#include <stdio.h>  /* version 2008-08-07 */
#define BITS  8
#define  TWO  2        
#define  NL  "\n"
#define alphabet "0123456789abcdefghijklmnopqrstuvwxyzABC"

int main(unsigned argc, char *argv[])
{  int   c;
   unsigned   h, i, lb, k, m, no, len=0, next, bits;
   FILE  *fp, *gp;
   if (argc <= 1)
      return  fprintf(stderr,"usage: %s infile [linelength]\n",argv[0]), 1;
   if ((unsigned char)~0 != (1U<<BITS)-1)
      return  fprintf(stderr,"ERROR  bytes must have exactly %u bits",BITS), 2;
   if (!(fp = fopen (argv[1],"r")))
      return  fprintf(stderr,"can't open %s\n",argv[1]), 3;
   if (argc >= 3  &&  1!=sscanf(argv[2],"%u",&len))
      return  fprintf(stderr,"illegal linelength: %s\n",argv[2]), 3;
   gp = stdout;
   no = 1;
   bits=0;
   lb= -1;
   next= no+len;
   while ( EOF != (c=getc(fp)) )
   {  for (h=0;h<BITS/TWO;h++,c>>=TWO)
      {  for (k=no;!(k&1);k>>=1)
            bits--;
         for (k=0,i=bits;i;k++)
            i >>= 1;
         if (!bits++)
            lb++;
         /* only exception below 2^31 */
         m = lb+k + (no!=2135101487U ? c&(1<<TWO)-1 : 4);
#ifdef  DECIMAL
         fprintf(gp,"%3u", m);
#else
         putc(alphabet[m] , gp);
#endif
         no++;
         if (no == next)
         {  fputs(NL, gp);
            next += len;
         }
      }
   }
   fclose(fp);
   return  0;
}
