home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 October / usenetsourcesnewsgroupsinfomagicoctober1994disk2.iso / misc / volume11 / uudec / part01 next >
Text File  |  1990-04-06  |  6KB  |  141 lines

  1. Newsgroups: comp.sources.misc
  2. subject: v11i097: latest uudec.cc for the world
  3. From: GORMAN_B@uk.ac.LANCSP.P1 (Barry Gorman )
  4. Sender: allbery@uunet.UU.NET (Brandon S. Allbery - comp.sources.misc)
  5.  
  6. Posting-number: Volume 11, Issue 97
  7. Submitted-by: GORMAN_B@uk.ac.LANCSP.P1 (Barry Gorman )
  8. Archive-name: uudec/part01
  9.  
  10. Some little time ago, I asked a good friend on a unix site to send me a copy
  11. of a uudecoder program. I was sent the version by scott@max (see below).
  12. Needless to say I had a fiddle with it, and I append the result of this.
  13. I would claim that the transformed program is more "structured" (what is this?)
  14. and certainly shorter. I have used my personal layout rules (indent=4*{'s)
  15. which will no doubt be controversial. Please feel free to use, distribute etc.
  16.  
  17. Please do not attempt to reply via the uucp gateway @ uk.ac.ukc; but earn-relay
  18. and nsfnet-relay are ok. Alternatively send via jjsc@uk.ac.rl.inf for forwarding
  19.  
  20. Barry
  21. .....
  22. ----------------------------------- cut here -----------------------------------
  23. #! /bin/sh
  24. # This file was wrapped with "dummyshar".  "sh" this file to extract.
  25. # Contents:  uudec.c
  26. echo extracting 'uudec.c'
  27. if test -f 'uudec.c' -a -z "$1"; then echo Not overwriting 'uudec.c'; else
  28. sed 's/^X//' << \EOF > 'uudec.c'
  29. X/********** From: scott@max.u.washington.edu - 20 Feb 90 21:13:03 GMT *********/
  30. X/* For the those may not have access to a UUDECODER, you may not
  31. X * be able to take benefit of like UX-Maze file exchange
  32. X * which require the files to be uuencoded.
  33. X * If that is the case may be just may be the following posts
  34. X * will be of help. This post contains the source code in
  35. X * C of a UUDECODER tested on msc 3.0 and PCDOS 3.1.
  36. X * Perhaps if you have access to an IBM/CLONE you could do
  37. X * the file uudecoding on the IBM before the final transfer
  38. X * to the C64 or C128.
  39. X * Or perhaps if you are knowledgeable with programing you
  40. X * could convert this program for the C64 or perhaps to another
  41. X * popular language like Pascal or Fortran that is supported
  42. X * by your system.
  43. X
  44. X/* source code reduced in size whilst maintaining the exact operation
  45. X * of the original program: GORMAN_B@UK.AC.LANCSP.P1 March 19th 1990.
  46. X * Probably favours machines capable of 32 bit working; but should
  47. X * work on others. The "register unsigned long word" variable is used
  48. X * for some long (16 place) shifts. This may or may not be faster than
  49. X * the use of division, depending on you processor design. I have left
  50. X * it in this form as I feel it is in the spirit of C and illustrates
  51. X * my technique. (bring back 24 bit machines with cyclic shifts!)
  52. X
  53. X/* usage for this file is as follows:
  54. X * uudecode <input file name (with extension)>
  55. X *     file is placed in the file name contained on the
  56. X *     first line of the uuencoded file ...
  57. X *
  58. X * The program expects this to look like begin XXX <FN>
  59. X * where XXX are the Unix(tm) file permissions
  60. X *   and <fn> is the Unix file name.  If this name is
  61. X *       too long for DOS, edit it to fit.  It has been
  62. X *       tested with msc v3.0 and PC-DOS 3.1.  the companion
  63. X *       file is uuencode.c ...
  64. X
  65. X/*************************** single character decode **************************/
  66. X
  67. X#define DEC(c) (((c) - ' ') & 077)
  68. X#include <stdio.h>
  69. X
  70. X/************************************ MAIN ************************************/
  71. Xmain (argc,argv) int argc; char *argv[];      /* expects one (or no) argument */
  72. X/******************************************************************************/
  73. X
  74. X   {FILE *in, *out; char buf[80];
  75. X
  76. X    switch(argc)                     /* sort out number of arguments supplied */
  77. X
  78. X       {default: fprintf(stderr,"Usage: uudec [file]n"); exit(2); /* 2+ args */
  79. X
  80. X        case 1: in=stdin; break;                    /* take source from stdin */
  81. X
  82. X        case 2: if(!(in=fopen(argv[1],"r"))) {perror(argv[1]); exit(1);}}
  83. X
  84. X/***** now that the source has been identified, scan for the "begin" line *****/
  85. X
  86. X    do if(!(fgets(buf,sizeof buf,in)))             /* read input line by line */
  87. X
  88. X       {fprintf(stderr, "No "begin" linen"); exit(3);}  /* complain if end */
  89. X
  90. X    while(strncmp(buf,"begin ",6));        /* until the "begin" line is found */
  91. X
  92. X/* the begin line must be followed by three (octal) digits and the file name **/
  93. X
  94. X       {char dest[32]; int mode;    /* these variables are needed transiently */
  95. X
  96. X        sscanf(buf,"begin %o %s",&mode,dest);   /* extract mode and file name */
  97. X
  98. X        if(!(out=fopen(dest,"w"))) {perror(dest); exit(4);}} /* open outfile? */
  99. X
  100. X/** having opened the file and read the "begin" line, decode it line by line **/
  101. X
  102. X        {char *p; int n;                  /* line pointer and character count */
  103. X
  104. X         while((p=fgets(buf,sizeof buf,in)) ? (n=DEC(buf[0]))    /* read line */
  105. X
  106. X                : (fprintf(stderr,"Short filen"), exit(10)))  /* end of file */
  107. X
  108. X           {register unsigned long word; int k;            /* local workspace */
  109. X
  110. X            do {k=4; do word=word<<6|DEC(*++p); while(--k);  /* decode 4 to 3 */
  111. X
  112. X                k=3; do {putc(word>>16,out); word<<=8;} while(--n && --k);}}
  113. X
  114. X            while(n);}}                 /* keep going until all decoding done */
  115. X
  116. X/* the decode should now be complete, we have read the zero length byte count */
  117. X
  118. X    if(!(fgets(buf,sizeof buf,in)) || strncmp(buf,"end",3))  /* check for end */
  119. X
  120. X       {fprintf(stderr,"No "end" linen"); exit(5);}}   /* complain if none */
  121. X
  122. X/******************************** end of uudec ********************************/
  123. EOF
  124. chars=`wc -c < 'uudec.c'`
  125. if test $chars !=     4181; then echo 'uudec.c' is $chars characters, should be     4181 characters!; fi
  126. fi
  127. exit 0
  128.  
  129.  
  130. ---
  131. ===============================================================================
  132. John Cullen                     || JANET : jjsc@uk.ac.rl.inf
  133. System Support Group            || ARPA  : jjsc%inf.rl.ac.uk@nsfnet-relay.ac.uk
  134. Informatics Department          || BITNET: jjsc@ukacrl (I think!)
  135. Rutherford Appleton Laboratory  || UUCP  : {...!mcvax}!ukc!rlinf!jjsc
  136. Chilton, Didcot, Oxon. OX11 0QX || VOICE : +44 (0)235 821900 ext 6555  
  137. ===============================================================================
  138. Your fortune cookie says:
  139. Birth: The first and direst of all disasters.
  140.  
  141.