%OWNBYTEINTEGERARRAYNAME TOKENS %OWNINTEGER TOKENPTR,IVALUE,CTYPE %OWNLONGREAL CVALUE %INTEGERFN CONST(%INTEGER MODE) !*********************************************************************** !* MODE=0 FOR NORMAL MODE=2 INTEGER CONSTANTS * !* %RESULT=0 for failure, %RESULT=1 if vali constant found * !* If ok then ctype=1 for integer const,=2 for real const * !* real value put into global CVALUE, if integer then it * !* the integer part is put into global ivalue * !*********************************************************************** %INTEGER I,Z %LONGLONGREAL CV,X CV=0; I=TOKENS(TOKENPTR); CTYPE=1 IVALUE=0; ->N %IF M'0'<=I<=M'9' ->DOT %IF I='.' %AND MODE=0 ! 1 digit is the MINIMUM constant %IF I='@' %AND MODE=0 %THEN CV=1 %AND ->ALPHA %RESULT=0 N: I=I&15; CV=10*CV+I TOKENPTR=TOKENPTR+1; I=TOKENS(TOKENPTR) ->N %IF M'0'<=I<=M'9' ->ALPHA %UNLESS MODE=0 %AND I='.' DOT: TOKENPTR=TOKENPTR+1; X=10; CTYPE=2 I=TOKENS(TOKENPTR) %RESULT=0 %UNLESS '0'<=I<='9'; ! '23.' NOT VALID IN ALGOL %WHILE '0'<=I<='9' %CYCLE CV=CV+(I&15)/X X=10*X; TOKENPTR=TOKENPTR+1 I=TOKENS(TOKENPTR) %REPEAT ALPHA: ! TEST FOR EXPONENT ->FIX %UNLESS MODE=0 %AND TOKENS(TOKENPTR)='@' TOKENPTR=TOKENPTR+1; X=CV; CTYPE=2 Z=1 I=TOKENS(TOKENPTR) %IF I='+' %OR I='-' %START Z=-1 %IF I='-' TOKENPTR=TOKENPTR+1 %FINISH %RESULT=0 %IF CONST(2)=0; ! no valid exponent IVALUE=IVALUE*Z; ! apply sign CTYPE=2 %RESULT=0 %UNLESS-78<=IVALUE<=78 %OR IVALUE=-99; ! OUTSIDE RANGE %IF IVALUE=-99 %THEN CV=0 %ELSE CV=X*10**IVALUE FIX: ! SEE IF IT IS INTEGER CVALUE=CV; ! imp uses load rounded (pds hopes) %IF CTYPE=1 %THEN CTYPE=2 %ANDRESULT=1 %RESULT=0 %IF CV>X'7FFFFFFF'; ! too big to be an integer IVALUE=INT(CV) CTYPE=1; %RESULT=1 %END %ENDOFFILE