/*
    Dieses Programm versucht MultiTeX/CS-TeX ab 3.14 so zu patchen,
    daž der Cork-Tabellen-Hack wirkungslos wird. Damit funktioniert
    das umlaut-package dann einwandfrei.
    VOR DER ANWENDUNG VORSICHTSHALBER EIN BACKUP DES TEX*.TTP ANLEGEN!!!
    VERWENDUNG DES PROGRAMMS AUF EIGENE GEFAHR!!!!
    Mehrfaches Patchen spielt keine Rolle.
    (c) Markus Kohm @ KA2, 1994
*/

#include <stdio.h>

int main( int argc, const char *argv[] ) {
  FILE *tex;
  char puffer[128];
  short magic;
  long  ph_tlen;
  long  ph_dlen;
  long  l;
  int i;
  puts( "@(#)CS-TeX-Patch (c) Markus Kohm, Nov 21 1994\n" + 4 );
  if ( argc != 2 ) {
    fputs( "Usage: texpatch <texpath+name>\n", stderr );
    return 1;
  }
  puts( "Open tex: " );
  puts( argv[1] );
  if ( ( tex = fopen( argv[1], "rb+" ) ) == NULL ) {
    perror( "fopen" );
    return 2;
  }
  if ( ( fread( &magic, 2, 1, tex ) != 1 ) ||
       ( fread( &ph_tlen, 4, 1, tex ) != 1 ) ||
       ( fread( &ph_dlen, 4, 1, tex ) != 1 ) ) {
    perror( "fread" );
    fclose( tex );
    return 2;
  }
  if ( fseek( tex, ph_tlen+0x1C, SEEK_SET ) ) {
    perror( "fseek" );
    fclose( tex );
    return 2;
  }
  puts( "Search Cork-table." );
  if ( fread( puffer, 127, 1, tex ) != 1 ) {
    perror( "fread" );
    fclose( tex );
    return 3;
  }
  l = ph_tlen + 0x1C;
  while ( ph_dlen >= 256 ) {
    if ( fread( puffer+127, 1, 1, tex ) != 1 ) {
      perror( "fread" );
      fclose( tex );
      return 3;
    }
    for ( i = 0; (i < 128) && (puffer[i] == i); i++ );
    if ( i == 128 ) {
      puts( "Cork-table found." );
      for ( i = 0; i < 128; i++ )
        puffer[i] = i+128;
      l += 128;
      if ( fseek( tex, l, SEEK_SET ) ) {
        perror( "fseek" );
        fclose( tex );
        return 3;
      }
      if ( fwrite( puffer, 128, 1, tex ) != 1 ) {
        perror( "fwrite" );
        fclose( tex );
        return 4;
      }
      if ( fclose( tex ) ) {
        perror( "fclose" );
        return 4;
      }
      puts( "Cork-table deleted!" );
      return 0;
    }
    ph_dlen--;
    l++;
    for ( i = 0; i < 127; i++ )
      puffer[i] = puffer[i+1];
  }
  fputs( "Cannot find Cork-table!\n", stderr );
  return 3;
}
