home *** CD-ROM | disk | FTP | other *** search
- (*-------------------------------------------------------------------------*)
- (* *)
- (* Amiga Oberon Library Module: Conversions Date: 02-Nov-92 *)
- (* *)
- (* © 1992 by Fridtjof Siebert *)
- (* *)
- (*-------------------------------------------------------------------------*)
-
- MODULE Conversions;
-
- IMPORT Str := Strings;
-
- (*------ StringToInt: ------*)
-
- PROCEDURE StringToInt* (VAR str: ARRAY OF CHAR;
- VAR int: LONGINT): BOOLEAN;
-
- (* parst den String nach folgender Grammatik:
-
- digit = "0" | "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9".
- hexdigit = "A" | "B" | "C" | "D" | "E" | "F".
-
- int = hex | dec.
- hex = {hexdigit | digit} "H".
- dec = ["+"|"-"] {digit}.
-
- führende und folgende Spaces werden überlesen. Ergebnis ist TRUE, wenn
- String Element der Grammatik ist und das Ergebnis im LONGINT-Bereich ist.
- Bei Hexzahlen werden automatisch negative, wenn sie >= 80000000H sind.
- Beispiel: FFFFFFF8H = -8.
- *)
-
- VAR
- i,l,n: INTEGER;
- ch: CHAR;
- hex: BOOLEAN;
- neg: BOOLEAN;
-
- PROCEDURE Next;
- BEGIN
- IF i=l THEN ch := 0X ELSE ch := CAP(str[i]); INC(i) END;
- END Next;
-
- BEGIN
- l := SHORT(Str.Length(str));
- WHILE (l>0) & (str[l-1]=" ") DO DEC(l) END;
- hex := (l>0) & (CAP(str[l-1])="H");
- i := 0; int := 0;
- REPEAT Next UNTIL ch#" ";
- IF hex THEN
- n := 0;
- LOOP
- CASE ch OF
- "0".."9":
- IF n=8 THEN RETURN FALSE END;
- (* $OvflChk- *) int := 16*int+ORD(ch)- ORD("0"); | (* $OvflChk= *)
- "A".."F":
- IF n=8 THEN RETURN FALSE END;
- (* $OvflChk- *) int := 16*int+ORD(ch)+(10-ORD("A")); | (* $OvflChk= *)
- ELSE
- RETURN ch="H";
- END;
- Next; INC(n);
- END;
- ELSE
- neg := FALSE;
- CASE ch OF "-","+": neg := ch="-"; Next ELSE END;
- LOOP
- CASE ch OF
- "0".."9":
- n := ORD(ch)-ORD("0");
- IF int>(MAX(LONGINT)-n) DIV 10 THEN RETURN FALSE
- ELSE int := 10*int + n END |
- ELSE
- IF neg THEN int := -int END;
- RETURN ch=0X
- END;
- Next;
- END;
- END;
- END StringToInt;
-
-
- (*------ IntToString: ------*)
-
-
- PROCEDURE IntToString*( int: LONGINT;
- VAR str: ARRAY OF CHAR;
- n: INTEGER): BOOLEAN;
-
- (* wandelt int in n-stellige Dezimalzahl um. LEN(str) muß größer als n+2
- sein. Ergebnis ist FALSE, wenn int zu groß ist. *)
-
- VAR
- mi: BOOLEAN;
- c: INTEGER;
-
- BEGIN
- str[n+1] := 0X; mi := FALSE;
- mi := int=MIN(LONGINT);
- IF mi THEN int := MIN(LONGINT)+1000000000 END;
- IF int<0 THEN int := -int; str[0] := "-" ELSE str[0] := " " END;
- c := n;
- WHILE c>0 DO
- str[c] := CHR(int MOD 10 + ORD("0"));
- int := int DIV 10;
- DEC(c);
- END;
- LOOP
- INC(c);
- IF (str[c]#"0") OR (c=n) THEN EXIT END;
- str[c] := " ";
- END;
- IF mi THEN INC(str[c]) END;
- RETURN int=0;
- END IntToString;
-
-
- (*------ IntToHex: ------*)
-
-
- PROCEDURE IntToHex*( int: LONGINT;
- VAR str: ARRAY OF CHAR;
- n: INTEGER): BOOLEAN;
-
- (* wandelt int in n-stellige Hexzahl um. LEN(str) muß größer als n+2
- sein. Ergebnis ist FALSE, wenn int zu groß ist. *)
-
- VAR
- d: CHAR;
-
- BEGIN
- str[n] := "H"; str[n+1] := 0X;
- WHILE n>0 DO
- DEC(n);
- d := CHR(int MOD 16);
- IF d<0AX THEN INC(d,ORD("0") )
- ELSE INC(d,ORD("A")-10) END;
- str[n] := d;
- int := int DIV 16;
- END;
- RETURN (int=0) OR (int=-1);
- END IntToHex;
-
-
- (*------ StrToInt: ------*)
-
-
- PROCEDURE StrToInt* (VAR str: ARRAY OF CHAR;
- VAR int: LONGINT;
- base: INTEGER): BOOLEAN;
-
- VAR
- i,l,n,z: INTEGER;
- ch: CHAR;
- neg: BOOLEAN;
-
- PROCEDURE Next;
- BEGIN
- IF i=l THEN ch := 0X ELSE ch := CAP(str[i]); INC(i) END;
- END Next;
-
- BEGIN
- l := SHORT(Str.Length(str));
- WHILE (l>0) & (str[l-1]=" ") DO DEC(l) END;
- i := 0; int := 0;
- REPEAT Next UNTIL ch#" ";
- neg := ch="-"; IF neg THEN Next END;
- n := 0;
- LOOP
- CASE ch OF
- "0".."9": z := ORD(ch)- ORD("0") |
- "A".."Z": z := ORD(ch)+(10-ORD("A")) |
- 0X: EXIT |
- ELSE RETURN FALSE END;
- IF (z>=base) OR (int>(MAX(LONGINT)-z) DIV base) THEN RETURN FALSE END;
- int := base*int+z;
- Next; INC(n);
- END;
- IF neg THEN int := - int END;
- RETURN TRUE;
- END StrToInt;
-
-
- (*------ IntToStr: ------*)
-
-
- PROCEDURE IntToStr* (int: LONGINT;
- VAR str: ARRAY OF CHAR;
- base,width: SHORTINT;
- fillChar: CHAR): BOOLEAN;
-
- VAR
- d: INTEGER;
- neg,inv: BOOLEAN;
-
- BEGIN
- str[width] := 0X; inv := int<0; int := ABS(int);
- neg := inv & (base=10); IF neg THEN inv := FALSE END;
- WHILE width>0 DO
- DEC(width);
- d := SHORT(int MOD base);
- IF inv & (d#0) THEN d := base-d END;
- IF d<10 THEN INC(d,ORD("0") )
- ELSE INC(d,ORD("A")-10) END;
- str[width] := CHR(d);
- int := int DIV base;
- IF int=0 THEN
- IF inv THEN IF base<10 THEN fillChar := CHR(base+(ORD("0")- 1))
- ELSE fillChar := CHR(base+(ORD("A")-11)) END; END;
- IF neg THEN
- IF width<=0 THEN RETURN FALSE
- ELSE DEC(width); str[width] := "-" END;
- END;
- WHILE width>0 DO DEC(width); str[width] := fillChar END;
- RETURN TRUE;
- END;
- END;
- RETURN (int=0) OR (int=-1);
- END IntToStr;
-
-
- (*------ IntToStringLeft: ------*)
-
-
- PROCEDURE IntToStringLeft* (int: LONGINT; VAR str: ARRAY OF CHAR);
-
- VAR
- index: INTEGER;
-
- PROCEDURE IToS(int: LONGINT);
- BEGIN
- IF int>9 THEN IToS(int DIV 10) END;
- IF index<LEN(str) THEN
- str[index] := CHR(int MOD 10 + ORD("0"));
- INC(index);
- END;
- END IToS;
-
- BEGIN
- index := 0;
- IF int<0 THEN
- str[0] := "-";
- index := 1;
- int := -int;
- END;
- IToS(int);
- IF index<LEN(str) THEN str[index] := 0X END;
- END IntToStringLeft;
-
-
- END Conversions.
-
-
-