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

wirehaze git hosting

MZ is back!
[MS-DOS.git] / v4.0 / src / CMD / TREE / TREEPAR.ASM
1 PAGE ,132 ;AN000;\ f
2 TITLE TREEPAR.SAL - PARSE THE DOS COMMAND LINE ;AN000;
3 ;****************** START OF SPECIFICATIONS *****************************
4 ; MODULE NAME: TREEPAR.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 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
14 ; to the user.
15 ;
16 ; ENTRY POINT: PARSER, near
17 ;
18 ; INPUT: (DOS COMMAND LINE PARAMETERS)
19 ;
20 ; [d:][path] TREE [D:][path] [/F] [/A]
21
22 ; WHERE
23 ; [d:][path] - Path where the TREE command resides.
24
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.
28
29 ; [/F] - This requests the files in each subdirectory
30 ; in addition to the subdirectories themselves
31 ; are to be listed.
32 ;
33 ; [/A] -This requests use of alternate char in place of graphics.
34 ;
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
39
40 ; EXIT-NORMAL: Carry flag is clear.
41
42 ; EXIT-ERROR: Carry flag is set. Parse error msg has been displayed.
43
44 ; INTERNAL REFERENCES:
45 ; ROUTINES:
46 ; PARSE_ERROR:NEAR Display the appropriate Parse error message.
47
48 ; DATA AREAS:
49 ; The several parameter control blocks, defined by the System
50 ; PARSER interface, defining the TREE parameters.
51 ; INCLUDE PATHMAC.INC - PATHGEN MACRO
52
53 ; EXTERNAL REFERENCES:
54 ; ROUTINES:
55 ; SENDMSG:NEAR Uses Msg Descriptor to drive message handler.
56 ; SYSPARSE:NEAR System Command Line Common Parser.
57 ;
58 ; DATA AREAS:
59 ; EXITFL:BYTE Errorlevel return code.
60 ; MSGNUM_PARSE:WORD Message descriptor for all parse errors.
61 ;
62 ; NOTES:
63 ; This module should be processed with the SALUT preprocessor
64 ; with the re-alignment not requested, as:
65 ;
66 ; SALUT TREEPAR,NUL
67 ;
68 ; To assemble these modules, the alphabetical or sequential
69 ; ordering of segments may be used.
70 ;
71 ; For LINK instructions, refer to the PROLOG of the main module,
72 ; TREE.SAL.
73 ;
74 ;
75 ;****************** END OF SPECIFICATIONS *****************************
76 HEADER <LOCAL MACROS, EQUATES> ;AN000;
77 IF1 ;AN000;
78 %OUT COMPONENT=TREE, MODULE=TREEPAR.SAL... ;AN000;
79 ENDIF ;AN000;
80 INCLUDE PATHMAC.INC ;AN012;
81 ; = = = = = = = = = = = =
82 HEADER MACRO TEXT ;;AN000;
83 .XLIST ;;AN000;
84 SUBTTL &TEXT ;;AN000;
85 .LIST ;;AN000;
86 PAGE ;;AN000;
87 ENDM ;;AN000;
88 ; = = = = = = = = = = = =
89 EXTRN MAX_PATH:ABS ;AN000;MAX LENGTH OF PATH PERMITTED
90
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;
99 MSG_DESC ENDS ;AN004;
100
101 ONE_SUBS EQU 1 ;AN004;NUMBER OF VARIABLES
102
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;
119 SUBLIST ENDS ;AN004;
120
121 ; LOCAL EQUATES
122
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
129
130 ; EXIT CODES FROM SYSPARSE (WHEN CY=0)
131
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
144
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
148
149 ;WHERE THE PARMS COME FROM:
150 EXTRN COMMAND:BYTE ;AN000;DOS INPUT COMMAND LINE PARMS
151
152 ;WHERE THE PARMS GO:
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
159
160 ;MESSAGES USED:
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
164
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
169
170 CURRENT_PARM DW ? ;AN000;POINTER INTO COMMAND OF NEXT OPERAND
171 PUBLIC CURRENT_PARM ;AN000;
172
173 ORDINAL DW ? ;AN000;ORDINAL NUMBER OF WHICH PARM TO PARSE
174 PUBLIC ORDINAL ;AN000;
175
176
177 ; INPUT: (DOS COMMAND LINE PARAMETERS)
178
179 ; [d:][path] TREE [D:][path] [/F] [/A]
180
181 ; WHERE
182 ; [d:][path] - Path where the TREE command resides.
183
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.
187
188 ; [/F] - This requests the files in each subdirectory
189 ; in addition to the subdirectories themselves
190 ; are to be listed.
191
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
196
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
203 ; (CR,LF,0 ALWAYS)
204
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
208
209 DB 1 ;AN000; MAX SWITCH OPERANDS ALLOWED
210 DW CONTROL_SW ;AN000; DESCRIPTION OF SWITCH 1
211
212 DB 0 ;AN000; MAX KEYWORD OPERANDS ALLOWED
213 ; THERE IS NO CONTROL BLOCK
214 ; DEFINING KEYWORDS
215
216 ; = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
217
218 ;PARSER CONTROL BLOCK DEFINING THE ONLY POSITIONAL PARAMETER, OPTIONAL
219
220 ;FIRST POSITIONAL PARAMETER IS:
221 ; [D:][PATH]
222
223 CONTROL_POS LABEL BYTE ;AN000;FIRST POSITIONAL DESCRIPTOR FOR FILESPEC,
224 ; OPTIONAL
225 DW 0201H ;AN000; CONTROLS TYPE MATCHED
226 ; SELECTED BITS: "FILE SPEC" AND "OPTIONAL"
227
228 ; 8000H=NUMERIC VALUE, (VALUE LIST WILL BE CHECKED)
229 ; 4000H=SIGNED NUMERIC VALUE (VALUE LIST WILL BE
230 ; CHECKED)
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
240 ; 0001H=OPTIONAL
241
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
249 ; IN FOLLOWING LIST
250
251
252 NOVALS LABEL BYTE ;AN000;
253 DB 0 ;AN000; NUMBER OF VALUE DEFINITIONS (0 - 3)
254
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
260 ; 7=DATE, 8=TIME
261 ; 9=QUOTED STRING
262 DB 0FFH ;AN000; MATCHED ITEM TAG
263 DW 0 ;AN000;POINTER TO SYNONYM
264
265 RESULT_PTR1 DD ? ;AN000; OFFSET OF STRING VALUE
266
267
268 ; = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
269
270 ;PARSER CONTROL BLOCK DEFINING THE SWITCHES, OPTIONAL
271
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.
275
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
280 ; CHECKED)
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
290 ; 0001H=OPTIONAL
291
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
296
297 DW RESULTSW1 ;AN000; RESULT BUFFER
298 DW NOVALS ;AN000; VALUE LISTS
299 DB 2 ;AN002; NUMBER OF KEYWORD/SWITCH SYNONYMS
300 ; IN FOLLOWING LIST
301 F_SW DB "/F",0 ;AN000; IF n >0, KEYWORD 1
302 A_SW DB "/A",0 ;AN002; IF n >0, KEYWORD 2
303
304
305
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
311 ; 7=DATE, 8=TIME
312 ; 9=QUOTED STRING
313 DB 0FFh ;AN000; MATCHED ITEM TAG
314
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;
323
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 ; = = = = = = = = = = = =
331
332 ; $SEARCH COMPLEX ;AN000;LOOP THRU COMMAND LINE
333 JMP SHORT $$SS1
334 $$DO1:
335 MOV ORDINAL,CX ;AN000;SAVE UPDATED COUNT
336
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
341 JE $$IF2
342 CALL PARSE_ERROR ;AN000;DISPLAY REASON FOR ERROR
343
344 STC ;AN000;SET CARRY TO INDICATE ERROR
345 ; $ELSE ;AN000;SINCE OK BY SYSPARSE
346 JMP SHORT $$EN2
347 $$IF2:
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
351 ; $ENDIF ;AN000;
352 $$EN2:
353 ; $EXITIF C,NUL ;AN000;HAD A PROBLEM WITH THE PARMS
354 JC $$SR1
355
356 ;SINCE ALL OK SO FAR, CONTINUE
357 ; $STRTSRCH ;AN000;ENTRY POINT INTO THE SEARCH LOOP
358 $$SS1:
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;
364 ; AX=EXIT CODE
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
371 ; WHAT THAT PARM IS
372 ; $ENDLOOP E ;AN000;END OF LIST
373 JNE $$DO1
374 CLC ;AN000;SAY ALL OK
375 ; $ENDSRCH ;AN000;
376 $$SR1:
377 RET ;AN000;RETURN TO CALLER
378 PARSER ENDP ;AN000;
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.
384
385 ;INPUT: DX AS SET BY SYSPARSE, POINTS TO RESULT BUFFER
386 ;OUTPUT: CY SET IF PROBLEM, CY CLEAR IF ALL OK
387 ; = = = = = = = = = = = =
388
389 CHECK_PATH PROC NEAR ;AN000;
390 PUBLIC CHECK_PATH ;AN000;
391
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,
395 JNE $$IF9
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
399 JNE $$IF10
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
406 JMP SHORT $$EN10
407 $$IF10:
408 LEA DI,START_PATH ;AN000;MOVE PARM TO STARTUP FILESPEC
409 ; $ENDIF ;AN000;PATH HAVE DRIVE?
410 $$EN10:
411
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
417
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;
421 JMP SHORT $$SS13
422 $$DO13:
423 STOSB ;AN000;PUT THIS CHAR INTO "START_PATH"
424 ; $STRTSRCH ;AN000;
425 $$SS13:
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
429 JNE $$IF13
430 CMP DL,BACK_SLASH ;AN012;IS PREV CHAR A BACKSLASH?
431 ; $IF E,AND ;AN012;YES, PREV CHAR WAS A BACKSLASH
432 JNE $$IF16
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
435 JE $$IF16
436 CMP CX,MAX_PATH ;AN000;WAS THIS THE ONLY CHAR?
437 ; $IF NE ;AN000;NO, NOT THE ONLY ONE
438 JE $$IF16
439 MOV BYTE PTR [DI-1],NUL ;AN000;CHANGE IT TO A "NUL"
440 ; $ENDIF ;AN000;
441 $$IF16:
442 CLC ;AN000;FLAG NO ERROR
443 ; $ORELSE ;AN000;CHECK OUT THIS NEW CHAR
444 JMP SHORT $$SR13
445 $$IF13:
446 ; $ENDLOOP LOOP ;AN000;GO BACK AND SAVE IT, IF ROOM
447 LOOP $$DO13
448 LEA DI,MSGNUM_INVPATH ;AN000;"INVALID PATH"
449 CALL SENDMSG ;AN000;DISPLAY THE MESSAGE
450
451 STC ;AN000;FLAG AN ERROR
452 ; $ENDSRCH ;AN000;
453 $$SR13:
454
455 ; $ELSE ;AN000;FILESPEC NOT SPECIFIED
456 JMP SHORT $$EN9
457 $$IF9:
458 MOV AX,SYNONYM ;AN002;GET SYNONYM POINTER
459 CMP AX,OFFSET F_SW ;AN002;WAS THE SWITCH /F?
460 ; $IF E ;AN002;IF /F
461 JNE $$IF22
462 MOV F_SW,BLANK ;AN003;STRIKE THE /F FROM THE LIST OF SWITCHES
463 OR FLAGS,F_SWITCH ;AN000;REQUEST LISTING OF FILENAMES
464 CLC ;AN000;NO ERROR
465 ; $ELSE ;AN002;SINCE NOT /F, MUST BE /A
466 JMP SHORT $$EN22
467 $$IF22:
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
473 ; $ENDIF ;AN002;
474 $$EN22:
475 ; $ENDIF ;AN000;FILESPEC?
476 $$EN9:
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;
483
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 ; = = = = = = = = = = = =
488
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
493 JE $$IF26
494 MOV BYTE PTR [SI],NUL ;AN004;DELIMIT THE BAD PARM
495 MOV SUBLIST_PARSE.SUB_VALUE,AX ;AN000;POINT SUBLIST TO BAD PARM
496
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?
500 $$IF26:
501 LEA DI,MSGNUM_PARSE ;AN000;PASS MESSAGE DESCRIPTOR
502 CALL SENDMSG ;AN000;DISPLAY ERROR MESSAGE
503
504 RET ;AN000;RETURN TO CALLER
505 PARSE_ERROR ENDP ;AN000;
506 ; = = = = = = = = = = = =
507 PATHLABL TREEPAR ;AN013;
508 CSEG ENDS ;AN000;
509 END ;AN000;
510 \1a