// -*- Mode: C++ -*-

#include <iostream.h>
#include <fstream.h>
#include <stdlib.h>
#include <ht/longchar.h>

ifstream *cmflog;
ofstream *ctex;
char mflogfilename[256];
char texfilename[256];
bool used[256];

int readnumber ()
{
  int result, c;
  while ((c=cmflog->get())!=EOF && c!='[');
  if (c==EOF) return -1;
  (*cmflog) >> result;
  return result;
}

void initex()
{
  (*ctex) << "\\documentstyle[german,a4,erwin,fuch]{article}\n\n"
             "\\begin{document}\n";
}

void donetex()
{
  (*ctex) << "\\end{document}\n";
}

void readall ()
{
  int i;
  for (i=0; i<256; i++) used[i]= false;

  while ((i=readnumber ())>=0) used[i]= true;
}

bool validtexchar (int i)
{
  return (i<123) && (i>32) && (i!=60) && (i!=62)
         && !(i>90 && i<97) && (i!=64) && (i!='$')
         && (i!='%') && (i!='#') && (i!='"') && (i!='&');
}

void maketable ()
{
  int const width= 10;
  for (int b=0; b<2; b++) {
    if (b==1)
      (*ctex)<< "\\\\[1cm]";

    (*ctex)<< "\\noindent\\ignorespaces"
              "\\begin{tabular}{|c||c|c|c|c|c|c|c|c||}\\hline\n";

    if (b==0)
      (*ctex)<< "&0x&1x&2x&3x&4x&5x&6x&7x\\\\\\hline\\hline";
    else
      (*ctex)<< "&8x&9x&ax&bx&cx&dx&ex&fx\\\\\\hline\\hline";

    for (int y=0; y<16; y++) {
      (*ctex) << endl
              << "x" << hex << y << "&" << dec;
      for (int x=0; x<8; x++) {
        int i= (b<<7)+y+(x<<4);
        if (used[i]) {
          (*ctex)<<"\\hbox to "<<width<<"pt{\\hfill\\fuch\\char"<<i<<"\\hfill}";
        }
        else
          (*ctex)<<"\\hskip"<<width<<"pt";

        if (validtexchar(i))
          (*ctex)<<"\\char"<<i<<"{}";
        else
          (*ctex)<<"{\\tiny"<<i<<"}";

        if (x==7)
          (*ctex)<<"\\\\\\hline";
        else
          (*ctex)<<"&";
      }
    }
    (*ctex)<< "\\hline\n\\end{tabular}\n";
  }
}

int main (int argc, char *const argv[])
{
  if (argc!=3) {
    cerr
    <<"usage: maketable metafonlogfile.log textablefile.tex"<<endl
    <<"This will create a TeX-file with a table of all used characters."<<endl;
    return 1;
  }
  strcpy (mflogfilename, argv[1]);
  strcpy (texfilename, argv[2]);

  cmflog= new ifstream (mflogfilename);
  readall ();
  delete cmflog;

  ctex= new ofstream (texfilename);
  initex ();
  maketable ();
  donetex ();
  delete ctex;
}

