发信人: i_can() 
整理人: wenbobo(2002-12-27 15:50:04), 站内信件
 | 
 
 
Is this OK?
 
 #ifndef lint
 static char sccsid[] = "@(#)uudecode.c  5.5 (Berkeley) 7/6/88";
 #endif /* not lint */
 
 #ifdef __MSDOS__        /* For Turbo C */
 #define MSDOS 1
 #endif
 
 /*
  * uudecode [input]
  *
  * create the specified file, decoding as you go.
  * used with uuencode.
  */
 #include <stdio.h>
 
 #ifdef WIN32
 #  include <stdlib.h>
 #  include <string.h>
 #  include <sys/types.h>
 #  include <sys/stat.h>
 #  define MSDOS 1
 #else /* Not WIN32 */
 #  ifdef VMS
 #    include <types.h>
 #    include <stat.h>
 #  else
 #    ifndef MSDOS            /* i.e., UNIX */
 #      include <pwd.h>
 #    endif
 #    include <sys/types.h>   /* MSDOS or UNIX */
 #    include <sys/stat.h>
 #  endif
 #endif /* Not WIN32 */
 
 /* single-character decode */
 #define DEC(c)  (((c) - ' ') & 077)
 
 main(argc, argv)
 char **argv;
 {
         void decode();
 
         FILE *in, *out;
         int mode;
 #ifdef WIN32
 	char dest[512];
 #else
         char dest[128];
 #endif
         char buf[80];
 
         /* optional input arg */
         if (argc > 1) {
                 if ((in = fopen(argv[1], "r")) == NULL) {
                         perror(argv[1]);
                         return 1;
                 }
                 argv++; argc--;
         } else
                 in = stdin;
 
         if (argc != 1) {
                 printf("Usage: uudecode [infile]\n");
                 return 2;
         }
 
         /* search for header line */
         for (;;) {
                 if (fgets(buf, sizeof buf, in) == NULL) {
                         fprintf(stderr, "No begin line\n");
                         return 3;
                 }
                 if (strncmp(buf, "begin ", 6) == 0)
                         break;
         }
         (void)sscanf(buf, "begin %o %s", &mode, dest);
 
 #if !defined(MSDOS) && !defined(VMS)    /* i.e., UNIX */
         /* handle ~user/file format */
         if (dest[0] == '~') {
                 char *sl;
                 struct passwd *getpwnam();
                 struct passwd *user;
                 char dnbuf[100], *index(), *strcat(), *strcpy();
 
                 sl = index(dest, '/');
                 if (sl == NULL) {
                         fprintf(stderr, "Illegal ~user\n");
                         return 3;
                 }
                 *sl++ = 0;
                 user = getpwnam(dest+1);
                 if (user == NULL) {
                         fprintf(stderr, "No such user as %s\n", dest); 
                         return 4;
                 }
                 strcpy(dnbuf, user->pw_dir);
                 strcat(dnbuf, "/");
                 strcat(dnbuf, sl);
                 strcpy(dest, dnbuf);
         }
 #endif  /* !defined(MSDOS) && !defined(VMS) */
 
         /* create output file */
 #ifdef MSDOS
         out = fopen(dest, "wb");        /* Binary file */
 #else
         out = fopen(dest, "w");
 #endif
         if (out == NULL) {
                 perror(dest);
                 return 4;
         }
 #if !defined(MSDOS) && !defined(VMS)    /* i.e., UNIX */
         chmod(dest, mode);
 #endif
 
         decode(in, out);
 
         if (fgets(buf, sizeof buf, in) == NULL || strcmp(buf, "end\n") ) {
                 fprintf(stderr, "No end line\n");
                 return 5;
         }
         return 0;
 }
 
 /*
  * copy from in to out, decoding as you go along.
  */
 void
 decode(in, out)
 FILE *in;
 FILE *out;
 {
         void outdec();
 
         char buf[80];
         char *bp;
         int n, i, expected;
 
         for (;;) {
                 /* for each input line */
                 if (fgets(buf, sizeof buf, in) == NULL) {
                         printf("Short file\n");
                         exit(10);
                 }
                 n = DEC(buf[0]);
                 if ((n <= 0) || (buf[0] == '\n'))
                         break;
 
                 /* Calculate expected # of chars and pad if necessary  */
                 expected = ((n+2)/3)<<2;
                 for (i = strlen(buf)-1; i <= expected; i++) buf[i] = '  ';
 
                 bp = &buf[1];
                 while (n > 0) {
                         outdec(bp, out, n);
                         bp += 4;
                         n -= 3;
                 }
         }
 }
 
 /*
  * output a group of 3 bytes (4 input characters).
  * the input chars are pointed to by p, they are to
  * be output to file f.  n is used to tell us not to
  * output all of them at the end of the file.
  */
 void
 outdec(p, f, n)
 char *p;
 FILE *f;
 int n;
 {
         int c1, c2, c3;
 
         c1 = DEC(*p) << 2 | DEC(p[1]) >> 4;
         c2 = DEC(p[1]) << 4 | DEC(p[2]) >> 2;
         c3 = DEC(p[2]) << 6 | DEC(p[3]);
         if (n >= 1)
                 putc(c1, f);
         if (n >= 2)
                 putc(c2, f);
         if (n >= 3)
                 putc(c3, f);
 }
 
 /*
  * Return the ptr in sp at which the character c appears;
  * NULL if not found
  */
 
 #ifndef NULL
 #  define NULL    0
 #endif
 
 char *
 index(sp, c)
 register char *sp, c;
 {
         do {
                 if (*sp == c)
                         return(sp);
         } while (*sp++);
         return(NULL);
 }
  -- 七里
  ※ 来源:.月光软件站 http://www.moon-soft.com.[FROM: 61.132.73.200]
  | 
 
 
 |