        .TITLE  SCAN. (UTIL-VAX Character Scan Routines)
;-----------------------------------------------------------------------
;
;               D I S C L A I M E R   N O T I C E
;               -------------------   -----------
;
;  This document and/or portions of the material and data furnished
;  herewith, was developed under sponsorship of the U. S. Government.
;  Neither the U.S. nor the U.S.D.O.E., nor the Leland Stanford Junior
;  University, nor their employees, nor their respective contractors,
;  subcontractors, or their employees, makes any warranty, express or
;  implied, or assumes any liability or responsibility for accuracy,
;  completeness or usefulness of any information, apparatus, product
;  or process disclosed, or represents that its use will not infringe
;  privately-owned rights.  Mention of any product, its manufacturer,
;  or suppliers shall not, nor is it intended to, imply approval, dis-
;  approval, or fitness for any particular use.  The U. S. and the
;  University at all times retain the right to use and disseminate same
;  for any purpose whatsoever.  Such distribution shall be made by the
;  National Energy Software Center at the Argonne National Laboratory
;  and only subject to the distributee furnishing satisfactory proof
;  that he has a valid license from the Intel Corporation in effect.
;
;-----------------------------------------------------------------------
;
;		R E V I S I O N   H I S T O R Y
;
;
;  15FEB82  Alex Hunter  1. Changes required by new entry point vector
;			    scheme.
;
;-----------------------------------------------------------------------
 
	.SHOW	EXPANSIONS
 
        .PSECT  $CGROUP_VECTOR,RD,NOWRT,EXE,GBL,CON,LONG
;
;  A macro to automatically generate entry point vector code
;  for procedure entry points.
;

        .MACRO  AENTRY  NAME,MASK
        .PSECT  $CGROUP_VECTOR
        .ENTRY  V.'NAME,MASK
        JMP     NAME+2
        .PSECT  UTIL_CODE
        .ENTRY  NAME,MASK
        .ENDM   AENTRY
 
        .PSECT  UTIL_CODE,RD,NOWRT,EXE,GBL,CON,LONG
 
;-----------------------------------------------------------------------
;
;    LOOKUP TABLE FOR NON-NUMERIC CHARACTER CLASSES.
;
;-----------------------------------------------------------------------
 
;  BIT DEFINITIONS:
 
ALFA = 0		; ANY LETTER.
TOKEN = 1		; ANY CHARACTER WHICH CAN BE PART OF A TOKEN.
FILE = 2		; ANY CHARACTER WHICH CAN BE PART OF A FILENAME.
BLANK = 3		; ANY CHARACTER REPRESENTING WHITE SPACE.
CRLF = 4		; A CR OR LF.
TERM = 5		; A LINE TERMINATOR CHARACTER.
LOWERCASE = 6		; A LOWERCASE LETTER.
ALFANUM = 7		; ANY LETTER OR DIGIT.
 
;  BIT MASKS:
 
M.ALFA = 1@ALFA
M.TOKEN = 1@TOKEN
M.FILE = 1@FILE
M.BLANK = 1@BLANK
M.CRLF = 1@CRLF
M.TERM = 1@TERM
M.LOWERCASE = 1@LOWERCASE
M.ALFANUM = 1@ALFANUM
 
;  TABLE:
 
ACLASS:
        .BYTE   0                                              ; 00 NUL
        .BYTE   0                                              ; 01 SOH
        .BYTE   0                                              ; 02 STX
        .BYTE   0                                              ; 03 ETX
        .BYTE   0                                              ; 04 EOT
        .BYTE   0                                              ; 05 ENQ
        .BYTE   0                                              ; 06 ACK
        .BYTE   0                                              ; 07 BEL
        .BYTE   0                                              ; 08 BS
        .BYTE   <M.BLANK>                                      ; 09 HT
        .BYTE   <M.CRLF+M.TERM>                                ; 0A LF
        .BYTE   0                                              ; 0B VT
        .BYTE   0                                              ; 0C FF
        .BYTE   <M.CRLF+M.TERM>                                ; 0D CR
        .BYTE   0                                              ; 0E SO
        .BYTE   0                                              ; 0F SI
        .BYTE   0                                              ; 10 DLE
        .BYTE   0                                              ; 11 DC1
        .BYTE   0                                              ; 12 DC2
        .BYTE   0                                              ; 13 DC3
        .BYTE   0                                              ; 14 DC4
        .BYTE   0                                              ; 15 NAK
        .BYTE   0                                              ; 16 SYN
        .BYTE   0                                              ; 17 ETB
        .BYTE   0                                              ; 18 CAN
        .BYTE   0                                              ; 19 EM
        .BYTE   0                                              ; 1A SUB
        .BYTE   <M.TERM>                                       ; 1B ESC
        .BYTE   0                                              ; 1C FS
        .BYTE   0                                              ; 1D GS
        .BYTE   0                                              ; 1E RS
        .BYTE   0                                              ; 1F US
        .BYTE   <M.BLANK>                                      ; 20 SP
        .BYTE   0                                              ; 21 !
        .BYTE   0                                              ; 22 "
        .BYTE   0                                              ; 23 #
        .BYTE   <M.FILE>                        ;(VMS only)    ; 24 $
        .BYTE   0                                              ; 25 %
        .BYTE   0                                              ; 26 &
        .BYTE   0                                              ; 27 '
        .BYTE   0                                              ; 28 (
        .BYTE   0                                              ; 29 )
        .BYTE   0                                              ; 2A *
        .BYTE   0                                              ; 2B +
        .BYTE   0                                              ; 2C ,
        .BYTE   0                                              ; 2D -
        .BYTE   <M.FILE>                                       ; 2E .
        .BYTE   0                                              ; 2F /
        .BYTE   <M.TOKEN+M.FILE+M.ALFANUM>                     ; 30 0
        .BYTE   <M.TOKEN+M.FILE+M.ALFANUM>                     ; 31 1
        .BYTE   <M.TOKEN+M.FILE+M.ALFANUM>                     ; 32 3
        .BYTE   <M.TOKEN+M.FILE+M.ALFANUM>                     ; 33 3
        .BYTE   <M.TOKEN+M.FILE+M.ALFANUM>                     ; 34 4
        .BYTE   <M.TOKEN+M.FILE+M.ALFANUM>                     ; 35 5
        .BYTE   <M.TOKEN+M.FILE+M.ALFANUM>                     ; 36 6
        .BYTE   <M.TOKEN+M.FILE+M.ALFANUM>                     ; 37 7
        .BYTE   <M.TOKEN+M.FILE+M.ALFANUM>                     ; 38 8
        .BYTE   <M.TOKEN+M.FILE+M.ALFANUM>                     ; 39 9
        .BYTE   <M.FILE>                                       ; 3A :
        .BYTE   <M.FILE>                        ; (VMS only)   ; 3B ;
        .BYTE   0                                              ; 3C <
        .BYTE   0                                              ; 3D =
        .BYTE   0                                              ; 3E >
        .BYTE   <M.TOKEN>                                      ; 3F ?
        .BYTE   <M.TOKEN>                                      ; 40 @
        .BYTE   <M.ALFA+M.TOKEN+M.FILE+M.ALFANUM>              ; 41 A
        .BYTE   <M.ALFA+M.TOKEN+M.FILE+M.ALFANUM>              ; 42 B
        .BYTE   <M.ALFA+M.TOKEN+M.FILE+M.ALFANUM>              ; 43 C
        .BYTE   <M.ALFA+M.TOKEN+M.FILE+M.ALFANUM>              ; 44 D
        .BYTE   <M.ALFA+M.TOKEN+M.FILE+M.ALFANUM>              ; 45 E
        .BYTE   <M.ALFA+M.TOKEN+M.FILE+M.ALFANUM>              ; 46 F
        .BYTE   <M.ALFA+M.TOKEN+M.FILE+M.ALFANUM>              ; 47 G
        .BYTE   <M.ALFA+M.TOKEN+M.FILE+M.ALFANUM>              ; 48 H
        .BYTE   <M.ALFA+M.TOKEN+M.FILE+M.ALFANUM>              ; 49 I
        .BYTE   <M.ALFA+M.TOKEN+M.FILE+M.ALFANUM>              ; 4A J
        .BYTE   <M.ALFA+M.TOKEN+M.FILE+M.ALFANUM>              ; 4B K
        .BYTE   <M.ALFA+M.TOKEN+M.FILE+M.ALFANUM>              ; 4C L
        .BYTE   <M.ALFA+M.TOKEN+M.FILE+M.ALFANUM>              ; 4D M
        .BYTE   <M.ALFA+M.TOKEN+M.FILE+M.ALFANUM>              ; 4E N
        .BYTE   <M.ALFA+M.TOKEN+M.FILE+M.ALFANUM>              ; 4F O
        .BYTE   <M.ALFA+M.TOKEN+M.FILE+M.ALFANUM>              ; 50 P
        .BYTE   <M.ALFA+M.TOKEN+M.FILE+M.ALFANUM>              ; 51 Q
        .BYTE   <M.ALFA+M.TOKEN+M.FILE+M.ALFANUM>              ; 52 R
        .BYTE   <M.ALFA+M.TOKEN+M.FILE+M.ALFANUM>              ; 53 S
        .BYTE   <M.ALFA+M.TOKEN+M.FILE+M.ALFANUM>              ; 54 T
        .BYTE   <M.ALFA+M.TOKEN+M.FILE+M.ALFANUM>              ; 55 U
        .BYTE   <M.ALFA+M.TOKEN+M.FILE+M.ALFANUM>              ; 56 V
        .BYTE   <M.ALFA+M.TOKEN+M.FILE+M.ALFANUM>              ; 57 W
        .BYTE   <M.ALFA+M.TOKEN+M.FILE+M.ALFANUM>              ; 58 X
        .BYTE   <M.ALFA+M.TOKEN+M.FILE+M.ALFANUM>              ; 59 Y
        .BYTE   <M.ALFA+M.TOKEN+M.FILE+M.ALFANUM>              ; 5A Z
        .BYTE   <M.FILE>                        ; (VMS only)   ; 5B [
        .BYTE   0                                              ; 5C \
        .BYTE   <M.FILE>                        ; (VMS only)   ; 5D ]
        .BYTE   0                                              ; 5E ^
        .BYTE   <M.TOKEN>                                      ; 5F _
        .BYTE   0                                              ; 60 `
        .BYTE   <M.ALFA+M.TOKEN+M.FILE+M.ALFANUM+M.LOWERCASE>  ; 61 a
        .BYTE   <M.ALFA+M.TOKEN+M.FILE+M.ALFANUM+M.LOWERCASE>  ; 62 b
        .BYTE   <M.ALFA+M.TOKEN+M.FILE+M.ALFANUM+M.LOWERCASE>  ; 63 c
        .BYTE   <M.ALFA+M.TOKEN+M.FILE+M.ALFANUM+M.LOWERCASE>  ; 64 d
        .BYTE   <M.ALFA+M.TOKEN+M.FILE+M.ALFANUM+M.LOWERCASE>  ; 65 e
        .BYTE   <M.ALFA+M.TOKEN+M.FILE+M.ALFANUM+M.LOWERCASE>  ; 66 f
        .BYTE   <M.ALFA+M.TOKEN+M.FILE+M.ALFANUM+M.LOWERCASE>  ; 67 g
        .BYTE   <M.ALFA+M.TOKEN+M.FILE+M.ALFANUM+M.LOWERCASE>  ; 68 h
        .BYTE   <M.ALFA+M.TOKEN+M.FILE+M.ALFANUM+M.LOWERCASE>  ; 69 i
        .BYTE   <M.ALFA+M.TOKEN+M.FILE+M.ALFANUM+M.LOWERCASE>  ; 6A j
        .BYTE   <M.ALFA+M.TOKEN+M.FILE+M.ALFANUM+M.LOWERCASE>  ; 6B k
        .BYTE   <M.ALFA+M.TOKEN+M.FILE+M.ALFANUM+M.LOWERCASE>  ; 6C l
        .BYTE   <M.ALFA+M.TOKEN+M.FILE+M.ALFANUM+M.LOWERCASE>  ; 6D m
        .BYTE   <M.ALFA+M.TOKEN+M.FILE+M.ALFANUM+M.LOWERCASE>  ; 6E n
        .BYTE   <M.ALFA+M.TOKEN+M.FILE+M.ALFANUM+M.LOWERCASE>  ; 6F o
        .BYTE   <M.ALFA+M.TOKEN+M.FILE+M.ALFANUM+M.LOWERCASE>  ; 70 p
        .BYTE   <M.ALFA+M.TOKEN+M.FILE+M.ALFANUM+M.LOWERCASE>  ; 71 q
        .BYTE   <M.ALFA+M.TOKEN+M.FILE+M.ALFANUM+M.LOWERCASE>  ; 72 r
        .BYTE   <M.ALFA+M.TOKEN+M.FILE+M.ALFANUM+M.LOWERCASE>  ; 73 s
        .BYTE   <M.ALFA+M.TOKEN+M.FILE+M.ALFANUM+M.LOWERCASE>  ; 74 t
        .BYTE   <M.ALFA+M.TOKEN+M.FILE+M.ALFANUM+M.LOWERCASE>  ; 75 u
        .BYTE   <M.ALFA+M.TOKEN+M.FILE+M.ALFANUM+M.LOWERCASE>  ; 76 v
        .BYTE   <M.ALFA+M.TOKEN+M.FILE+M.ALFANUM+M.LOWERCASE>  ; 77 w
        .BYTE   <M.ALFA+M.TOKEN+M.FILE+M.ALFANUM+M.LOWERCASE>  ; 78 x
        .BYTE   <M.ALFA+M.TOKEN+M.FILE+M.ALFANUM+M.LOWERCASE>  ; 79 y
        .BYTE   <M.ALFA+M.TOKEN+M.FILE+M.ALFANUM+M.LOWERCASE>  ; 7A z
        .BYTE   0                                              ; 7B {
        .BYTE   0                                              ; 7C |
        .BYTE   0                                              ; 7D }
        .BYTE   0                                              ; 7E ~
        .BYTE   0                                              ; 7F DEL
	.BYTE	0[128]			; (Just in case...)    ; 80-FF.
 
;-----------------------------------------------------------------------
;
;    LOOKUP TABLE FOR NUMERIC CHARACTER CLASSES.
;  
;    BITS <3:0> OF EACH ENTRY REPRESENT THE BINARY VALUE OF THE
;    CORRESPONDING ASCII CHARACTER.
;
;    OTHER BITS ARE DEFINED BELOW.
;
;-----------------------------------------------------------------------
 
BINARY = 4		; BINARY DIGIT.
OCTAL = 5		; OCTAL DIGIT.
DECIMAL = 6		; DECIMAL DIGIT.
HEX = 7			; HEXADECIMAL DIGIT.
 
;  BIT MASKS:
 
M.BINARY = 1@BINARY
M.OCTAL = 1@OCTAL
M.DECIMAL = 1@DECIMAL
M.HEX = 1@HEX
 
;  LOOKUP TABLE:
 
NCLASS:
        .BYTE   0                                              ; 00 NUL
        .BYTE   0                                              ; 01 SOH
        .BYTE   0                                              ; 02 STX
        .BYTE   0                                              ; 03 ETX
        .BYTE   0                                              ; 04 EOT
        .BYTE   0                                              ; 05 ENQ
        .BYTE   0                                              ; 06 ACK
        .BYTE   0                                              ; 07 BEL
        .BYTE   0                                              ; 08 BS
        .BYTE   0                                              ; 09 HT
        .BYTE   0                                              ; 0A LF
        .BYTE   0                                              ; 0B VT
        .BYTE   0                                              ; 0C FF
        .BYTE   0                                              ; 0D CR
        .BYTE   0                                              ; 0E SO
        .BYTE   0                                              ; 0F SI
        .BYTE   0                                              ; 10 DLE
        .BYTE   0                                              ; 11 DC1
        .BYTE   0                                              ; 12 DC2
        .BYTE   0                                              ; 13 DC3
        .BYTE   0                                              ; 14 DC4
        .BYTE   0                                              ; 15 NAK
        .BYTE   0                                              ; 16 SYN
        .BYTE   0                                              ; 17 ETB
        .BYTE   0                                              ; 18 CAN
        .BYTE   0                                              ; 19 EM
        .BYTE   0                                              ; 1A SUB
        .BYTE   0                                              ; 1B ESC
        .BYTE   0                                              ; 1C FS
        .BYTE   0                                              ; 1D GS
        .BYTE   0                                              ; 1E RS
        .BYTE   0                                              ; 1F US
        .BYTE   0                                              ; 20 SP
        .BYTE   0                                              ; 21 !
        .BYTE   0                                              ; 22 "
        .BYTE   0                                              ; 23 #
        .BYTE   0                                              ; 24 $
        .BYTE   0                                              ; 25 %
        .BYTE   0                                              ; 26 &
        .BYTE   0                                              ; 27 '
        .BYTE   0                                              ; 28 (
        .BYTE   0                                              ; 29 )
        .BYTE   0                                              ; 2A *
        .BYTE   0                                              ; 2B +
        .BYTE   0                                              ; 2C ,
        .BYTE   0                                              ; 2D -
        .BYTE   0                                              ; 2E .
        .BYTE   0                                              ; 2F /
        .BYTE   <M.HEX+M.DECIMAL+M.OCTAL+M.BINARY>+0           ; 30 0
        .BYTE   <M.HEX+M.DECIMAL+M.OCTAL+M.BINARY>+1           ; 31 1
        .BYTE   <M.HEX+M.DECIMAL+M.OCTAL>+2                    ; 32 3
        .BYTE   <M.HEX+M.DECIMAL+M.OCTAL>+3                    ; 33 3
        .BYTE   <M.HEX+M.DECIMAL+M.OCTAL>+4                    ; 34 4
        .BYTE   <M.HEX+M.DECIMAL+M.OCTAL>+5                    ; 35 5
        .BYTE   <M.HEX+M.DECIMAL+M.OCTAL>+6                    ; 36 6
        .BYTE   <M.HEX+M.DECIMAL+M.OCTAL>+7                    ; 37 7
        .BYTE   <M.HEX+M.DECIMAL>+8                            ; 38 8
        .BYTE   <M.HEX+M.DECIMAL>+9                            ; 39 9
        .BYTE   0                                              ; 3A :
        .BYTE   0                                              ; 3B ;
        .BYTE   0                                              ; 3C <
        .BYTE   0                                              ; 3D =
        .BYTE   0                                              ; 3E >
        .BYTE   0                                              ; 3F ?
        .BYTE   0                                              ; 40 @
        .BYTE   <M.HEX>+10                                     ; 41 A
        .BYTE   <M.HEX>+11                                     ; 42 B
        .BYTE   <M.HEX>+12                                     ; 43 C
        .BYTE   <M.HEX>+13                                     ; 44 D
        .BYTE   <M.HEX>+14                                     ; 45 E
        .BYTE   <M.HEX>+15                                     ; 46 F
        .BYTE   0                                              ; 47 G
        .BYTE   0                                              ; 48 H
        .BYTE   0                                              ; 49 I
        .BYTE   0                                              ; 4A J
        .BYTE   0                                              ; 4B K
        .BYTE   0                                              ; 4C L
        .BYTE   0                                              ; 4D M
        .BYTE   0                                              ; 4E N
        .BYTE   0                                              ; 4F O
        .BYTE   0                                              ; 50 P
        .BYTE   0                                              ; 51 Q
        .BYTE   0                                              ; 52 R
        .BYTE   0                                              ; 53 S
        .BYTE   0                                              ; 54 T
        .BYTE   0                                              ; 55 U
        .BYTE   0                                              ; 56 V
        .BYTE   0                                              ; 57 W
        .BYTE   0                                              ; 58 X
        .BYTE   0                                              ; 59 Y
        .BYTE   0                                              ; 5A Z
        .BYTE   0                                              ; 5B [
        .BYTE   0                                              ; 5C \
        .BYTE   0                                              ; 5D ]
        .BYTE   0                                              ; 5E ^
        .BYTE   0                                              ; 5F _
        .BYTE   0                                              ; 60 `
        .BYTE   <M.HEX>+10                                     ; 61 a
        .BYTE   <M.HEX>+11                                     ; 62 b
        .BYTE   <M.HEX>+12                                     ; 63 c
        .BYTE   <M.HEX>+13                                     ; 64 d
        .BYTE   <M.HEX>+14                                     ; 65 e
        .BYTE   <M.HEX>+15                                     ; 66 f
        .BYTE   0                                              ; 67 g
        .BYTE   0                                              ; 68 h
        .BYTE   0                                              ; 69 i
        .BYTE   0                                              ; 6A j
        .BYTE   0                                              ; 6B k
        .BYTE   0                                              ; 6C l
        .BYTE   0                                              ; 6D m
        .BYTE   0                                              ; 6E n
        .BYTE   0                                              ; 6F o
        .BYTE   0                                              ; 70 p
        .BYTE   0                                              ; 71 q
        .BYTE   0                                              ; 72 r
        .BYTE   0                                              ; 73 s
        .BYTE   0                                              ; 74 t
        .BYTE   0                                              ; 75 u
        .BYTE   0                                              ; 76 v
        .BYTE   0                                              ; 77 w
        .BYTE   0                                              ; 78 x
        .BYTE   0                                              ; 79 y
        .BYTE   0                                              ; 7A z
        .BYTE   0                                              ; 7B {
        .BYTE   0                                              ; 7C |
        .BYTE   0                                              ; 7D }
        .BYTE   0                                              ; 7E ~
        .BYTE   0                                              ; 7F DEL
	.BYTE	0[128]			; (Just in case...)    ; 80-FF.
 
;-----------------------------------------------------------------------
;
;    CHARACTER SCAN PROCEDURES.
;
;-----------------------------------------------------------------------
 
        AENTRY  DDIGCH,<^M<>>
        MOVZBL  @W^SCANP-K.(R11),R0
	EXTV	#DECIMAL,#1,NCLASS[R0],R0
	RET
 
        AENTRY  QDIGCH,<^M<>>
        MOVZBL  @W^SCANP-K.(R11),R0
	EXTV	#OCTAL,#1,NCLASS[R0],R0
	RET
 
        AENTRY  BDIGCH,<^M<>>
        MOVZBL  @W^SCANP-K.(R11),R0
	EXTV	#BINARY,#1,NCLASS[R0],R0
	RET
 
        AENTRY  HDIGCH,<^M<>>
        MOVZBL  @W^SCANP-K.(R11),R0
	EXTV	#HEX,#1,NCLASS[R0],R0
	RET
 
        AENTRY  ANYCH,<^M<>>
	MCOML	#0,R0
	RET
 
        AENTRY  FORCUP,<^M<>>
        MOVZBL  @W^SCANP-K.(R11),R0
	BBC	#LOWERCASE,ACLASS[R0],1$
	SUBB2	#<^A'a'-^A'A'>,R0	; Convert lowercase to uppercase.
1$:	RET
 
        AENTRY  LETRCH,<^M<>>
        MOVZBL  @W^SCANP-K.(R11),R0
	EXTV	#ALFA,#1,ACLASS[R0],R0
	RET
 
        AENTRY  LTNMCH,<^M<>>
        MOVZBL  @W^SCANP-K.(R11),R0
	EXTV	#ALFANUM,#1,ACLASS[R0],R0
	RET
 
        AENTRY  TOKCH,<^M<>>
        MOVZBL  @W^SCANP-K.(R11),R0
	EXTV	#TOKEN,#1,ACLASS[R0],R0
	RET
 
        AENTRY  FILECH,<^M<>>
        MOVZBL  @W^SCANP-K.(R11),R0
	EXTV	#FILE,#1,ACLASS[R0],R0
	RET
 
        AENTRY  CRLFCH,<^M<>>
        MOVZBL  @W^SCANP-K.(R11),R0
	EXTV	#CRLF,#1,ACLASS[R0],R0
	RET
 
        AENTRY  TERMCH,<^M<>>
        MOVZBL  @W^SCANP-K.(R11),R0
	EXTV	#TERM,#1,ACLASS[R0],R0
	RET
 
        AENTRY  BLNKCH,<^M<>>
        MOVZBL  @W^SCANP-K.(R11),R0
	EXTV	#BLANK,#1,ACLASS[R0],R0
	RET
 
        AENTRY  ASCBIN,<^M<>>
        MOVZBL  @W^SCANP-K.(R11),R0
	EXTZV	#0,#4,NCLASS[R0],R0
	RET
 
	.END
