This is vario.c in view mode; [Download] [Up]
/****************************************************************************** * * * Copyright (C) 1992,1993,1994 Tony Robinson * * * * See the file LICENSE for conditions on distribution and usage * * * ******************************************************************************/ # include <math.h> # include <stdio.h> # include "shorten.h" extern char *argv0; # define MASKTABSIZE 33 ulong masktab[MASKTABSIZE]; void mkmasktab() { int i; ulong val = 0; masktab[0] = val; for(i = 1; i < 33; i++) { val <<= 1; val |= 1; masktab[i] = val; } } static uchar *putbuf; static uchar *putbufp; static ulong pbuffer; static int nbitput; void var_put_init(stream) FILE *stream; { mkmasktab(); putbuf = (uchar*) pmalloc((ulong) BUFSIZ); putbufp = putbuf; pbuffer = 0; nbitput = 0; } static uchar *getbuf; static uchar *getbufp; static int nbyteget; static ulong gbuffer; static int nbitget; void var_get_init(stream) FILE *stream; { mkmasktab(); getbuf = (uchar*) pmalloc((ulong) BUFSIZ); getbufp = getbuf; nbyteget = 0; gbuffer = 0; nbitget = 0; } void word_put(buffer, stream) ulong buffer; FILE *stream; { *putbufp++ = buffer >> 24; *putbufp++ = buffer >> 16; *putbufp++ = buffer >> 8; *putbufp++ = buffer; if(putbufp - putbuf == BUFSIZ) { if(fwrite((char*) putbuf, 1, BUFSIZ, stream) != BUFSIZ) update_exit(1, "failed to write compressed stream\n"); putbufp = putbuf; } } void uvar_put(val, nbin, stream) ulong val; int nbin; FILE *stream; { ulong lobin = (1L << nbin) | (val & masktab[nbin]); /* SAL */ ulong nsd = val >> nbin; int i, nlobin = nbin + 1; if(nbitput + nsd >= 32) { for(i = 0; i < (nbitput + nsd) >> 5; i++) { word_put(pbuffer, stream); pbuffer = 0; } nbitput = (nbitput + nsd) % 32; } else nbitput += nsd; while(nlobin != 0) { if(nbitput + nlobin >= 32) { pbuffer |= (lobin >> (nbitput + nlobin - 32)); word_put(pbuffer, stream); pbuffer = 0; nlobin -= 32 - nbitput; nbitput = 0; } else { nbitput += nlobin; pbuffer |= (lobin << (32 - nbitput)); nlobin = 0; } } } void ulong_put(val, stream) ulong val; FILE *stream; { int i, nbit; for(i = 31; i >= 0 && (val & (1L << i)) == 0; i--); /* SAL */ nbit = i + 1; uvar_put((ulong) nbit, ULONGSIZE, stream); uvar_put(val & masktab[nbit], nbit, stream); } ulong word_get(stream) FILE *stream; { ulong buffer; if(nbyteget < 4) { nbyteget += fread((char*) getbuf, 1, BUFSIZ, stream); if(nbyteget < 4) update_exit(1, "premature EOF on compressed stream\n"); getbufp = getbuf; } buffer = ((long) getbufp[0]) << 24 | ((long) getbufp[1]) << 16 | ((long) getbufp[2]) << 8 | ((long) getbufp[3]); /* SAL */ getbufp += 4; nbyteget -= 4; return(buffer); } long uvar_get(nbin, stream) int nbin; FILE *stream; { long result; if(nbitget == 0) { gbuffer = word_get(stream); nbitget = 32; } for(result = 0; !(gbuffer & (1L << --nbitget)); result++) { /* SAL */ if(nbitget == 0) { gbuffer = word_get(stream); nbitget = 32; } } while(nbin != 0) { if(nbitget >= nbin) { result = (result << nbin) | ((gbuffer >> (nbitget-nbin)) &masktab[nbin]); nbitget -= nbin; nbin = 0; } else { result = (result << nbitget) | (gbuffer & masktab[nbitget]); gbuffer = word_get(stream); nbin -= nbitget; nbitget = 32; } } return(result); } ulong ulong_get(stream) FILE *stream; { int nbit = uvar_get(ULONGSIZE, stream); return(uvar_get(nbit, stream)); } void var_put(val, nbin, stream) long val; int nbin; FILE *stream; { if(val < 0) uvar_put((ulong) ((~val) << 1) | 1L, nbin + 1, stream); else uvar_put((ulong) ((val) << 1), nbin + 1, stream); } void var_put_quit(stream) FILE *stream; { /* flush to a word boundary */ uvar_put((ulong) 0, 31, stream); /* and write out the remaining chunk in the buffer */ if(fwrite((char*) putbuf, 1, putbufp - putbuf, stream) != putbufp - putbuf) update_exit(1, "failed to write compressed stream\n"); free((char*) putbuf); } long var_get(nbin, stream) int nbin; FILE *stream; { ulong uvar = uvar_get(nbin + 1, stream); if(uvar & 1) return((long) ~(uvar >> 1)); else return((long) (uvar >> 1)); } void var_get_quit(stream) FILE *stream; { free((char*) getbuf); } int sizeof_uvar(val, nbin) ulong val; int nbin; { return((val >> nbin) + nbin); } int sizeof_var(val, nbin) long val; int nbin; { return((abs(val) >> nbin) + nbin + 1); }
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.