From: root AT jacob DOT remcomp DOT fr (root) Subject: Re: uudecode? 18 Jan 1999 23:17:14 -0800 Message-ID: References: Content-Type: text To: John DOT Cooper AT citrix DOT com (John Cooper) Cc: gnu-win32 AT cygnus DOT com Let's stop this uuencode/decode discussion. Here are two small little programs in that old but powerful language we all know somehow. ------------------------------------------------------cut here: uuencode.c #include #define ENC(c) ((c) ? ((c) & 077) + ' ': '`') static int uuencode(char *nom) /* nom means 'name' in french :-) */ { int ch, n, idx; register char *p; char buf[80], outbuf[250]; FILE *in; if ((in = fopen(nom, "rb")) == NULL) return 1; /* please add some error checking/reporting */ printf("begin 0666 %s\n",nom);/* note: no attempt to fake any permissions */ while ((n = fread(buf, 1, 45, in)) != 0) { idx = 0; outbuf[idx++] = ENC(ch); for (p = buf; n > 0; n -= 3, p += 3) { ch = *p >> 2; ch = ENC(ch); outbuf[idx++] = ch; ch = ((*p << 4) & 060) | ((p[1] >> 4) & 017); ch = ENC(ch); outbuf[idx++] = ch; ch = ((p[1] << 2) & 074) | ((p[2] >> 6) & 03); ch = ENC(ch); outbuf[idx++] = ch; ch = p[2] & 077; ch = ENC(ch); outbuf[idx++] = ch; } outbuf[idx++] = '\n'; outbuf[idx] = 0; printf("%s", outbuf); } printf("%c\nend\n", ENC(0)); fclose(in); return 0; } int main(int argc, char *argv[]) // add error checking here if you feel like { return uuencode(argv[1]); } ---------------------------------------------------cut here uudecode.c #include #include #define DEC(c) (((c) - ' ') & 077) static int uudecode(char *fname) { register int n; register char ch, *p; char buf[2 * BUFSIZ],outname[512]; FILE *out, *in = fopen(fname, "rb"); if (in == NULL) { fprintf(stderr,"Impossible to open %s\n",fname); return 1; } while (fgets(buf, 80, in)) { if (!strncmp(buf, "begin", 5)) goto decodeStart; } fprintf(stderr,"No 'begin' line found in %s\n",fname); return 1; decodeStart: p = buf + sizeof("begin"); while (*p == ' ' || *p == '\t') p++; while (*p >= '0' && *p <= '9') // ignore any permissions setting p++; while (*p == ' ' || *p == '\t') p++; strcpy(outname, p); p = outname; while (*p >= ' ') // This supposes file name chars are >= ' ' p++; *p = 0; out = fopen(outname, "wb"); if (out == NULL) { fprintf(stderr,"Impossible to open %s\n",outname); return 1; } while (1) { if (!fgets(buf, 80, in)) break; if (!strncmp(buf, "end\r\n", 5)) break; p = buf; n = DEC(*p); if (n <= 0) break; for (++p; n > 0; p += 4, n -= 3) { if (n >= 3) { ch = DEC(p[0]) << 2 | DEC(p[1]) >> 4; fputc(ch, out); ch = DEC(p[1]) << 4 | DEC(p[2]) >> 2; fputc(ch, out); ch = DEC(p[2]) << 6 | DEC(p[3]); fputc(ch, out); } else { if (n >= 1) { ch = DEC(p[0]) << 2 | DEC(p[1]) >> 4; fputc(ch, out); } if (n >= 2) { ch = DEC(p[1]) << 4 | DEC(p[2]) >> 2; fputc(ch, out); } } } } fclose(out); fclose(in); return 0; } int main(int argc, char *argv[]) // Add error checking here if you feel like { return uudecode(argv[1]); } --------------------------------------------------------------------------- enjoy! -- Jacob Navia Logiciels/Informatique 41 rue Maurice Ravel Tel 01 48.23.51.44 93430 Villetaneuse Fax 01 48.23.95.39 France - For help on using this list (especially unsubscribing), send a message to "gnu-win32-request AT cygnus DOT com" with one line of text: "help".