Trailing-Edge
-
PDP-10 Archives
-
BB-H506D-SM_1983
-
cobol/source/num.mac
There are 7 other files named num.mac in the archive. Click here to see a list.
; UPD ID= 2851 on 5/16/80 at 11:52 AM by NIXON
TITLE NUM FOR LIBOL
SUBTTL DETERMINE IF A STRING IS NUMERIC /ACK
;THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY ONLY BE USED
; OR COPIED IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE.
;
;COPYRIGHT (C) 1974, 1981 BY DIGITAL EQUIPMENT CORPORATION
;REVISION HISTORY:
; 16-MAY-80 [631] FIX IF NUMERIC TEST OF EVEN DIGIT COMP-3 ITEM.
; 13-AUG-76 [450] ADD ANSII STD NUMERIC TESTING
; 5/15/75 /DBT BIS
; 13-DEC-74 CREATION.
;*****
SEARCH LBLPRM ;DEFINE PARAMETERS.
%%LBLP==:%%LBLP
EBCMP.==:EBCMP.
TRAILB==:TRAILB
NUMSTD==:NUMSTD ; [450] ADD ANSII STD NUMERIC TESTING
BIS==:BIS
EXTERN EASTB. ;FORCE EASTBL TO BE LOADED.
HISEG
COMMENT \
THIS ROUTINE CHECKS A STRING TO SEE IF IT CONTAINS ONLY NUMERIC
CHARACTERS. IF THE STRING'S PICTURE INDICATES THAT IT MAY CONTAIN
A SIGN, THE SIGN MAY APPEAR IN ANY OR ALL OF THE FOLLOWING POSITIONS
AND NEED NOT BE CONSISTANT.
1. AS A LEADING "+" OR "-".
2. AS A TRAILING "+" OR "-".
3. AS AN 11-OVERPUNCH OR 12-OVERPUNCH IN THE LAST
DIGIT OF THE NUMBER.
CALL:
MOVEI 16,PARAMETER ADDRESS
PUSHJ 17,NUM.6/NUM.7/NUM.9
PARAMETERS:
BITS 0-5 BYTE POINTER RESIDUE FOR THE INPUT FIELD.
BIT 6 1 IF AN OPERATIONAL SIGN IS PRESENT.
BITS 7-17 SIZE OF THE INPUT FIELD.
BITS 18-35 ADDRESS OF THE FIRST CHARACTER OF THE INPUT FIELD.
RETURNS:
CALL+1 IF THE STRING LENGTH IS ZERO OR IS IS NOT
A VALID NUMERIC STRING.
CALL+2 IF THE STRING IS A VALID NUMERIC STRING.
REGISTERS USED:
CH, SW, MASK, JAC, IPTR, CNT, CPTR
\
ENTRY NUM.6 ;IF THE INPUT IS SIXBIT.
ENTRY NUM.7 ;IF THE INPUT IS ASCII.
IFN EBCMP.,<
ENTRY NUM.9 ;IF THE INPUT IS EBCDIC.
>
IFE BIS,<
;LOCAL AC DEFINTIONS:
TPTR==TAC3
TOKE==TAC4
STATE==TAC5
EXTERN SET1. ;PICKS UP THE PARAMETERS.
EXTERN RET.1 ;RETURNS TO CALL+1.
EXTERN PTRTK. ;TABLE OF POINTERS TO THE TOKEN TABLES.
NUM.6: JSP CH, NUM ;ENTER HERE IF THE INPUT IS SIXBIT,
NUM.7: JSP CH, NUM ; HERE IF IT IS ASCII AND
IFN EBCMP.,<
NUM.9: JSP CH, NUM ; HERE IF IT IS EBCDIC.
>
NUM: SUBI CH, NUM.6-5 ;SEE WHAT THE INPUT LOOKS LIKE.
JSP JAC, SET1. ;GO SET UP THE PARAMETERS.
MOVE CPTR, PTRTK.-6(SW) ;GET THE POINTER TO THE TOKEN TABLE.
MOVEI STATE, 1 ;ASSUME WE START IN STATE 1.
SKIPGE SW ;DO WE?
MOVEI STATE, SS ;NO, THE INPUT IS SIGNED. START
; IN STATE SS.
NUM1: ILDB CH, IPTR ;GET THE NEXT CHAR.
LDB TOKE, CPTR ;GET THE TOKEN.
LDB STATE, PTRTBL(TOKE) ;GET THE NEXT STATE.
JUMPE STATE, RET.1 ;IF IT'S ZERO FAIL.
SOJG CNT, NUM1 ;LOOP IF THERE ARE MORE CHARS.
SKIPL STATBL-1(STATE) ;ARE WE IN A FAILURE STATE?
AOS (PP) ;NO, SKIP RETURN.
POPJ PP, ;RETURN.
SUBTTL TRANSITION TABLES.
COMMENT \
STRUCTURE:
BIT 0 1 ==: THIS IS A FAILURE STATE (IF WE ARE
IN THIS STATE AND THERE IS NO
MORE INPUT, FAIL.)
THE REST OF THE WORD IS BROKEN INTO FOUR BIT BYTES
CONTAINING THE NEXT STATE FOR EACH OF THE TOKENS. THE TOKENS
ARE:
0 NULL
1 TAB
2 BLANK
3 DIGIT
4 OVERPUNCHED DIGIT
5 GRAPHIC SIGN
6 OTHER
A NEXT STATE OF 0 INDICATES FAILURE.
THE ALGORITHM:
1. GET A CHARACTER.
2. CONVERT THE CHAR TO A TOKEN.
3. DETERMINE THE NEXT STATE.
4. IF THE NEXT STATE IS 0 FAIL.
5. MAKE THE NEXT STATE BE THE CURRENT STATE.
6. DETERMINE IF THERE IS ANY MORE INPUT.
7. IF THERE IS GO TO 1.
8. DETERMINE IF WE ARE IN A FAILURE STATE.
9. IF WE ARE FAIL OTHERWISE TAKE THE "TRUE" RETURN.
\
DEFINE SWS(STATE, F, N, T, B, D, S, G, O)<BYTE (1)F(4)N,T,B,D,S,G,O>
IFE TRAILB,< ;USE THE FOLLOWING TABLE IF BLANKS TERMINATE THE FIELD.
IFE NUMSTD,< ;[450]
STATBL: SWS 1,1,1,1,1,2,0,0,0
SWS 2,0,2,3,3,2,0,0,0
SWS 3,0,3,3,3,0,0,0,0
SWS 4,1,4,4,4,5,3,5,0
SWS 5,0,5,3,3,5,3,3,0
;IF THE ITEM'S PICTURE STRING CONTAINS AN "S" WE START AT STATE 4.
SS==4
> ; END IFE NUMSTD
> ; END IFE TRAILB
IFN TRAILB,< ;USE THE FOLLOWING TABLE IF BLANKS ARE CONVERTED TO 0.
STATBL: SWS 1,1,1,1,2,3,0,0,0
SWS 2,0,2,2,2,3,0,0,0
SWS 3,0,3,4,3,3,0,0,0
SWS 4,0,4,4,4,0,0,0,0
SWS 5,1,5,5,6,7,4,7,0
SWS 6,0,6,6,6,7,4,7,0
SWS 7,0,7,4,7,7,4,4,0
;IF THE ITEM'S PICTURE STRING CONTAINS AN "S" WE START AT STATE 5.
SS==5
>
IFN NUMSTD,< ; [450] USE THE FOLLOWING TABLE IF ANSII STANDARD NUMERIC TESTING DESIRED
IFE TRAILB <
STATBL: SWS 1,0,0,0,0,1,0,0,0
SWS 2,1,0,0,0,3,4,5,0
SWS 3,0,0,0,0,3,4,4,0
SWS 4,0,0,0,0,0,0,0,0
SWS 5,1,0,0,0,1,0,0,0
; FOR SIGNED ITEM START AT STATE 2
SS==2
>
> ; [450] END IFN NUMSTD
;TABLE OF POINTERS INTO THE TRANSITION TABLES - INDEX BY TOKE.
PTRTBL: BLOCK 0
N==4
REPEAT 7,< POINT 4,STATBL-1(STATE),N
N==N+4>
> ;END OF NON-BIS
IFN BIS,<
EXTERN NUMS.6,NUMS.7,NUMS.9 ;TRANSLATION TABLES
EXTERN RET.2
EXTERN BPTOK. ;CONVERT TO TOKEN POINTER
; FLAGS FOR LEFT OF SW
SAWSGN==1B35 ;LEADING GRAPHIC SIGN SEEN
NUMS.T: CVTDBT NUMS.6 ;SIXBIT
CVTDBT NUMS.7 ;ASCII
0
CVTDBT NUMS.9 ;EBCDIC
NUM.6: JSP BISCH, NUM ;SIXBIT
NUM.7: JSP BISCH, NUM ;ASCII
BLOCK 1
NUM.9: JSP BISCH, NUM ;EBCDIC
NUM:
SUBI BISCH, NUM.6-5 ;CONVERT TO BYTE SIZE
JSP JAC, BSET1.## ;GET PARAMETER
NUM1: EXTEND B.FLAG, NUMS.T-6(SW) ;GO
JRST ABRTCK ;ABORT??
TLNE B.FLAG,BFLG.N ;ALL DONE - NUMERIC???
AOS (PP) ;YES
POPJ PP, ;NO
ABRTCK: ;INSTRUCTION ABORTED - WHY????
LDB BISCH, SRCPT ;GET OFFENDING CHARACTER
LDB BISCH, BPTOK.-6(SW) ;TOKEN VALUE
XCT TOKTAB(BISCH) ;DISPATCH
IFE NUMSTD,< ; [450] DEC STD NUMERIC TESTING
TOKTAB: EXP 0 ;NULLS ARE IGNORED
JRST NUMFN1 ;TAB
JRST NUMFN1 ;BLANK
EXP 0 ;DIGIT
JRST OVPCHK ;OVERPUNCH
JRST GPHCHK ;GRAPHIC
POPJ PP, ;OTHER - LOSES
> ; END IF IFE NUMSTD [450]
IFN NUMSTD, < ; [450] ANSII STD NUMERIC TESTING
TOKTAB: POPJ PP, ; [450] NULLS ARE ILLEGAL
POPJ PP, ; [450] TABS ARE ILLEGAL
POPJ PP, ; [450] BLANKS AE ILLEGAL
EXP 0 ; [450] DIGIT
JRST OVPCHK ; [450] OVERPUNCH
JRST GPHCHK ; [450] GRAPHIC
POPJ PP, ; [450] OTHER - LOSES
> ; [450] END IFN NUMSTD
OVPCHK: ;OVERPUHCH SIGN CHARACTER
; CHECK TO SEE THAT IT IS LAST AND
; THAT NO SIGN HAS BEEN SEEN BEFORE
SKIPGE SW ;CAN IT BE SIGNED
TLNE SW,SAWSGN ;YES-HAVE WE SEEN A LEADING SIGN?
POPJ PP, ;UNSIGNED OR TWO SIGNS LOSE
JRST NUMFN1 ;OK SO FAR
GPHCHK: ;GRAPHIC SIGN
SKIPGE SW ;CAN IT BE SIGNED
TLOE SW,SAWSGN ;YES - HAVE WE SEEN ONE ALREADY?
POPJ PP, ;UNSIGNED OR TWO SIGNS LOSE
TLNN B.FLAG,BFLG.N ;IS IT LEADING?
JRST NUM1 ;YES CONTINUE
;NO - TRAILING
IFE NUMSTD,< ; [450]
NUMFN1: ;HAVE A LIGIT NUMBER - MAKE SURE JUST BLANKS/TAB
; FOLLOW
TLZ B.FLAG,BFLG. ;CLEAR ALL FLAGS SO WE CAN
;RESTART AND SO FOLLOWING COMPARE
; WILL WORK
JUMPE SRCCNT,RET.2 ;DONE - IF AT END OF FIELD
; SKIP TRAILING BLANKS / TABS
EXTEND B.FLAG,NUMS.T-6(SW)
POPJ PP, ;ABORT MEANS OTHER THAN B/T
;MAKE SURE THERE WERE NO DIGITS
TLNN B.FLAG,BFLG.N
AOS (PP) ;GOOD NUMBER
POPJ PP, ;SORRY
> ; [450] END IFE NUMSTD
IFN NUMSTD, <
NUMFN1: ; NO OTHER DIGITS MAY FOLLOW
TLZ B.FLAG,BFLG. ;CLEAR ALL FLAGS SO WE CAN
;RESTART AND SO FOLLOWING COMPARE
; WILL WORK
JUMPE SRCCNT,RET.2 ;DONE - IF AT END OF FIELD
POPJ PP, ; [450] FAIL BECAUSE MORE CHARS FOLLOW TRAILING OR IMBEDDED SIGN
> ;[450] END IFN NUMSTD
> ;END OF BIS
SUBTTL COMP-3 NUMERIC TEST
ENTRY NUM.3
NUM.3: MOVEI CH,8 ;TELL SET1. ITS EBCDIC
JSP JAC,SET1.## ;SET UP THE PARAMETERS.
TRNE CNT,1 ;ODD OR EVEN NO. OF DIGITS
JRST NUM3A ;ODD
ILDB T1,IPTR ;GET THE FIRST BYTE
ANDI T1,17 ;MASK OUT JUNK
SOJA CNT,NUM3B ;[631] AND CONTINUE
NUM3A: ILDB T1,IPTR ;GET NEXT BYTE
SUBI CNT,2 ;ACCOUNT FOR IT
NUM3B: LSHC T1,-4 ;SPLIT OFF LOWER NIBBLE
LSH T2,-^D32
CAILE T1,9 ;HIGH NIBBLE MUST BE NUMERIC
POPJ PP, ;FAILURE
JUMPL CNT,NUM3C ;LAST NIBBLE IS THE SIGN
CAILE T2,9 ;LOWER NIBBLE MUST BE NUMERIC
POPJ PP, ;FAILURE
JRST NUM3A ;OK, LOOP
NUM3C: CAILE T2,9 ;IT BETTER BE A SIGN
AOS (PP) ;IT IS (12 THRU 17 ARE OK)
POPJ PP,
END