summaryrefslogtreecommitdiff
path: root/v4.0/src/CMD/COMP/COMPPAR.ASM
diff options
context:
space:
mode:
Diffstat (limited to 'v4.0/src/CMD/COMP/COMPPAR.ASM')
-rw-r--r--v4.0/src/CMD/COMP/COMPPAR.ASM410
1 files changed, 410 insertions, 0 deletions
diff --git a/v4.0/src/CMD/COMP/COMPPAR.ASM b/v4.0/src/CMD/COMP/COMPPAR.ASM
new file mode 100644
index 0000000..e47ce55
--- /dev/null
+++ b/v4.0/src/CMD/COMP/COMPPAR.ASM
@@ -0,0 +1,410 @@
1 PAGE ,132 ;
2 TITLE COMPPAR.SAL - LOOK AT COMMAND LINE PARMS
3;****************** START OF SPECIFICATIONS *****************************
4; MODULE NAME: COMPPAR.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 COMP. 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] COMP [d:][path][filenam1[.ext]] [d:][path][filenam2[.ext]]
21;
22; Where
23; [d:][path] before COMP to specify the drive and path that
24; contains the COMP command file.
25;
26; [d:][path][filenam1[.ext]] - to specify the FIRST (or primary)
27; file or group of files to be compared
28;
29; [d:][path][filenam2[.ext]] - to specify the SECOND file or group
30; of files to be compared with the corresponding file
31; from the FIRST group
32;
33; Global filename characters are allowed in both filenames,
34; and will cause all of the files matching the first filename
35; to be compared with the corresponding files from the second
36; filename. Thus, entering COMP A:*.ASM B:*.BAK will cause
37; each file from drive A: that has an extension of .ASM to be
38; compared with a file of the same name (but with an extension
39; of .BAK) from drive B:.
40;
41; If you enter only a drive specification, COMP will assume
42; all files in the current directory of the specified drive.
43; If you enter a path without a filename, COMP assumes all
44; files in the specified directory. Thus, COMP A:\LEVEL1
45; B:\LEVEL2 will compare all files in directory A:\LEVEL1 with
46; the files of the same names in directory B:\LEVEL2.
47;
48; If no parameters are entered with the COMP command, you will
49; be prompted for both. If the second parm is omitted, COMP
50; will prompt for it. If you simply press ENTER when prompted
51; for the second filename, COMP assumes *.* (all files
52; matching the primary filename), and will use the current
53; directory of the default drive.
54;
55; If no file matches the primary filename, COMP will prompt
56; again for both parameters.
57;
58;
59; Upon entry to PARSER in this module,
60; "CURRENT_PARM" = offset to start of parm text in command string
61; "ORDINAL" = initialized to zero
62; PSP+81H = text of DOS command line parms string
63;
64; EXIT-NORMAL: If a Code Page number was specified
65; BX = Offset to language table to be loaded
66; DX = Integer value of Code Page specified
67; If /STATUS (or /STA) was specified
68; BX = 0
69; If Question mark was specified
70; BX=-1
71;
72; EXIT-ERROR: If there was any problem with the parms,
73; the question mark is assumed, and the appropriate
74; PARSE error message is displayed.
75; The Errorlevel code of "EXPAR" (3), meaning: "PARM ERROR",
76; set in "EXITFL", is requested to be returned to the user.
77;
78; INTERNAL REFERENCES:
79; ROUTINES:
80; PARSE_ERROR:NEAR Display the appropriate Parse error message.
81;
82; DATA AREAS:
83; The several parameter control blocks, defined by the System
84; PARSER interface, defining the COMP parameters.
85;
86; EXTERNAL REFERENCES:
87; ROUTINES:
88; SENDMSG:NEAR Uses Msg Descriptor to drive message handler.
89; SYSPARSE:NEAR System Command Line Common Parser.
90;
91; DATA AREAS:
92; EXITFL:BYTE Errorlevel return code.
93; MSGNUM_PARSE:WORD Message descriptor for all parse errors.
94;
95; NOTES:
96; This module should be processed with the SALUT preprocessor
97; with the re-alignment not requested, as:
98;
99; SALUT COMPPAR,NUL
100;
101; To assemble these modules, the alphabetical or sequential
102; ordering of segments may be used.
103;
104; For LINK instructions, refer to the PROLOG of the main module,
105; COMP1.SAL.
106;
107; REVISION HISTORY:
108; A000 Version 4.0 : add PARSER, System Message Handler,
109; Add compare of extended attributes, if present.
110;
111; COPYRIGHT: The following notice is found in the OBJ code generated from
112; the "COMPSM.SAL" module:
113;
114; "The DOS COMP Utility"
115; "Version 4.0 (C) Copyright 1988 Microsoft"
116; "Licensed Material - Property of Microsoft"
117;
118;PROGRAM AUTHOR: Edwin M. K.
119; modified: Bill L.
120;****************** END OF SPECIFICATIONS *****************************
121 IF1 ;AN000;
122 %OUT COMPONENT=COMP, MODULE=COMPPAR.SAL... ;AN000;
123 ENDIF ;AN000;
124; = = = = = = = = = = = = ;AN000;
125HEADER MACRO TEXT ;;AN000;
126.XLIST ;;AN000;
127 SUBTTL TEXT ;;AN000;
128.LIST ;;AN000;
129 PAGE ;;AN000;
130 ENDM ;;AN000;
131; = = = = = = = = = = = = ;AN000;
132; $SALUT (4,23,28,36) ;AN000;
133
134 INCLUDE COMPEQ.INC ;AN000;
135; LOCAL EQUATES ;AN000;
136MAX_PATH_LEN EQU 64 ;MAX CHAR IN A PATH ;AN000;
137EXPAR EQU 1 ;RETURN TO DOS, INVALID DOS COMMAND LINE PARMS ;AN000;
138ZERO_PARM_CT EQU 0 ;ORDINAL VALUE BEFORE FIRST PARM FOUND ;AN000;
139FIRST_PARM_CT EQU 1 ;ORDINAL VALUE AFTER FIRST PARM FOUND ;AN000;
140NUL EQU 0 ;ASCIIZ STRING DELIMITER ;AN000;
141; = = = = = = = = = = = = ;AN000;
142; EXIT CODES FROM SYSPARSE (WHEN CY=0) ;AN000;
143
144SYSPRM_EX_OK EQU 0 ; no error ;AN000;
145SYSPRM_EX_MANY EQU 1 ; too many operands ;AN000;
146SYSPRM_EX_MISSING EQU 2 ; required operand missing ;AN000;
147SYSPRM_EX_NOT_SWLIST EQU 3 ; not in switch list provided ;AN000;
148SYSPRM_EX_NOT_KEYLIST EQU 4 ; not in keyword list provided ;AN000;
149SYSPRM_EX_RANGE EQU 6 ; out of range specified ;AN000;
150SYSPRM_EX_VALUE EQU 7 ; not in value list provided ;AN000;
151SYSPRM_EX_STRING EQU 8 ; not in string list provided ;AN000;
152SYSPRM_EX_SYNTAX EQU 9 ; syntax error ;AN000;
153SYSPRM_EX_EOL EQU -1 ; end of command line ;AN000;
154; = = = = = = = = = = = = ;AN000;
155 HEADER <STRUC - DEFINITIONS OF EXTERNAL CONTROL BLOCKS> ;AN000;
156PSP STRUC ;AN000;
157 DB 80H DUP (?) ;SKIP OVER FIRST HALF OF PSP ;AN000;
158PSP_PARMLEN DB ? ;NUMBER OF BYTES IN DOS COMMAND LINE ;AN000;
159PSP_COMMAND DB 127 DUP(?) ;TEXT OF DOS COMMAND LINE ;AN000;
160PSP ENDS ;AN000;
161; = = = = = = = = = = = = ;AN000;
162FILESPEC STRUC ;AN000;
163FS_DRIVE_ID DB ? ;DRIVE LETTER ;AN000;
164FS_COLON DB ":" ;COLON SEPARATOR ;AN000;
165FS_SLASH1 DB "\" ;LEADING BACKSLASH,START AT ROOT ;AN000;
166FS_PATH DB MAX_PATH_LEN DUP (0) ;TEXT OF PATH ;AN000;
167
168;LOCATION OF REMAINING FIELDS DEPENDS ON LENGTH OF ACTUAL PATH ;AN000;
169;POSITIONS SHOWN ARE FOR MAX PATH LENGTH ONLY ;AN000;
170
171FS_SLASH2 DB 0 ;TRAILING BACKSLASH ;AN000;
172FS_FNAME DB 8 DUP (0) ;FILENAME ;AN000;
173FS_PER DB 0 ;PERIOD END OF FILENAME ;AN000;
174FS_EXT DB 3 DUP (0) ;FILENAME EXTENSION ;AN000;
175FILESPEC ENDS ;AN000;
176; = = = = = = = = = = = = ;AN000;
177 HEADER <PARSING WORKAREAS> ;AN000;
178; $SALUT (4,14,19,36) ;AN000;
179CSEG SEGMENT PARA PUBLIC 'CODE' ;AN000;
180 ASSUME CS:CSEG,DS:CSEG,ES:CSEG,SS:CSEG ;AN000;
181
182 EXTRN SENDMSG:NEAR ;USES MSG DESCRIPTOR TO DRIVE MESSAGE HANDLR ;AN000;
183 EXTRN SYSPARSE:NEAR ;SYSTEM COMMAND LINE PARSER ;AN000;
184
185 EXTRN EXITFL:BYTE ;ERRORLEVEL RETURN CODE ;AN000;
186 EXTRN PATH1:BYTE ;FIRST POSITIONAL PARM ;AN000;
187 EXTRN PATH2:BYTE ;SECOND POSITIONAL PARM ;AN000;
188 EXTRN MSGNUM_PPARSE:WORD ;MESSAGE DESCRIPTOR FOR ALL PARSE ERRORS ;AN000;
189 EXTRN SUBLIST_24:WORD ;sublist for parse error messages ;AN000;
190; = = = = = = = = = = = = ;AN000;
191
192CURRENT_PARM DW 81H ;POINTER INTO COMMAND OF NEXT OPERAND ;AN000;
193 PUBLIC CURRENT_PARM ;AN000;
194
195ORDINAL DW 0 ;ORDINAL NUMBER OF WHICH PARM TO PARSE ;AN000;
196 PUBLIC ORDINAL ;AN000;
197
198PARM_COUNT DW 00H ;CURRENT PARM COUNT (USED TO TRICK "PARSER" ;AN000;
199 PUBLIC PARM_COUNT ;INTO PARSING FILE NAMES ENTERED FROM THE ;AN000;
200 ;KEYBOARD INSTEAD OF COMMAND LINE ;AN000;
201; = = = = = = = = = = = = ;AN000;
202 HEADER <DOS COMMAND LINE PARSER CONTROL BLOCKS> ;AN000;
203
204;INPUT PARAMETERS CONTROL BLOCK, POINTED TO BY ES:DI WHEN CALLING PARSER ;AN000;
205
206 PUBLIC PARMS ;LET LINK MAKE PARMS BLOCK ADDRESSABLE ;AN000;
207PARMS LABEL BYTE ;PARMS CONTROL BLOCK ;AN000;
208 DW PARMSX ;POINTER TO PARMS EXTENSION ;AN000;
209 DB 0 ; NUMBER OF STRINGS (0, 1, 2) ;AN000;
210 ; NEXT LIST WOULD BE EXTRA DELIM LIST ;AN000;
211 ; (,& WHITESPACE ALWAYS) ;AN000;
212 ; NEXT LIST WOULD BE EXTRA END OF LINE LIST ;AN000;
213 ; (CR,LF,0 ALWAYS) ;AN000;
214
215;SYSTEM PARSER PARAMETER EXTENSION CONTROL BLOCK ;AN000;
216PARMSX LABEL BYTE ;PARMS EXTENSION CONTROL BLOCK ;AN000;
217 DB 0,2 ; MIN, MAX POSITIONAL OPERANDS ALLOWED ;AN000;
218 DW CONTROL_POS ; DESCRIPTION OF POSITIONAL 1 ;AN000;
219 DW CONTROL_POS ; DESCRIPTION OF POSITIONAL 2 ;AN000;
220
221 DB 0 ; MAX SWITCH OPERANDS ALLOWED ;AN000;
222
223 DB 0 ; MAX KEYWORD OPERANDS ALLOWED ;AN000;
224 ; THERE IS NO CONTROL BLOCK ;AN000;
225 ; DEFINING KEYWORDS ;AN000;
226
227; = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = ;AN000;
228 HEADER <POSITIONAL PARM DESCRIPTOR BLOCK> ;AN000;
229;PARSER CONTROL BLOCK DEFINING THE ONLY POSITIONAL PARAMETER, OPTIONAL ;AN000;
230;BOTH POSITIONAL PARAMETER ARE: ;AN000;
231; [d:][path][filename[.ext]] ;AN000;
232
233 PUBLIC CONTROL_POS ;LET LINK MAKE THIS ADDRESSABLE ;AN000;
234CONTROL_POS LABEL BYTE ;FIRST POSITIONAL DESCRIPTOR FOR FILESPEC, ;AN000;
235 ; OPTIONAL ;AN000;
236 DW 0201H ; CONTROLS TYPE MATCHED ;AN000;
237 ; SELECTED BITS: "FILESPEC" AND "OPTIONAL" ;AN000;
238
239 ; 8000H=NUMERIC VALUE, (VALUE LIST WILL BE CHECKED) ;AN000;
240 ; 4000H=SIGNED NUMERIC VALUE (VALUE LIST WILL BE ;AN000;
241 ; CHECKED) ;AN000;
242 ; 2000H=SIMPLE STRING(VALUE LIST WILL BE CHECKED) ;AN000;
243 ; 1000H=DATE STRING (VALUE LIST WON'T BE CHECKED) ;AN000;
244 ; 0800H=TIME STRING (VALUE LIST WON'T BE CHECKED) ;AN000;
245 ; 0400H=COMPLEX LIST (VALUE LIST WON'T BE CHECKED) ;AN000;
246 ; 0200H=FILE SPEC (VALUE LIST WON'T BE CHECKED) ;AN000;
247 ; 0100H=DRIVE ONLY (VALUE LIST WON'T BE CHECKED) ;AN000;
248 ; 0080H=QUOTED STRING (VALUE LIST WON'T BE CHECKED) ;AN000;
249 ; 0010H=IGNORE ":" AT END IN MATCH ;AN000;
250 ; 0002H=REPEATS ALLOWED ;AN000;
251 ; 0001H=OPTIONAL ;AN000;
252
253 DW 0001H ;FUNCTION_FLAGS ;AN000;
254 ; 0001H=CAP RESULT BY FILE TABLE ;AN000;
255 ; 0002H=CAP RESULT BY CHAR TABLE ;AN000;
256 ; 0010H=REMOVE ":" AT END ;AN000;
257 DW RESULT1 ; RESULT BUFFER ;AN000;
258 DW NOVALS ; VALUE LISTS ;AN000;
259 DB 0 ; NUMBER OF KEYWORD/SWITCH SYNONYMS ;AN000;
260 ; IN FOLLOWING LIST ;AN000;
261
262; = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = ;AN000;
263;RESULTS CONTROL BLOCK FOR THE POSITIONAL PARAMETER ;AN000;
264RESULT1 LABEL BYTE ; BELOW FILLED IN FOR DEFAULTS ;AN000;
265 DB 5 ; TYPE RETURNED: 0=RESERVED, ;AN000;
266 ; 1=NUMBER, 2=LIST INDEX, ;AN000;
267 ; 3=STRING, 4=COMPLEX, ;AN000;
268 ; 5=FILESPEC, 6=DRIVE ;AN000;
269 ; 7=DATE, 8=TIME ;AN000;
270 ; 9=QUOTED STRING ;AN000;
271RESULT_TAG DB 0FFH ; MATCHED ITEM TAG ;AN000;
272 DW 0 ;POINTER TO SYNONYM ;AN000;
273
274RESULT_PTR1 DD ? ; OFFSET OF STRING VALUE ;AN000;
275
276; = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = ;AN000;
277;VALUE CONTROL BLOCK ;AN000;
278NOVALS LABEL BYTE ;AN000;
279 DB 0 ; NUMBER OF VALUE DEFINITIONS (0 - 3) ;AN000;
280
281; = = = = = = = = = = = = ;AN000;
282 HEADER <PARSER - ASK SYSPARM TO DECODE PARAMETERS> ;AN000;
283; $SALUT (4,4,9,36) ;AN000;
284PARSER PROC NEAR ;AN000;
285 PUBLIC PARSER ;AN000;
286
287;INPUT: "CURRENT_PARM" = OFFSET TO NEXT PARM IN COMMAND STRING ;AN000;
288; "ORDINAL" = COUNT OF NEXT PARM TO PARSE ;AN000;
289; PSP+81H = TEXT OF DOS COMMAND LINE PARMS STRING ;AN000;
290
291;OUTPUT: IF SPECIFIED, FIRST PARM GOES TO "PATH1". ;AN000;
292; IF SPECIFIED, SECOND PARM GOES TO "PATH2". ;AN000;
293; IF EITHER PARM MISSING, THEN "PATHn" STARTS WITH NUL CHAR. ;AN000;
294; CARRY SET IF ERROR. ;AN000;
295; = = = = = = = = = = = = ;AN000;
296
297; $SEARCH COMPLEX ;LOOP THRU COMMAND LINE ;AN000;
298 JMP SHORT $$SS1
299$$DO1:
300 ;LOOKING AT RETURN CODE FROM SYSPARSE... ;AN000;
301 AND AX,AX ;AN008; ;WERE THERE ANY ERRORS? ;AN000;
302; $EXITIF NE ;HAD A PROBLEM ;AN000;
303 JE $$IF1
304 CALL PARSE_ERROR ;DISPLAY REASON FOR ERROR ;AN000;
305 MOV AL,01h ;AN000; ;pass back errorlevel ret code
306 mov ah,4ch
307 int 21h
308; $ORELSE ;SINCE NO PROBLEM, SO FAR ;AN000;
309 JMP SHORT $$SR1
310$$IF1:
311 MOV ORDINAL,CX ;SAVE UPDATED COUNT ;AN000;
312 MOV CURRENT_PARM,SI ;REMEMBER HOW FAR I GOT ;AN000;
313 MOV BX,DX ;SET DATA BASE REG TO POINT TO ;AN000;
314 ;RESULT BUFFER OF THIS OPERAND ;AN000;
315
316 MOV SI,WORD PTR RESULT_PTR1 ;GET WHERE STRING IS PUT ;AN000;
317 ;GUESS, THIS IS THE FIRST PARM ;AN000;
318 MOV DI,OFFSET PATH1 ;GET WHERE STRING IS TO GO ;AN000;
319
320 ;IF PARSING FILENAME INPUTED FROM KEYBOARD ;AN000;
321 ;THEN PARM_COUNT MUST = ZERO_PARM_CT = 0 ;AN000;
322 CMP CX,PARM_COUNT ;IS THIS THE FIRST PARM OR JUST A FILENAME IN BUFFER ;AN000;
323
324; $IF NE ;NO, MUST BE THE SECOND PARM ;AN000;
325 JE $$IF4
326 ;MADE A BAD GUESS, FIX IT ;AN000;
327 MOV DI,OFFSET PATH2 ;CHANGE DEST TO WHERE SECOND STRING GOES ;AN000;
328; $ENDIF ;AN000;
329$$IF4:
330
331 ;MOVE ASCIIZ STRING FROM DS:SI ;AN000;
332 ;WHERE COMMAND PARSE PUT IT ;AN000;
333 ;TO ES:DI WHERE COMP2 USES IT ;AN000;
334
335; $DO COMPLEX ;AN000;
336 JMP SHORT $$SD6
337$$DO6:
338 STOSB ;PUT CHAR IN AL TO ES:DI ;AN000;
339; $STRTDO ;AN000;
340$$SD6:
341 LODSB ;GET CHAR FROM DS:SI TO AL ;AN000;
342 CMP AL,NUL ;IS THAT THE END OF STRING? ;AN000;
343; $ENDDO E ;IF SO, QUIT ;AN000;
344 JNE $$DO6
345
346; $STRTSRCH ;AN000;
347$$SS1:
348 LEA DI,PARMS ;ES:DI = PARSE CONTROL DEFINITON ;AN000;
349 MOV SI,CURRENT_PARM ;DS:SI = COMMAND STRING, NEXT PARM ;AN000;
350 XOR DX,DX ;RESERVED, INIT TO ZERO ;AN000;
351 MOV CX,ORDINAL ;OPERAND ORDINAL, INITIALLY ZERO ;AN000;
352 CALL SYSPARSE ;LOOK AT DOS PARMS ;AN000;
353 ;AX=EXIT CODE ;AN000;
354 ;BL=TERMINATED DELIMETER CODE ;AN000;
355 ;CX=NEW OPERAND ORDINAL ;AN000;
356 ;SI=SET TO PAST SCANNED OPERAND ;AN000;
357 ;DX=SELECTED RESULT BUFFER ;AN000;
358 CMP AX,SYSPRM_EX_EOL ;IS THAT THE END OF THE PARMS? ;AN000;
359 ;IF NOT, LOOP BACK AND FIND OUT ;AN000;
360 ;WHAT THAT PARM IS ;AN000;
361; $ENDLOOP E ;END OF LIST ;AN000;
362 JNE $$DO1
363 CLC ;RETURN FLAG FOR "NO ERROR" ;AN000;
364; $ENDSRCH ;FINISHED WITH DOS COMMAND LINE ;AN000;
365$$SR1:
366 RET ;RETURN TO CALLER ;AN000;
367PARSER ENDP ;AN000;
368; = = = = = = = = = = = = ;AN000;
369 HEADER <PARSE_ERROR - DISPLAY REASON FOR PARSE ERROR> ;AN000;
370PARSE_ERROR PROC NEAR ;AN000;
371
372;INPUT: "FIRST_TIME" - IF NON-ZERO, FORCE ERROR CODE TO "TOO MANY PARMS" ;AN000;
373; AX - ERROR NUMBER RETURNED FROM PARSE. ;AN000;
374;OUTPUT: APPROPRIATE ERROR MESSAGE IS DISPLAYED. ;AN000;
375; = = = = = = = = = = = = ;AN000;
376
377 MOV MSGNUM_PPARSE,AX ;PASS MESSAGE NUMBER TO DESCRIPTOR ;AN000;
378 MOV DX,OFFSET MSGNUM_PPARSE ;PASS MESSAGE DESCRIPTOR ;AN000;
379 MOV BX,CURRENT_PARM ;AN000;
380PE_BX: ;AN000;
381 CMP BX,SI ;are we past the point the parser stopped ? ;AN000;
382 JAE PE_BX_OK ;yes, we are done. ;AN000;
383 CMP BYTE PTR [BX],20H ;by-pass leading blanks ;AN000;
384 JNE PE_BX_OK ;AN000;
385 INC BX ;AN000;
386 JMP PE_BX ;AN000;
387PE_BX_OK: ;AN000;
388 MOV SUBLIST_24.SUB_VALUE,BX ;AN000;
389;
390;make a ASCIIZ string out of parameter
391;
392PE_LOOP: ;AN000;
393 CMP BX,SI ;are we past the point the parser stopped ? ;AN000;
394 JAE PE_OK ;yes, we are done. ;AN000;
395 CMP BYTE PTR [BX],20H ;check for spaec or end of line ;AN000;
396 JE PE_OK ;AN000;
397 INC BX ;AN000;
398 JMP PE_LOOP ;AN000;
399PE_OK: ;AN000;
400 MOV byte ptr [BX],00H ;end string with zero ;AN000;
401
402 CALL SENDMSG ;DISPLAY ERROR MESSAGE ;AN000;
403
404 MOV EXITFL,EXPAR ;ERRORLEVEL CODE TO "PARM ERROR" ;AN000;
405 RET ;RETURN TO CALLER ;AN000;
406PARSE_ERROR ENDP ;AN000; ;AN000;
407; = = = = = = = = = = = = ;AN000;
408CSEG ENDS ;AN000;
409 END ;AN000;
410 \ No newline at end of file