(* (c) copyright 1988 by the Vrije Universiteit, Amsterdam, The Netherlands. See the copyright notice in the ACK home directory, in the file "Copyright". *) (*$R-*) IMPLEMENTATION MODULE Conversions; (* Module: numeric-to-string conversions Author: Ceriel J.H. Jacobs Version: $Id$ *) PROCEDURE ConvertNum(num, len, base: CARDINAL; neg: BOOLEAN; VAR str: ARRAY OF CHAR); VAR i: CARDINAL; r: CARDINAL; tmp: ARRAY [0..20] OF CHAR; BEGIN i := 0; REPEAT r := num MOD base; num := num DIV base; IF r <= 9 THEN tmp[i] := CHR(r + ORD('0')); ELSE tmp[i] := CHR(r - 10 + ORD('A')); END; INC(i); UNTIL num = 0; IF neg THEN tmp[i] := '-'; INC(i) END; IF len > HIGH(str) + 1 THEN len := HIGH(str) + 1; END; IF i > HIGH(str) + 1 THEN i := HIGH(str) + 1; END; r := 0; WHILE len > i DO str[r] := ' '; INC(r); DEC(len); END; WHILE i > 0 DO str[r] := tmp[i-1]; DEC(i); INC(r); END; WHILE r <= HIGH(str) DO str[r] := 0C; INC(r); END; END ConvertNum; PROCEDURE ConvertOctal(num, len: CARDINAL; VAR str: ARRAY OF CHAR); BEGIN ConvertNum(num, len, 8, FALSE, str); END ConvertOctal; PROCEDURE ConvertHex(num, len: CARDINAL; VAR str: ARRAY OF CHAR); BEGIN ConvertNum(num, len, 16, FALSE, str); END ConvertHex; PROCEDURE ConvertCardinal(num, len: CARDINAL; VAR str: ARRAY OF CHAR); BEGIN ConvertNum(num, len, 10, FALSE, str); END ConvertCardinal; PROCEDURE ConvertInteger(num: INTEGER; len: CARDINAL; VAR str: ARRAY OF CHAR); BEGIN IF (num < 0) AND (num >= -MAX(INTEGER)) THEN ConvertNum(-num, len, 10, TRUE, str); ELSE ConvertNum(CARDINAL(num), len, 10, num < 0, str); END; END ConvertInteger; END Conversions.