2 TITLE TREEPAR
.SAL - PARSE THE DOS COMMAND LINE
;AN000;
3 ;****************** START OF SPECIFICATIONS *****************************
4 ; MODULE NAME: TREEPAR.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 TREE. 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] TREE [D:][path] [/F] [/A]
23 ; [d:][path] - Path where the TREE command resides.
25 ; [D:][path] - Display of subdirectories starts with this
26 ; specified subdirectory. If this is not
27 ; specified, the default is the drive root directory.
29 ; [/F] - This requests the files in each subdirectory
30 ; in addition to the subdirectories themselves
33 ; [/A] -This requests use of alternate char in place of graphics.
35 ; Upon entry to PARSER in this module,
36 ; "CURRENT_PARM" = offset to start of parm text in command string
37 ; "ORDINAL" = initialized to zero
38 ; PSP+81H = text of DOS command line parms string
40 ; EXIT-NORMAL: Carry flag is clear.
42 ; EXIT-ERROR: Carry flag is set. Parse error msg has been displayed.
44 ; INTERNAL REFERENCES:
46 ; PARSE_ERROR:NEAR Display the appropriate Parse error message.
49 ; The several parameter control blocks, defined by the System
50 ; PARSER interface, defining the TREE parameters.
51 ; INCLUDE PATHMAC.INC - PATHGEN MACRO
53 ; EXTERNAL REFERENCES:
55 ; SENDMSG:NEAR Uses Msg Descriptor to drive message handler.
56 ; SYSPARSE:NEAR System Command Line Common Parser.
59 ; EXITFL:BYTE Errorlevel return code.
60 ; MSGNUM_PARSE:WORD Message descriptor for all parse errors.
63 ; This module should be processed with the SALUT preprocessor
64 ; with the re-alignment not requested, as:
68 ; To assemble these modules, the alphabetical or sequential
69 ; ordering of segments may be used.
71 ; For LINK instructions, refer to the PROLOG of the main module,
75 ;****************** END OF SPECIFICATIONS *****************************
76 HEADER
<LOCAL MACROS
, EQUATES
> ;AN000;
78 %
OUT COMPONENT
=TREE
, MODULE
=TREEPAR
.SAL... ;AN000;
80 INCLUDE PATHMAC
.INC ;AN012;
81 ; = = = = = = = = = = = =
82 HEADER
MACRO TEXT
;;AN000;
88 ; = = = = = = = = = = = =
89 EXTRN MAX_PATH
:ABS
;AN000;MAX LENGTH OF PATH PERMITTED
91 ; $SALUT (4,23,28,36) ;AN004;
92 MSG_DESC
STRUC ;AN004;
93 MSG_NUM
DW ?
;AN004;MESSAGE NUMBER (TO AX)
94 MSG_HANDLE
DW ?
;AN004;HANDLE OF OUTPUT DEVICE (TO BX)
95 MSG_SUBLIST
DW ?
;AN004;POINTER TO SUBLIST (TO SI)
96 MSG_COUNT
DW ?
;AN004;SUBSTITUTION COUNT (TO CX)
97 MSG_CLASS
DW ?
;AN004;MESSAGE CLASS (IN HIGH BYTE, TO DH)
98 ; LOW BYTE HAS 0 (FUNCTION "NO INPUT", TO DL);AN004;
101 ONE_SUBS EQU
1 ;AN004;NUMBER OF VARIABLES
103 SUBLIST
STRUC ;AN000;
104 SUB_SIZE
DB ?
;AN004;SUBLIST SIZE (POINTER TO NEXT SUBLIST)
105 SUB_RES
DB ?
;AN004;RESERVED
106 ;NEXT FIELD IS TO BE USED AS A DOUBLE WORD ;AN004;
107 SUB_VALUE
DW ?
;AN004;TIME, DATE, OR PTR TO DATA ITEM
108 SUB_VALUE_SEG
DW ?
;AN004;SEG ID OF PTR
109 ;(ABOVE FIELD MUST BE FILLED AT EXECUTION TIME ;AN004;
110 ; IF THIS IS A .COM FILE) ;AN004;
111 SUB_ID
DB ?
;AN004;N OF %N
112 SUB_FLAGS
DB ?
;AN004;DATA TYPE FLAGS
113 SUB_MAX_WIDTH
DB ?
;AN004;MAXIMUM FIELD WIDTH (0=UNLIMITED)
114 SUB_MIN_WIDTH
DB ?
;AN004;MINIMUM FIELD WIDTH
115 SUB_PAD_CHAR
DB ?
;AN004;CHARACTER FOR PAD FIELD
116 ; CAN BE " ", "0" OR ",". ;AN004;
117 ; "," CAUSES INSERTION OF THE ACTIVE ;AN004;
118 ; THOUSANDS SEPARATOR BETWEEN EVERY 3 DIGITS. ;AN004;
123 CMD_BUF_SIZE EQU
127 ;AN000;NUMBER BYTES IN DOS COMMAND LINE BUFFER
124 ZERO EQU
0 ;AN000;COMPARAND FOR CLEARED REG
125 COLON EQU
":" ;AN000;FOLLOWS DRIVE LETTER IN FULL FILESPEC
126 NUL EQU
0 ;AN000;DELIMITER FOR ASCIIZ STRINGS
127 BACK_SLASH EQU
"\" ;AN000;PATH DELIMITER
128 BLANK EQU " " ;AN003;WIPE OUT SWITCH, AVOIDS DUPLICATES
130 ; EXIT CODES FROM SYSPARSE (WHEN CY=0)
132 SYSPRM_EX_OK EQU 0 ;AN000; no error
133 SYSPRM_EX_MANY EQU 1 ;AN000; too many operands
134 SYSPRM_EX_MISSING EQU 2 ;AN000; required operand missing
135 SYSPRM_EX_NOT_SWLIST EQU 3 ;AN000; not in switch list provided
136 SYSPRM_EX_NOT_KEYLIST EQU 4 ;AN000; not in keyword list provided
137 SYSPRM_EX_RANGE EQU 6 ;AN000; out of range specified
138 SYSPRM_EX_VALUE EQU 7 ;AN000; not in value list provided
139 SYSPRM_EX_STRING EQU 8 ;AN000; not in string list provided
140 SYSPRM_EX_SYNTAX EQU 9 ;AN000; syntax error
141 SYSPRM_EX_EOL EQU -1 ;AN000; end of command line
142 HEADER <EXTRN REFERENCES, LOCAL VARIABLES> ;AN000;
143 EXTRN F_SWITCH:ABS ;AN000;BIT FLAGS TO TURN ON IF /F SPECIFIED
145 ; $SALUT (4,15,20,28) ;AN000;
146 CSEG SEGMENT PARA PUBLIC 'CODE' ;AN000;
147 ASSUME CS:CSEG,DS:CSEG,ES:CSEG,SS:CSEG ;AN000;ESTABLISHED BY CALLER
149 ;WHERE THE PARMS COME FROM:
150 EXTRN COMMAND:BYTE ;AN000;DOS INPUT COMMAND LINE PARMS
153 EXTRN FLAGS:BYTE ;AN000;HAS INDICATOR FOR /F
154 ; WHERE F_SWITCH BIT GOES
155 EXTRN START_DRIVE:BYTE ;AN000;LETTER OF DRIVE BEING RESEARCHED
156 EXTRN START_PATH:BYTE ;AN000;PATH OF START OF CHAIN BEING RESEARCHED
157 EXTRN GRAF_TABLE:BYTE ;AN002;TABLE OF GRAPHIC CHARACTERS
158 EXTRN GRAF_TABLE_ALT:BYTE ;AN002;ALTERNATE SET OF GRAPHIC CHARACTERS
161 EXTRN MSGNUM_PARSE:WORD ;AN000;MSG DESCRIPTOR FOR PARSE ERRORS
162 EXTRN SUBLIST_PARSE:WORD ;AN004;POINTS TO INVALID PARM
163 EXTRN MSGNUM_INVPATH:WORD ;AN000;"INVALID PATH
" COMMON MESSAGE
165 ;EXTERNAL SUBROUTINES USED:
166 EXTRN SYSPARSE:NEAR ;AN000;COMMAND LINE PARM PARSER
167 EXTRN SENDMSG:NEAR ;AN000;USES MSG DESCRIPTOR TO DRIVE MESSAGE HANDLR
168 EXTRN SCAN_DBCS:NEAR ;AN012;GET LAST TWO CHARS OF STRING
170 CURRENT_PARM DW ? ;AN000;POINTER INTO COMMAND OF NEXT OPERAND
171 PUBLIC CURRENT_PARM ;AN000;
173 ORDINAL DW ? ;AN000;ORDINAL NUMBER OF WHICH PARM TO PARSE
174 PUBLIC ORDINAL ;AN000;
177 ; INPUT: (DOS COMMAND LINE PARAMETERS)
179 ; [d:][path] TREE [D:][path] [/F] [/A]
182 ; [d:][path] - Path where the TREE command resides.
184 ; [D:][path] - Display of subdirectories starts with this
185 ; specified subdirectory. If this is not
186 ; specified, the default is the drive root directory.
188 ; [/F] - This requests the files in each subdirectory
189 ; in addition to the subdirectories themselves
192 ; [/A] - This requests use of alternate graphic chars
193 ; = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
194 HEADER <PARSE CONTROL BLOCKS DEFINING PARMS> ;AN000;
195 ;INPUT PARAMETERS CONTROL BLOCK, POINTED TO BY ES:DI WHEN CALLING PARSER
197 PARMS LABEL BYTE ;AN000;PARMS CONTROL BLOCK
198 DW PARMSX ;AN000;POINTER TO PARMS EXTENSION
199 DB 0 ;AN000; NUMBER OF STRINGS (0, 1, 2)
200 ; NEXT LIST WOULD BE EXTRA DELIM LIST
201 ; (,& WHITESPACE ALWAYS)
202 ; NEXT LIST WOULD BE EXTRA END OF LINE LIST
205 PARMSX LABEL BYTE ;AN000;PARMS EXTENSION CONTROL BLOCK
206 DB 0,1 ;AN000; MIN, MAX POSITIONAL OPERANDS ALLOWED
207 DW CONTROL_POS ;AN000; DESCRIPTION OF POSITIONAL 1
209 DB 1 ;AN000; MAX SWITCH OPERANDS ALLOWED
210 DW CONTROL_SW ;AN000; DESCRIPTION OF SWITCH 1
212 DB 0 ;AN000; MAX KEYWORD OPERANDS ALLOWED
213 ; THERE IS NO CONTROL BLOCK
216 ; = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
218 ;PARSER CONTROL BLOCK DEFINING THE ONLY POSITIONAL PARAMETER, OPTIONAL
220 ;FIRST POSITIONAL PARAMETER IS:
223 CONTROL_POS LABEL BYTE ;AN000;FIRST POSITIONAL DESCRIPTOR FOR FILESPEC,
225 DW 0201H ;AN000; CONTROLS TYPE MATCHED
226 ; SELECTED BITS: "FILE SPEC
" AND "OPTIONAL
"
228 ; 8000H=NUMERIC VALUE, (VALUE LIST WILL BE CHECKED)
229 ; 4000H=SIGNED NUMERIC VALUE (VALUE LIST WILL BE
231 ; 2000H=SIMPLE STRING(VALUE LIST WILL BE CHECKED)
232 ; 1000H=DATE STRING (VALUE LIST WON'T BE CHECKED)
233 ; 0800H=TIME STRING (VALUE LIST WON'T BE CHECKED)
234 ; 0400H=COMPLEX LIST (VALUE LIST WON'T BE CHECKED)
235 ; 0200H=FILE SPEC (VALUE LIST WON'T BE CHECKED)
236 ; 0100H=DRIVE ONLY (VALUE LIST WON'T BE CHECKED)
237 ; 0080H=QUOTED STRING (VALUE LIST WON'T BE CHECKED)
238 ; 0010H=IGNORE ":" AT END IN MATCH
239 ; 0002H=REPEATS ALLOWED
242 DW 0001H ;AN000;FUNCTION_FLAGS
243 ; 0001H=CAP RESULT BY FILE TABLE
244 ; 0002H=CAP RESULT BY CHAR TABLE
245 ; 0010H=REMOVE ":" AT END
246 DW RESULT1 ;AN000; RESULT BUFFER
247 DW NOVALS ;AN000; VALUE LISTS
248 DB 0 ;AN000; NUMBER OF KEYWORD/SWITCH SYNONYMS
252 NOVALS LABEL BYTE ;AN000;
253 DB 0 ;AN000; NUMBER OF VALUE DEFINITIONS (0 - 3)
255 RESULT1 LABEL BYTE ;AN000; BELOW FILLED IN FOR DEFAULTS
256 DB 5 ;AN000; TYPE RETURNED: 0=RESERVED,
257 ; 1=NUMBER, 2=LIST INDEX,
258 ; 3=STRING, 4=COMPLEX,
259 ; 5=FILESPEC, 6=DRIVE
262 DB 0FFH ;AN000; MATCHED ITEM TAG
263 DW 0 ;AN000;POINTER TO SYNONYM
265 RESULT_PTR1 DD ? ;AN000; OFFSET OF STRING VALUE
268 ; = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
270 ;PARSER CONTROL BLOCK DEFINING THE SWITCHES, OPTIONAL
272 ;THE SWITCH IS "/F
". WHEN REQUESTED, IT MEANS TO LIST ALL FILE
273 ;NAMES IN EVERY DIRECTORY BEING TRACED.
274 ;THE OTHER SWITCH IS "/A
". IT MEANS TO USE THE ALTERNATE SET OF GRAPHIC CHARS.
276 CONTROL_SW LABEL BYTE ;AN000;SWITCH DESCRIPTOR
277 DW 0000H ;AN000; CONTROLS TYPE MATCHED
278 ; 8000H=NUMERIC VALUE, (VALUE LIST WILL BE CHECKED)
279 ; 4000H=SIGNED NUMERIC VALUE (VALUE LIST WILL BE
281 ; 2000H=SIMPLE STRING(VALUE LIST WILL BE CHECKED)
282 ; 1000H=DATE STRING (VALUE LIST WON'T BE CHECKED)
283 ; 0800H=TIME STRING (VALUE LIST WON'T BE CHECKED)
284 ; 0400H=COMPLEX LIST (VALUE LIST WON'T BE CHECKED)
285 ; 0200H=FILE SPEC (VALUE LIST WON'T BE CHECKED)
286 ; 0100H=DRIVE ONLY (VALUE LIST WON'T BE CHECKED)
287 ; 0080H=QUOTED STRING (VALUE LIST WON'T BE CHECKED)
288 ; 0010H=IGNORE ":" AT END IN MATCH
289 ; 0002H=REPEATS ALLOWED
292 DW 0002H ;AN000;FUNCTION_FLAGS
293 ; 0001H=CAP RESULT BY FILE TABLE
294 ; 0002H=CAP RESULT BY CHAR TABLE
295 ; 0010H=REMOVE ":" AT END
297 DW RESULTSW1 ;AN000; RESULT BUFFER
298 DW NOVALS ;AN000; VALUE LISTS
299 DB 2 ;AN002; NUMBER OF KEYWORD/SWITCH SYNONYMS
301 F_SW DB "/F
",0 ;AN000; IF n >0, KEYWORD 1
302 A_SW DB "/A
",0 ;AN002; IF n >0, KEYWORD 2
306 RESULTSW1 LABEL BYTE ;AN000; BELOW FILLED IN FOR DEFAULTS
307 DB 3 ;AN000; TYPE RETURNED: 0=RESERVED,
308 ; 1=NUMBER, 2=LIST INDEX,
309 ; 3=STRING, 4=COMPLEX,
310 ; 5=FILESPEC, 6=DRIVE
313 DB 0FFh ;AN000; MATCHED ITEM TAG
315 SYNONYM DW 0 ;AN000; SYNONYM POINTER (BASED ON ES:)
316 RESULT_PTR2 DD ? ;AN000; OFFSET OF STRING VALUE
317 PATHLABL TREEPAR ;AN013;
318 ; = = = = = = = = = = = =
319 HEADER <PARSER - DRIVE SYSPARSE, VERIFY RESULTS> ;AN000;
320 ; $SALUT (4,4,9,36) ;AN000;
321 PARSER PROC NEAR ;AN000;
322 PUBLIC PARSER ;AN000;
324 ;INPUT: "CURRENT_PARM
" = OFFSET TO NEXT PARM IN COMMAND STRING
325 ; "ORDINAL
" = COUNT OF NEXT PARM TO PARSE
326 ; "COMMAND
" = TEXT OF DOS COMMAND LINE PARMS STRING
327 ;OUTPUT: CARRY IS SET IF THERE WAS A PROBLEM, AX HAS PARSE RET CODE.
328 ; CARRY IS CLEAR IF ALL OK WITH THE PARMS
329 ;THE PSP IS NOT REFERENCED, SINCE THE PARMS HAVE BEEN MOVED OUT OF THERE.
330 ; = = = = = = = = = = = =
332 ; $SEARCH COMPLEX ;AN000;LOOP THRU COMMAND LINE
335 MOV ORDINAL,CX ;AN000;SAVE UPDATED COUNT
337 ;LOOKING AT RETURN CODE IN AX,
338 ; JUST PRODUCED BY SYSPARSE...
339 CMP AX,ZERO ;AN000;WERE THERE ANY ERRORS?
340 ; $IF NE ;AN000;HAD A PROBLEM FOUND BY SYSPARSE
342 CALL PARSE_ERROR ;AN000;DISPLAY REASON FOR ERROR
344 STC ;AN000;SET CARRY TO INDICATE ERROR
345 ; $ELSE ;AN000;SINCE OK BY SYSPARSE
348 MOV CURRENT_PARM,SI ;AN000;REMEMBER HOW FAR I GOT
349 CALL CHECK_PATH ;AN000;SEE IF A GOOD PATH WAS SPECIFIED
350 ;OUTPUT: CY SET IF ERROR
353 ; $EXITIF C,NUL ;AN000;HAD A PROBLEM WITH THE PARMS
356 ;SINCE ALL OK SO FAR, CONTINUE
357 ; $STRTSRCH ;AN000;ENTRY POINT INTO THE SEARCH LOOP
359 LEA DI,PARMS ;AN000; ES:DI = PARSE CONTROL DEFINITON
360 MOV SI,CURRENT_PARM ;AN000; DS:SI = COMMAND STRING, NEXT PARM
361 XOR DX,DX ;AN000; RESERVED, INIT TO ZERO
362 MOV CX,ORDINAL ;AN000; OPERAND ORDINAL, INITIALLY ZERO
363 CALL SYSPARSE ;AN000;
365 ; BL=TERMINATED DELIMITER CODE
366 ; CX=NEW OPERAND ORDINAL
367 ; SI=SET TO PAST SCANNED OPERAND
368 ; DX=SELECTED RESULT BUFFER
369 CMP AX,SYSPRM_EX_EOL ;AN000; IS THAT THE END OF THE PARMS?
370 ;IF NOT, LOOP BACK AND FIND OUT
372 ; $ENDLOOP E ;AN000;END OF LIST
374 CLC ;AN000;SAY ALL OK
377 RET ;AN000;RETURN TO CALLER
379 ; = = = = = = = = = = = =
380 HEADER <CHECK_PATH - SEE IF THE PATH IS OK> ;AN000;
381 ;MOVE THE PATH STRING FROM RESULT BUFFER TO "START_DRIVE
" AND "START_PATH
",
382 ;VERIFY THE LENGTH OF THE PATH AS BEING WITHIN LIMITS.
383 ;CHECK FOR THE /F SWITCH, SETTING "FLAGS
" (F_SWITCH BIT ON) IF /F SPECIFIED.
385 ;INPUT: DX AS SET BY SYSPARSE, POINTS TO RESULT BUFFER
386 ;OUTPUT: CY SET IF PROBLEM, CY CLEAR IF ALL OK
387 ; = = = = = = = = = = = =
389 CHECK_PATH PROC NEAR ;AN000;
390 PUBLIC CHECK_PATH ;AN000;
392 MOV BX,DX ;AN000;SET DATA BASE REG TO POINT TO THIS OPERAND
393 CMP BX,OFFSET RESULT1 ;AN000;WAS PATH SPECIFIED?
394 ; $IF E ;AN000;IF PATH SPECIFIED,
396 MOV SI,WORD PTR RESULT_PTR1 ;AN000;GET WHERE THE STRING IS
397 CMP BYTE PTR [SI]+1,COLON ;AN000;DOES PATH START WITH DRIVE?
398 ; $IF E ;AN000;STARTS WITH DRIVE
400 LEA DI,START_DRIVE ;AN000;MOVE PARM TO STARTUP FILESPEC
401 LODSB ;AN000;MOVE THE DRIVE ID
402 STOSB ;AN000; INTO "START_DRIVE
"
403 INC SI ;AN000;STEP SOURCE INDEX OVER COLON
404 INC DI ;AN000;STEP DEST INDEX OVER COLON
405 ; $ELSE ;AN000;DOES NOT START WITH DRIVE
408 LEA DI,START_PATH ;AN000;MOVE PARM TO STARTUP FILESPEC
409 ; $ENDIF ;AN000;PATH HAVE DRIVE?
412 PUSH SI ;AN012;SAVE WHERE STRING STARTS
413 CALL SCAN_DBCS ;AN012;SCAN STRING FOR DBCS
414 ;DL=LAST CHAR, DH=NEXT TO LAST CHAR
415 POP SI ;AN012;RESTORE POINTER TO START OF STRING
416 ;NOW TO GET THE PATH ITSELF
418 MOV CX,MAX_PATH ;AN000;SET THE LIMIT OF PATH LENGTH
419 INC CX ;AN000; INCLUDING THE NUL AT THE END
420 ; $SEARCH COMPLEX ;AN000;
423 STOSB ;AN000;PUT THIS CHAR INTO "START_PATH
"
426 LODSB ;AN000;GET A CHAR FROM PARSED STRING
427 CMP AL,NUL ;AN000;IS THIS THE DELIMITER?
428 ; $EXITIF E ;AN000;NORMAL END OF STRING FOUND
430 CMP DL,BACK_SLASH ;AN012;IS PREV CHAR A BACKSLASH?
431 ; $IF E,AND ;AN012;YES, PREV CHAR WAS A BACKSLASH
433 CMP DH,BACK_SLASH ;AN012;IS CHAR BEFORE THAT A BACKSLASH?
434 ; $IF NE,AND ;AN012;NO, CHAR BEFORE THAT WAS NOT A BACKSLASH
436 CMP CX,MAX_PATH ;AN000;WAS THIS THE ONLY CHAR?
437 ; $IF NE ;AN000;NO, NOT THE ONLY ONE
439 MOV BYTE PTR [DI-1],NUL ;AN000;CHANGE IT TO A "NUL
"
442 CLC ;AN000;FLAG NO ERROR
443 ; $ORELSE ;AN000;CHECK OUT THIS NEW CHAR
446 ; $ENDLOOP LOOP ;AN000;GO BACK AND SAVE IT, IF ROOM
448 LEA DI,MSGNUM_INVPATH ;AN000;"INVALID PATH
"
449 CALL SENDMSG ;AN000;DISPLAY THE MESSAGE
451 STC ;AN000;FLAG AN ERROR
455 ; $ELSE ;AN000;FILESPEC NOT SPECIFIED
458 MOV AX,SYNONYM ;AN002;GET SYNONYM POINTER
459 CMP AX,OFFSET F_SW ;AN002;WAS THE SWITCH /F?
462 MOV F_SW,BLANK ;AN003;STRIKE THE /F FROM THE LIST OF SWITCHES
463 OR FLAGS,F_SWITCH ;AN000;REQUEST LISTING OF FILENAMES
465 ; $ELSE ;AN002;SINCE NOT /F, MUST BE /A
468 MOV A_SW,BLANK ;AN003;STRIKE THE /A FROM THE LIST OF SWITCHES
469 MOV AX,WORD PTR GRAF_TABLE_ALT ;AN002;PICK UP THE ALTERNATE SET
470 MOV WORD PTR GRAF_TABLE,AX ;AN002; OF GRAPHICS CHARACTERS
471 MOV AX,WORD PTR GRAF_TABLE_ALT+WORD ;AN002; AND MOVE THEM TO
472 MOV WORD PTR GRAF_TABLE+WORD,AX ;AN002; THE TABLE OF GRAPHICS TO BE USED
475 ; $ENDIF ;AN000;FILESPEC?
477 RET ;AN000;RETURN TO CALLER
478 CHECK_PATH ENDP ;AN000;
479 ; = = = = = = = = = = = =
480 HEADER <PARSE_ERROR - DISPLAY ERROR MSG FOR PARSER> ;AN000;
481 PARSE_ERROR PROC NEAR ;AN000;
482 PUBLIC PARSE_ERROR ;AN000;
484 ;INPUT: AX - ERROR NUMBER RETURNED FROM PARSE.
485 ; SI - OFFSET INTO COMMAND OF FIRST BYTE BEYOND PARM IN ERROR
486 ; "CURRENT_PARM
" - OFFSET INTO COMMAND OF WHERE TO START LOOKING FOR PARM
487 ; = = = = = = = = = = = =
489 MOV MSGNUM_PARSE,AX ;AN000;SET THE ERROR NUMBER
490 MOV AX,CURRENT_PARM ;AN004;GET POINTER TO START OF BAD PARM
491 CMP SI,AX ;AN004;HAS THE INDEX TO COMMAND LINE MOVED?
492 ; $IF NE ;AN004;YES, THERE IS A FAULTY PARM
494 MOV BYTE PTR [SI],NUL ;AN004;DELIMIT THE BAD PARM
495 MOV SUBLIST_PARSE.SUB_VALUE,AX ;AN000;POINT SUBLIST TO BAD PARM
497 MOV MSGNUM_PARSE.MSG_SUBLIST,OFFSET SUBLIST_PARSE ;AN004;POINT TO SUBLIST
498 MOV MSGNUM_PARSE.MSG_COUNT,ONE_SUBS ;AN004;SET COUNT OF SUBLISTS TO ONE
499 ; $ENDIF ;AN004;INDEX MOVED?
501 LEA DI,MSGNUM_PARSE ;AN000;PASS MESSAGE DESCRIPTOR
502 CALL SENDMSG ;AN000;DISPLAY ERROR MESSAGE
504 RET ;AN000;RETURN TO CALLER
505 PARSE_ERROR ENDP ;AN000;
506 ; = = = = = = = = = = = =
507 PATHLABL TREEPAR ;AN013;