(* CVT2XXX.PAS -- meta-converter for pcGeos
** Copyright (c) 1995,1996 Jochen Metzinger
**
** This program is free software; you can redistribute it and/or modify
** it under the terms of the GNU General Public License as published by
** the Free Software Foundation; either version 2, or (at your option)
** any later version.
**
** This program is distributed in the hope that it will be useful,
** but WITHOUT ANY WARRANTY; without even the implied warranty of
** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
** GNU General Public License for more details.
**
** You should have received a copy of the GNU General Public License
** along with this program; if not, write to the Free Software
** Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*)

(*$M 8192,0,0 <-- have to be able to execute programs *)
PROGRAM cvt2xxx;

USES DOS, global, geos, coding, errors, jobs, batch;

VAR
 file_name, dir_name: STRING;
 verbose, do_batch: BOOLEAN;
 dir_search: SearchRec;
 info: InfoRec;
 job: STRING;

PROCEDURE usage;
BEGIN
 WriteLn('CVT2XXX  Version 0.3',country,'  Convert GEOS files');
 WriteLn('Copyright (c) 1995,1996 Jochen Metzinger ');
 WriteLn;
 WriteLn(short_usage);
 WriteLn;
 WriteLn('  filename    convert this file(s)');
 WriteLn('  batch       create coverting .BAT file');
 WriteLn('    /V          verbose running commands');
 Write('    /G          german');
 IF default_code = ge_coding THEN Write(' [default]');
 WriteLn;
 Write('    /E          english');
 IF default_code = uk_coding THEN Write(' [default]');
 WriteLn;
 HALT(1);
END; (* usage *)

PROCEDURE Init;
 VAR i, j: WORD; par: STRING;
  bat_name: STRING;
  D: DirStr; N: NameStr; E: ExtStr;
BEGIN
 short_usage := 'CVT2XXX [/?] filename [batch] [options]';
 file_name := ''; bat_name := ''; verbose := FALSE;
 IF ParamCount = 0 THEN
  usage;
 FOR i := 1 TO ParamCount DO BEGIN
  par := ParamStr(i);
  IF (par[1] = '/') OR (par[1] = '-') THEN
   BEGIN
    IF Length(par) = 1 THEN
     FATAL('unknown option '+par);
    FOR j := 2 TO Length(par) DO
     CASE UpCase(par[j]) OF
      '?', 'H': usage;
      'V': verbose := TRUE;
      'G': SetCoding(ge_coding);
      'E': SetCoding(uk_coding);
      ELSE FATAL('unknown option '+par);
     END; (* case *)
   END
  ELSE IF file_name = '' THEN
   file_name := AddExt(par, '.CVT')
  ELSE IF bat_name = '' THEN
   bat_name := AddExt(par, '.BAT')
  ELSE
   FATAL('too many arguments');
 END; (* for *)
 IF file_name = '' THEN usage;
 job_init;
 FSplit(file_name,D,N,E);
 dir_name := D; file_name := N+E;
 do_batch := (bat_name <> '');
 IF do_batch THEN BEGIN
  bat_open(bat_name);
  IF NOT verbose THEN
   bat_line('@ECHO=OFF');
 END; (* if *)
 short_usage := '';
END; (* init *)

FUNCTION get_info(file_name: STRING; VAR info: InfoRec): BOOLEAN;
 VAR cvt_file: FILE; result: WORD; magic: STRING;
BEGIN
 get_info := FALSE;
 (* open file *)
 (*$I-*)
 Assign(cvt_file, file_name);
 FileMode := FileMode_RO;
 Reset(cvt_file,1);
 FileMode := FileMode_RW;
 IF IOResult <> 0 THEN BEGIN
  message('unable to open file ');
  EXIT;
 END; (* if *)
 (*$I+*)
 (* handle .cvt header *)
 BlockRead(cvt_file,info,SizeOf(info),result);
 IF result <> SizeOf(info) THEN BEGIN
  Close(cvt_file);
  message('not a formatted GEOS file V1.0');
  EXIT;
 END; (* if *)
 magic := GetString(info.b[32], 28);
 IF (magic <> 'SEQ formatted GEOS file V1.0') AND
    (magic <> 'PRG formatted GEOS file V1.0') THEN BEGIN
  Close(cvt_file);
  message('not a formatted GEOS file V1.0');
  EXIT;
 END; (* if *)
 (* handle info record *)
 BlockRead(cvt_file, info, SizeOf(info), result);
 Close(cvt_file);
 IF result <> SizeOf(info) THEN BEGIN
  message('file too short');
  EXIT;
 END; (* if *)
 get_info := TRUE;
END; (* get_info *)

PROCEDURE create_batch(job: STRING);
 VAR next: LongInt; use_next, use_end: BOOLEAN;
BEGIN
 IF NOT verbose THEN
  bat_line('ECHO '+file_name+':');
 next := 1;
 use_end := FALSE;
 REPEAT
  use_next := FALSE;
  REPEAT
   bat_line(job);
   job := job_next(0);
   IF job <> '' THEN BEGIN
    bat_line('IF ERRORLEVEL 1 GOTO '+bat_nr+'-'+long2str(next,0));
    use_next := TRUE;
   END; (* if *)
  UNTIL job = '';
  job := job_next(1);
  IF job <> '' THEN BEGIN
   bat_line('IF NOT ERRORLEVEL 1 GOTO end'+bat_nr);
   use_end := TRUE;
  END; (* if *)
  IF use_next THEN BEGIN
   bat_line(':'+bat_nr+'-'+long2str(next,0));
   Inc(next);
  END; (* if *)
 UNTIL job = '';
 IF use_end THEN
  bat_line(':end'+bat_nr);
 bat_inc;
END; (* create_batch *)

PROCEDURE execute(job: STRING);
BEGIN
 REPEAT
  IF verbose THEN message(job);
  SwapVectors;
  Exec(GetEnv('COMSPEC'), '/C '+job);
  SwapVectors;
  IF DosError <> 0 THEN
   FATAL('dos error #'+long2str(DosError,0));
  job := job_next(DosExitCode);
 UNTIL job = '';
END; (* execute *)


BEGIN
 Init;
 FindFirst(dir_name+file_name, Hidden OR SysFile, dir_search);
 IF DosError <> 0 THEN
  FATAL('no file found');
 WHILE DosError = 0 DO BEGIN
  file_name := dir_name+dir_search.Name;
  message('*** '+file_name+' ***');
  IF get_info(file_name, info) THEN BEGIN
   job := job_first(info, file_name);
   IF job = '' THEN
    message('no converter for '+file_name+'defined')
   ELSE IF do_batch THEN
    create_batch(job)
   ELSE
    execute(job);
  END; (* if *)
  FindNext(dir_search);
 END; (* while *)
 IF do_batch THEN
  bat_close;
END. (* cvt2xxx *)
