/*---------------------------------*//* Unshrink Zip File entry - Modul *//* Link this with rest.            *//*                                 *//* Ivo van Poorten, May 1993.      *//*---------------------------------*/#include STDIO.H/*---------------------------------*//* ZIP LAYOUT Declarations         *//* No 'typedef struct'-format      *//* because Lightspeed C does not   *//* support that.                   *//*---------------------------------*/extern int siglw,sighw;/* Local_file_header */extern int vneed1,gpb1,cmeth1,ltime1,ldate1;extern int crc1lw,crc1hw;      /* longint */extern int csize1lw,csize1hw;  /* longint */ extern int usize1lw,usize1hw;  /* longint */extern int namelen1,xtralen1;/* Central_directory_file_header */extern int vmb,vneed2,gpb2,cmeth2,ltime2,ldate2;extern int crc2lw,crc2hw;extern int csize2lw,csize2hw;extern int usize2lw,usize2hw;extern int namelen2,xtralen2,commlen1,nrstart;extern int inta;extern int extalw,extahw;extern int relof1lw,relof1hw;/* End_central_dir_record */extern int nrthis,nrdws,totaldt,totald;extern int sizdirlw,sizdirhw;extern int offscdlw,offscdhw;extern int commlen2;/* And a dummy string */extern char dummys[256];/*-----------------*//* Input Variables *//*-----------------*/extern FILE iocb;extern char zipfn[256];extern char command;#define inbufsiz 512char inbuf[inbufsiz];int csize,inpos,incnt,pc,pcbits,pcbitv;/*------------------*//* Output Variables *//*------------------*/extern char filename[256];FILE iocbus;#define outbufsz 512char outbuf[outbufsz];int outcnt,outpos;/*--------------------------*//* UnShrink working storage *//*--------------------------*//* hsize has to be 8192, but due to *//* lack of memory it is 4096. Sadly *//* it can't unshrink files that use *//* 13-bit codes...                  *//* same for max_bits ( has to be 13 */#define max_bits 12#define initbits 9#define hsize 4096#define firstent 257#define clear 256int  prefixof[hsize+1];char suffixof[hsize+1];char stack[hsize+1];int cbits,maxcode,free_ent;int maxcodem,offset,sizex;/*---------------------------------*//* calculate outpos/usize1lw*100   */percent()$(int result;int x,y,t;  result=0;  x=outpos;  x*=2;  for(t=0; t<8; t++)  $(    y=x/usize1lw;    x-=y*usize1lw;    x*=2;    result<<=1;    if(y)      result+=1;  $)  result*=100;  result/=256;  return result;$)/*---------------------------------*/outbyte(x)char x;$(int noppes;  outbuf[outcnt]=x;  outcnt++;  outpos++;  if(outcnt==outbufsz)  $(    noppes=fwrite(outbuf,1,outbufsz,iocbus);    outcnt=0;    printf("\l\l\l\l%3d%%",percent());  $)$)/*---------------------------------*/stop()$(int noppes;  if(outcnt>0)  $(    noppes=fwrite(outbuf,1,outcnt,iocbus);    fclose(iocbus);  $)  printf("\l\l\l\l100%%\n");$)/*---------------------------------*/readbyte(x)int *x;$(  if(incnt==0)  $(    if(csize==0)    $(      return -1;    $)    inpos=inbufsiz;    if(inpos>csize)      inpos=csize;    incnt=fread(inbuf,1,inpos,iocb);    inpos=1;    csize-=incnt;  $)  *x=inbuf[inpos-1];  inpos++;  incnt--;  return 1;$)/*---------------------------------*/readbits(bits,x)int bits,*x;$(  int bit;  int bitv;  int istat;  *x=0;  bitv=1;  for(bit=0; bit<=bits-1; bit++)  $(    if(pcbits>0)    $(      pcbits--;      pcbitv=pcbitv<<1;    $)    else    $(      istat=readbyte(&pc);      pcbits=7;      pcbitv=1;    $)    if((pc&pcbitv)!=0)      *x=*x|bitv;    bitv=bitv<<1;  $)  return istat;$)/*---------------------------------*/partial()$(  int pr,cd;  for(cd=firstent; cd<free_ent; cd++)    prefixof[cd]|=0x8000;  for(cd=firstent; cd<free_ent; cd++)  $(    pr=prefixof[cd] & 0x7fff;    if(pr>=firstent)      prefixof[cd] &= 0x7fff;  $)  for(cd=firstent; cd<free_ent; cd++)    if((prefixof[cd] & 0x8000) != 0)      prefixof[cd]=-1;  free_ent=firstent;  while((free_ent<maxcodem) && (prefixof[free_ent]!=-1))    free_ent++;$)/*---------------------------------*/unshrink()$(int stackp;int finchar;int code;int oldcode;int incode;int inpstat;  printf("Unshrinking %3d%%",0);  iocbus=fopen(filename,"w");  if(iocbus<0)  $(    printf("Can't create %s\n",filename);    exit();  $)  pcbits=0;  incnt=0;  outcnt=0;  outpos=0;  maxcodem=1<<max_bits;  cbits=initbits;  maxcode=(1<<cbits)-1;  free_ent=firstent;  offset=0;  sizex=0;  for(code=maxcodem; code>255; code--)    prefixof[code]=-1;  for(code=255; code>=0; code--)  $(    prefixof[code]=0;    suffixof[code]=code;  $)  csize=csize1lw;  inpstat=readbits(cbits,&oldcode);  if(inpstat==-1)  $(    stop();    return;  $)  finchar=oldcode;  outbyte(finchar);  stackp=0;  while(inpstat!=-1)  $(    inpstat=readbits(cbits,&code);    if(inpstat==-1)    $(      stop();      return;    $)    while(code==clear)    $(      inpstat=readbits(cbits,&code);      switch(code)      $(        case 1:        $(          cbits++;          if(cbits==max_bits)            maxcode=maxcodem;          else            maxcode=(1<<cbits)-1;        $)        break;        case 2:          partial();        break;      $)      inpstat=readbits(cbits,&code);      if(inpstat==-1)      $(        stop();        return;      $)    $)    incode=code;    if(prefixof[code]==-1)    $(      stack[stackp]=finchar;      stackp++;      code=oldcode;    $)    while(code>=firstent)    $(      stack[stackp]=suffixof[code];      stackp++;      code=prefixof[code];    $)    finchar=suffixof[code];    stack[stackp]=finchar;    stackp++;    while(stackp>0)    $(      stackp--;      outbyte(stack[stackp]);    $)    code=free_ent;    if(code<maxcodem)    $(      prefixof[code]=oldcode;      suffixof[code]=finchar;      while((free_ent<maxcodem) && (prefixof[free_ent]!=-1))        free_ent++;    $)    oldcode=incode;  $)  stop();$)/*---------------------------------*/