#include <stdio.h> /* version from 2020-03-16 18:40 UTC+1 */
#define  D  1   //  0 for new-style

static unsigned char  table[256][4];


int main(unsigned argc, char *argv[])
{  int   c;
   unsigned   h, i, j, j0, lb, m, n, bits;
   unsigned long   k, no;
   FILE  *fp, *gp;
   if (argc <= 1)
      return  fprintf(stderr,"usage: %s datafile outputfile\n",argv[0]);
   if (!(fp = fopen (argv[1],"r")))
      return  fprintf(stderr,"can't open %s\n",argv[1]), 3;
#ifdef  LOOKUP_TABLE
   if (!(gp = fopen (LOOKUP_TABLE,"r")))
      return  fprintf(stderr,"can't open %s\n",LOOKUP_TABLE), 3;
   n= fread(table, 4, 256, gp);
   fclose(gp);
#else
   if (1 != fread(&n, 4, 1, fp))
      return  fprintf(stderr,"can't read %s\n",argv[1]), 5;
   if (n != fread(table, 4, n, fp))
      return  fprintf(stderr,"insufficient data in %s\n",argv[1]), 6;
#endif
   if (!(gp = fopen (argv[2],"w")))
      return  fprintf(stderr,"can't open %s\n",argv[1]), 3;
   no= 1;
   j0= (no-D)&4-1;
   bits= 0;
   lb= -1;
   m=0;
   while ( EOF != (c=getc(fp)) )
   {  if (c >= n) 
         return  fprintf(stderr,"index=%u is too big for lookup-table\n",c), 8;
      for (j=j0;j<4;j++)
      {  for (k=no;!(k&1);k>>=1)
            bits--;
         for (h=0,i=bits;i;h++)
            i >>= 1;
         if (!bits++)
            lb++;
#ifdef  L_N
         m = lb;
#endif
         m += h + table[c][no-D&4-1];
#ifdef  L_N
         fputc((int)m,gp);
#else
         if ((no&1)^D)
         {
            fputc((int)m,gp);
            m=0;
         }
         else
            m <<= 4;
#endif
         no++;
      }
      j0=0;
   }
   fclose(fp);
   fclose(gp);
   return  no-1;
}
