delorie.com/archives/browse.cgi   search  
Mail Archives: cygwin/1999/01/18/23:17:14

From: root AT jacob DOT remcomp DOT fr (root)
Subject: Re: uudecode?
18 Jan 1999 23:17:14 -0800 :
Message-ID: <m102Jd8-0008SnC.cygnus.gnu-win32@jacob.remcomp.fr>
References: <ud84cq39y DOT fsf AT TENDLE DOT citrix DOT com>
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 <stdio.h>
#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 <stdio.h>
#include <string.h>
#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".

- Raw text -


  webmaster     delorie software   privacy  
  Copyright © 2019   by DJ Delorie     Updated Jul 2019