diff options
Diffstat (limited to 'v4.0/src/CMD/XCOPY/XCOPYPAR.ASM')
| -rw-r--r-- | v4.0/src/CMD/XCOPY/XCOPYPAR.ASM | 488 |
1 files changed, 488 insertions, 0 deletions
diff --git a/v4.0/src/CMD/XCOPY/XCOPYPAR.ASM b/v4.0/src/CMD/XCOPY/XCOPYPAR.ASM new file mode 100644 index 0000000..b18aaf8 --- /dev/null +++ b/v4.0/src/CMD/XCOPY/XCOPYPAR.ASM | |||
| @@ -0,0 +1,488 @@ | |||
| 1 | PAGE ,132 ; | ||
| 2 | TITLE XCOPYPAR.SAL - LOOK AT COMMAND LINE PARMS | ||
| 3 | ;****************** START OF SPECIFICATIONS ***************************** | ||
| 4 | ; MODULE NAME: XCOPYPAR.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 XCOPY. 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 | ; SOURCE OPERAND: TARGET OPERAND: | ||
| 21 | ; | ||
| 22 | ; [d:] [path] filename[.ext] [d:] [path] [filename[.ext]] | ||
| 23 | ; or | ||
| 24 | ; [d:] path [filename[.ext]] | ||
| 25 | ; or | ||
| 26 | ; d: [path] [filename[.ext]] | ||
| 27 | ; | ||
| 28 | ; WHERE | ||
| 29 | ; | ||
| 30 | ; [d:] - To specify the Source drive | ||
| 31 | ; | ||
| 32 | ; [d:] - To specify the Destination drive | ||
| 33 | ; | ||
| 34 | ; | ||
| 35 | ; SWITCHES: | ||
| 36 | ; | ||
| 37 | ; /A /D /E /M /P /S /V /W | ||
| 38 | ; | ||
| 39 | ; | ||
| 40 | ; Upon entry to PARSER in this module, | ||
| 41 | ; "CURRENT_PARM" = offset to start of parm text in command string | ||
| 42 | ; "ORDINAL" = initialized to zero | ||
| 43 | ; PSP+81H = text of DOS command line parms string | ||
| 44 | |||
| 45 | ; EXIT-NORMAL: | ||
| 46 | |||
| 47 | ; EXIT-ERROR: | ||
| 48 | |||
| 49 | ; INTERNAL REFERENCES: | ||
| 50 | ; ROUTINES: | ||
| 51 | ; PARSE_ERROR:NEAR Display the appropriate Parse error message. | ||
| 52 | |||
| 53 | ; DATA AREAS: | ||
| 54 | ; The several parameter control blocks, defined by the System | ||
| 55 | ; PARSER interface, defining the XCOPY parameters. | ||
| 56 | |||
| 57 | ; EXTERNAL REFERENCES: | ||
| 58 | ; ROUTINES: | ||
| 59 | ; SYSPARSE:NEAR System Command Line Common Parser. | ||
| 60 | ; | ||
| 61 | ; DATA AREAS: | ||
| 62 | ; EXITFL:BYTE Errorlevel return code. | ||
| 63 | ; MSGNUM_PARSE:WORD Message descriptor for all parse errors. | ||
| 64 | ; | ||
| 65 | ; NOTES: | ||
| 66 | ; This module should be processed with the SALUT preprocessor | ||
| 67 | ; with the re-alignment not requested, as: | ||
| 68 | ; | ||
| 69 | ; SALUT XCOPYPAR,NUL | ||
| 70 | ; | ||
| 71 | ; To assemble these modules, the alphabetical or sequential | ||
| 72 | ; ordering of segments may be used. | ||
| 73 | ; | ||
| 74 | ; For LINK instructions, refer to the PROLOG of the main module, | ||
| 75 | ; XCOPY.SAL. | ||
| 76 | ; | ||
| 77 | ; REVISION HISTORY: A000 Version 4.00: add PARSER, System Message Handler, | ||
| 78 | ; Ignore unique volume serial number differences | ||
| 79 | ; A004 PTM0700 9/02/87 Avoid duplicate switches and | ||
| 80 | ; display parm in error. | ||
| 81 | ; | ||
| 82 | ; Label: "The DOS XCOPY Utility" | ||
| 83 | ; "Version 4.00 (C)Copyright 1988 Microsoft" | ||
| 84 | ; "Licensed Material - Program Property of Microsoft " | ||
| 85 | ; | ||
| 86 | ;****************** END OF SPECIFICATIONS ***************************** | ||
| 87 | IF1 | ||
| 88 | %OUT COMPONENT=XCOPY, MODULE=XCOPYPAR.SAL... | ||
| 89 | ENDIF | ||
| 90 | ; = = = = = = = = = = = = | ||
| 91 | HEADER MACRO TEXT | ||
| 92 | .XLIST | ||
| 93 | SUBTTL TEXT | ||
| 94 | .LIST | ||
| 95 | PAGE | ||
| 96 | ENDM | ||
| 97 | ; = = = = = = = = = = = = | ||
| 98 | ; $SALUT (4,23,28,36) | ||
| 99 | ; LOCAL EQUATES | ||
| 100 | |||
| 101 | INIT_ERROR_FLAG EQU 80H ;AN000;critical initialization error. Should abort | ||
| 102 | CMD_BUF_SIZE EQU 127 ;AN000;NUMBER BYTES IN DOS COMMAND LINE BUFFER | ||
| 103 | ZERO EQU 0 ;AN000;COMPARAND FOR CLEARED REG | ||
| 104 | NUL EQU 0 ;AN000;DELIMITER FOR ASCIIZ STRINGS | ||
| 105 | |||
| 106 | ; = = = = = = = = = = = = | ||
| 107 | |||
| 108 | ; PARSER ASSEMBLE SWITCHES | ||
| 109 | |||
| 110 | FarSW EQU 0 ;AN000;CALL THE PARSER BY FAR CALL | ||
| 111 | DateSW EQU 1 ;AN000;DATE FORMAT | ||
| 112 | TimeSW EQU 1 ;AN000;TIME FORMAT | ||
| 113 | FileSW EQU 1 ;AN000;FILE SPECIFICATION | ||
| 114 | CAPSW EQU 1 ;AN000;USE FILE TABLE CAPS | ||
| 115 | CmpxSW EQU 0 ;AN000;COMPLEX LIST | ||
| 116 | DrvSW EQU 1 ;AN000;DRIVE ONLY FORMAT | ||
| 117 | QusSW EQU 0 ;AN000;QUOTED STRING | ||
| 118 | NumSW EQU 1 ;AN000;NUMERIC VALUE | ||
| 119 | KeySW EQU 0 ;AN000;KEYWORDS | ||
| 120 | SwSW EQU 1 ;AN000;SWITCHES | ||
| 121 | Val1SW EQU 0 ;AN000;VALUE DEFINITION #1 | ||
| 122 | Val2SW EQU 0 ;AN000;VALUE DEFINITION #2 | ||
| 123 | Val3SW EQU 0 ;AN000;VALUE DEFINITION #3 | ||
| 124 | ; = = = = = = = = = = = = | ||
| 125 | ; EXIT CODES FROM SYSPARSE (WHEN CY=0) | ||
| 126 | |||
| 127 | SYSPRM_EX_OK EQU 0 ;AN000; no error | ||
| 128 | SYSPRM_EX_MANY EQU 1 ;AN000; too many operands | ||
| 129 | SYSPRM_EX_MISSING EQU 2 ;AN000; required operand missing | ||
| 130 | SYSPRM_EX_NOT_SWLIST EQU 3 ;AN000; not in switch list provided | ||
| 131 | SYSPRM_EX_NOT_KEYLIST EQU 4 ;AN000; not in keyword list provided | ||
| 132 | SYSPRM_EX_RANGE EQU 6 ;AN000; out of range specified | ||
| 133 | SYSPRM_EX_VALUE EQU 7 ;AN000; not in value list provided | ||
| 134 | SYSPRM_EX_STRING EQU 8 ;AN000; not in string list provided | ||
| 135 | SYSPRM_EX_SYNTAX EQU 9 ;AN000; syntax error | ||
| 136 | SYSPRM_EX_EOL EQU -1 ;AN000; end of command line | ||
| 137 | ; = = = = = = = = = = = = | ||
| 138 | |||
| 139 | HEADER <STRUC - DEFINITIONS OF EXTERNAL CONTROL BLOCKS> | ||
| 140 | ; $SALUT (4,17,22,36) | ||
| 141 | PSP STRUC | ||
| 142 | DB 80H DUP (?) ;AN000;SKIP OVER FIRST HALF OF PSP | ||
| 143 | PSP_PARMLEN DB ? ;AN000;NUMBER OF BYTES IN DOS COMMAND LINE | ||
| 144 | PSP_COMMAND DB 127 DUP(?) ;AN000;TEXT OF DOS COMMAND LINE | ||
| 145 | PSP ENDS | ||
| 146 | ; = = = = = = = = = = = = | ||
| 147 | CSEG SEGMENT PUBLIC ;AN000;PLACE HOLDER FOR PARSE CODE | ||
| 148 | CSEG ENDS | ||
| 149 | DGROUP GROUP DSEG, DSEG_INIT | ||
| 150 | DSEG SEGMENT PARA PUBLIC | ||
| 151 | DSEG ENDS | ||
| 152 | ; | ||
| 153 | DSEG_INIT SEGMENT PARA PUBLIC | ||
| 154 | ; | ||
| 155 | INCLUDE PSDATA.INC ;AN018;WORK AREA USED BY PARSE.ASM | ||
| 156 | ; | ||
| 157 | ;--- EXTERNAL VARIABLES --- | ||
| 158 | EXTRN PARM_FLAG: BYTE ;AN000; | ||
| 159 | IF1 | ||
| 160 | %OUT COMPONENT=XCOPY, SUBCOMPONENT=PARSE | ||
| 161 | ENDIF | ||
| 162 | ;--- | ||
| 163 | COMMAND_LINE DB 127 DUP(?) ;AN000;TEXT OF DOS COMMAND LINE (INTERNAL USE) | ||
| 164 | PUBLIC COMMAND_LINE | ||
| 165 | |||
| 166 | CURRENT_PARM DW DGROUP:COMMAND_LINE ;AN000;POINTER INTO COMMAND OF NEXT | ||
| 167 | ;OPERAND | ||
| 168 | PUBLIC CURRENT_PARM | ||
| 169 | |||
| 170 | ORDINAL DW 0 ;AN000;ORDINAL NUMBER OF WHICH PARM TO PARSE | ||
| 171 | PUBLIC ORDINAL | ||
| 172 | |||
| 173 | TAR_DRIVE DB " " ;AN000;TARGET DRIVE LETTER SPECIFIED IN PARMS | ||
| 174 | SO_DRIVE DB " " ;AN000;SOURCE DRIVE LETTER SPECIFIED | ||
| 175 | PUBLIC TAR_DRIVE,SO_DRIVE ;AN000;PASS RESULTS TO INIT ROUTINE | ||
| 176 | |||
| 177 | ; = = = = = = = = = = = = | ||
| 178 | HEADER <DOS COMMAND LINE PARSER CONTROL BLOCKS> | ||
| 179 | |||
| 180 | ;INPUT PARAMETERS CONTROL BLOCK, POINTED TO BY ES:DI WHEN CALLING PARSER | ||
| 181 | |||
| 182 | PUBLIC PARMS ;AN000;LET LINK MAKE PARMS BLOCK ADDRESSABLE | ||
| 183 | PARMS LABEL BYTE ;AN000;PARMS CONTROL BLOCK | ||
| 184 | DW DGROUP:PARMSX ;AN000;POINTER TO PARMS EXTENSION | ||
| 185 | DB 0 ;AN000; NUMBER OF STRINGS (0, 1, 2) | ||
| 186 | DB 1 ;AN000; NUMBER OF ADDITIONAL DELIMITERS | ||
| 187 | DB ";" ;AN000; ADDITIONAL DELIMITER | ||
| 188 | |||
| 189 | |||
| 190 | ;SYSTEM PARSER PARAMETER EXTENSION CONTROL BLOCK | ||
| 191 | PARMSX LABEL BYTE ;AN000; PARMS EXTENSION CONTROL BLOCK | ||
| 192 | DB 1,2 ;AN000; MIN, MAX POSITIONAL OPERANDS ALLOWED | ||
| 193 | DW DGROUP:CONTROL_POS1 ;AN000; DESCRIPTION OF POSITIONAL 1 | ||
| 194 | DW DGROUP:CONTROL_POS2 ;AN000; DESCRIPTION OF POSITIONAL 2 | ||
| 195 | |||
| 196 | DB 2 ;AN000; THERE ARE 8 SWITCHES IN 2 GROUPS | ||
| 197 | ;AN000; (/A, /E, /M, /P, /S, /V, /W, /D) | ||
| 198 | DW DGROUP:SW1_7 ;AN000; POINTER TO THE SWITCH DEFINITION AREA | ||
| 199 | DW DGROUP:SW8 ;AN000; POINTER TO EIGHTH SWITCH DEFINITION AREA | ||
| 200 | |||
| 201 | DB 0 ;AN000; MAX KEYWORD OPERANDS ALLOWED | ||
| 202 | ;AN000; THERE IS NO CONTROL BLOCK | ||
| 203 | ;AN000; DEFINING KEYWORDS | ||
| 204 | |||
| 205 | ; = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = | ||
| 206 | HEADER <POSITIONAL PARM DESCRIPTOR BLOCK> | ||
| 207 | ;PARSER CONTROL BLOCK DEFINING THE ONLY POSITIONAL PARAMETER, OPTIONAL | ||
| 208 | |||
| 209 | ;FIRST POSITIONAL PARAMETER IS: | ||
| 210 | ; | ||
| 211 | ; [d:] [path] filename[.ext] | ||
| 212 | ; or | ||
| 213 | ; [d:] path [filename[.ext]] | ||
| 214 | ; or | ||
| 215 | ; d: [path] [filename[.ext]] | ||
| 216 | ; | ||
| 217 | PUBLIC CONTROL_POS1 ;AN000; LET LINK MAKE THIS ADDRESSABLE | ||
| 218 | CONTROL_POS1 LABEL BYTE ;AN000; FIRST POSITIONAL DESCRIPTOR FOR FILESPEC | ||
| 219 | ;AN000; | ||
| 220 | DW 0200H ;AN000; CONTROLS TYPE MATCHED | ||
| 221 | ; SELECTED BITS: "FILE SPEC" | ||
| 222 | |||
| 223 | ; 8000H=NUMERIC VALUE, (VALUE LIST WILL BE CHECKED) | ||
| 224 | ; 4000H=SIGNED NUMERIC VALUE (VALUE LIST WILL BE | ||
| 225 | ; CHECKED) | ||
| 226 | ; 2000H=SIMPLE STRING(VALUE LIST WILL BE CHECKED) | ||
| 227 | ; 1000H=DATE STRING (VALUE LIST WON'T BE CHECKED) | ||
| 228 | ; 0800H=TIME STRING (VALUE LIST WON'T BE CHECKED) | ||
| 229 | ; 0400H=COMPLEX LIST (VALUE LIST WON'T BE CHECKED) | ||
| 230 | ; 0200H=FILE SPEC (VALUE LIST WON'T BE CHECKED) | ||
| 231 | ; 0100H=DRIVE ONLY (VALUE LIST WON'T BE CHECKED) | ||
| 232 | ; 0080H=QUOTED STRING (VALUE LIST WON'T BE CHECKED) | ||
| 233 | ; 0010H=IGNORE ":" AT END IN MATCH | ||
| 234 | ; 0002H=REPEATS ALLOWED | ||
| 235 | ; 0001H=OPTIONAL | ||
| 236 | |||
| 237 | DW 0002H ;AN000; FUNCTION_FLAGS | ||
| 238 | ; 0001H=CAP RESULT BY FILE TABLE | ||
| 239 | ; 0002H=CAP RESULT BY CHAR TABLE | ||
| 240 | ; 0010H=REMOVE ":" AT END | ||
| 241 | DW DGROUP:RESULT1 ;AN000; RESULT BUFFER (FIRST) | ||
| 242 | PUBLIC RESULT1 | ||
| 243 | DW DGROUP:NOVALS ;AN000; NO VALUE LISTS | ||
| 244 | DB 0 ;AN000; NUMBER OF KEYWORD/SWITCH SYNONYMS | ||
| 245 | ;AN000; IN FOLLOWING LIST | ||
| 246 | |||
| 247 | ;SECOND POSITIONAL PARAMETER IS: | ||
| 248 | ; | ||
| 249 | ; [d:] [path] [filename[.ext]] | ||
| 250 | ; | ||
| 251 | PUBLIC CONTROL_POS2 ;AN000; LET LINK MAKE THIS ADDRESSABLE | ||
| 252 | CONTROL_POS2 LABEL BYTE ;AN000; SECOND POSITIONAL DESCRIPTOR FOR FILESPEC, | ||
| 253 | ;AN000; OPTIONAL | ||
| 254 | DW 0201H ;AN000; CONTROLS TYPE MATCHED | ||
| 255 | ;AN000; SELECTED BITS: "FILE SPEC" | ||
| 256 | DW 0002H ;AN000; FUNCTION_FLAGS | ||
| 257 | DW DGROUP:RESULT2 ;AN000; RESULT BUFFER (SECOND) | ||
| 258 | DW DGROUP:NOVALS ;AN000; NO VALUE LISTS | ||
| 259 | DB 0 ;AN000; NUMBER OF KEYWORD/SWITCH SYNONYMS | ||
| 260 | ;AN000; IN FOLLOWING LIST | ||
| 261 | |||
| 262 | |||
| 263 | ;VALUE CONTROL BLOCK FOR THE POSITIONAL PARAMETERS | ||
| 264 | NOVALS DB 0 ;AN000;NO VALUE DEFINITIONS | ||
| 265 | |||
| 266 | ;RESULTS CONTROL BLOCK FOR THE FIRST POSITIONAL PARAMETER | ||
| 267 | RESULT1 LABEL BYTE ;AN000; BELOW FILLED IN FOR DEFAULTS | ||
| 268 | TYPE1 DB 0 ;AN000; TYPE RETURNED: 0=RESERVED, | ||
| 269 | PUBLIC TYPE1 | ||
| 270 | ;AN000; 1=NUMBER, 2=LIST INDEX, | ||
| 271 | ;AN000; 3=STRING, 4=COMPLEX, | ||
| 272 | ;AN000; 5=FILESPEC, 6=DRIVE | ||
| 273 | ;AN000; 7=DATE, 8=TIME | ||
| 274 | ;AN000; 9=QUOTED STRING | ||
| 275 | RESULT_TAG1 DB 0FFH ;AN000; MATCHED ITEM TAG | ||
| 276 | DW 0 ;AN000; POINTER TO SYNONYM | ||
| 277 | |||
| 278 | RESULT_PTR1 DD 0 ;AN000; FILESPEC OFFSET | ||
| 279 | PUBLIC RESULT_PTR1 | ||
| 280 | |||
| 281 | ;RESULTS CONTROL BLOCK FOR THE SECOND POSITIONAL PARAMETER | ||
| 282 | RESULT2 LABEL BYTE ;AN000; BELOW FILLED IN FOR DEFAULTS | ||
| 283 | PUBLIC RESULT2 | ||
| 284 | TYPE2 DB 0 ;AN000; TYPE RETURNED: 0=RESERVED, | ||
| 285 | PUBLIC TYPE2 | ||
| 286 | ;AN000; 1=NUMBER, 2=LIST INDEX, | ||
| 287 | ;AN000; 3=STRING, 4=COMPLEX, | ||
| 288 | ;AN000; 5=FILESPEC, 6=DRIVE | ||
| 289 | ;AN000; 7=DATE, 8=TIME | ||
| 290 | ;AN000; 9=QUOTED STRING | ||
| 291 | RESULT_TAG2 DB 0FFH ;AN000; MATCHED ITEM TAG | ||
| 292 | DW 0 ;AN000; POINTER TO SYNONYM | ||
| 293 | |||
| 294 | RESULT_PTR2 DD 0 ;AN000; FILESPEC OFFSET | ||
| 295 | PUBLIC RESULT_PTR2 | ||
| 296 | |||
| 297 | ; = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = | ||
| 298 | HEADER <SWITCH PARM DESCRIPTOR BLOCK> | ||
| 299 | ;PARSER CONTROL BLOCK DEFINING THE SWITCHES, OPTIONAL | ||
| 300 | |||
| 301 | PUBLIC SW1_7 ;AN000;LET LINK MAKE THIS ADDRESSABLE | ||
| 302 | SW1_7 LABEL BYTE ;AN000;SWITCH DESCRIPTOR FOR THE FIRST SEVEN SW | ||
| 303 | DW 0001H ;AN000; CONTROLS TYPE MATCHED | ||
| 304 | ;SELECTED BITS: "OPTIONAL" | ||
| 305 | ; 8000H=NUMERIC VALUE, (VALUE LIST WILL BE CHECKED) | ||
| 306 | ; 4000H=SIGNED NUMERIC VALUE (VALUE LIST WILL BE | ||
| 307 | ; CHECKED) | ||
| 308 | ; 2000H=SIMPLE STRING(VALUE LIST WILL BE CHECKED) | ||
| 309 | ; 1000H=DATE STRING (VALUE LIST WON'T BE CHECKED) | ||
| 310 | ; 0800H=TIME STRING (VALUE LIST WON'T BE CHECKED) | ||
| 311 | ; 0400H=COMPLEX LIST (VALUE LIST WON'T BE CHECKED) | ||
| 312 | ; 0200H=FILE SPEC (VALUE LIST WON'T BE CHECKED) | ||
| 313 | ; 0100H=DRIVE ONLY (VALUE LIST WON'T BE CHECKED) | ||
| 314 | ; 0080H=QUOTED STRING (VALUE LIST WON'T BE CHECKED) | ||
| 315 | ; 0010H=IGNORE ":" AT END IN MATCH | ||
| 316 | ; 0002H=REPEATS ALLOWED | ||
| 317 | ; 0001H=OPTIONAL | ||
| 318 | |||
| 319 | DW 0002H ;AN000; FUNCTION_FLAGS | ||
| 320 | ; 0001H=CAP RESULT BY FILE TABLE | ||
| 321 | ; 0002H=CAP RESULT BY CHAR TABLE | ||
| 322 | ; 0010H=REMOVE ":" AT END | ||
| 323 | |||
| 324 | DW DGROUP:RESULTSW1 ;AN000; RESULT BUFFER | ||
| 325 | PUBLIC RESULTSW1 ;AN000;LET LINK MAKE THIS ADDRESSABLE | ||
| 326 | DW DGROUP:NOVALS ;AN000; VALUE LISTS | ||
| 327 | DB 7 ;AN000; NUMBER OF KEYWORD/SWITCH SYNONYMS | ||
| 328 | ;AN000; IN FOLLOWING LIST | ||
| 329 | SW_A DB "/A",0 | ||
| 330 | PUBLIC SW_A | ||
| 331 | SW_E DB "/E",0 | ||
| 332 | PUBLIC SW_E | ||
| 333 | SW_M DB "/M",0 | ||
| 334 | PUBLIC SW_M | ||
| 335 | SW_P DB "/P",0 | ||
| 336 | PUBLIC SW_P | ||
| 337 | SW_S DB "/S",0 | ||
| 338 | PUBLIC SW_S | ||
| 339 | SW_V DB "/V",0 | ||
| 340 | PUBLIC SW_V | ||
| 341 | SW_W DB "/W",0 | ||
| 342 | PUBLIC SW_W | ||
| 343 | |||
| 344 | ;PARSER CONTROL BLOCK DEFINING THE DATE SWITCH, OPTIONAL | ||
| 345 | |||
| 346 | PUBLIC SW8 ;AN000; LET LINK MAKE THIS ADDRESSABLE | ||
| 347 | SW8 LABEL BYTE ;AN000; SWITCH DESCRIPTOR FOR THE DATE SW | ||
| 348 | DW 1000H ;AN000; CONTROLS TYPE MATCHED | ||
| 349 | DW 0000H ;AN000; FUNCTION_FLAGS | ||
| 350 | DW DGROUP:DATE_BUFF ;AN000; RESULT BUFFER | ||
| 351 | DW DGROUP:NOVALS ;AN000; VALUE LISTS | ||
| 352 | DB 1 ;AN000; NUMBER OF KEYWORD/SWITCH SYNONYMS | ||
| 353 | ;AN000; IN FOLLOWING LIST | ||
| 354 | SW_D DB "/D",0 | ||
| 355 | PUBLIC SW_D | ||
| 356 | |||
| 357 | |||
| 358 | |||
| 359 | ;RESULTS CONTROL BLOCK FOR THE /A,/E,/M,/P,/S,/V,/W SWITCHES | ||
| 360 | RESULTSW1 LABEL BYTE ;AN000; BELOW FILLED IN FOR DEFAULTS | ||
| 361 | DB 3 ;AN000; TYPE RETURNED: 0=RESERVED, | ||
| 362 | ; 1=NUMBER, 2=LIST INDEX, | ||
| 363 | ; 3=STRING, 4=COMPLEX, | ||
| 364 | ; 5=FILESPEC, 6=DRIVE | ||
| 365 | ; 7=DATE, 8=TIME | ||
| 366 | ; 9=QUOTED STRING | ||
| 367 | DB 0FFh ;AN000; MATCHED ITEM TAG | ||
| 368 | |||
| 369 | RESULTSWSYN DW 0 ;AN000; SYNONYM POINTER (BASED ON ES:) | ||
| 370 | PUBLIC RESULTSWSYN | ||
| 371 | RESULTSWVAL DD 0 ;AN000; OFFSET OF STRING VALUE | ||
| 372 | PUBLIC RESULTSWVAL | ||
| 373 | |||
| 374 | |||
| 375 | ;RESULT CONTROL BLOCK FOR THE /D SWITCH | ||
| 376 | DATE_BUFF LABEL BYTE | ||
| 377 | DB 7 ;AN000; TYPE RETURNED (DATE) | ||
| 378 | DB 0FFh ;AN000; MATCHED ITEM TAG | ||
| 379 | DW 0 ;AN000; SYNONYM POINTER (BASED ON ES:) | ||
| 380 | DATE_YEAR DW 0 ;AN000; YEAR | ||
| 381 | PUBLIC DATE_YEAR | ||
| 382 | DATE_MONTH DB 0 ;AN000; MONTH | ||
| 383 | PUBLIC DATE_MONTH | ||
| 384 | DATE_DAY DB 0 ;AN000; DAY | ||
| 385 | PUBLIC DATE_DAY | ||
| 386 | |||
| 387 | |||
| 388 | ; = = = = = = = = = = = = | ||
| 389 | DSEG_INIT ENDS | ||
| 390 | HEADER <PARSING WORKAREAS> | ||
| 391 | ; $SALUT (4,14,19,36) | ||
| 392 | CSEG SEGMENT PUBLIC | ||
| 393 | ASSUME CS:CSEG, DS:DGROUP, ES:DGROUP | ||
| 394 | |||
| 395 | PUBLIC SYSPARSE ;AN000;SUBROUTINE ENTRY POINT ;AN000; | ||
| 396 | |||
| 397 | |||
| 398 | IF1 | ||
| 399 | %OUT COMPONENT=XCOPY, SUBCOMPONENT=PARSE, MODULE=PARSE.ASM... | ||
| 400 | ENDIF | ||
| 401 | INCSW EQU 0 ;AN018;TELL PARSE.ASM PSDATA.INC IS INCLUDED | ||
| 402 | BASESW EQU 1 ;AN018;PSDATA.INC IS ADDRESSABLE WITH DS | ||
| 403 | ; INCLUDE PARSE.ASM ;AN000;GENERATED CODE SUPPRESSED FROM LISTING | ||
| 404 | .XLIST | ||
| 405 | .XCREF | ||
| 406 | INCLUDE PARSE.ASM | ||
| 407 | .LIST | ||
| 408 | .CREF | ||
| 409 | |||
| 410 | EXTRN GET_PARMS:NEAR ;AN000;COMMAND LINE PARMS AND OPTIONS PROCESSING | ||
| 411 | |||
| 412 | HEADER <PARSER - ASK SYSPARM TO DECODE PARAMETERS> | ||
| 413 | ; $SALUT (4,4,9,36) | ||
| 414 | PARSER PROC NEAR | ||
| 415 | PUBLIC PARSER | ||
| 416 | |||
| 417 | ;INPUT: CURRENT_PARM = OFFSET TO NEXT PARM IN COMMAND STRING | ||
| 418 | ; COMMAND_LINE = COPY OF DOS COMMAND LINE PARAMETERS | ||
| 419 | ; "ORDINAL" = COUNT OF NEXT PARM TO PARSE | ||
| 420 | ;OUTPUT: CARRY IS SET IF THERE WAS A PROBLEM, AX HAS PARSE RET CODE. | ||
| 421 | ; CARRY IS CLEAR IF ALL OK WITH THE PARMS | ||
| 422 | ;THE PSP IS NOT REFERENCED, SINCE THE PARMS HAVE BEEN MOVED OUT OF THERE. | ||
| 423 | |||
| 424 | |||
| 425 | MOV ORDINAL,ZERO ;AN000;OPERAND ORDINAL, INITALLY ZERO | ||
| 426 | ; $SEARCH COMPLEX ;AN000;LOOP THRU COMMAND LINE | ||
| 427 | JMP SHORT $$SS1 | ||
| 428 | $$DO1: | ||
| 429 | ;AN000;LOOKING AT RETURN CODE IN AX, | ||
| 430 | ;AN000; JUST PRODUCED BY SYSPARSE... | ||
| 431 | CMP AX,ZERO ;AN000;WERE THERE ANY ERRORS? | ||
| 432 | ; $EXITIF NE,OR ;AN000;HAD A PROBLEM | ||
| 433 | JNE $$LL2 | ||
| 434 | MOV ORDINAL,CX ;AN000;SAVE UPDATED COUNT | ||
| 435 | MOV CURRENT_PARM,SI ;AN000;REMEMBER HOW FAR I GOT | ||
| 436 | MOV BX,DX ;AN000;SET DATA BASE REG TO POINT TO THIS OPERAND | ||
| 437 | CALL GET_PARMS ;AN000;GET 1ST AND 2ND PARAMETERS | ||
| 438 | TEST PARM_FLAG,INIT_ERROR_FLAG ;AN000;CRITICAL PARAMETER ERROR HAS OCCURRED | ||
| 439 | ; $EXITIF NZ ;AN000;HAD A PROBLEM | ||
| 440 | JZ $$IF1 | ||
| 441 | $$LL2: | ||
| 442 | STC ;AN000;SET CARRY TO INDICATE ERROR | ||
| 443 | CALL PARM_ERROR ;AN000;GET OUT WITH ERROR INFORMATION | ||
| 444 | ;AN000;EITHER PARAMETER OR PARSER ERROR PROCESSED | ||
| 445 | |||
| 446 | |||
| 447 | ; $ORELSE ;AN000;SINCE NO PROBLEM, SO FAR | ||
| 448 | JMP SHORT $$SR1 | ||
| 449 | $$IF1: | ||
| 450 | ; $STRTSRCH | ||
| 451 | $$SS1: | ||
| 452 | |||
| 453 | LEA DI,PARMS ;AN000; ES:DI = PARSE CONTROL DEFINITON | ||
| 454 | MOV SI,CURRENT_PARM ;AN000; DS:SI = COMMAND STRING, NEXT PARM | ||
| 455 | XOR DX,DX ;AN000; RESERVED, INIT TO ZERO | ||
| 456 | MOV CX,ORDINAL ;AN000; OPERAND ORDINAL, INITIALLY ZERO | ||
| 457 | CALL SYSPARSE | ||
| 458 | ;AN000; AX=EXIT CODE | ||
| 459 | ;AN000; BL=TERMINATED DELIMITER CODE | ||
| 460 | ;AN000; CX=NEW OPERAND ORDINAL | ||
| 461 | ;AN000; SI=SET TO PAST SCANNED OPERAND | ||
| 462 | ;AN000; DX=SELECTED RESULT BUFFER | ||
| 463 | CMP AX,SYSPRM_EX_EOL ;AN000; IS THAT THE END OF THE PARMS? | ||
| 464 | ;AN000;IF NOT, LOOP BACK AND FIND OUT | ||
| 465 | ;AN000; WHAT THAT PARM IS | ||
| 466 | ; $ENDLOOP E ;AN000;END OF LIST | ||
| 467 | JNE $$DO1 | ||
| 468 | CLC ;AN000;CLEAR CARRY, END OF LIST OK | ||
| 469 | ; $ENDSRCH | ||
| 470 | $$SR1: | ||
| 471 | RET ;AN000;RETURN TO CALLER | ||
| 472 | PARSER ENDP | ||
| 473 | ; = = = = = = = = = = = = | ||
| 474 | HEADER <PARM_ERROR - ????????????> | ||
| 475 | PARM_ERROR PROC NEAR | ||
| 476 | ;INPUT: DX - ADDRESS OF MESSAGE TEXT | ||
| 477 | ; PARM_FLAG set to INIT_ERROR_FLAG (critical error) | ||
| 478 | ; OR THERE WAS A PARSER ERROR | ||
| 479 | |||
| 480 | RET ;AN000;RETURN TO CALLER WITH C SET | ||
| 481 | |||
| 482 | PARM_ERROR ENDP | ||
| 483 | |||
| 484 | |||
| 485 | ; = = = = = = = = = = = = | ||
| 486 | CSEG ENDS | ||
| 487 | END | ||
| 488 | \ No newline at end of file | ||