*DECK SSRGNT
PROC SSRGNT(CSTRING, POS, (LEN), TOKEN, EC);
# TITLE SSRGNT - GET NEXT TOKEN #
BEGIN # SSRGNT #
#
** SSRGNT - GET NEXT TOKEN.
* A TOKEN IS A SINGLE SPECIAL CHARACTER, OR
* A 7 OR LESS ALPHA-NUMERIC STRING.
*
* A. LIM. 82/02/10.
*
* THIS PROCEDURE-S MAIN FUNCTION IS TO GET A TOKEN FROM A
* COMMAND STRING STARTING AT CHARACTER POSITION (POS) WITHIN
* THE STRING. ON RETURNING TO THE CALLER (TOKEN) CONTAINS THE
* JUST TOKENIZED TOKEN, AND (POS) POINTING AT THE NEXT CHARACTER
* IN THE STRING OR AT END OF STRING. IF THERE IS ANY ERRORS,
* AN ERROR CODE WILL RETURN TO THE CALLER, OR WITH (TOKEN)
* CONTAINING THE ERROR TOKEN.
* IT IS CALLED INTO EXECUTION BY: *SSRRCS*
*
* PROC SSRGNT(CSTRING, POS, (LEN), TOKEN, EC)
*
* ENTRY CSTRING = COMMAND STRING WHERE A TOKEN IS TO BE TOKENIZED
* POS = STARTING CHARACTER POSITION WITHIN STRING FOR
* THIS TOKEN.
* LEN = TOTAL LENGTH IN CHARACTERS OF THE STRING.
* 0 FOR STRING TERMINATED BY A SPECIAL CHAR.
* EXIT CSTRING = UNCHANGED.
* POS = NEXT CHAR POSITION WITHIN THE STRING FOR
* THE NEXT TOKEN.
* LEN = UNCHANGED.
* TOKEN = TOKEN STORED.
* EC = ERROR CODE.
* 0 = NO ERROR.
* 1 = PARAMETER TOO LONG.
*
* NOTE THIS PROCEDURE ASSUMES *POS* IS ALWAYS POINTING AT A
* CHARACTER WITHIN THE RANGE OF COMMAND STRING, I. E.
* IN THE CASE OF COMMAND SYNTAX, IT WILL NOT BE POINTING
* AT ANY CHARACTER AFTER THE END-OF-LINE TERMINATOR.
* AND IN THE CASE OF INPUT STRING, IT WILL NOT BE
* POINTING AT ANY CHARACTER OUTSIDE THE RANGE OF *LEN*.
*
* METHOD *SSBEBF* IS CALLED TO EXTRACT A CHARACTER AT A TIME FROM
* THE STRING. THEN *SSBSBF* IS CALLED TO STORE/CONCATENATE
* THE EXTRACTED CHARACTER INTO THE RESULTING TOKEN.
* TOKENIZATION CONTINUES UNTIL A VALID TOKEN, I. E. A SINGL
* SPECIAL CHARACTER OR A 7 OR LESS ALPHA-NUMERIC STRING, IS
* IS TOKENIZED. IN CASE OF ERROR, *EC* WILL BE SET, AND
* *TOKEN* CONTAINS 7 + 1 (+1 FOR THE NEXT TOO CHARACTER)
* CHARACTERS.
#
#
**** PROC SSRGNT XREF LIST
#
XREF
BEGIN
PROC SSBEBF; # EXTRACT BITFIELD FROM A TABLE #
PROC SSBSBF; # STORE BITFIELD INTO A TABLE #
END
#
****
#
# DEFS #
DEF CHARLEN$ # 6 #; # CHAR LENGTH IN BITS FOR OCT DISP-CODE #
DEF CHARWD$ # 10 #; # NO OF 6-BIT CHAR PER CM WORD #
DEF CSSIZ$ # 14 #; # MAX NO OF CHARACTERS/COMMAND STRING #
DEF A$ # O"01"#; # OCT DISP-CODE FOR "A" #
DEF NINE$ # O"44"#; # OCT DISP-CODE FOR "9" #
DEF ASTERISK # O"47"#; # OCT DISP-CODE FOR "*" #
DEF TKNSIZ$ # 7 #; # TOKEN SIZE #
# FORMAL PARAMETERS #
#
** CSTRING - COMMAND STRING TERMINATED BY AN END OF LINE TERMINATOR,
* OR *LEN* NUMBER OF CHARACTERS.
#
ARRAY CSTRING[00:00] S(CSSIZ$);
BEGIN
ITEM CST$LINE C(00,00,140);
END
ITEM POS I; # CHARACTER POSITION WITHIN STRING #
ITEM LEN I; # LENGTH IN CHARACTERS OF CSTRING #
ITEM TOKEN U; # RESULTING TOKEN #
ITEM EC I; # ERROR CODE #
# ACTUAL PARAMETERS FOR PROC *SSBEBF*, AND *SSBSBF* #
ITEM ORD I; # WORD/ORDINAL WITHIN TABLE #
ITEM BIT I; # STARTING BIT POSITION WITHIN WORD #
ITEM RESULT U; # WORD THAT RECEIVES BIT FIELD #
ITEM SORD I; # WORD WITHIN TOKEN TO STORE #
ITEM SBIT I; # BIT WITHIN TOKEN TO STORE #
# GENERAL ITEMS #
ITEM I I; # LOOP INDUCTION VARIABLE #
ITEM DONE B; # LOOP EXIT VARIABLE #
ITEM NPOS I; # NPOS = POS #
CONTROL EJECT;
# INITIALIZES VARIABLES #
TOKEN = O"55555555555555555555"; # CLEAR TOKEN AREA #
EC = 0; # PRESET TO NO ERROR #
SORD = 0; # PRESET TOKEN ORDINAL #
SBIT = 0; # PRESET TOKEN BIT #
DONE = FALSE; # PRESET FLAG TO FALSE #
#
* CONVERT CHARACTER POSITION(POS) INTO TABLE ORDINAL(ORD) AND
* STARTING BIT POSITION(BIT) WITHIN ORDINAL.
#
NPOS = POS;
ORD = 0;
BIT = NPOS * CHARLEN$;
FOR I = 0 WHILE (NPOS - CHARWD$) GQ 0
DO
BEGIN
NPOS = NPOS - CHARWD$;
ORD = ORD + 1;
BIT = NPOS * CHARLEN$;
END
#
* GET FIRST CHARACTER FROM COMMAND STRING *CSTRING* STARTING FROM
* CURRENT CHARACTER POSITION *POS*, AND STORE IT INTO *TOKEN*.
* IF THIS IS A SPECIAL CHARACTER, WE ARE DONE, AND RETURN THE TOKEN.
* ELSE, IT MUST BE AN ALPHA-NUMERIC STRING.
* CONTINUE THE TOKENIZATION PROCESS UNTIL A 7 CHARACTERS HAS REACHED
* OR A SPECIAL CHARACTER IS HIT, OR *LEN* IS REACHED. IF LONGER THA
* 7 CHARACTERS, EXIT WITH ERROR CODE, AND *TOKEN* CONTAINS 8
* CHARACTERS.
#
SSBEBF(CSTRING, ORD, BIT, CHARLEN$, RESULT); # GET FIRST CHAR #
SSBSBF(TOKEN, SORD, SBIT, CHARLEN$, RESULT); # STORE THE CHAR #
POS = POS + 1; # INCREMENT POS #
IF ( (RESULT LS A$) OR (RESULT GR NINE$) )
AND ( RESULT NQ ASTERISK )
THEN GOTO EXIT; # SPECIAL CHAR, DONE #
FOR I = 1 STEP 1 WHILE ((NOT DONE)
AND (POS NQ LEN)
AND (I LS TKNSIZ$))
DO # LOOP TIL DONE OR LEN REACHED OR 7 CHAR #
BEGIN
SSBEBF(CSTRING, ORD, BIT, CHARLEN$, RESULT); # EXTRACT A CHAR #
IF ( (RESULT LS A$) OR (RESULT GR NINE$) )
AND ( RESULT NQ ASTERISK )
THEN
BEGIN
DONE = TRUE; # SPECIAL CHAR HIT, DONE #
END
ELSE
BEGIN
SSBSBF(TOKEN, SORD, SBIT, CHARLEN$, RESULT); #CONCATENATE CHR#
POS = POS + 1; # INCREMENT CHAR POS #
END
END
IF ((NOT DONE)
AND (POS NQ LEN))
THEN
BEGIN # 7 ALPHA-NUM CHARS ALREADY #
SSBEBF(CSTRING, ORD, BIT, CHARLEN$, RESULT); # LOOK AHEAD #
IF ((RESULT GQ A$) AND (RESULT LQ NINE$))
OR ( RESULT EQ ASTERISK )
THEN
BEGIN # NEXT CHAR NOT SPECIAL CHAR #
SSBSBF(TOKEN, SORD, SBIT, CHARLEN$, RESULT); # STORE CHAR #
EC = 1; # PARAMETER TOO LONG #
END
END
EXIT:
END # SSRGNT #
TERM