(*---------------------------------------------------------------------------
    :Program.    ConvLibSym.mod
    :Author.     Bernd Preusing
    :Address.    Gerhardstr. 16  D-2200 Elmshorn
    :Phone.      04121/22486
    :Shortcut.   [bep]
    :Version.    1.1
    :Date.       02-Oct-88
    :Copyright.  PD
    :Language.   Modula-II
    :Translator. M2Amiga
    :Imports.    TwoFiles, InOut2 [bep]
    :UpDate.     uses now TwoFiles
    :Contents.   converts a $M- file to a real library file
    :Remark.     
---------------------------------------------------------------------------*)
MODULE ConvLibSym;

(* Aufruf: ConvLibSym {from to}
   Dieses Programm konvertiert ein mittels der Option $M- kompiliertes
   .sym-File in ein echtes Library-Modul (wie Exec, Dos etc.).
   Prozeduren dürfen selbstverständlich nur CODE-Prozeduren sein!
*)

FROM SYSTEM IMPORT
	ADDRESS, ADR, CAST, BYTE;

FROM Arts IMPORT
	CurrentLevel, Terminate, returnVal;

FROM InOut2 IMPORT
	termCh, done, Write, WriteString, WriteLn, Read, ReadCard, ReadString,
        WriteBytes, ReadBytes, WriteCount, ReadCount,
        CloseInput, CloseOutput;

FROM TwoFiles IMPORT
	OpenFiles;

(*------------------------------------------------------------*)


TYPE
	tByte = [0..255];

CONST
	readErr = 'read error';

VAR
	Version:	CARDINAL;
	Long,Long2:	LONGINT;
	Ch:		CHAR;
	NameLen:	tByte;
	Buffer:		ARRAY[0..100] OF tByte;
	LibName:	ARRAY[0..31] OF CHAR;
	LibLength:	LONGINT;


(* $R- $V- *)
PROCEDURE StrLen(str{3}:ADDRESS; max{4}:LONGINT): LONGINT;
BEGIN
 max:=-1;
 DEC(str);
 REPEAT
   INC(str); INC(max)
 UNTIL CAST(tByte,str^)=0;
 RETURN max
END StrLen;
(* $R= $V= *)

PROCEDURE OpenF(): BOOLEAN;
BEGIN
  CloseInput; CloseOutput;
  WriteLn;
  WriteString('Name of library (without .library) ?');
  ReadString(LibName);
  IF NOT done THEN RETURN FALSE END;
  LibLength:=StrLen(ADR(LibName),0);
  REPEAT
    WriteString('minimum version of library?');
    ReadCard(Version);
  UNTIL done;
  RETURN OpenFiles(TRUE,TRUE);
END OpenF;

(* gibt Meldung aus und terminiert *)
PROCEDURE Error(s:ARRAY OF CHAR);
BEGIN
  CloseOutput;
  WriteLn;
  WriteString(s);
  WriteLn;
  WriteString('Programm abgebrochen');
  WriteLn;
  returnVal:=20;
  Terminate(CurrentLevel());
END Error;

BEGIN
  WriteString('M2Amiga library converter V 1.1 ©1988 Bernd Preusing');
  WriteLn;
  WHILE OpenF() DO
    ReadBytes(Long); (* M2Amiga FileKennung *)
    IF NOT done THEN Error(readErr) END;
    IF Long#2 THEN
      Error('Kein M2Amiga-SYM-File!!!')
    END;
    WriteBytes(Long);

    Read(Ch); (* FüllByte ?? *)
    Write(Ch);

    ReadCount(ADR(Buffer),6); (* keys *)
    IF NOT done THEN Error(readErr) END;
    Long:=0;
    WriteBytes(Long); (* ==> pad, libVersion *)
    (* Version *)
    WriteBytes(Version);

    ReadBytes(NameLen);
    IF NOT done THEN Error(readErr) END;
    ReadCount(ADR(Buffer),NameLen);
    IF NOT done THEN Error(readErr) END;
    IF Buffer[NameLen-1] # 3 THEN (* modType *)
      Error('nicht mit Option $M- compiliert')
    END;
    Buffer[NameLen-1]:=2; (* library *)
    Write(CHR(NameLen));
    WriteCount(ADR(Buffer),NameLen); (* ModName fertig *)
    Write(CHR(LibLength+8+1)); (* libName dranhängen *)
    WriteCount(ADR(LibName),LibLength); (* LibName *)
    WriteString('.library');
    
 (* $S- *) (* den haben wir jetzt genug sprapaziert! *)
 
    LOOP (* Rest direkt kopieren *)
      ReadBytes(Ch); (* Read setzt done immer auf TRUE *)
      IF done THEN
        Write(Ch)
      ELSE
        EXIT
      END;
    END;
 
 (* $S= *)
 
    CloseInput; CloseOutput;
    WriteString('Bearbeitung erfolgreich beendet.'); WriteLn;
    WriteString('Nun das neue File auf das alte kopieren!');
    WriteLn;
  END; (* nächste Files *)
  WriteString(' --- fertig ---');
  WriteLn;
 END ConvLibSym.
