URI:
       tinflatezlib.c - plan9port - [fork] Plan 9 from user space
  HTML git clone git://src.adamsgaard.dk/plan9port
   DIR Log
   DIR Files
   DIR Refs
   DIR README
   DIR LICENSE
       ---
       tinflatezlib.c (1026B)
       ---
            1 #include <u.h>
            2 #include <libc.h>
            3 #include <flate.h>
            4 #include "zlib.h"
            5 
            6 typedef struct ZWrite        ZWrite;
            7 
            8 struct ZWrite
            9 {
           10         ulong        adler;
           11         void        *wr;
           12         int        (*w)(void*, void*, int);
           13 };
           14 
           15 static int
           16 zlwrite(void *vzw, void *buf, int n)
           17 {
           18         ZWrite *zw;
           19 
           20         zw = vzw;
           21         zw->adler = adler32(zw->adler, buf, n);
           22         n = (*zw->w)(zw->wr, buf, n);
           23         if(n <= 0)
           24                 return n;
           25         return n;
           26 }
           27 
           28 int
           29 inflatezlib(void *wr, int (*w)(void*, void*, int), void *getr, int (*get)(void*))
           30 {
           31         ZWrite zw;
           32         ulong v;
           33         int c, i;
           34 
           35         c = (*get)(getr);
           36         if(c < 0)
           37                 return FlateInputFail;
           38         i = (*get)(getr);
           39         if(i < 0)
           40                 return FlateInputFail;
           41 
           42         if(((c << 8) | i) % 31)
           43                 return FlateCorrupted;
           44         if((c & ZlibMeth) != ZlibDeflate
           45         || (c & ZlibCInfo) > ZlibWin32k)
           46                 return FlateCorrupted;
           47 
           48         zw.wr = wr;
           49         zw.w = w;
           50         zw.adler = 1;
           51         i = inflate(&zw, zlwrite, getr, get);
           52         if(i != FlateOk)
           53                 return i;
           54 
           55         v = 0;
           56         for(i = 0; i < 4; i++){
           57                 c = (*get)(getr);
           58                 if(c < 0)
           59                         return FlateInputFail;
           60                 v = (v << 8) | c;
           61         }
           62         if(zw.adler != v)
           63                 return FlateCorrupted;
           64 
           65         return FlateOk;
           66 }