annotate lib-src/mmencode.c @ 2421:ab71ad6ff3dd

[xemacs-hg @ 2004-12-06 03:50:53 by ben] (none) README.packages: Document use of --package-prefix. Fix error in specifying standard package location. make-docfile.c: Use QXE_PATH_MAX. info.el: Correct doc string giving example package path. menubar-items.el: Move Prefix Rectangle command up one level. xemacs/packages.texi: Add long form of Lisp Reference Manual to links. Add links pointing to Lisp Reference Manual for more detailed package discussion. lispref/range-tables.texi: Document range-table changes. internals/internals.texi: Update history section. elhash.c, elhash.h, profile.c: Create inchash_eq() to allow direct incrementing of hash-table entry. Use in profile.c to try to reduce profiling overhead. Increase initial size of profile hash tables to reduce profiling overhead. buffer.c, device-msw.c, dialog-msw.c, dired-msw.c, editfns.c, event-msw.c, events.c, glyphs-msw.c, keymap.c, objects-msw.c, process-nt.c, syswindows.h, text.c, text.h, unexnt.c: Rename xetcs* -> qxetcs* for consistency with qxestr*. Rename ei*_c(_*) -> ei*_ascii(_*) since they work with ASCII-only strings not "C strings", whatever those are. This is the last place where "c" was incorrectly being used for "ascii". dialog-msw.c, dumper.c, event-msw.c, fileio.c, glyphs-gtk.c, glyphs-x.c, nt.c, process-nt.c, realpath.c, sysdep.c, sysfile.h, unexcw.c, unexnext.c, unexnt.c: Try to avoid differences in systems that do or do not include final null byte in PATH_MAX. Create PATH_MAX_INTERNAL and PATH_MAX_EXTERNAL and use them everywhere. Rewrite code in dumper.c to avoid use of PATH_MAX. When necessary in nt.c, use _MAX_PATH instead of MAX_PATH to be consistent with other places. text.c: Code to short-circuit when binary or Unicode was not working due to EOL wrapping. Fix this code to work when either no EOL autodetection or no CR's or LF's in the text. lisp.h, rangetab.c, rangetab.h, regex.c, search.c: Implement different types of ranges (open/closed start and end). Change default to be start-closed, end-open.
author ben
date Mon, 06 Dec 2004 03:52:23 +0000
parents b39c14581166
children 49316578f12d
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1 /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2 Copyright (c) 1991 Bell Communications Research, Inc. (Bellcore)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4 Permission to use, copy, modify, and distribute this material
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5 for any purpose and without fee is hereby granted, provided
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6 that the above copyright notice and this permission notice
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
7 appear in all copies, and that the name of Bellcore not be
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
8 used in advertising or publicity pertaining to this
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
9 material without the specific, prior written permission
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
10 of an authorized representative of Bellcore. BELLCORE
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
11 MAKES NO REPRESENTATIONS ABOUT THE ACCURACY OR SUITABILITY
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
12 OF THIS MATERIAL FOR ANY PURPOSE. IT IS PROVIDED "AS IS",
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
13 WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
14 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
15
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
16 #define NEWLINE_CHAR '\n'
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
17 #include <stdlib.h>
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
18 #include <stdio.h>
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
19 #include <ctype.h>
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
20 #include <string.h>
430
a5df635868b2 Import from CVS: tag r21-2-23
cvs
parents: 428
diff changeset
21 #include <errno.h>
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
22
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
23 static void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
24 output64chunk(int c1, int c2, int c3, int pads, FILE *outfile);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
25
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
26 static signed char basis_64[] =
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
27 "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
28
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
29 static signed char index_64[128] = {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
30 -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
31 -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
32 -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,62, -1,-1,-1,63,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
33 52,53,54,55, 56,57,58,59, 60,61,-1,-1, -1,-1,-1,-1,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
34 -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,10, 11,12,13,14,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
35 15,16,17,18, 19,20,21,22, 23,24,25,-1, -1,-1,-1,-1,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
36 -1,26,27,28, 29,30,31,32, 33,34,35,36, 37,38,39,40,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
37 41,42,43,44, 45,46,47,48, 49,50,51,-1, -1,-1,-1,-1
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
38 };
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
39
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
40 #define char64(c) (((c) < 0 || (c) > 127) ? -1 : index_64[(c)])
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
41
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
42 /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
43 char64(c)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
44 char c;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
45 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
46 char *s = (char *) strchr(basis_64, c);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
47 if (s) return(s-basis_64);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
48 return(-1);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
49 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
50 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
51
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
52 /* the following gets a character, but fakes it properly into two chars if there's a newline character */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
53 static int InNewline=0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
54
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
55 static int
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
56 nextcharin (FILE *infile, int PortableNewlines)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
57 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
58 int c;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
59
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
60 #ifndef NEWLINE_CHAR
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
61 return(getc(infile));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
62 #else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
63 if (!PortableNewlines) return(getc(infile));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
64 if (InNewline) {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
65 InNewline = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
66 return(10); /* LF */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
67 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
68 c = getc(infile);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
69 if (c == NEWLINE_CHAR) {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
70 InNewline = 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
71 return(13); /* CR */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
72 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
73 return(c);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
74 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
75 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
76
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
77 static void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
78 to64(FILE *infile, FILE *outfile, int PortableNewlines)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
79 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
80 int c1, c2, c3, ct=0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
81 InNewline = 0; /* always reset it */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
82 while ((c1 = nextcharin(infile, PortableNewlines)) != EOF) {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
83 c2 = nextcharin(infile, PortableNewlines);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
84 if (c2 == EOF) {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
85 output64chunk(c1, 0, 0, 2, outfile);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
86 } else {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
87 c3 = nextcharin(infile, PortableNewlines);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
88 if (c3 == EOF) {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
89 output64chunk(c1, c2, 0, 1, outfile);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
90 } else {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
91 output64chunk(c1, c2, c3, 0, outfile);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
92 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
93 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
94 ct += 4;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
95 if (ct > 71) {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
96 putc('\n', outfile);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
97 ct = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
98 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
99 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
100 if (ct) putc('\n', outfile);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
101 fflush(outfile);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
102 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
103
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
104 static void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
105 output64chunk(int c1, int c2, int c3, int pads, FILE *outfile)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
106 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
107 putc(basis_64[c1>>2], outfile);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
108 putc(basis_64[((c1 & 0x3)<< 4) | ((c2 & 0xF0) >> 4)], outfile);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
109 if (pads == 2) {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
110 putc('=', outfile);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
111 putc('=', outfile);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
112 } else if (pads) {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
113 putc(basis_64[((c2 & 0xF) << 2) | ((c3 & 0xC0) >>6)], outfile);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
114 putc('=', outfile);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
115 } else {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
116 putc(basis_64[((c2 & 0xF) << 2) | ((c3 & 0xC0) >>6)], outfile);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
117 putc(basis_64[c3 & 0x3F], outfile);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
118 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
119 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
120
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
121 static int
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
122 PendingBoundary(char *s, char **Boundaries, int *BoundaryCt)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
123 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
124 int i, len;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
125
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
126 if (s[0] != '-' || s[1] != '-') return(0);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
127
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
128
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
129 for (i=0; i < *BoundaryCt; ++i) {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
130 len = strlen(Boundaries[i]);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
131 if (!strncmp(s, Boundaries[i], len)) {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
132 if (s[len] == '-' && s[len+1] == '-') *BoundaryCt = i;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
133 return(1);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
134 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
135 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
136 return(0);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
137 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
138
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
139 /* If we're in portable newline mode, we have to convert CRLF to the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
140 local newline convention on output */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
141
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
142 static int CRpending = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
143
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
144 #ifdef NEWLINE_CHAR
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
145 static void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
146 almostputc(int c, FILE *outfile, int PortableNewlines)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
147 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
148 if (CRpending) {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
149 if (c == 10) {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
150 putc(NEWLINE_CHAR, outfile);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
151 CRpending = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
152 } else {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
153 putc(13, outfile);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
154 if (c != 13) {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
155 putc(c, outfile);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
156 CRpending = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
157 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
158 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
159 } else {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
160 if (PortableNewlines && c == 13) {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
161 CRpending = 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
162 } else {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
163 putc(c, outfile);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
164 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
165 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
166 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
167 #else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
168 static void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
169 almostputc(int c, FILE *outfile, int PortableNewlines)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
170 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
171 putc(c, outfile);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
172 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
173 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
174
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
175 static void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
176 from64(FILE *infile, FILE *outfile,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
177 char **boundaries, int *boundaryct, int PortableNewlines)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
178 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
179 int c1, c2, c3, c4;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
180 int newline = 1, DataDone = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
181
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
182 /* always reinitialize */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
183 CRpending = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
184 while ((c1 = getc(infile)) != EOF) {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
185 if (isspace(c1)) {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
186 if (c1 == '\n') {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
187 newline = 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
188 } else {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
189 newline = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
190 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
191 continue;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
192 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
193 if (newline && boundaries && c1 == '-') {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
194 char Buf[200];
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
195 /* a dash is NOT base 64, so all bets are off if NOT a boundary */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
196 ungetc(c1, infile);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
197 fgets(Buf, sizeof(Buf), infile);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
198 if (boundaries
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
199 && (Buf[0] == '-')
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
200 && (Buf[1] == '-')
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
201 && PendingBoundary(Buf, boundaries, boundaryct)) {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
202 return;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
203 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
204 fprintf(stderr, "Ignoring unrecognized boundary line: %s\n", Buf);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
205 continue;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
206 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
207 if (DataDone) continue;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
208 newline = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
209 do {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
210 c2 = getc(infile);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
211 } while (c2 != EOF && isspace(c2));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
212 do {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
213 c3 = getc(infile);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
214 } while (c3 != EOF && isspace(c3));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
215 do {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
216 c4 = getc(infile);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
217 } while (c4 != EOF && isspace(c4));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
218 if (c2 == EOF || c3 == EOF || c4 == EOF) {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
219 fprintf(stderr, "Warning: base64 decoder saw premature EOF!\n");
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
220 return;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
221 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
222 if (c1 == '=' || c2 == '=') {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
223 DataDone=1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
224 continue;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
225 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
226 c1 = char64(c1);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
227 c2 = char64(c2);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
228 almostputc(((c1<<2) | ((c2&0x30)>>4)), outfile, PortableNewlines);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
229 if (c3 == '=') {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
230 DataDone = 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
231 } else {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
232 c3 = char64(c3);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
233 almostputc((((c2&0XF) << 4) | ((c3&0x3C) >> 2)), outfile, PortableNewlines);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
234 if (c4 == '=') {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
235 DataDone = 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
236 } else {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
237 c4 = char64(c4);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
238 almostputc((((c3&0x03) <<6) | c4), outfile, PortableNewlines);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
239 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
240 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
241 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
242 if (CRpending) putc(13, outfile); /* Don't drop a lone trailing char 13 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
243 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
244
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
245 static signed char basis_hex[] = "0123456789ABCDEF";
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
246 static signed char index_hex[128] = {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
247 -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
248 -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
249 -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
250 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,-1,-1, -1,-1,-1,-1,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
251 -1,10,11,12, 13,14,15,-1, -1,-1,-1,-1, -1,-1,-1,-1,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
252 -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
253 -1,10,11,12, 13,14,15,-1, -1,-1,-1,-1, -1,-1,-1,-1,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
254 -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
255 };
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
256
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
257 /* The following version generated complaints on Solaris. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
258 /* #define hexchar(c) (((c) < 0 || (c) > 127) ? -1 : index_hex[(c)]) */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
259 /* Since we're no longer ever calling it with anything signed, this should work: */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
260 #define hexchar(c) (((c) > 127) ? -1 : index_hex[(c)])
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
261
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
262 /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
263 hexchar(c)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
264 char c;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
265 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
266 char *s;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
267 if (islower(c)) c = toupper(c);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
268 s = (char *) strchr(basis_hex, c);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
269 if (s) return(s-basis_hex);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
270 return(-1);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
271 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
272 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
273
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
274 static void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
275 toqp(FILE *infile, FILE *outfile)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
276 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
277 int c, ct=0, prevc=255;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
278 while ((c = getc(infile)) != EOF) {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
279 if ((c < 32 && (c != '\n' && c != '\t'))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
280 || (c == '=')
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
281 || (c >= 127)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
282 /* Following line is to avoid single periods alone on lines,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
283 which messes up some dumb smtp implementations, sigh... */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
284 || (ct == 0 && c == '.')) {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
285 putc('=', outfile);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
286 putc(basis_hex[c>>4], outfile);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
287 putc(basis_hex[c&0xF], outfile);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
288 ct += 3;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
289 prevc = 'A'; /* close enough */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
290 } else if (c == '\n') {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
291 if (prevc == ' ' || prevc == '\t') {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
292 putc('=', outfile); /* soft & hard lines */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
293 putc(c, outfile);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
294 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
295 putc(c, outfile);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
296 ct = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
297 prevc = c;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
298 } else {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
299 if (c == 'F' && prevc == '\n') {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
300 /* HORRIBLE but clever hack suggested by MTR for sendmail-avoidance */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
301 c = getc(infile);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
302 if (c == 'r') {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
303 c = getc(infile);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
304 if (c == 'o') {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
305 c = getc(infile);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
306 if (c == 'm') {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
307 c = getc(infile);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
308 if (c == ' ') {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
309 /* This is the case we are looking for */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
310 fputs("=46rom", outfile);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
311 ct += 6;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
312 } else {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
313 fputs("From", outfile);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
314 ct += 4;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
315 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
316 } else {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
317 fputs("Fro", outfile);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
318 ct += 3;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
319 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
320 } else {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
321 fputs("Fr", outfile);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
322 ct += 2;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
323 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
324 } else {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
325 putc('F', outfile);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
326 ++ct;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
327 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
328 ungetc(c, infile);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
329 prevc = 'x'; /* close enough -- printable */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
330 } else { /* END horrible hack */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
331 putc(c, outfile);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
332 ++ct;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
333 prevc = c;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
334 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
335 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
336 if (ct > 72) {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
337 putc('=', outfile);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
338 putc('\n', outfile);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
339 ct = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
340 prevc = '\n';
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
341 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
342 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
343 if (ct) {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
344 putc('=', outfile);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
345 putc('\n', outfile);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
346 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
347 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
348
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
349 static void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
350 fromqp(FILE *infile, FILE *outfile, char **boundaries, int *boundaryct)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
351 {
647
b39c14581166 [xemacs-hg @ 2001-08-13 04:45:47 by ben]
ben
parents: 442
diff changeset
352 int c1, c2;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
353 int sawnewline = 1, neednewline = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
354 /* The neednewline hack is necessary because the newline leading into
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
355 a multipart boundary is part of the boundary, not the data */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
356
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
357 while ((c1 = getc(infile)) != EOF) {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
358 if (sawnewline && boundaries && (c1 == '-')) {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
359 char Buf[200];
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
360 unsigned char *s;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
361
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
362 ungetc(c1, infile);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
363 fgets(Buf, sizeof(Buf), infile);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
364 if (boundaries
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
365 && (Buf[0] == '-')
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
366 && (Buf[1] == '-')
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
367 && PendingBoundary(Buf, boundaries, boundaryct)) {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
368 return;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
369 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
370 /* Not a boundary, now we must treat THIS line as q-p, sigh */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
371 if (neednewline) {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
372 putc('\n', outfile);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
373 neednewline = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
374 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
375 for (s=(unsigned char *) Buf; *s; ++s) {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
376 if (*s == '=') {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
377 if (!*++s) break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
378 if (*s == '\n') {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
379 /* ignore it */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
380 sawnewline = 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
381 } else {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
382 c1 = hexchar(*s);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
383 if (!*++s) break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
384 c2 = hexchar(*s);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
385 putc(c1<<4 | c2, outfile);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
386 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
387 } else {
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
388 #ifdef WIN32_NATIVE
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
389 if (*s == '\n')
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
390 putc('\r', outfile); /* insert CR for binary-mode write */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
391 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
392 putc(*s, outfile);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
393 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
394 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
395 } else {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
396 if (neednewline) {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
397 putc('\n', outfile);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
398 neednewline = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
399 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
400 if (c1 == '=') {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
401 sawnewline = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
402 c1 = getc(infile);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
403 if (c1 == '\n') {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
404 /* ignore it */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
405 sawnewline = 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
406 } else {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
407 c2 = getc(infile);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
408 c1 = hexchar(c1);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
409 c2 = hexchar(c2);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
410 putc(c1<<4 | c2, outfile);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
411 if (c2 == '\n') sawnewline = 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
412 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
413 } else {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
414 if (c1 == '\n') {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
415 sawnewline = 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
416 neednewline = 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
417 } else {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
418 sawnewline = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
419 putc(c1, outfile);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
420 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
421 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
422 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
423 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
424 if (neednewline) {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
425 putc('\n', outfile);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
426 neednewline = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
427 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
428 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
429
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
430
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
431 /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
432 Copyright (c) 1991 Bell Communications Research, Inc. (Bellcore)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
433
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
434 Permission to use, copy, modify, and distribute this material
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
435 for any purpose and without fee is hereby granted, provided
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
436 that the above copyright notice and this permission notice
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
437 appear in all copies, and that the name of Bellcore not be
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
438 used in advertising or publicity pertaining to this
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
439 material without the specific, prior written permission
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
440 of an authorized representative of Bellcore. BELLCORE
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
441 MAKES NO REPRESENTATIONS ABOUT THE ACCURACY OR SUITABILITY
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
442 OF THIS MATERIAL FOR ANY PURPOSE. IT IS PROVIDED "AS IS",
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
443 WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
444 */
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
445 #ifdef WIN32_NATIVE
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
446 #include <io.h>
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
447 #include <fcntl.h>
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
448 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
449
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
450 #define BASE64 1
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
451 #define QP 2 /* quoted-printable */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
452
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
453 int main(int argc, char *argv[])
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
454 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
455 int encode = 1, which = BASE64, i, portablenewlines = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
456 FILE *fp = stdin;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
457 FILE *fpo = stdout;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
458
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
459 for (i=1; i<argc; ++i) {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
460 if (argv[i][0] == '-') {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
461 switch (argv[i][1]) {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
462 case 'o':
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
463 if (++i >= argc) {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
464 fprintf(stderr, "mimencode: -o requires a file name.\n");
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
465 exit(-1);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
466 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
467 fpo = fopen(argv[i], "w");
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
468 if (!fpo) {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
469 perror(argv[i]);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
470 exit(-1);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
471 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
472 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
473 case 'u':
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
474 encode = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
475 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
476 case 'q':
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
477 which = QP;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
478 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
479 case 'p':
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
480 portablenewlines = 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
481 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
482 case 'b':
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
483 which = BASE64;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
484 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
485 default:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
486 fprintf(stderr,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
487 "Usage: mmencode [-u] [-q] [-b] [-p] [-o outputfile] [file name]\n");
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
488 exit(-1);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
489 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
490 } else {
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
491 #ifdef WIN32_NATIVE
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
492 if (encode)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
493 fp = fopen(argv[i], "rb");
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
494 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
495 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
496 fp = fopen(argv[i], "rt");
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
497 setmode(fileno(fpo), O_BINARY);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
498 } /* else */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
499 #else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
500 fp = fopen(argv[i], "r");
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
501 #endif /* WIN32_NATIVE */
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
502 if (!fp) {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
503 perror(argv[i]);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
504 exit(-1);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
505 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
506 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
507 }
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
508 #ifdef WIN32_NATIVE
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
509 if (fp == stdin) setmode(fileno(fp), O_BINARY);
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
510 #endif /* WIN32_NATIVE */
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
511 if (which == BASE64) {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
512 if (encode) {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
513 to64(fp, fpo, portablenewlines);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
514 } else {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
515 from64(fp,fpo, (char **) NULL, (int *) 0, portablenewlines);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
516 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
517 } else {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
518 if (encode) toqp(fp, fpo); else fromqp(fp, fpo, NULL, 0);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
519 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
520 return(0);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
521 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
522