LET hexziffern = "123456789ABCDEF";
ROW 4 INT CONST faktoren :: ROW 4 INT : (1, 16, 256, 4096);
INT PROC dez (TEXT CONST hex):
INT VAR stellen := LENGTH hex;
IF stellen > 4
OR stellen > 3 AND (hex SUB 1) > "7"
THEN errorstop ("Zahl zu groß")
FI;
INT VAR i :: 0, stelle, ziffpos;
TEXT VAR ziffer;
FOR stelle FROM 1 UPTO stellen REP
ziffer := hex SUB (stellen - stelle + 1);
ziffpos := pos (hexziffern, ziffer);
IF ziffpos <> 0
THEN i INCR ziffpos * faktoren [stelle]
ELIF ziffer <> "0"
THEN errorstop ("Hexadezimalzahl fehlerhaft")
FI
PER;
i
END PROC dez;
{194 + 76 ; kann nicht durch `replace' zu Beginn verkleinert werden }
TEXT PROC hex (TEXT CONST t dez):
IF t dez = "" THEN LEAVE hex WITH "" FI;
INT VAR stelle, hex ziffer, dez := int (t dez);
TEXT VAR hexzahl := "";
FOR stelle FROM 4 DOWNTO 1 REP
hexziffer := dez DIV faktoren [stelle];
IF hexziffer <> 0
THEN hexzahl CAT (hexziffern SUB hexziffer);
dez DECR hexziffer * faktoren [stelle]
ELSE hexzahl CAT "0"
FI
PER;
hexzahl
END PROC hex;
putline (""1""4"Dezimalzahlen schlicht, Hexadezimalzahlen mit schließendem ""h"" eingeben");
line;
TEXT VAR z;
REP put ("Zahl:");
get (z);
IF (z SUB LENGTH z) = "h"
THEN put (dez (subtext (z, 1, LENGTH z - 1)))
ELSE put (hex (z))
FI
UNTIL z = "" PER