]> wirehaze git hosting - MS-DOS.git/blob - v4.0/src/CMD/GRAFTABL/GRTABPAR.ASM

wirehaze git hosting

MZ is back!
[MS-DOS.git] / v4.0 / src / CMD / GRAFTABL / GRTABPAR.ASM
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
5
6 ; DESCRIPTIVE NAME: Handle the definition of the DOS command line parameters
7 ; and the interface to the DOS system PARSER.
8
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
14 ; to the user.
15
16 ; ENTRY POINT: PARSER, near
17
18 ; INPUT: (DOS COMMAND LINE PARAMETERS)
19
20 ; [d:][path] GRAFTABL [cp|?|/STA|/STATUS]
21
22 ; WHERE
23 ; [d:][path] - Path where the GRAFTABL command resides.
24
25 ; [cp] - Codepage number to be loaded. If blank,
26 ; 437 is assumed
27
28 ; [?] - This requests a display of the parameters
29 ; supported by the GRAFTABL command.
30
31 ; [/STATUS] - (May be shortened to just /STA.) This
32 ; requests the current codepage already
33 ; loaded by a previous GRAFTABL, if any,
34 ; be displayed.
35
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
40
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
45 ; BX = 0
46 ; If Question mark was specified
47 ; BX=-1
48
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.
54
55 ; INTERNAL REFERENCES:
56 ; ROUTINES:
57 ; PARSE_ERROR:NEAR Display the appropriate Parse error message.
58
59 ; DATA AREAS:
60 ; The several parameter control blocks, defined by the System
61 ; PARSER interface, defining the GRAFTABL parameters.
62
63 ; EXTERNAL REFERENCES:
64 ; ROUTINES:
65 ; SENDMSG:NEAR Uses Msg Descriptor to drive message handler.
66 ; SYSPARSE:NEAR System Command Line Common Parser.
67
68 ; DATA AREAS:
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.
76
77 ; NOTES:
78 ; This module should be processed with the SALUT preprocessor
79 ; with the re-alignment not requested, as:
80
81 ; SALUT GRTABPAR,NUL
82
83 ; To assemble these modules, the alphabetical or sequential
84 ; ordering of segments may be used.
85
86 ; For LINK instructions, refer to the PROLOG of the main module,
87 ; GRTAB.SAL.
88
89 ; REVISION HISTORY:
90 ; A001 PTM 382 display "ACTIVE" OR "PREVIOUS" CP.
91 ; A002 PTM 474 Avoid duplicate switches
92 ; A003 PTM 538 Display parm in error
93
94 ;****************** END OF SPECIFICATIONS *****************************
95 IF1 ;AN000;
96 %OUT COMPONENT=GRAFTABL, MODULE=GRTABPAR.SAL... ;AN000;
97 ENDIF ;AN000;
98 ; = = = = = = = = = = = =
99 INCLUDE PATHMAC.INC ;AN006;
100 ; = = = = = = = = = = = =
101 HEADER MACRO TEXT ;;AN000;
102 .XLIST ;AN000;
103 SUBTTL TEXT ;AN000;
104 .LIST ;AN000;
105 PAGE ;AN000;
106 ENDM ;;AN000;
107 ; = = = = = = = = = = = =
108 ; $SALUT (4,23,28,36) ;AN000;
109 EXTRN CPID_L:ABS ;AN000;BYTES PER CPID ENTRY
110
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;
119
120 ONE_SUBS EQU 1 ;AN003;NUMBER OF VARIABLES
121
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;
138 SUBLIST ENDS ;AN003;
139
140 ; LOCAL EQUATES
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)
149
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 ; = = = = = = = = = = = =
169 PSP STRUC ;AN000;
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
173 PSP ENDS ;AN000;
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;
179
180 EXTRN SENDMSG:NEAR ;AN000;USES MSG DESCRIPTOR TO DRIVE MESSAGE HANDLR
181 EXTRN SYSPARSE:NEAR ;AN000;SYSTEM COMMAND LINE PARSER
182
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 ; = = = = = = = = = = = =
189
190 CURRENT_PARM DW 81H ;AN000;POINTER INTO COMMAND OF NEXT OPERAND
191 PUBLIC CURRENT_PARM ;AN000;
192
193 ORDINAL DW 0 ;AN000;ORDINAL NUMBER OF WHICH PARM TO PARSE
194 PUBLIC ORDINAL ;AN000;
195
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
202 ; BX = 0
203 ; If Question mark was specified
204 ; BX=-1
205 ; = = = = = = = = = = = =
206 HEADER <DOS COMMAND LINE PARSER CONTROL BLOCKS> ;AN000;
207
208 ;INPUT PARAMETERS CONTROL BLOCK, POINTED TO BY ES:DI WHEN CALLING PARSER
209
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
217 ; (CR,LF,0 ALWAYS)
218
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
223
224 DB 1 ;AN000; MAX SWITCH OPERANDS ALLOWED
225 DW CONTROL_SW ;AN000; DESCRIPTION OF SWITCH 1
226
227 DB 0 ;AN000; MAX KEYWORD OPERANDS ALLOWED
228 ; THERE IS NO CONTROL BLOCK
229 ; DEFINING KEYWORDS
230
231 ; = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
232 HEADER <POSITIONAL PARM DESCRIPTOR BLOCK> ;AN000;
233 ;PARSER CONTROL BLOCK DEFINING THE ONLY POSITIONAL PARAMETER, OPTIONAL
234
235 ;FIRST POSITIONAL PARAMETER IS:
236 ; [cp|?] THE CODEPAGE NUMBER, OR THE QUESTION MARK
237
238 PUBLIC CONTROL_POS ;AN000;LET LINK MAKE THIS ADDRESSABLE
239 CONTROL_POS LABEL BYTE ;AN000;FIRST POSITIONAL DESCRIPTOR FOR FILESPEC,
240 ; OPTIONAL
241 DW 2001H ;AN000; CONTROLS TYPE MATCHED
242 ; SELECTED BITS: "SIMPLE STRING" AND "OPTIONAL"
243
244 ; 8000H=NUMERIC VALUE, (VALUE LIST WILL BE CHECKED)
245 ; 4000H=SIGNED NUMERIC VALUE (VALUE LIST WILL BE
246 ; CHECKED)
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
256 ; 0001H=OPTIONAL
257
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
265 ; IN FOLLOWING LIST
266
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
272
273
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.
278
279 VAL_437 EQU 1 ;AN000;VALUE RETURNED
280 DB VAL_437 ;AN000; FOR:
281 DW S437 ;AN000;SPECIFIC CHOICE IF STRING
282
283 VAL_850 EQU 2 ;AN000;VALUE RETURNED
284 DB VAL_850 ;AN000; FOR:
285 DW S850 ;AN000;SPECIFIC CHOICE IF STRING
286
287 VAL_860 EQU 3 ;AN000;VALUE RETURNED
288 DB VAL_860 ;AN000; FOR:
289 DW S860 ;AN000;SPECIFIC CHOICE IF STRING
290
291 VAL_863 EQU 4 ;AN000;VALUE RETURNED
292 DB VAL_863 ;AN000; FOR:
293 DW S863 ;AN000;SPECIFIC CHOICE IF STRING
294
295 VAL_865 EQU 5 ;AN000;VALUE RETURNED
296 DB VAL_865 ;AN000; FOR:
297 DW S865 ;AN000;SPECIFIC CHOICE IF STRING
298
299 VAL_QUESTION EQU 6 ;AN000;VALUE RETURNED
300 DB VAL_QUESTION ;AN000; FOR:
301 DW SQU ;AN000;SPECIFIC CHOICE IF STRING
302
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
309 SQU DB "?",0 ;AN000;
310
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
317 ; 7=DATE, 8=TIME
318 ; 9=QUOTED STRING
319 RESULT_TAG DB 0FFH ;AN000; MATCHED ITEM TAG
320 RESULT_SYN DW 0 ;AN000;POINTER TO SYNONYM
321
322 RESULT_PTR DD ? ;AN000;OFFSET OF STRING VALUE
323
324 ; = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
325 HEADER <SWITCH PARM DESCRIPTOR BLOCK> ;AN000;
326 ;PARSER CONTROL BLOCK DEFINING THE ONLY SWITCH, OPTIONAL
327
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
336 ; CHECKED)
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
346 ; 0001H=OPTIONAL
347
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
352
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
357 ; IN FOLLOWING LIST
358 SW_STA DB "/STA",0 ;AN000; IF n >0, KEYWORD 1
359 SW_STATUS DB "/STATUS",0 ;AN000;SECOND KEYWORD
360
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;
370
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
378 ; BX = 0
379 ; IF QUESTION MARK WAS SPECIFIED
380 ; BX=-1
381
382 ;IF THERE WAS ANY PROBLEM WITH THE PARMS, THE QUESTION MARK IS ASSUMED,
383 ;AND "EXITFL" SET TO "EXPAR" TO INDICATE PARM ERROR.
384
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 ; = = = = = = = = = = = =
392
393 ; $SEARCH COMPLEX ;AN000;LOOP THRU COMMAND LINE
394 JMP SHORT $$SS1
395 $$DO1:
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
399 JE $$IF1
400 CALL PARSE_ERROR ;AN000;DISPLAY REASON FOR ERROR
401
402 ; $ORELSE LONG ;AN000;SINCE NO PROBLEM, SO FAR
403 JMP $$SR1
404 $$IF1:
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
408 JNE $$IF4
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,
412 JNE $$IF5
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
417 JNE $$IF6
418 MOV BX,RETCODE_QUESTION ;AN000;INDICATE THAT "?" SPECIFIED
419 ; $ELSE ;AN000;SINCE "?" NOT SPECIFIED
420 JMP SHORT $$EN6
421 $$IF6:
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;
426 JMP SHORT $$SD8
427 $$DO8:
428 ADD BX,TYPE LANGUAGE ;AN000;POINT TO NEXT TABLE
429 ADD ACTIVECPID,CPID_L ;AN000;SELECT NEXT CPID ENTRY
430 ; $STRTDO ;AN000;
431 $$SD8:
432 ; $ENDDO LOOP ;AN000;DECREMENT INDEX
433 LOOP $$DO8
434 ;BX-OFFSET TO LANGUAGE TABLE
435 ; INDICATED BY POSITIONAL PARM
436 ; $ENDIF ;AN000;"?" SPECIFIED?
437 $$EN6:
438 ; $ELSE ;AN000;SINCE NOT POSITIONAL PARM SPECIFIED
439 JMP SHORT $$EN5
440 $$IF5:
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?
446 $$EN5:
447 INC FIRST_TIME ;AN000;INDICATE A PARM HAS BEEN FOUND
448 ; $ELSE ;AN000;SINCE ALREADY HAVE A PARM
449 JMP SHORT $$EN4
450 $$IF4:
451 PUSH SI ;AN003;SAVE NEW INDEX TO COMMAND LINE
452 CALL PARSE_ERROR ;AN000;FUSS ABOUT TOO MANY PARMS
453
454 POP CURRENT_PARM ;AN000;REMEMBER HOW FAR I GOT
455
456 ; $ENDIF ;AN000;ALREADY HAVE A PARM?
457 $$EN4:
458 MOV PARSE_RESULT,BX ;AN000;SAVE THE RESULT OF THIS PARSE
459 ; $STRTSRCH ;AN000;
460 $$SS1:
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
466 ; AX=EXIT CODE
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
473 ; WHAT THAT PARM IS
474 ; $ENDLOOP E ;AN000;END OF LIST
475 JNE $$DO1
476 CMP FIRST_TIME,ZERO ;AN000;FIND ANYTHING YET?
477 ; $IF E ;AN000;IF NO PARM SPECIFIED
478 JNE $$IF18
479 LEA BX,TABLEUS ;AN000;SPECIFY 437 (USA) AS DEFAULT
480 ; $ELSE ;AN000;SINCE A PARM WAS FOUND
481 JMP SHORT $$EN18
482 $$IF18:
483 MOV BX,PARSE_RESULT ;AN000;REMEMBER PARM ALREADY FOUND
484 ; $ENDIF ;AN000;
485 $$EN18:
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
489 JNA $$IF21
490 MOV DX,[BX].LANID ;AN000;FETCH THE TWO CHAR ID FROM TABLE
491 ; $ENDIF ;AN000;
492 $$IF21:
493 ; $ENDSRCH ;AN000;FINISHED WITH DOS COMMAND LINE
494 $$SR1:
495 RET ;AN000;RETURN TO CALLER
496 PARSER ENDP ;AN000;
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 ; = = = = = = = = = = = =
508
509 CMP FIRST_TIME,ZERO ;AN000;ANY PARMS FOUND YET?
510 ; $IF NE ;AN000;IF PARM ALREADY FOUND
511 JE $$IF24
512 MOV AX,SYSPRM_EX_MANY ;AN000;CHANGE RETURN CODE TO "TOO MANY PARMS"
513 ; $ENDIF ;AN000;PARMS FOUND?
514 $$IF24:
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
519 JE $$IF26
520 MOV BYTE PTR [SI],NUL ;AN003;DELIMIT THE BAD PARM
521 MOV SUBLIST_PARSE.SUB_VALUE,AX ;AN000;POINT SUBLIST TO BAD PARM
522
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?
526 $$IF26:
527 LEA DI,MSGNUM_PARSE ;AN000;PASS MESSAGE DESCRIPTOR
528 CALL SENDMSG ;AN000;DISPLAY ERROR MESSAGE
529
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;
536 CSEG ENDS ;AN000;
537 END ;AN000;
538 \1a