1 PAGE
90,132 ;AN000;\ f\eA\b\e2
2 TITLE GRTABPAR
.SAL - LOOK
AT COMMAND LINE PARMS
;AN000;
3 ;****************** START OF SPECIFICATIONS *****************************
4 ; MODULE NAME: GRTABPAR.SAL
6 ; DESCRIPTIVE NAME: Handle the definition of the DOS command line parameters
7 ; and the interface to the DOS system PARSER.
9 ;FUNCTION: The static data areas are prescribed by the DOS system PARSER
10 ; to define the several parameters presented to GRAFTABL. These
11 ; data areas are passed to the PARSER, and its responses checked
12 ; to determine the nature of the user's specifications. Any errors
13 ; found in the user's parameters are defined in messages back
16 ; ENTRY POINT: PARSER, near
18 ; INPUT: (DOS COMMAND LINE PARAMETERS)
20 ; [d:][path] GRAFTABL [cp|?|/STA|/STATUS]
23 ; [d:][path] - Path where the GRAFTABL command resides.
25 ; [cp] - Codepage number to be loaded. If blank,
28 ; [?] - This requests a display of the parameters
29 ; supported by the GRAFTABL command.
31 ; [/STATUS] - (May be shortened to just /STA.) This
32 ; requests the current codepage already
33 ; loaded by a previous GRAFTABL, if any,
36 ; Upon entry to PARSER in this module,
37 ; "CURRENT_PARM" = offset to start of parm text in command string
38 ; "ORDINAL" = initialized to zero
39 ; PSP+81H = text of DOS command line parms string
41 ; EXIT-NORMAL: If a Code Page number was specified
42 ; BX = Offset to language table to be loaded
43 ; DX = Integer value of Code Page specified
44 ; If /STATUS (or /STA) was specified
46 ; If Question mark was specified
49 ; EXIT-ERROR: If there was any problem with the parms,
50 ; the question mark is assumed, and the appropriate
51 ; PARSE error message is displayed.
52 ; The Errorlevel code of "EXPAR" (3), meaning: "PARM ERROR",
53 ; set in "EXITFL", is requested to be returned to the user.
55 ; INTERNAL REFERENCES:
57 ; PARSE_ERROR:NEAR Display the appropriate Parse error message.
60 ; The several parameter control blocks, defined by the System
61 ; PARSER interface, defining the GRAFTABL parameters.
63 ; EXTERNAL REFERENCES:
65 ; SENDMSG:NEAR Uses Msg Descriptor to drive message handler.
66 ; SYSPARSE:NEAR System Command Line Common Parser.
69 ; TABLEUS:BYTE First table of Fonts, happens to be the USA version.
70 ; (Format of language Font defined in LANGUAGE STRUC.)
71 ; EXITFL:BYTE Errorlevel return code.
72 ; MSGNUM_PARSE:WORD Message descriptor for all parse errors.
73 ; ACTIVECPID:WORD Pointer to CPID entry of active entry, where the
74 ; CPID table is a set of 4 byte asciiz strings,
75 ; each defining the number of a Code Page font.
78 ; This module should be processed with the SALUT preprocessor
79 ; with the re-alignment not requested, as:
83 ; To assemble these modules, the alphabetical or sequential
84 ; ordering of segments may be used.
86 ; For LINK instructions, refer to the PROLOG of the main module,
90 ; A001 PTM 382 display "ACTIVE" OR "PREVIOUS" CP.
91 ; A002 PTM 474 Avoid duplicate switches
92 ; A003 PTM 538 Display parm in error
94 ;****************** END OF SPECIFICATIONS *****************************
96 %
OUT COMPONENT
=GRAFTABL
, MODULE
=GRTABPAR
.SAL... ;AN000;
98 ; = = = = = = = = = = = =
99 INCLUDE PATHMAC
.INC ;AN006;
100 ; = = = = = = = = = = = =
101 HEADER
MACRO TEXT
;;AN000;
107 ; = = = = = = = = = = = =
108 ; $SALUT (4,23,28,36) ;AN000;
109 EXTRN CPID_L
:ABS
;AN000;BYTES PER CPID ENTRY
111 MSG_DESC
STRUC ;AN003;
112 MSG_NUM
DW ?
;AN003;MESSAGE NUMBER (TO AX)
113 MSG_HANDLE
DW ?
;AN003;HANDLE OF OUTPUT DEVICE (TO BX)
114 MSG_SUBLIST
DW ?
;AN003;POINTER TO SUBLIST (TO SI)
115 MSG_COUNT
DW ?
;AN003;SUBSTITUTION COUNT (TO CX)
116 MSG_CLASS
DW ?
;AN003;MESSAGE CLASS (IN HIGH BYTE, TO DH)
117 ; LOW BYTE HAS 0 (FUNCTION "NO INPUT", TO DL);AN003;
118 MSG_DESC ENDS
;AN003;
120 ONE_SUBS EQU
1 ;AN003;NUMBER OF VARIABLES
122 SUBLIST
STRUC ;AN000;
123 SUB_SIZE
DB ?
;AN003;SUBLIST SIZE (POINTER TO NEXT SUBLIST)
124 SUB_RES
DB ?
;AN003;RESERVED
125 ;NEXT FIELD IS TO BE USED AS A DOUBLE WORD ;AN003;
126 SUB_VALUE
DW ?
;AN003;TIME, DATE, OR PTR TO DATA ITEM
127 SUB_VALUE_SEG
DW ?
;AN003;SEG ID OF PTR
128 ;(ABOVE FIELD MUST BE FILLED AT EXECUTION TIME ;AN003;
129 ; IF THIS IS A .COM FILE) ;AN003;
130 SUB_ID
DB ?
;AN003;N OF %N
131 SUB_FLAGS
DB ?
;AN003;DATA TYPE FLAGS
132 SUB_MAX_WIDTH
DB ?
;AN003;MAXIMUM FIELD WIDTH (0=UNLIMITED)
133 SUB_MIN_WIDTH
DB ?
;AN003;MINIMUM FIELD WIDTH
134 SUB_PAD_CHAR
DB ?
;AN003;CHARACTER FOR PAD FIELD
135 ; CAN BE " ", "0" OR ",". ;AN003;
136 ; "," CAUSES INSERTION OF THE ACTIVE ;AN003;
137 ; THOUSANDS SEPARATOR BETWEEN EVERY 3 DIGITS. ;AN003;
141 ZERO EQU
0 ;AN000;COMPARAND FOR MISSING PARMS
142 RETCODE_QUESTION EQU
-1 ;AN000;VALUE IN BX, IF PARM=?
143 EXPAR EQU
3 ;AN000;RETURN TO DOS, INVALID DOS COMND LINE PARMS
144 CR EQU
13 ;AN000;CARRIAGE RETURN
145 BLANK EQU
" " ;AN002;AVOIDS DUPLICATES SWITCHES
146 NUL EQU
0 ;AN003;ASCIIZ DELIMITER
147 ; = = = = = = = = = = = =
148 ; EXIT CODES FROM SYSPARSE (WHEN CY=0)
150 SYSPRM_EX_OK EQU
0 ;AN000; no error
151 SYSPRM_EX_MANY EQU
1 ;AN000; too many operands
152 SYSPRM_EX_MISSING EQU
2 ;AN000; required operand missing
153 SYSPRM_EX_NOT_SWLIST EQU
3 ;AN000; not in switch list provided
154 SYSPRM_EX_NOT_KEYLIST EQU
4 ;AN000; not in keyword list provided
155 SYSPRM_EX_RANGE EQU
6 ;AN000; out of range specified
156 SYSPRM_EX_VALUE EQU
7 ;AN000; not in value list provided
157 SYSPRM_EX_STRING EQU
8 ;AN000; not in string list provided
158 SYSPRM_EX_SYNTAX EQU
9 ;AN000; syntax error
159 SYSPRM_EX_EOL EQU
-1 ;AN000; end of command line
160 ; = = = = = = = = = = = =
161 HEADER
<STRUC - DEFINITIONS OF EXTERNAL CONTROL BLOCKS
> ;AN000;
162 LANGUAGE
STRUC ;AN000;DEFINITION OF EACH LANGUAGE TABLE
163 LANCHAR
DB 1024 DUP(?
) ;AN000;8 BYTES PER EACH OF 128 CHARACTERS
164 LANID
DW ?
;AN000;TWO BYTE CODEPAGE ID, TO MATCH
165 ; GRAFTABL CMD LINE PARM
166 LANNAME
DB 14 DUP(?
) ;AN000;ASCIIZ STRING NAME OF LANGUAGE
167 LANGUAGE ENDS
;AN000;
168 ; = = = = = = = = = = = =
170 DB 80H
DUP (?
) ;AN000;SKIP OVER FIRST HALF OF PSP
171 PSP_PARMLEN
DB ?
;AN000;NUMBER OF BYTES IN DOS COMMAND LINE
172 PSP_COMMAND
DB 127 DUP(?
) ;AN000;TEXT OF DOS COMMAND LINE
174 ; = = = = = = = = = = = =
175 HEADER
<PARSING WORKAREAS
> ;AN000;
176 ; $SALUT (4,14,19,36) ;AN000;
177 CSEG
SEGMENT PARA
PUBLIC ;AN000;
178 ASSUME
CS:CSEG
,DS:CSEG
,ES:CSEG
,SS:CSEG
;AN000;
180 EXTRN SENDMSG
:NEAR ;AN000;USES MSG DESCRIPTOR TO DRIVE MESSAGE HANDLR
181 EXTRN SYSPARSE
:NEAR ;AN000;SYSTEM COMMAND LINE PARSER
183 EXTRN TABLEUS
:BYTE ;AN000;FIRST TABLE OF FONTS
184 EXTRN EXITFL
:BYTE ;AN000;ERRORLEVEL RETURN CODE
185 EXTRN MSGNUM_PARSE
:WORD ;AN000;MESSAGE DESCRIPTOR FOR ALL PARSE ERRORS
186 EXTRN SUBLIST_PARSE
:WORD ;AN003;POINTS TO INVALID PARM
187 EXTRN ACTIVECPID
:WORD ;AN000;POINTER TO CPID ENTRY OF ACTIVE ENTRY
188 ; = = = = = = = = = = = =
190 CURRENT_PARM
DW 81H
;AN000;POINTER INTO COMMAND OF NEXT OPERAND
191 PUBLIC CURRENT_PARM
;AN000;
193 ORDINAL
DW 0 ;AN000;ORDINAL NUMBER OF WHICH PARM TO PARSE
194 PUBLIC ORDINAL
;AN000;
196 FIRST_TIME
DB 0 ;AN000;INDICATES IF A PARM ALREADY FOUND
197 PARSE_RESULT
DW 0 ;AN000;TEMP, HOLDS BX TO BE RETURNED
198 ; If a Code Page number was specified
199 ; BX = Offset to language table to be loaded
200 ; DX = Integer value of Code Page specified
201 ; If /STATUS (or /STA) was specified
203 ; If Question mark was specified
205 ; = = = = = = = = = = = =
206 HEADER
<DOS COMMAND LINE PARSER CONTROL BLOCKS
> ;AN000;
208 ;INPUT PARAMETERS CONTROL BLOCK, POINTED TO BY ES:DI WHEN CALLING PARSER
210 PUBLIC PARMS
;AN000;LET LINK MAKE PARMS BLOCK ADDRESSABLE
211 PARMS
LABEL BYTE ;AN000;PARMS CONTROL BLOCK
212 DW PARMSX
;AN000;POINTER TO PARMS EXTENSION
213 DB 0 ;AN000; NUMBER OF STRINGS (0, 1, 2)
214 ; NEXT LIST WOULD BE EXTRA DELIM LIST
215 ; (,& WHITESPACE ALWAYS)
216 ; NEXT LIST WOULD BE EXTRA END OF LINE LIST
219 ;SYSTEM PARSER PARAMETER EXTENSION CONTROL BLOCK
220 PARMSX
LABEL BYTE ;AN000;PARMS EXTENSION CONTROL BLOCK
221 DB 0,1 ;AN000; MIN, MAX POSITIONAL OPERANDS ALLOWED
222 DW CONTROL_POS
;AN000; DESCRIPTION OF POSITIONAL 1
224 DB 1 ;AN000; MAX SWITCH OPERANDS ALLOWED
225 DW CONTROL_SW
;AN000; DESCRIPTION OF SWITCH 1
227 DB 0 ;AN000; MAX KEYWORD OPERANDS ALLOWED
228 ; THERE IS NO CONTROL BLOCK
231 ; = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
232 HEADER
<POSITIONAL PARM DESCRIPTOR BLOCK
> ;AN000;
233 ;PARSER CONTROL BLOCK DEFINING THE ONLY POSITIONAL PARAMETER, OPTIONAL
235 ;FIRST POSITIONAL PARAMETER IS:
236 ; [cp|?] THE CODEPAGE NUMBER, OR THE QUESTION MARK
238 PUBLIC CONTROL_POS
;AN000;LET LINK MAKE THIS ADDRESSABLE
239 CONTROL_POS
LABEL BYTE ;AN000;FIRST POSITIONAL DESCRIPTOR FOR FILESPEC,
241 DW 2001H
;AN000; CONTROLS TYPE MATCHED
242 ; SELECTED BITS: "SIMPLE STRING" AND "OPTIONAL"
244 ; 8000H=NUMERIC VALUE, (VALUE LIST WILL BE CHECKED)
245 ; 4000H=SIGNED NUMERIC VALUE (VALUE LIST WILL BE
247 ; 2000H=SIMPLE STRING(VALUE LIST WILL BE CHECKED)
248 ; 1000H=DATE STRING (VALUE LIST WON'T BE CHECKED)
249 ; 0800H=TIME STRING (VALUE LIST WON'T BE CHECKED)
250 ; 0400H=COMPLEX LIST (VALUE LIST WON'T BE CHECKED)
251 ; 0200H=FILE SPEC (VALUE LIST WON'T BE CHECKED)
252 ; 0100H=DRIVE ONLY (VALUE LIST WON'T BE CHECKED)
253 ; 0080H=QUOTED STRING (VALUE LIST WON'T BE CHECKED)
254 ; 0010H=IGNORE ":" AT END IN MATCH
255 ; 0002H=REPEATS ALLOWED
258 DW 0000H ;AN000;FUNCTION_FLAGS ("NO CAPS")
259 ; 0001H=CAP RESULT BY FILE TABLE
260 ; 0002H=CAP RESULT BY CHAR TABLE
261 ; 0010H=REMOVE ":" AT END
262 DW RESULT
;AN000; RESULT BUFFER
263 DW VALS
;AN000; VALUE LISTS
264 DB 0 ;AN000; NUMBER OF KEYWORD/SWITCH SYNONYMS
267 ;VALUE CONTROL BLOCK FOR THE POSITIONAL PARAMETERS
268 VALS
DB 3 ;AN000;NUMBER OF VALS DEFINITIONS (0-3)
269 DB 0 ;AN000;NUMBER OF RANGES (NONE)
270 DB 0 ;AN000;NUMBER OF NUMERIC CHOICES (NONE)
271 DB 6 ;AN000;NUMBER OF CHOICE STRINGS
274 ;THE ORDER OF THESE VALUE DEFINITIONS IS SIGNIFICANT. THEIR ORDER MUST
275 ;MATCH THE ORDER IN WHICH THE CORRESPONDING FONT TABLE MODULES ARE
276 ;LINKED TOGETHER. THUE THE "VALUE RETURNED" OF 1 MEANS THE FIRST LINKED
277 ;FONT TABLE, THE VALUE OF 5 MEANS THE FIFTH LINKED FONT TABLE, ETC.
279 VAL_437 EQU
1 ;AN000;VALUE RETURNED
280 DB VAL_437
;AN000; FOR:
281 DW S437
;AN000;SPECIFIC CHOICE IF STRING
283 VAL_850 EQU
2 ;AN000;VALUE RETURNED
284 DB VAL_850
;AN000; FOR:
285 DW S850
;AN000;SPECIFIC CHOICE IF STRING
287 VAL_860 EQU
3 ;AN000;VALUE RETURNED
288 DB VAL_860
;AN000; FOR:
289 DW S860
;AN000;SPECIFIC CHOICE IF STRING
291 VAL_863 EQU
4 ;AN000;VALUE RETURNED
292 DB VAL_863
;AN000; FOR:
293 DW S863
;AN000;SPECIFIC CHOICE IF STRING
295 VAL_865 EQU
5 ;AN000;VALUE RETURNED
296 DB VAL_865
;AN000; FOR:
297 DW S865
;AN000;SPECIFIC CHOICE IF STRING
299 VAL_QUESTION EQU
6 ;AN000;VALUE RETURNED
300 DB VAL_QUESTION
;AN000; FOR:
301 DW SQU
;AN000;SPECIFIC CHOICE IF STRING
303 ; SET OF ASCIIZ STRINGS, DEFINING THE POSITIONAL PARAMETER
304 S437
DB "437",0 ;AN000;USA
305 S850
DB "850",0 ;AN000;MULTI-LINGUAL
306 S860
DB "860",0 ;AN000;PORTUGUESE
307 S863
DB "863",0 ;AN000;CANADIAN FRENCH
308 S865
DB "865",0 ;AN000;NORDIC
311 ;RESULTS CONTROL BLOCK FOR THE POSITIONAL PARAMETER, AND SWITCH PARAMETER
312 RESULT
LABEL BYTE ;AN000; BELOW FILLED IN FOR DEFAULTS
313 DB 3 ;AN000; TYPE RETURNED: 0=RESERVED,
314 ; 1=NUMBER, 2=LIST INDEX,
315 ; 3=STRING, 4=COMPLEX,
316 ; 5=FILESPEC, 6=DRIVE
319 RESULT_TAG
DB 0FFH ;AN000; MATCHED ITEM TAG
320 RESULT_SYN
DW 0 ;AN000;POINTER TO SYNONYM
322 RESULT_PTR
DD ?
;AN000;OFFSET OF STRING VALUE
324 ; = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
325 HEADER
<SWITCH PARM DESCRIPTOR BLOCK
> ;AN000;
326 ;PARSER CONTROL BLOCK DEFINING THE ONLY SWITCH, OPTIONAL
328 ;THE SWITCH IS "/STA" OR "/STATUS". WHEN REQUESTED, IT MEANS TO IDENTIFY
329 ;WHAT CODEPAGE IS CURRENTLY SUPPORTED BY THE PREVIOUS GRAFTABL, IF ANY.
330 PUBLIC CONTROL_SW
;AN000;LET LINK MAKE THIS ADDRESSABLE
331 CONTROL_SW
LABEL BYTE ;AN000;SWITCH DESCRIPTOR FOR /STA
332 DW 0001H ;AN000; CONTROLS TYPE MATCHED
333 ;SELECTED BITS: "OPTIONAL"
334 ; 8000H=NUMERIC VALUE, (VALUE LIST WILL BE CHECKED)
335 ; 4000H=SIGNED NUMERIC VALUE (VALUE LIST WILL BE
337 ; 2000H=SIMPLE STRING(VALUE LIST WILL BE CHECKED)
338 ; 1000H=DATE STRING (VALUE LIST WON'T BE CHECKED)
339 ; 0800H=TIME STRING (VALUE LIST WON'T BE CHECKED)
340 ; 0400H=COMPLEX LIST (VALUE LIST WON'T BE CHECKED)
341 ; 0200H=FILE SPEC (VALUE LIST WON'T BE CHECKED)
342 ; 0100H=DRIVE ONLY (VALUE LIST WON'T BE CHECKED)
343 ; 0080H=QUOTED STRING (VALUE LIST WON'T BE CHECKED)
344 ; 0010H=IGNORE ":" AT END IN MATCH
345 ; 0002H=REPEATS ALLOWED
348 DW 0000H ;AN000;FUNCTION_FLAGS ("NO CAPS")
349 ; 0001H=CAP RESULT BY FILE TABLE
350 ; 0002H=CAP RESULT BY CHAR TABLE
351 ; 0010H=REMOVE ":" AT END
353 DW RESULT
;AN000; RESULT BUFFER
354 ;(USE SAME RESULT BUF AS DID POSITIONAL PARM)
355 DW NOVALS
;AN000; VALUE LISTS
356 DB 2 ;AN000; NUMBER OF KEYWORD/SWITCH SYNONYMS
358 SW_STA
DB "/STA",0 ;AN000; IF n >0, KEYWORD 1
359 SW_STATUS
DB "/STATUS",0 ;AN000;SECOND KEYWORD
361 ;VALUE CONTROL BLOCK FOR THE SWITCHES
362 NOVALS
LABEL BYTE ;AN000;
363 DB 0 ;AN000; NUMBER OF VALUE DEFINITIONS (0 - 3)
364 ; = = = = = = = = = = = =
365 PATHLABL GRTABPAR
;AN006;
366 HEADER
<PARSER
- ASK SYSPARM TO DECODE PARAMETERS
> ;AN000;
367 ; $SALUT (4,4,9,36) ;AN000;
368 PARSER PROC
NEAR ;AN000;
369 PUBLIC PARSER
;AN000;
371 ;INPUT: "CURRENT_PARM" = OFFSET TO NEXT PARM IN COMMAND STRING
372 ; "ORDINAL" = COUNT OF NEXT PARM TO PARSE
373 ; PSP+81H = TEXT OF DOS COMMAND LINE PARMS STRING
374 ;OUTPUT: IF A CODEPAGE NUMBER WAS SPECIFIED
375 ; BX = OFFSET TO LANGUAGE TABLE TO BE LOADED
376 ; DX = INTEGER VALUE OF CODEPAGE SPECIFIED
377 ; IF /STATUS WAS SPECIFIED
379 ; IF QUESTION MARK WAS SPECIFIED
382 ;IF THERE WAS ANY PROBLEM WITH THE PARMS, THE QUESTION MARK IS ASSUMED,
383 ;AND "EXITFL" SET TO "EXPAR" TO INDICATE PARM ERROR.
385 ;IT A CP IS SPECIFIED, A STATUS REPORT IS ALWAYS GIVEN TO SAY WHAT WHAT
386 ;THERE PREVIOUSLY, SO IF THE USER SPECIFIED A CP AND THE /STATUS SWITCH,
387 ;THEN THE /STATUS DOES NOTHING BEYOND WHAT WOULD HAVE BEEN DONE ALREADY
388 ;WITH JUST THE CP SPECIFICATION. I ALWAYS REPORT STATUS. THE ONLY
389 ;REASON TO HAVE /STATUS IS TO BE ABLE TO SEE WHAT IS THERE ALREADY
390 ;WITHOUT INVOKING THE DEFAULT OF 437 (USA) BY NOT SPECIFYING A CP.
391 ; = = = = = = = = = = = =
393 ; $SEARCH COMPLEX ;AN000;LOOP THRU COMMAND LINE
396 ;LOOKING AT RET CODE IN AX SET BY SYSPARSE
397 CMP AX,ZERO
;AN000;WERE THERE ANY ERRORS?
398 ; $EXITIF NE ;AN000;HAD A PROBLEM
400 CALL PARSE_ERROR
;AN000;DISPLAY REASON FOR ERROR
402 ; $ORELSE LONG ;AN000;SINCE NO PROBLEM, SO FAR
405 MOV ORDINAL
,CX ;AN000;SAVE UPDATED COUNT
406 CMP FIRST_TIME
,ZERO
;AN000;DO I HAVE A PARM YET?
407 ; $IF E ;AN000;NOT YET, LOOK AT THIS ONE JUST FOUND
409 MOV CURRENT_PARM
,SI ;AN000;REMEMBER HOW FAR I GOT
410 CMP RESULT_SYN
,ZERO
;AN000;WAS POSITIONAL PARM SPECIFIED?
411 ; $IF E ;AN000;IF POSITIONAL PARM SPECIFIED,
413 MOV CL,RESULT_TAG
;AN000;GET ID OF SPECIFIED PARM
414 XOR CH,CH ;AN000;CLEAR HIGH BYTE
415 CMP CL,VAL_QUESTION
;AN000;WAS "?" SPECIFIED?
416 ; $IF E ;AN000;IF "?" SPECIFIED
418 MOV BX,RETCODE_QUESTION
;AN000;INDICATE THAT "?" SPECIFIED
419 ; $ELSE ;AN000;SINCE "?" NOT SPECIFIED
422 LEA BX,TABLEUS
;AN000;GET WHERE FIRST CODEPAGE STARTS, USING CX
423 ; AS A COUNTER, STEP THRU THE LANGUAGE TABLES
424 ; UNTIL GETTING TO THE SPECIFIED ONE
425 ; $DO COMPLEX ;AN000;
428 ADD BX,TYPE LANGUAGE
;AN000;POINT TO NEXT TABLE
429 ADD ACTIVECPID
,CPID_L
;AN000;SELECT NEXT CPID ENTRY
432 ; $ENDDO LOOP ;AN000;DECREMENT INDEX
434 ;BX-OFFSET TO LANGUAGE TABLE
435 ; INDICATED BY POSITIONAL PARM
436 ; $ENDIF ;AN000;"?" SPECIFIED?
438 ; $ELSE ;AN000;SINCE NOT POSITIONAL PARM SPECIFIED
441 ;RESULT_SYN POINTS TO A SWITCH
442 XOR BX,BX ;AN000; MUST HAVE BEEN THE SWITCH, /STATUS
443 MOV SW_STA
,BLANK
;AN002;AVOID THE DUPLICATION OF THIS SWITCH
444 MOV SW_STATUS
,BLANK
;AN002;AVOID THE DUPLICATION OF THIS SWITCH
445 ; $ENDIF ;AN000;POSITIONAL?
447 INC FIRST_TIME
;AN000;INDICATE A PARM HAS BEEN FOUND
448 ; $ELSE ;AN000;SINCE ALREADY HAVE A PARM
451 PUSH SI ;AN003;SAVE NEW INDEX TO COMMAND LINE
452 CALL PARSE_ERROR
;AN000;FUSS ABOUT TOO MANY PARMS
454 POP CURRENT_PARM
;AN000;REMEMBER HOW FAR I GOT
456 ; $ENDIF ;AN000;ALREADY HAVE A PARM?
458 MOV PARSE_RESULT
,BX ;AN000;SAVE THE RESULT OF THIS PARSE
461 LEA DI,PARMS
;AN000; ES:DI = PARSE CONTROL DEFINITON
462 MOV SI,CURRENT_PARM
;AN000; DS:SI = COMMAND STRING, NEXT PARM
463 XOR DX,DX ;AN000; RESERVED, INIT TO ZERO
464 MOV CX,ORDINAL
;AN000; OPERAND ORDINAL, INITIALLY ZERO
465 CALL SYSPARSE
;AN000;LOOK AT DOS PARMS
467 ; BL=TERMINATED DELIMETER CODE
468 ; CX=NEW OPERAND ORDINAL
469 ; SI=SET TO PAST SCANNED OPERAND
470 ; DX=SELECTED RESULT BUFFER
471 CMP AX,SYSPRM_EX_EOL
;AN000; IS THAT THE END OF THE PARMS?
472 ;IF NOT, LOOP BACK AND FIND OUT
474 ; $ENDLOOP E ;AN000;END OF LIST
476 CMP FIRST_TIME
,ZERO
;AN000;FIND ANYTHING YET?
477 ; $IF E ;AN000;IF NO PARM SPECIFIED
479 LEA BX,TABLEUS
;AN000;SPECIFY 437 (USA) AS DEFAULT
480 ; $ELSE ;AN000;SINCE A PARM WAS FOUND
483 MOV BX,PARSE_RESULT
;AN000;REMEMBER PARM ALREADY FOUND
486 ;BX=-1, "?"; BX=0, "/STATUS";BX>0, CP TABLE
487 CMP BX,ZERO
;AN000;WAS A CP TABLE FOUND?
488 ; $IF A ;AN000;IF A CP TABLE FOUND
490 MOV DX,[BX].LANID
;AN000;FETCH THE TWO CHAR ID FROM TABLE
493 ; $ENDSRCH ;AN000;FINISHED WITH DOS COMMAND LINE
495 RET ;AN000;RETURN TO CALLER
497 ; = = = = = = = = = = = = ;AN000;
498 HEADER
<PARSE_ERROR
- DISPLAY REASON FOR PARSE ERROR
> ;AN000;
499 PARSE_ERROR PROC
NEAR ;AN000;
500 ;INPUT: "FIRST_TIME" - IF NON-ZERO, FORCE ERROR CODE TO "TOO MANY PARMS"
501 ; AX - ERROR NUMBER RETURNED FROM PARSE.
502 ; SI - OFFSET INTO COMMAND OF FIRST BYTE BEYOND PARM IN ERROR
503 ; "CURRENT_PARM" - OFFSET INTO COMMAND OF WHERE TO START LOOKING FOR PARM
504 ;OUTPUT: APPROPRIATE ERROR MESSAGE IS DISPLAYED.
505 ; BX IS SET TO PRETEND THAT THE "?" WAS SPECIFIED.
506 ; "EXITFL" SET TO "EXPAR" TO INDICATE PARM ERROR.
507 ; = = = = = = = = = = = =
509 CMP FIRST_TIME
,ZERO
;AN000;ANY PARMS FOUND YET?
510 ; $IF NE ;AN000;IF PARM ALREADY FOUND
512 MOV AX,SYSPRM_EX_MANY
;AN000;CHANGE RETURN CODE TO "TOO MANY PARMS"
513 ; $ENDIF ;AN000;PARMS FOUND?
515 MOV MSGNUM_PARSE
,AX ;AN000;PASS MESSAGE NUMBER TO DESCRIPTOR
516 MOV AX,CURRENT_PARM
;AN003;GET POINTER TO START OF BAD PARM
517 CMP SI,AX ;AN003;HAS THE INDEX TO COMMAND LINE MOVED?
518 ; $IF NE ;AN003;YES, THERE IS A FAULTY PARM
520 MOV BYTE PTR [SI],NUL
;AN003;DELIMIT THE BAD PARM
521 MOV SUBLIST_PARSE
.SUB_VALUE
,AX ;AN000;POINT SUBLIST TO BAD PARM
523 MOV MSGNUM_PARSE
.MSG_SUBLIST
,OFFSET SUBLIST_PARSE
;AN003;POINT TO SUBLIST
524 MOV MSGNUM_PARSE
.MSG_COUNT
,ONE_SUBS
;AN003;SET COUNT OF SUBLISTS TO ONE
525 ; $ENDIF ;AN003;INDEX MOVED?
527 LEA DI,MSGNUM_PARSE
;AN000;PASS MESSAGE DESCRIPTOR
528 CALL SENDMSG
;AN000;DISPLAY ERROR MESSAGE
530 MOV BX,RETCODE_QUESTION
;AN000;INDICATE THAT "?" SPECIFIED
531 MOV EXITFL
,EXPAR
;AN000;ERRORLEVEL CODE TO "PARM ERROR"
532 RET ;AN000;RETURN TO CALLER
533 PARSE_ERROR ENDP
;AN000;
534 ; = = = = = = = = = = = =
535 PATHLABL GRTABPAR
;AN006;