summaryrefslogtreecommitdiff
path: root/v4.0/src/CMD/GRAFTABL/GRTABPAR.ASM
diff options
context:
space:
mode:
authorGravatar Mark Zbikowski2024-04-25 21:24:10 +0100
committerGravatar Microsoft Open Source2024-04-25 22:32:27 +0000
commit2d04cacc5322951f187bb17e017c12920ac8ebe2 (patch)
tree80ee017efa878dfd5344b44249e6a241f2a7f6e2 /v4.0/src/CMD/GRAFTABL/GRTABPAR.ASM
parentMerge pull request #430 from jpbaltazar/typoptbr (diff)
downloadms-dos-main.tar.gz
ms-dos-main.tar.xz
ms-dos-main.zip
MZ is back!HEADmain
Diffstat (limited to 'v4.0/src/CMD/GRAFTABL/GRTABPAR.ASM')
-rw-r--r--v4.0/src/CMD/GRAFTABL/GRTABPAR.ASM538
1 files changed, 538 insertions, 0 deletions
diff --git a/v4.0/src/CMD/GRAFTABL/GRTABPAR.ASM b/v4.0/src/CMD/GRAFTABL/GRTABPAR.ASM
new file mode 100644
index 0000000..320161d
--- /dev/null
+++ b/v4.0/src/CMD/GRAFTABL/GRTABPAR.ASM
@@ -0,0 +1,538 @@
1 PAGE 90,132 ;AN000;A2
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; = = = = = = = = = = = =
101HEADER 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
111MSG_DESC STRUC ;AN003;
112MSG_NUM DW ? ;AN003;MESSAGE NUMBER (TO AX)
113MSG_HANDLE DW ? ;AN003;HANDLE OF OUTPUT DEVICE (TO BX)
114MSG_SUBLIST DW ? ;AN003;POINTER TO SUBLIST (TO SI)
115MSG_COUNT DW ? ;AN003;SUBSTITUTION COUNT (TO CX)
116MSG_CLASS DW ? ;AN003;MESSAGE CLASS (IN HIGH BYTE, TO DH)
117 ; LOW BYTE HAS 0 (FUNCTION "NO INPUT", TO DL);AN003;
118MSG_DESC ENDS ;AN003;
119
120ONE_SUBS EQU 1 ;AN003;NUMBER OF VARIABLES
121
122SUBLIST STRUC ;AN000;
123SUB_SIZE DB ? ;AN003;SUBLIST SIZE (POINTER TO NEXT SUBLIST)
124SUB_RES DB ? ;AN003;RESERVED
125 ;NEXT FIELD IS TO BE USED AS A DOUBLE WORD ;AN003;
126SUB_VALUE DW ? ;AN003;TIME, DATE, OR PTR TO DATA ITEM
127SUB_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;
130SUB_ID DB ? ;AN003;N OF %N
131SUB_FLAGS DB ? ;AN003;DATA TYPE FLAGS
132SUB_MAX_WIDTH DB ? ;AN003;MAXIMUM FIELD WIDTH (0=UNLIMITED)
133SUB_MIN_WIDTH DB ? ;AN003;MINIMUM FIELD WIDTH
134SUB_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;
138SUBLIST ENDS ;AN003;
139
140; LOCAL EQUATES
141ZERO EQU 0 ;AN000;COMPARAND FOR MISSING PARMS
142RETCODE_QUESTION EQU -1 ;AN000;VALUE IN BX, IF PARM=?
143EXPAR EQU 3 ;AN000;RETURN TO DOS, INVALID DOS COMND LINE PARMS
144CR EQU 13 ;AN000;CARRIAGE RETURN
145BLANK EQU " " ;AN002;AVOIDS DUPLICATES SWITCHES
146NUL EQU 0 ;AN003;ASCIIZ DELIMITER
147; = = = = = = = = = = = =
148; EXIT CODES FROM SYSPARSE (WHEN CY=0)
149
150SYSPRM_EX_OK EQU 0 ;AN000; no error
151SYSPRM_EX_MANY EQU 1 ;AN000; too many operands
152SYSPRM_EX_MISSING EQU 2 ;AN000; required operand missing
153SYSPRM_EX_NOT_SWLIST EQU 3 ;AN000; not in switch list provided
154SYSPRM_EX_NOT_KEYLIST EQU 4 ;AN000; not in keyword list provided
155SYSPRM_EX_RANGE EQU 6 ;AN000; out of range specified
156SYSPRM_EX_VALUE EQU 7 ;AN000; not in value list provided
157SYSPRM_EX_STRING EQU 8 ;AN000; not in string list provided
158SYSPRM_EX_SYNTAX EQU 9 ;AN000; syntax error
159SYSPRM_EX_EOL EQU -1 ;AN000; end of command line
160; = = = = = = = = = = = =
161 HEADER <STRUC - DEFINITIONS OF EXTERNAL CONTROL BLOCKS> ;AN000;
162LANGUAGE STRUC ;AN000;DEFINITION OF EACH LANGUAGE TABLE
163LANCHAR DB 1024 DUP(?) ;AN000;8 BYTES PER EACH OF 128 CHARACTERS
164LANID DW ? ;AN000;TWO BYTE CODEPAGE ID, TO MATCH
165 ; GRAFTABL CMD LINE PARM
166LANNAME DB 14 DUP(?) ;AN000;ASCIIZ STRING NAME OF LANGUAGE
167LANGUAGE ENDS ;AN000;
168; = = = = = = = = = = = =
169PSP STRUC ;AN000;
170 DB 80H DUP (?) ;AN000;SKIP OVER FIRST HALF OF PSP
171PSP_PARMLEN DB ? ;AN000;NUMBER OF BYTES IN DOS COMMAND LINE
172PSP_COMMAND DB 127 DUP(?) ;AN000;TEXT OF DOS COMMAND LINE
173PSP ENDS ;AN000;
174; = = = = = = = = = = = =
175 HEADER <PARSING WORKAREAS> ;AN000;
176; $SALUT (4,14,19,36) ;AN000;
177CSEG 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
190CURRENT_PARM DW 81H ;AN000;POINTER INTO COMMAND OF NEXT OPERAND
191 PUBLIC CURRENT_PARM ;AN000;
192
193ORDINAL DW 0 ;AN000;ORDINAL NUMBER OF WHICH PARM TO PARSE
194 PUBLIC ORDINAL ;AN000;
195
196FIRST_TIME DB 0 ;AN000;INDICATES IF A PARM ALREADY FOUND
197PARSE_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
211PARMS 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
220PARMSX 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
239CONTROL_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
268VALS 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
279VAL_437 EQU 1 ;AN000;VALUE RETURNED
280 DB VAL_437 ;AN000; FOR:
281 DW S437 ;AN000;SPECIFIC CHOICE IF STRING
282
283VAL_850 EQU 2 ;AN000;VALUE RETURNED
284 DB VAL_850 ;AN000; FOR:
285 DW S850 ;AN000;SPECIFIC CHOICE IF STRING
286
287VAL_860 EQU 3 ;AN000;VALUE RETURNED
288 DB VAL_860 ;AN000; FOR:
289 DW S860 ;AN000;SPECIFIC CHOICE IF STRING
290
291VAL_863 EQU 4 ;AN000;VALUE RETURNED
292 DB VAL_863 ;AN000; FOR:
293 DW S863 ;AN000;SPECIFIC CHOICE IF STRING
294
295VAL_865 EQU 5 ;AN000;VALUE RETURNED
296 DB VAL_865 ;AN000; FOR:
297 DW S865 ;AN000;SPECIFIC CHOICE IF STRING
298
299VAL_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
304S437 DB "437",0 ;AN000;USA
305S850 DB "850",0 ;AN000;MULTI-LINGUAL
306S860 DB "860",0 ;AN000;PORTUGUESE
307S863 DB "863",0 ;AN000;CANADIAN FRENCH
308S865 DB "865",0 ;AN000;NORDIC
309SQU DB "?",0 ;AN000;
310
311;RESULTS CONTROL BLOCK FOR THE POSITIONAL PARAMETER, AND SWITCH PARAMETER
312RESULT 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
319RESULT_TAG DB 0FFH ;AN000; MATCHED ITEM TAG
320RESULT_SYN DW 0 ;AN000;POINTER TO SYNONYM
321
322RESULT_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
331CONTROL_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
358SW_STA DB "/STA",0 ;AN000; IF n >0, KEYWORD 1
359SW_STATUS DB "/STATUS",0 ;AN000;SECOND KEYWORD
360
361;VALUE CONTROL BLOCK FOR THE SWITCHES
362NOVALS 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;
368PARSER 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
496PARSER ENDP ;AN000;
497; = = = = = = = = = = = = ;AN000;
498 HEADER <PARSE_ERROR - DISPLAY REASON FOR PARSE ERROR> ;AN000;
499PARSE_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
533PARSE_ERROR ENDP ;AN000;
534; = = = = = = = = = = = =
535 PATHLABL GRTABPAR ;AN006;
536CSEG ENDS ;AN000;
537 END ;AN000;
538 \ No newline at end of file