(* CVT_INFO.PAS -- get information from a GEOS file
** 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.
*)

PROGRAM cvt_info;

USES global, geos, coding, errors, cvt;

CONST
 FileTypName: ARRAY [$0..$7] OF STRING[3] =
  ('DEL', 'SEQ', 'PRG', 'USR',
   'REL', '?05', '?06', '?07');

 GeosTypeName: ARRAY [0..15] OF STRING[4] =
  ('C=64', 'BAS',  'ASM',  'DATA', 'SYS',
   'HELP', 'APPL', 'DOC',  'FONT', 'PRT',
   'IN',   'DISK', 'STRT', 'TMP',  'SELF',
   'MOUS');

VAR
 line: INTEGER;
 info: InfoRec;
 i: INTEGER;
 result: WORD;

PROCEDURE usage;
BEGIN
 WriteLn('CVT_INFO  Version 0.3',country,'  Show the info chain of a GEOS file');
 WriteLn('Copyright (c) 1995,1996 Jochen Metzinger ');
 WriteLn;
 WriteLn(short_usage);
 WriteLn;
 WriteLn('  filename    GEOS file');
 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;
  in_name: STRING;
BEGIN
 short_usage := 'CVT_INFO [/?] filename [options]';
 in_name := '';
 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;
      'G': SetCoding(ge_coding);
      'E': SetCoding(uk_coding);
      ELSE FATAL('unknown option '+par);
     END; (* case *)
   END
  ELSE IF in_name = '' THEN
   in_name := AddExt(par, CVT_EXT)
  ELSE
   FATAL('too many arguments');
 END; (* for *)
 IF in_name = '' THEN usage;
 cvt_open(in_name);
 short_usage := '';
END; (* init *)

PROCEDURE NewLine;
 VAR i, j: BYTE;
  b0, b1, b: BYTE;
BEGIN
 WriteLn;
 i := 2*line;
 IF i <= 21 THEN BEGIN
  i := 3*i;
  FOR j := 0 TO 2 DO BEGIN
   b0 := info.icon[j+i];
   IF i <= 62-5
    THEN b1 := info.icon[j+i+3]
    ELSE b1 := 0;
   FOR b := 1 TO 8 DO BEGIN
    IF b0 AND $80 = 0 THEN
     IF b1 AND $80 = 0 THEN
      Write(' ')
     ELSE
      Write('Ü')
    ELSE
     IF b1 AND $80 = 0 THEN
      Write('ß')
     ELSE
      Write('Û');
    b0 := (b0 AND $7F) SHL 1;
    b1 := (b1 AND $7F) SHL 1;
   END; (* for *)
  END; (* for *)
  Write('  ');
 END; (* if *)
 Inc(line);
END;(* NewLine *)

BEGIN (* cvt_info *)
 Init;
 cvt.cvt_info(info);
 cvt_close;
 line := 0;
 NewLine;
 WITH info DO BEGIN
  Write('File: ', cvt_name,'  <',ParamStr(1),'>');
  NewLine;
  Write('Type: ',FileTypName[ftyp AND $07],',');
  IF gtyp > 15
   THEN Write('??',HexStr(gtyp,2),',')
   ELSE Write(GeosTypeName[gtyp],',');
  IF strk = 0 THEN
   Write('SEQ')
  ELSE IF strk = 1 THEN
   Write('VLIR')
  ELSE
   Write('??',HexStr(strk,2));
  NewLine;
  Write('Program: ',HexStr(prg_start,4),'-');
  Write(HexStr(prg_end,4),'  Start: ',HexStr(sys_addr,4));
  NewLine;
  NewLine;
  Write('Class      : ');
  i := 1;
  WHILE i <= 20 DO BEGIN
   IF class[i] = #0
    THEN i := 20
    ELSE Write(TransChr(class[i]));
   Inc(i);
  END; (* while *)
  NewLine;
  IF gtyp <> 8 THEN
   BEGIN (* no font *)
    Write('Disk/Author: ');
    i := 1;
    WHILE i <= 20 DO BEGIN
     IF disk[i] = #0
      THEN i := 20
      ELSE Write(TransChr(disk[i]));
     Inc(i);
    END; (* while *)
    NewLine;
    Write('Generator  : ');
    i := 1;
    WHILE i <= 20 DO BEGIN
     IF appl[i] = #0
      THEN i := 20
      ELSE Write(TransChr(appl[i]));
     Inc(i);
    END; (* while *)
    NewLine;
   END
  ELSE
   BEGIN (* font *)
    Write('FontID     : 0x',HexStr(w[128 DIV 2],4),'  ',w[64]);
    NewLine;
    Write('Sizes      :');
    i := 130 DIV 2;
    WHILE i <= 160 DIV 2 DO BEGIN
     IF w[i] = 0
      THEN i := 255
      ELSE Write(' ',w[i] AND $003F);
     Inc(i);
    END; (* while *)
    NewLine;
   END; (* else *)
  NewLine;
  Write('Intern     :');
  FOR i := 01 TO 12 DO Write(' ',HexStr(intern[i],2));
  NewLine;
  Write('            ');
  FOR i := 13 TO 23 DO Write(' ',HexStr(intern[i],2));
  WHILE line <= 11 DO NewLine;
  Write('Info text: ');
  i := 1;
  WHILE i <= 96 DO BEGIN
   IF text[i] = #0 THEN
    i := 96
   ELSE IF text[i] = #13 THEN
    WriteLn
   ELSE
    Write(TransChr(text[i]));
   Inc(i);
  END; (* while *)
  WriteLn;
 END; (* with *)
END. (* cvt_info *)
