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.
|
---|