| 1 | (*
|
|---|
| 2 | (c) copyright 1988 by the Vrije Universiteit, Amsterdam, The Netherlands.
|
|---|
| 3 | See the copyright notice in the ACK home directory, in the file "Copyright".
|
|---|
| 4 | *)
|
|---|
| 5 |
|
|---|
| 6 | (*$R-*)
|
|---|
| 7 | IMPLEMENTATION MODULE Conversions;
|
|---|
| 8 | (*
|
|---|
| 9 | Module: numeric-to-string conversions
|
|---|
| 10 | Author: Ceriel J.H. Jacobs
|
|---|
| 11 | Version: $Header: /cvsup/minix/src/lib/ack/libm2/Conversion.mod,v 1.1 2005/10/10 15:27:46 beng Exp $
|
|---|
| 12 | *)
|
|---|
| 13 |
|
|---|
| 14 | PROCEDURE ConvertNum(num, len, base: CARDINAL;
|
|---|
| 15 | neg: BOOLEAN;
|
|---|
| 16 | VAR str: ARRAY OF CHAR);
|
|---|
| 17 | VAR i: CARDINAL;
|
|---|
| 18 | r: CARDINAL;
|
|---|
| 19 | tmp: ARRAY [0..20] OF CHAR;
|
|---|
| 20 | BEGIN
|
|---|
| 21 | i := 0;
|
|---|
| 22 | REPEAT
|
|---|
| 23 | r := num MOD base;
|
|---|
| 24 | num := num DIV base;
|
|---|
| 25 | IF r <= 9 THEN
|
|---|
| 26 | tmp[i] := CHR(r + ORD('0'));
|
|---|
| 27 | ELSE
|
|---|
| 28 | tmp[i] := CHR(r - 10 + ORD('A'));
|
|---|
| 29 | END;
|
|---|
| 30 | INC(i);
|
|---|
| 31 | UNTIL num = 0;
|
|---|
| 32 | IF neg THEN
|
|---|
| 33 | tmp[i] := '-';
|
|---|
| 34 | INC(i)
|
|---|
| 35 | END;
|
|---|
| 36 | IF len > HIGH(str) + 1 THEN len := HIGH(str) + 1; END;
|
|---|
| 37 | IF i > HIGH(str) + 1 THEN i := HIGH(str) + 1; END;
|
|---|
| 38 | r := 0;
|
|---|
| 39 | WHILE len > i DO str[r] := ' '; INC(r); DEC(len); END;
|
|---|
| 40 | WHILE i > 0 DO str[r] := tmp[i-1]; DEC(i); INC(r); END;
|
|---|
| 41 | WHILE r <= HIGH(str) DO
|
|---|
| 42 | str[r] := 0C;
|
|---|
| 43 | INC(r);
|
|---|
| 44 | END;
|
|---|
| 45 | END ConvertNum;
|
|---|
| 46 |
|
|---|
| 47 | PROCEDURE ConvertOctal(num, len: CARDINAL; VAR str: ARRAY OF CHAR);
|
|---|
| 48 | BEGIN
|
|---|
| 49 | ConvertNum(num, len, 8, FALSE, str);
|
|---|
| 50 | END ConvertOctal;
|
|---|
| 51 |
|
|---|
| 52 | PROCEDURE ConvertHex(num, len: CARDINAL; VAR str: ARRAY OF CHAR);
|
|---|
| 53 | BEGIN
|
|---|
| 54 | ConvertNum(num, len, 16, FALSE, str);
|
|---|
| 55 | END ConvertHex;
|
|---|
| 56 |
|
|---|
| 57 | PROCEDURE ConvertCardinal(num, len: CARDINAL; VAR str: ARRAY OF CHAR);
|
|---|
| 58 | BEGIN
|
|---|
| 59 | ConvertNum(num, len, 10, FALSE, str);
|
|---|
| 60 | END ConvertCardinal;
|
|---|
| 61 |
|
|---|
| 62 | PROCEDURE ConvertInteger(num: INTEGER;
|
|---|
| 63 | len: CARDINAL;
|
|---|
| 64 | VAR str: ARRAY OF CHAR);
|
|---|
| 65 | BEGIN
|
|---|
| 66 | IF (num < 0) AND (num >= -MAX(INTEGER)) THEN
|
|---|
| 67 | ConvertNum(-num, len, 10, TRUE, str);
|
|---|
| 68 | ELSE
|
|---|
| 69 | ConvertNum(CARDINAL(num), len, 10, num < 0, str);
|
|---|
| 70 | END;
|
|---|
| 71 | END ConvertInteger;
|
|---|
| 72 |
|
|---|
| 73 | END Conversions.
|
|---|