Google
 

Trailing-Edge - PDP-10 Archives - decuslib20-03 - decus/20-0078/libsim/getrad.sim
There is 1 other file named getrad.sim in the archive. Click here to see a list.
! INTEGER PROCEDURE GETRADIX converts a text T containing
! an item in base BASE to the corresponding base-10 integer.
!
! If BASE <= 10 only the characters 012...(BASE-1) may be used.
! If BASE = 16 or -16 then the char:s 0..9 A..F may be used.
! For all other bases the sequence should be written:
! 01...9(10)(11)(12)....
! Note that texts containing illegal characters will
! always be (somehow) interpreted.
!
! C.f. TEXT PROCEDURE RADIX.
!
! Author: Mats Ohlin, FOA 1, Fack, S-104 50 STOCKHOLM, SWEDEN.
! Date: 76-12-10
;
OPTIONS(/E/C/-Q/-A/-I/-D);
EXTERNAL CHARACTER PROCEDURE fetchar;
EXTERNAL TEXT PROCEDURE from;
INTEGER PROCEDURE getradix(base,t);
INTEGER base;   TEXT t;
IF t = "0" THEN error: getradix:= 0 ELSE
IF base > 1 OR base < -1 THEN
BEGIN   INTEGER sum,b,i,flag;   CHARACTER c;
BOOLEAN neg,signflag;

    ! Skip leading blanks and sign;
    FOR c:= fetchar(t,1) WHILE c = ' ' OR c = '+'
    OR c = '-' DO
    BEGIN   t:- from(t,2);
	IF c = '-' OR c = '+' THEN
	BEGIN   neg:= c = '-';
	    IF signflag THEN GO TO error;
	    signflag:= TRUE;
	END sign;
    END c loop;

    ! Check first char;
    IF (IF c = '(' OR Digit(c) THEN TRUE
    ELSE 'A' <= c AND c <= 'F' AND (base = 16 OR
    base = -16) ) THEN
    BEGIN
	! See how long the item is;
	t.Setpos(1);
	WHILE t.More DO
	BEGIN   c:= t.Getchar;
	    IF Digit(c) THEN !ok; ELSE
	    IF c = '(' THEN flag:= flag + 1 ELSE
	    IF c = ')' THEN flag:= flag - 1 ELSE
	    IF 'A' <= c AND c <= 'F' AND (base = 16 OR
	    base = -16) THEN ! OK; ELSE
	    GO TO endoft;
	    IF flag < 0 THEN GO TO endoft ELSE
	    IF flag > 1 THEN
	    BEGIN   t.Setpos(t.Pos-2);
	    GO TO endoft   END;

	END more loop;
	endoft:   IF t.More THEN t:- t.Sub(1,t.Pos-1);

	! Start summation;
	b:= 1;
	FOR i:= t.Length STEP -1 UNTIL 1 DO
	BEGIN
	    c:= fetchar(t,i);
	    IF c NE ')' THEN
	    sum:= sum + b*(Rank(c)-(IF Letter(c) THEN 55
	    ELSE 48)) ELSE
	    BEGIN
		i:= i - 2;
		FOR c:= fetchar(t,i) WHILE c NE '(' AND i > 1
		DO i:= i - 1;
		IF i > 0 THEN sum:= sum + b*from(t,i+1).Getint;
	    END (..) ;
	    IF i > 1 THEN b:= b*base;
	END i loop;
	getradix:= sum*(IF neg THEN -1 ELSE 1)
    END starts with ( or Digit
END getradix;