URI:
       tinflatezlibblock.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
       ---
       tinflatezlibblock.c (1057B)
       ---
            1 #include <u.h>
            2 #include <libc.h>
            3 #include <flate.h>
            4 #include "zlib.h"
            5 
            6 typedef struct Block        Block;
            7 
            8 struct Block
            9 {
           10         uchar        *pos;
           11         uchar        *limit;
           12 };
           13 
           14 static int
           15 blgetc(void *vb)
           16 {
           17         Block *b;
           18 
           19         b = vb;
           20         if(b->pos >= b->limit)
           21                 return -1;
           22         return *b->pos++;
           23 }
           24 
           25 static int
           26 blwrite(void *vb, void *buf, int n)
           27 {
           28         Block *b;
           29 
           30         b = vb;
           31 
           32         if(n > b->limit - b->pos)
           33                 n = b->limit - b->pos;
           34         memmove(b->pos, buf, n);
           35         b->pos += n;
           36         return n;
           37 }
           38 
           39 int
           40 inflatezlibblock(uchar *dst, int dsize, uchar *src, int ssize)
           41 {
           42         Block bd, bs;
           43         int ok;
           44 
           45         if(ssize < 6)
           46                 return FlateInputFail;
           47 
           48         if(((src[0] << 8) | src[1]) % 31)
           49                 return FlateCorrupted;
           50         if((src[0] & ZlibMeth) != ZlibDeflate
           51         || (src[0] & ZlibCInfo) > ZlibWin32k)
           52                 return FlateCorrupted;
           53 
           54         bs.pos = src + 2;
           55         bs.limit = src + ssize - 6;
           56 
           57         bd.pos = dst;
           58         bd.limit = dst + dsize;
           59 
           60         ok = inflate(&bd, blwrite, &bs, blgetc);
           61         if(ok != FlateOk)
           62                 return ok;
           63 
           64         if(adler32(1, dst, bs.pos - dst) != ((bs.pos[0] << 24) | (bs.pos[1] << 16) | (bs.pos[2] << 8) | bs.pos[3]))
           65                 return FlateCorrupted;
           66 
           67         return bd.pos - dst;
           68 }