Trailing-Edge
-
PDP-10 Archives
-
decuslib20-03
-
decus/20-0078/libsim/radix.sim
There is 1 other file named radix.sim in the archive. Click here to see a list.
! TEXT PROCEDURE RADIX returns a text containing
! the representation of input I in radix BASE.
! BASE may be negative but not -1 or zero.
! Resulting text will never contain blanks.
! If BASE = 16 then sequence 0123456789ABCDEF will be used,
! otherwise if BASE > 10 then
! the sequence 0123456789(10)(11)(12)... will be used.
!
! C.f. INTEGER PROCEDURE GETRADIX
!
! Author: Mats Ohlin, FOA 1, Fack, S-104 50 STOCKHOLM, SWEDEN.
! Date: 76-12-10
;
OPTIONS(/E/C/-Q/-A/-I/-D);
TEXT PROCEDURE radix(base,i); INTEGER base,i;
IF i = 0 THEN radix:- Copy("0") ELSE
IF base = 0 OR base = -1 OR base = 1 THEN radix:- Copy("*") ELSE
BEGIN INTEGER j,ndig,abase; BOOLEAN neg;
TEXT t; REF (dig) xdig;
CLASS dig(c); CHARACTER c;
BEGIN REF (dig) next;
next:- xdig; xdig:- THIS dig;
ndig:= ndig + 1;
END dig;
abase:= base*Sign(base);
IF base > 0 THEN neg:= i < 0;
IF neg THEN i:= -i;
WHILE i NE 0 DO
BEGIN j:= Mod(i,base);
IF j < 0 THEN
BEGIN j:= j - base; i:= i + base END;
! 48 = '0' 55 + 10 = 'A' ;
IF j <= 9 THEN NEW dig(Char(j+48)) ELSE
IF abase = 16 THEN NEW dig(Char(j+55)) ELSE
BEGIN NEW dig(')');
WHILE j NE 0 DO
BEGIN NEW dig(Char(Mod(j,10)+48)); j:= j//10 END;
NEW dig('(');
END unusual base;
i:= i//base;
END loop;
IF neg THEN NEW dig('-');
t:- Blanks(ndig);
WHILE xdig =/= NONE DO
BEGIN t.Putchar(xdig.c); xdig:- xdig.next END;
t.Setpos(1);
radix:- t
END radix;