Program ConsoleToolDemo;

Const
  Length = 80;

Type
  String80 = String[80];

Var
  Win: Ptr;
  Con: Ptr;
  St: String[80];
  z: Long;

 Procedure WriteConInt(Con: ptr;    { Devicehandle }
                       i: Long;     { Zahl, die ausgegeben werden soll }
                       b: integer;  { Basis }
                       f: integer); { Mindest-Feldbreite }
 Var
  s: String[40];
  j,k,z,len: integer;
  i2: Long;
 Begin
  j:=40;
  s[40]:=chr(0);    { Nullbyte am Ende }
  i2:=abs(i);
  Repeat
    j:= j-1;
    z:= i2 mod b;   { letzte Ziffer von i2 }
    If z<10 Then
      s[j]:=chr(z+ord('0'))     { Ziffern 0 bis 10 }
    Else
      s[j]:=chr(z-10+ord('A')); { Hexziffern A bis F }
    i2:= i2 Div b;
  Until i2=0;
  If b=16 Then
    Begin
      j:=j-1;
      s[j]:='$'     { Hexzahlen automatisch mit "$" }
    End;
  If b=2 Then
    Begin
      j:=j-1;
      s[j]:='%'     { Binärzahlen mit "%" }
    End;
  If i<0 Then
    Begin
      j:=j-1;
      s[j]:='-'     { Minuszeichen bei neg. Zahlen }
    End;
  len:=40-j;        { Gesamtlänge der Zahl }
  For k:=1 to f-len Do
    WriteCon(Con, ' ');     { Am Anfang mit Spaces auffüllen }
  WriteCon(Con, Str(^s[j])) { String ab j-tem Zeichen ausgeben }
 End;

 Procedure ReadConString(Con:Ptr; Var s: String80);
   Const
     Backspace = chr(8);
     Return = chr(13);
   Var
     ch: Char;
     i: integer;
     Sig: Long;
   Begin
     i:=1;
     Repeat
       Sig:=Wait(-1);
       ch:=ReadCon(Con);
       If ( (ch >= chr(32)) and (ch < chr(127)) ) or (ch>=chr(160)) Then
         Begin
           WriteCon(Con,ch);
           s[i]:=ch;
           i:=i+1
         End;
       If (ch=BackSpace) and (i>1) Then
         Begin
           WriteCon(Con,''\8' '\8);  { Ein Zeichen zurück, mit Space
                                       überschreiben und wieder zurück }
           i:=i-1
         End;
     Until (ch=Return) or (i>=79);
     s[i]:=chr(0);    { mit Space abschließen }
   End;

 Function Convert(s: String80): Long;
 Var
   i:Long;
   j, b, z, sign: integer;
 Begin
   i:= 0;
   b:= 10;  { Basis }
   j:= 1;   { Stringanfang }
   While s[j]=' ' Do
     j:=j+1;           { führende Spaces überlesen }
   If s[j]='-' Then
     Begin   { negatives Vorzeichen }
       sign:= -1;
       j:=j+1
     End
   Else
     Begin
       sign:= 1;
       If s[j]='+' Then j:=j+1   { Pluszeichen überlesen }
     End;
   If s[j] = '$' Then   { Hexzahl }
     Begin
       b:=16; j:=j+1
     End;
   If s[j] = '%' Then   { Binärzahl }
     Begin
       b:=2; j:=j+1
     End;
   Repeat
     If (s[j] >= '0') and (s[j] <= '9') Then
       z := ord(s[j]) - ord('0')
     Else
     If (s[j] >= 'a') and (s[j] <= 'z') Then
       z := ord(s[j]) - ord('a') + 10
     Else
     If (s[j] >= 'A') and (s[j] <= 'Z') Then
       z := ord(s[j]) - ord('A') + 10
     Else
       z:= -1;  { ungültige Ziffer }
     If z >= b Then
       z:= -1;  { zu groß für Basis }
     If z >= 0 Then
       i:= b*i + z;
     j:= j+1
   Until z<0;
   Convert:= sign*i
 End;


Begin
  Win := Open_Window(0,0,640,200,1,0,$1006,'Test',Nil,640,200,640,200);
  Con := OpenConsole(Win);
  Repeat
    WriteCon(Con, 'Eingabe: ');
    ReadConString(Con, St);
    If St <> '' Then
      Begin
        z:=Convert(St);
        WriteCon(Con,''\n\n); { eine Leerzeile }
        WriteConInt(Con, z, 10, 12); { dezimal, rechtsbündig }
        WriteConInt(Con, z, 16, 12);
        WriteCon(Con,'  ');
        WriteConInt(Con, z,  2,  1); { binär und linksbündig }
        WriteCon(Con, ''\n\n)
      End
  Until St='';        { bei Leerzeile beenden }
  CloseConsole(Con);
  Close_Window(Win)
End.
