home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 October / usenetsourcesnewsgroupsinfomagicoctober1994disk2.iso / misc / volume6 / u16.patch1 < prev    next >
Internet Message Format  |  1989-02-03  |  5KB

  1. Path: xanth!ukma!tut.cis.ohio-state.edu!mailrus!csd4.milw.wisc.edu!leah!itsgw!steinmetz!uunet!allbery
  2. From: allbery@uunet.UU.NET (Brandon S. Allbery - comp.sources.misc)
  3. Newsgroups: comp.sources.misc
  4. Subject: v06i013: u16 patch 1
  5. Message-ID: <47279@uunet.UU.NET>
  6. Date: 24 Jan 89 03:07:23 GMT
  7. Sender: allbery@uunet.UU.NET
  8. Reply-To: tom@SSD.HARRIS.COM (Tom Horsley)
  9. Lines: 157
  10. Approved: allbery@uunet.UU.NET (Brandon S. Allbery - comp.sources.misc)
  11.  
  12. Posting-number: Volume 6, Issue 13
  13. Submitted-by: tom@SSD.HARRIS.COM (Tom Horsley)
  14. Archive-name: u16.patch1
  15.  
  16. [This just about clears out the comp.sources.misc queue -- there are 4 more
  17. submissions to go, but they require further thought.  ++bsa]
  18.  
  19. This is patch number 1 (and hopefully patch number last) to the u16
  20. 16 bit uncompress for the PC.
  21. ----------------------------cut here-------------------------------
  22. *** u16.c.orig    Tue Jan  3 15:34:51 1989
  23. --- u16.c    Tue Jan  3 15:34:28 1989
  24. ***************
  25. *** 6,11 ****
  26. --- 6,23 ----
  27.    * Parts written (other parts plagarized) by Tom Horsley
  28.    *   (tahorsley@ssd.harris.com)
  29.    *   Dec 1988.
  30. +  *
  31. +  * Version 1.1
  32. +  *
  33. +  * Bug1 - fixed Dec 22, 1988
  34. +  *   The initial check for end of file that attempted to just use
  35. +  *   the current byte pointer was not good enough. Because the byte
  36. +  *   pointer might look within bounds, but a large code might eat
  37. +  *   some garbage bits beyond the end as it is assembled.
  38. +  *
  39. +  *   The fix was to add a new variable to keep track of the count
  40. +  *   of bits in the buffer and always check to see that there are
  41. +  *   enough bits for at least one new code to be extracted.
  42.    */
  43.   #include <stdio.h>
  44.   #include <fcntl.h>
  45. ***************
  46. *** 82,88 ****
  47.    * message you get with the -H option.
  48.    */
  49.   unsigned char buf[MAXBUF] = "\
  50. ! u16 - 16 bit LZW uncompress for the IBM PC\n\
  51.   u16 [-H] [files...]\n\
  52.   \n\
  53.   -H\tPrint this message and exit.\n\
  54. --- 94,100 ----
  55.    * message you get with the -H option.
  56.    */
  57.   unsigned char buf[MAXBUF] = "\
  58. ! u16 - 16 bit LZW uncompress for the IBM PC, version 1.1\n\
  59.   u16 [-H] [files...]\n\
  60.   \n\
  61.   -H\tPrint this message and exit.\n\
  62. ***************
  63. *** 97,102 ****
  64. --- 109,119 ----
  65.   on the ends of file names.\n"
  66.   ;
  67.   
  68. + /* Number of bits in the buffer.
  69. +  */
  70. + long          bitsinbuf = 0;
  71. + long          n_bits;
  72.   /* Number of bytes of file data resident in buf.
  73.    */
  74.   int          bufsize = 0;
  75. ***************
  76. *** 167,172 ****
  77. --- 184,190 ----
  78.        eofmark = &buf[bufsize];
  79.         } else {
  80.        bufsize += cursize;
  81. +      bitsinbuf += (((long)cursize) << 3);
  82.         }
  83.      }
  84.      if (eofmark == NULL) {
  85. ***************
  86. *** 203,210 ****
  87.          * have recieved a clear code then flush the current size code
  88.          * and advance to next size.
  89.          */
  90. !       while (cb.codep != vartab[curvartab].origp) xcode(&cb);
  91. !       if (cb.bufp >= endbuf) return(-1L);
  92.         if (clear_flg > 0) {
  93.        curvartab = 0;
  94.        clear_flg = 0;
  95. --- 221,230 ----
  96.          * have recieved a clear code then flush the current size code
  97.          * and advance to next size.
  98.          */
  99. !       while (cb.codep != vartab[curvartab].origp) {
  100. !      xcode(&cb);
  101. !      bitsinbuf -= n_bits;
  102. !       }
  103.         if (clear_flg > 0) {
  104.        curvartab = 0;
  105.        clear_flg = 0;
  106. ***************
  107. *** 220,232 ****
  108.         (*vartab[curvartab].initp)(&cb);
  109.         vartab[curvartab].origp = cb.codep;
  110.         maxcode = vartab[curvartab].maxcode;
  111.   #ifdef DEBUG
  112.         fprintf(stderr,
  113.        "switching to %d bit codes, bytes_out = %ld, free_ent = %ld\n",
  114. !      vartab[curvartab].n_bits,bytes_out, free_ent);
  115.   #endif
  116.      }
  117. !    return (long)(xcode(&cb));
  118.   }
  119.   
  120.   /* Decompress stdin to stdout.    This routine adapts to the codes in
  121. --- 240,258 ----
  122.         (*vartab[curvartab].initp)(&cb);
  123.         vartab[curvartab].origp = cb.codep;
  124.         maxcode = vartab[curvartab].maxcode;
  125. +       n_bits = (long)vartab[curvartab].n_bits;
  126.   #ifdef DEBUG
  127.         fprintf(stderr,
  128.        "switching to %d bit codes, bytes_out = %ld, free_ent = %ld\n",
  129. !      n_bits,bytes_out, free_ent);
  130.   #endif
  131.      }
  132. !    bitsinbuf -= n_bits;
  133. !    if (bitsinbuf < 0) {
  134. !       return -1L;
  135. !    } else {
  136. !       return (long) xcode(&cb);
  137. !    }
  138.   }
  139.   
  140.   /* Decompress stdin to stdout.    This routine adapts to the codes in
  141. ***************
  142. *** 270,276 ****
  143. --- 296,304 ----
  144.      /* Read the iniital buffer worth of data and check magic numbers
  145.       * and flags.
  146.       */
  147. +    bitsinbuf = 0;
  148.      ReadBuf();
  149. +    bitsinbuf -= 3 * 8;
  150.      if (bufsize < 3) {
  151.         fputs("u16: Missing file header.\n",stderr);
  152.         return 1;
  153. ***************
  154. *** 298,303 ****
  155. --- 326,332 ----
  156.      /*
  157.       * initialize the first 256 entries in the table.
  158.       */
  159. +    n_bits = vartab[0].n_bits;
  160.      maxcode = vartab[0].maxcode;
  161.      for ( code = 255; code >= 0; code-- ) {
  162.         tab_prefixof(code) = 0;
  163. --------------------------- cut here --------------------------------
  164. =====================================================================
  165.     usenet: tahorsley@ssd.harris.com  USMail: Tom Horsley
  166. compuserve: 76505,364                         511 Kingbird Circle
  167.      genie: T.HORSLEY                         Delray Beach, FL  33444
  168.