summaryrefslogtreecommitdiff
path: root/v4.0/src/CMD/TREE/TREEPAR.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/TREE/TREEPAR.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/TREE/TREEPAR.ASM')
-rw-r--r--v4.0/src/CMD/TREE/TREEPAR.ASM510
1 files changed, 510 insertions, 0 deletions
diff --git a/v4.0/src/CMD/TREE/TREEPAR.ASM b/v4.0/src/CMD/TREE/TREEPAR.ASM
new file mode 100644
index 0000000..7fcdb97
--- /dev/null
+++ b/v4.0/src/CMD/TREE/TREEPAR.ASM
@@ -0,0 +1,510 @@
1 PAGE ,132 ;AN000;
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; = = = = = = = = = = = =
82HEADER 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;
92MSG_DESC STRUC ;AN004;
93MSG_NUM DW ? ;AN004;MESSAGE NUMBER (TO AX)
94MSG_HANDLE DW ? ;AN004;HANDLE OF OUTPUT DEVICE (TO BX)
95MSG_SUBLIST DW ? ;AN004;POINTER TO SUBLIST (TO SI)
96MSG_COUNT DW ? ;AN004;SUBSTITUTION COUNT (TO CX)
97MSG_CLASS DW ? ;AN004;MESSAGE CLASS (IN HIGH BYTE, TO DH)
98 ; LOW BYTE HAS 0 (FUNCTION "NO INPUT", TO DL);AN004;
99MSG_DESC ENDS ;AN004;
100
101ONE_SUBS EQU 1 ;AN004;NUMBER OF VARIABLES
102
103SUBLIST STRUC ;AN000;
104SUB_SIZE DB ? ;AN004;SUBLIST SIZE (POINTER TO NEXT SUBLIST)
105SUB_RES DB ? ;AN004;RESERVED
106 ;NEXT FIELD IS TO BE USED AS A DOUBLE WORD ;AN004;
107SUB_VALUE DW ? ;AN004;TIME, DATE, OR PTR TO DATA ITEM
108SUB_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;
111SUB_ID DB ? ;AN004;N OF %N
112SUB_FLAGS DB ? ;AN004;DATA TYPE FLAGS
113SUB_MAX_WIDTH DB ? ;AN004;MAXIMUM FIELD WIDTH (0=UNLIMITED)
114SUB_MIN_WIDTH DB ? ;AN004;MINIMUM FIELD WIDTH
115SUB_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;
119SUBLIST ENDS ;AN004;
120
121; LOCAL EQUATES
122
123CMD_BUF_SIZE EQU 127 ;AN000;NUMBER BYTES IN DOS COMMAND LINE BUFFER
124ZERO EQU 0 ;AN000;COMPARAND FOR CLEARED REG
125COLON EQU ":" ;AN000;FOLLOWS DRIVE LETTER IN FULL FILESPEC
126NUL EQU 0 ;AN000;DELIMITER FOR ASCIIZ STRINGS
127BACK_SLASH EQU "\" ;AN000;PATH DELIMITER
128BLANK EQU " " ;AN003;WIPE OUT SWITCH, AVOIDS DUPLICATES
129
130; EXIT CODES FROM SYSPARSE (WHEN CY=0)
131
132SYSPRM_EX_OK EQU 0 ;AN000; no error
133SYSPRM_EX_MANY EQU 1 ;AN000; too many operands
134SYSPRM_EX_MISSING EQU 2 ;AN000; required operand missing
135SYSPRM_EX_NOT_SWLIST EQU 3 ;AN000; not in switch list provided
136SYSPRM_EX_NOT_KEYLIST EQU 4 ;AN000; not in keyword list provided
137SYSPRM_EX_RANGE EQU 6 ;AN000; out of range specified
138SYSPRM_EX_VALUE EQU 7 ;AN000; not in value list provided
139SYSPRM_EX_STRING EQU 8 ;AN000; not in string list provided
140SYSPRM_EX_SYNTAX EQU 9 ;AN000; syntax error
141SYSPRM_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;
146CSEG 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
170CURRENT_PARM DW ? ;AN000;POINTER INTO COMMAND OF NEXT OPERAND
171 PUBLIC CURRENT_PARM ;AN000;
172
173ORDINAL 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
197PARMS 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
205PARMSX 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
223CONTROL_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
252NOVALS LABEL BYTE ;AN000;
253 DB 0 ;AN000; NUMBER OF VALUE DEFINITIONS (0 - 3)
254
255RESULT1 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
265RESULT_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
276CONTROL_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
301F_SW DB "/F",0 ;AN000; IF n >0, KEYWORD 1
302A_SW DB "/A",0 ;AN002; IF n >0, KEYWORD 2
303
304
305
306RESULTSW1 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
315SYNONYM DW 0 ;AN000; SYNONYM POINTER (BASED ON ES:)
316RESULT_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;
321PARSER 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
378PARSER 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
389CHECK_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
478CHECK_PATH ENDP ;AN000;
479; = = = = = = = = = = = =
480 HEADER <PARSE_ERROR - DISPLAY ERROR MSG FOR PARSER> ;AN000;
481PARSE_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
505PARSE_ERROR ENDP ;AN000;
506; = = = = = = = = = = = =
507 PATHLABL TREEPAR ;AN013;
508CSEG ENDS ;AN000;
509 END ;AN000;
510 \ No newline at end of file