untermud/DOC/
untermud/DOC/U/
untermud/DOC/U/U-examples/
untermud/DOC/internals/
untermud/DOC/wizard/
untermud/MISC/
untermud/MISC/dbchk/
untermud/RWHO/
untermud/RWHO/rwhod/
/*
    Copyright (C) 1991, Marcus J. Ranum. All rights reserved.
*/

#include    "config.h"

#define DEFAULT_COMPTABLE

#include    "comp.h"

static char ctab[128][128];

void comp_init ()
{
  int i;
  int j;

  for (i = 0; i < 128; i++)
    for (j = 0; j < 128; j++)
      ctab[i][j] = 0;

  for (i = 0; i < 128; i++)
    ctab[(int) ctok[i][0]][(int) ctok[i][1]] = i | 0x80;
}




int compress (FILE * fin, FILE * fout)
{
  char c;
  char nxt = -1;

  while (1) {
    if (nxt == -1)
      c = getc (fin);
    else
      c = nxt;

    nxt = getc (fin);
    if (ferror (fin) || feof (fin)) {
      if (c != -1)
        putc (c, fout);
      return (ferror (fin) == 0);
    }

    if (ctab[(int) c][(int) nxt]) {
      if (fputc (ctab[(int) c][(int) nxt], fout) == EOF)
        return (1);
      nxt = -1;
    } else {
      if (fputc (c, fout) == EOF)
        return (1);
    }

  }
}



int decompress (FILE * fin, FILE * fout)
{
  char c;

  while (1) {
    c = getc (fin);
    if (feof (fin) || ferror (fin))
      return (ferror (fin) == 0);

    if (c & 0x80) {
      putc (ctok[c & 0x7f][0], fout);
      putc (ctok[c & 0x7f][1], fout);
    } else
      putc (c, fout);
  }
}



int main (int ac, char *av[])
{
  comp_init ();
  if (ac < 2)
    exit (compress (stdin, stdout));
  else
    exit (decompress (stdin, stdout));
}