diff options
| author | 2024-04-25 21:24:10 +0100 | |
|---|---|---|
| committer | 2024-04-25 22:32:27 +0000 | |
| commit | 2d04cacc5322951f187bb17e017c12920ac8ebe2 (patch) | |
| tree | 80ee017efa878dfd5344b44249e6a241f2a7f6e2 /v4.0/src/CMD/GRAFTABL/GRTABPAR.ASM | |
| parent | Merge pull request #430 from jpbaltazar/typoptbr (diff) | |
| download | ms-dos-main.tar.gz ms-dos-main.tar.xz ms-dos-main.zip | |
Diffstat (limited to 'v4.0/src/CMD/GRAFTABL/GRTABPAR.ASM')
| -rw-r--r-- | v4.0/src/CMD/GRAFTABL/GRTABPAR.ASM | 538 |
1 files changed, 538 insertions, 0 deletions
diff --git a/v4.0/src/CMD/GRAFTABL/GRTABPAR.ASM b/v4.0/src/CMD/GRAFTABL/GRTABPAR.ASM new file mode 100644 index 0000000..320161d --- /dev/null +++ b/v4.0/src/CMD/GRAFTABL/GRTABPAR.ASM | |||
| @@ -0,0 +1,538 @@ | |||
| 1 | PAGE 90,132 ;AN000;A2 | ||
| 2 | TITLE GRTABPAR.SAL - LOOK AT COMMAND LINE PARMS ;AN000; | ||
| 3 | ;****************** START OF SPECIFICATIONS ***************************** | ||
| 4 | ; MODULE NAME: GRTABPAR.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 GRAFTABL. 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] GRAFTABL [cp|?|/STA|/STATUS] | ||
| 21 | |||
| 22 | ; WHERE | ||
| 23 | ; [d:][path] - Path where the GRAFTABL command resides. | ||
| 24 | |||
| 25 | ; [cp] - Codepage number to be loaded. If blank, | ||
| 26 | ; 437 is assumed | ||
| 27 | |||
| 28 | ; [?] - This requests a display of the parameters | ||
| 29 | ; supported by the GRAFTABL command. | ||
| 30 | |||
| 31 | ; [/STATUS] - (May be shortened to just /STA.) This | ||
| 32 | ; requests the current codepage already | ||
| 33 | ; loaded by a previous GRAFTABL, if any, | ||
| 34 | ; be displayed. | ||
| 35 | |||
| 36 | ; Upon entry to PARSER in this module, | ||
| 37 | ; "CURRENT_PARM" = offset to start of parm text in command string | ||
| 38 | ; "ORDINAL" = initialized to zero | ||
| 39 | ; PSP+81H = text of DOS command line parms string | ||
| 40 | |||
| 41 | ; EXIT-NORMAL: If a Code Page number was specified | ||
| 42 | ; BX = Offset to language table to be loaded | ||
| 43 | ; DX = Integer value of Code Page specified | ||
| 44 | ; If /STATUS (or /STA) was specified | ||
| 45 | ; BX = 0 | ||
| 46 | ; If Question mark was specified | ||
| 47 | ; BX=-1 | ||
| 48 | |||
| 49 | ; EXIT-ERROR: If there was any problem with the parms, | ||
| 50 | ; the question mark is assumed, and the appropriate | ||
| 51 | ; PARSE error message is displayed. | ||
| 52 | ; The Errorlevel code of "EXPAR" (3), meaning: "PARM ERROR", | ||
| 53 | ; set in "EXITFL", is requested to be returned to the user. | ||
| 54 | |||
| 55 | ; INTERNAL REFERENCES: | ||
| 56 | ; ROUTINES: | ||
| 57 | ; PARSE_ERROR:NEAR Display the appropriate Parse error message. | ||
| 58 | |||
| 59 | ; DATA AREAS: | ||
| 60 | ; The several parameter control blocks, defined by the System | ||
| 61 | ; PARSER interface, defining the GRAFTABL parameters. | ||
| 62 | |||
| 63 | ; EXTERNAL REFERENCES: | ||
| 64 | ; ROUTINES: | ||
| 65 | ; SENDMSG:NEAR Uses Msg Descriptor to drive message handler. | ||
| 66 | ; SYSPARSE:NEAR System Command Line Common Parser. | ||
| 67 | |||
| 68 | ; DATA AREAS: | ||
| 69 | ; TABLEUS:BYTE First table of Fonts, happens to be the USA version. | ||
| 70 | ; (Format of language Font defined in LANGUAGE STRUC.) | ||
| 71 | ; EXITFL:BYTE Errorlevel return code. | ||
| 72 | ; MSGNUM_PARSE:WORD Message descriptor for all parse errors. | ||
| 73 | ; ACTIVECPID:WORD Pointer to CPID entry of active entry, where the | ||
| 74 | ; CPID table is a set of 4 byte asciiz strings, | ||
| 75 | ; each defining the number of a Code Page font. | ||
| 76 | |||
| 77 | ; NOTES: | ||
| 78 | ; This module should be processed with the SALUT preprocessor | ||
| 79 | ; with the re-alignment not requested, as: | ||
| 80 | |||
| 81 | ; SALUT GRTABPAR,NUL | ||
| 82 | |||
| 83 | ; To assemble these modules, the alphabetical or sequential | ||
| 84 | ; ordering of segments may be used. | ||
| 85 | |||
| 86 | ; For LINK instructions, refer to the PROLOG of the main module, | ||
| 87 | ; GRTAB.SAL. | ||
| 88 | |||
| 89 | ; REVISION HISTORY: | ||
| 90 | ; A001 PTM 382 display "ACTIVE" OR "PREVIOUS" CP. | ||
| 91 | ; A002 PTM 474 Avoid duplicate switches | ||
| 92 | ; A003 PTM 538 Display parm in error | ||
| 93 | |||
| 94 | ;****************** END OF SPECIFICATIONS ***************************** | ||
| 95 | IF1 ;AN000; | ||
| 96 | %OUT COMPONENT=GRAFTABL, MODULE=GRTABPAR.SAL... ;AN000; | ||
| 97 | ENDIF ;AN000; | ||
| 98 | ; = = = = = = = = = = = = | ||
| 99 | INCLUDE PATHMAC.INC ;AN006; | ||
| 100 | ; = = = = = = = = = = = = | ||
| 101 | HEADER MACRO TEXT ;;AN000; | ||
| 102 | .XLIST ;AN000; | ||
| 103 | SUBTTL TEXT ;AN000; | ||
| 104 | .LIST ;AN000; | ||
| 105 | PAGE ;AN000; | ||
| 106 | ENDM ;;AN000; | ||
| 107 | ; = = = = = = = = = = = = | ||
| 108 | ; $SALUT (4,23,28,36) ;AN000; | ||
| 109 | EXTRN CPID_L:ABS ;AN000;BYTES PER CPID ENTRY | ||
| 110 | |||
| 111 | MSG_DESC STRUC ;AN003; | ||
| 112 | MSG_NUM DW ? ;AN003;MESSAGE NUMBER (TO AX) | ||
| 113 | MSG_HANDLE DW ? ;AN003;HANDLE OF OUTPUT DEVICE (TO BX) | ||
| 114 | MSG_SUBLIST DW ? ;AN003;POINTER TO SUBLIST (TO SI) | ||
| 115 | MSG_COUNT DW ? ;AN003;SUBSTITUTION COUNT (TO CX) | ||
| 116 | MSG_CLASS DW ? ;AN003;MESSAGE CLASS (IN HIGH BYTE, TO DH) | ||
| 117 | ; LOW BYTE HAS 0 (FUNCTION "NO INPUT", TO DL);AN003; | ||
| 118 | MSG_DESC ENDS ;AN003; | ||
| 119 | |||
| 120 | ONE_SUBS EQU 1 ;AN003;NUMBER OF VARIABLES | ||
| 121 | |||
| 122 | SUBLIST STRUC ;AN000; | ||
| 123 | SUB_SIZE DB ? ;AN003;SUBLIST SIZE (POINTER TO NEXT SUBLIST) | ||
| 124 | SUB_RES DB ? ;AN003;RESERVED | ||
| 125 | ;NEXT FIELD IS TO BE USED AS A DOUBLE WORD ;AN003; | ||
| 126 | SUB_VALUE DW ? ;AN003;TIME, DATE, OR PTR TO DATA ITEM | ||
| 127 | SUB_VALUE_SEG DW ? ;AN003;SEG ID OF PTR | ||
| 128 | ;(ABOVE FIELD MUST BE FILLED AT EXECUTION TIME ;AN003; | ||
| 129 | ; IF THIS IS A .COM FILE) ;AN003; | ||
| 130 | SUB_ID DB ? ;AN003;N OF %N | ||
| 131 | SUB_FLAGS DB ? ;AN003;DATA TYPE FLAGS | ||
| 132 | SUB_MAX_WIDTH DB ? ;AN003;MAXIMUM FIELD WIDTH (0=UNLIMITED) | ||
| 133 | SUB_MIN_WIDTH DB ? ;AN003;MINIMUM FIELD WIDTH | ||
| 134 | SUB_PAD_CHAR DB ? ;AN003;CHARACTER FOR PAD FIELD | ||
| 135 | ; CAN BE " ", "0" OR ",". ;AN003; | ||
| 136 | ; "," CAUSES INSERTION OF THE ACTIVE ;AN003; | ||
| 137 | ; THOUSANDS SEPARATOR BETWEEN EVERY 3 DIGITS. ;AN003; | ||
| 138 | SUBLIST ENDS ;AN003; | ||
| 139 | |||
| 140 | ; LOCAL EQUATES | ||
| 141 | ZERO EQU 0 ;AN000;COMPARAND FOR MISSING PARMS | ||
| 142 | RETCODE_QUESTION EQU -1 ;AN000;VALUE IN BX, IF PARM=? | ||
| 143 | EXPAR EQU 3 ;AN000;RETURN TO DOS, INVALID DOS COMND LINE PARMS | ||
| 144 | CR EQU 13 ;AN000;CARRIAGE RETURN | ||
| 145 | BLANK EQU " " ;AN002;AVOIDS DUPLICATES SWITCHES | ||
| 146 | NUL EQU 0 ;AN003;ASCIIZ DELIMITER | ||
| 147 | ; = = = = = = = = = = = = | ||
| 148 | ; EXIT CODES FROM SYSPARSE (WHEN CY=0) | ||
| 149 | |||
| 150 | SYSPRM_EX_OK EQU 0 ;AN000; no error | ||
| 151 | SYSPRM_EX_MANY EQU 1 ;AN000; too many operands | ||
| 152 | SYSPRM_EX_MISSING EQU 2 ;AN000; required operand missing | ||
| 153 | SYSPRM_EX_NOT_SWLIST EQU 3 ;AN000; not in switch list provided | ||
| 154 | SYSPRM_EX_NOT_KEYLIST EQU 4 ;AN000; not in keyword list provided | ||
| 155 | SYSPRM_EX_RANGE EQU 6 ;AN000; out of range specified | ||
| 156 | SYSPRM_EX_VALUE EQU 7 ;AN000; not in value list provided | ||
| 157 | SYSPRM_EX_STRING EQU 8 ;AN000; not in string list provided | ||
| 158 | SYSPRM_EX_SYNTAX EQU 9 ;AN000; syntax error | ||
| 159 | SYSPRM_EX_EOL EQU -1 ;AN000; end of command line | ||
| 160 | ; = = = = = = = = = = = = | ||
| 161 | HEADER <STRUC - DEFINITIONS OF EXTERNAL CONTROL BLOCKS> ;AN000; | ||
| 162 | LANGUAGE STRUC ;AN000;DEFINITION OF EACH LANGUAGE TABLE | ||
| 163 | LANCHAR DB 1024 DUP(?) ;AN000;8 BYTES PER EACH OF 128 CHARACTERS | ||
| 164 | LANID DW ? ;AN000;TWO BYTE CODEPAGE ID, TO MATCH | ||
| 165 | ; GRAFTABL CMD LINE PARM | ||
| 166 | LANNAME DB 14 DUP(?) ;AN000;ASCIIZ STRING NAME OF LANGUAGE | ||
| 167 | LANGUAGE ENDS ;AN000; | ||
| 168 | ; = = = = = = = = = = = = | ||
| 169 | PSP STRUC ;AN000; | ||
| 170 | DB 80H DUP (?) ;AN000;SKIP OVER FIRST HALF OF PSP | ||
| 171 | PSP_PARMLEN DB ? ;AN000;NUMBER OF BYTES IN DOS COMMAND LINE | ||
| 172 | PSP_COMMAND DB 127 DUP(?) ;AN000;TEXT OF DOS COMMAND LINE | ||
| 173 | PSP ENDS ;AN000; | ||
| 174 | ; = = = = = = = = = = = = | ||
| 175 | HEADER <PARSING WORKAREAS> ;AN000; | ||
| 176 | ; $SALUT (4,14,19,36) ;AN000; | ||
| 177 | CSEG SEGMENT PARA PUBLIC ;AN000; | ||
| 178 | ASSUME CS:CSEG,DS:CSEG,ES:CSEG,SS:CSEG ;AN000; | ||
| 179 | |||
| 180 | EXTRN SENDMSG:NEAR ;AN000;USES MSG DESCRIPTOR TO DRIVE MESSAGE HANDLR | ||
| 181 | EXTRN SYSPARSE:NEAR ;AN000;SYSTEM COMMAND LINE PARSER | ||
| 182 | |||
| 183 | EXTRN TABLEUS:BYTE ;AN000;FIRST TABLE OF FONTS | ||
| 184 | EXTRN EXITFL:BYTE ;AN000;ERRORLEVEL RETURN CODE | ||
| 185 | EXTRN MSGNUM_PARSE:WORD ;AN000;MESSAGE DESCRIPTOR FOR ALL PARSE ERRORS | ||
| 186 | EXTRN SUBLIST_PARSE:WORD ;AN003;POINTS TO INVALID PARM | ||
| 187 | EXTRN ACTIVECPID:WORD ;AN000;POINTER TO CPID ENTRY OF ACTIVE ENTRY | ||
| 188 | ; = = = = = = = = = = = = | ||
| 189 | |||
| 190 | CURRENT_PARM DW 81H ;AN000;POINTER INTO COMMAND OF NEXT OPERAND | ||
| 191 | PUBLIC CURRENT_PARM ;AN000; | ||
| 192 | |||
| 193 | ORDINAL DW 0 ;AN000;ORDINAL NUMBER OF WHICH PARM TO PARSE | ||
| 194 | PUBLIC ORDINAL ;AN000; | ||
| 195 | |||
| 196 | FIRST_TIME DB 0 ;AN000;INDICATES IF A PARM ALREADY FOUND | ||
| 197 | PARSE_RESULT DW 0 ;AN000;TEMP, HOLDS BX TO BE RETURNED | ||
| 198 | ; If a Code Page number was specified | ||
| 199 | ; BX = Offset to language table to be loaded | ||
| 200 | ; DX = Integer value of Code Page specified | ||
| 201 | ; If /STATUS (or /STA) was specified | ||
| 202 | ; BX = 0 | ||
| 203 | ; If Question mark was specified | ||
| 204 | ; BX=-1 | ||
| 205 | ; = = = = = = = = = = = = | ||
| 206 | HEADER <DOS COMMAND LINE PARSER CONTROL BLOCKS> ;AN000; | ||
| 207 | |||
| 208 | ;INPUT PARAMETERS CONTROL BLOCK, POINTED TO BY ES:DI WHEN CALLING PARSER | ||
| 209 | |||
| 210 | PUBLIC PARMS ;AN000;LET LINK MAKE PARMS BLOCK ADDRESSABLE | ||
| 211 | PARMS LABEL BYTE ;AN000;PARMS CONTROL BLOCK | ||
| 212 | DW PARMSX ;AN000;POINTER TO PARMS EXTENSION | ||
| 213 | DB 0 ;AN000; NUMBER OF STRINGS (0, 1, 2) | ||
| 214 | ; NEXT LIST WOULD BE EXTRA DELIM LIST | ||
| 215 | ; (,& WHITESPACE ALWAYS) | ||
| 216 | ; NEXT LIST WOULD BE EXTRA END OF LINE LIST | ||
| 217 | ; (CR,LF,0 ALWAYS) | ||
| 218 | |||
| 219 | ;SYSTEM PARSER PARAMETER EXTENSION CONTROL BLOCK | ||
| 220 | PARMSX LABEL BYTE ;AN000;PARMS EXTENSION CONTROL BLOCK | ||
| 221 | DB 0,1 ;AN000; MIN, MAX POSITIONAL OPERANDS ALLOWED | ||
| 222 | DW CONTROL_POS ;AN000; DESCRIPTION OF POSITIONAL 1 | ||
| 223 | |||
| 224 | DB 1 ;AN000; MAX SWITCH OPERANDS ALLOWED | ||
| 225 | DW CONTROL_SW ;AN000; DESCRIPTION OF SWITCH 1 | ||
| 226 | |||
| 227 | DB 0 ;AN000; MAX KEYWORD OPERANDS ALLOWED | ||
| 228 | ; THERE IS NO CONTROL BLOCK | ||
| 229 | ; DEFINING KEYWORDS | ||
| 230 | |||
| 231 | ; = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = | ||
| 232 | HEADER <POSITIONAL PARM DESCRIPTOR BLOCK> ;AN000; | ||
| 233 | ;PARSER CONTROL BLOCK DEFINING THE ONLY POSITIONAL PARAMETER, OPTIONAL | ||
| 234 | |||
| 235 | ;FIRST POSITIONAL PARAMETER IS: | ||
| 236 | ; [cp|?] THE CODEPAGE NUMBER, OR THE QUESTION MARK | ||
| 237 | |||
| 238 | PUBLIC CONTROL_POS ;AN000;LET LINK MAKE THIS ADDRESSABLE | ||
| 239 | CONTROL_POS LABEL BYTE ;AN000;FIRST POSITIONAL DESCRIPTOR FOR FILESPEC, | ||
| 240 | ; OPTIONAL | ||
| 241 | DW 2001H ;AN000; CONTROLS TYPE MATCHED | ||
| 242 | ; SELECTED BITS: "SIMPLE STRING" AND "OPTIONAL" | ||
| 243 | |||
| 244 | ; 8000H=NUMERIC VALUE, (VALUE LIST WILL BE CHECKED) | ||
| 245 | ; 4000H=SIGNED NUMERIC VALUE (VALUE LIST WILL BE | ||
| 246 | ; CHECKED) | ||
| 247 | ; 2000H=SIMPLE STRING(VALUE LIST WILL BE CHECKED) | ||
| 248 | ; 1000H=DATE STRING (VALUE LIST WON'T BE CHECKED) | ||
| 249 | ; 0800H=TIME STRING (VALUE LIST WON'T BE CHECKED) | ||
| 250 | ; 0400H=COMPLEX LIST (VALUE LIST WON'T BE CHECKED) | ||
| 251 | ; 0200H=FILE SPEC (VALUE LIST WON'T BE CHECKED) | ||
| 252 | ; 0100H=DRIVE ONLY (VALUE LIST WON'T BE CHECKED) | ||
| 253 | ; 0080H=QUOTED STRING (VALUE LIST WON'T BE CHECKED) | ||
| 254 | ; 0010H=IGNORE ":" AT END IN MATCH | ||
| 255 | ; 0002H=REPEATS ALLOWED | ||
| 256 | ; 0001H=OPTIONAL | ||
| 257 | |||
| 258 | DW 0000H ;AN000;FUNCTION_FLAGS ("NO CAPS") | ||
| 259 | ; 0001H=CAP RESULT BY FILE TABLE | ||
| 260 | ; 0002H=CAP RESULT BY CHAR TABLE | ||
| 261 | ; 0010H=REMOVE ":" AT END | ||
| 262 | DW RESULT ;AN000; RESULT BUFFER | ||
| 263 | DW VALS ;AN000; VALUE LISTS | ||
| 264 | DB 0 ;AN000; NUMBER OF KEYWORD/SWITCH SYNONYMS | ||
| 265 | ; IN FOLLOWING LIST | ||
| 266 | |||
| 267 | ;VALUE CONTROL BLOCK FOR THE POSITIONAL PARAMETERS | ||
| 268 | VALS DB 3 ;AN000;NUMBER OF VALS DEFINITIONS (0-3) | ||
| 269 | DB 0 ;AN000;NUMBER OF RANGES (NONE) | ||
| 270 | DB 0 ;AN000;NUMBER OF NUMERIC CHOICES (NONE) | ||
| 271 | DB 6 ;AN000;NUMBER OF CHOICE STRINGS | ||
| 272 | |||
| 273 | |||
| 274 | ;THE ORDER OF THESE VALUE DEFINITIONS IS SIGNIFICANT. THEIR ORDER MUST | ||
| 275 | ;MATCH THE ORDER IN WHICH THE CORRESPONDING FONT TABLE MODULES ARE | ||
| 276 | ;LINKED TOGETHER. THUE THE "VALUE RETURNED" OF 1 MEANS THE FIRST LINKED | ||
| 277 | ;FONT TABLE, THE VALUE OF 5 MEANS THE FIFTH LINKED FONT TABLE, ETC. | ||
| 278 | |||
| 279 | VAL_437 EQU 1 ;AN000;VALUE RETURNED | ||
| 280 | DB VAL_437 ;AN000; FOR: | ||
| 281 | DW S437 ;AN000;SPECIFIC CHOICE IF STRING | ||
| 282 | |||
| 283 | VAL_850 EQU 2 ;AN000;VALUE RETURNED | ||
| 284 | DB VAL_850 ;AN000; FOR: | ||
| 285 | DW S850 ;AN000;SPECIFIC CHOICE IF STRING | ||
| 286 | |||
| 287 | VAL_860 EQU 3 ;AN000;VALUE RETURNED | ||
| 288 | DB VAL_860 ;AN000; FOR: | ||
| 289 | DW S860 ;AN000;SPECIFIC CHOICE IF STRING | ||
| 290 | |||
| 291 | VAL_863 EQU 4 ;AN000;VALUE RETURNED | ||
| 292 | DB VAL_863 ;AN000; FOR: | ||
| 293 | DW S863 ;AN000;SPECIFIC CHOICE IF STRING | ||
| 294 | |||
| 295 | VAL_865 EQU 5 ;AN000;VALUE RETURNED | ||
| 296 | DB VAL_865 ;AN000; FOR: | ||
| 297 | DW S865 ;AN000;SPECIFIC CHOICE IF STRING | ||
| 298 | |||
| 299 | VAL_QUESTION EQU 6 ;AN000;VALUE RETURNED | ||
| 300 | DB VAL_QUESTION ;AN000; FOR: | ||
| 301 | DW SQU ;AN000;SPECIFIC CHOICE IF STRING | ||
| 302 | |||
| 303 | ; SET OF ASCIIZ STRINGS, DEFINING THE POSITIONAL PARAMETER | ||
| 304 | S437 DB "437",0 ;AN000;USA | ||
| 305 | S850 DB "850",0 ;AN000;MULTI-LINGUAL | ||
| 306 | S860 DB "860",0 ;AN000;PORTUGUESE | ||
| 307 | S863 DB "863",0 ;AN000;CANADIAN FRENCH | ||
| 308 | S865 DB "865",0 ;AN000;NORDIC | ||
| 309 | SQU DB "?",0 ;AN000; | ||
| 310 | |||
| 311 | ;RESULTS CONTROL BLOCK FOR THE POSITIONAL PARAMETER, AND SWITCH PARAMETER | ||
| 312 | RESULT LABEL BYTE ;AN000; BELOW FILLED IN FOR DEFAULTS | ||
| 313 | DB 3 ;AN000; TYPE RETURNED: 0=RESERVED, | ||
| 314 | ; 1=NUMBER, 2=LIST INDEX, | ||
| 315 | ; 3=STRING, 4=COMPLEX, | ||
| 316 | ; 5=FILESPEC, 6=DRIVE | ||
| 317 | ; 7=DATE, 8=TIME | ||
| 318 | ; 9=QUOTED STRING | ||
| 319 | RESULT_TAG DB 0FFH ;AN000; MATCHED ITEM TAG | ||
| 320 | RESULT_SYN DW 0 ;AN000;POINTER TO SYNONYM | ||
| 321 | |||
| 322 | RESULT_PTR DD ? ;AN000;OFFSET OF STRING VALUE | ||
| 323 | |||
| 324 | ; = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = | ||
| 325 | HEADER <SWITCH PARM DESCRIPTOR BLOCK> ;AN000; | ||
| 326 | ;PARSER CONTROL BLOCK DEFINING THE ONLY SWITCH, OPTIONAL | ||
| 327 | |||
| 328 | ;THE SWITCH IS "/STA" OR "/STATUS". WHEN REQUESTED, IT MEANS TO IDENTIFY | ||
| 329 | ;WHAT CODEPAGE IS CURRENTLY SUPPORTED BY THE PREVIOUS GRAFTABL, IF ANY. | ||
| 330 | PUBLIC CONTROL_SW ;AN000;LET LINK MAKE THIS ADDRESSABLE | ||
| 331 | CONTROL_SW LABEL BYTE ;AN000;SWITCH DESCRIPTOR FOR /STA | ||
| 332 | DW 0001H ;AN000; CONTROLS TYPE MATCHED | ||
| 333 | ;SELECTED BITS: "OPTIONAL" | ||
| 334 | ; 8000H=NUMERIC VALUE, (VALUE LIST WILL BE CHECKED) | ||
| 335 | ; 4000H=SIGNED NUMERIC VALUE (VALUE LIST WILL BE | ||
| 336 | ; CHECKED) | ||
| 337 | ; 2000H=SIMPLE STRING(VALUE LIST WILL BE CHECKED) | ||
| 338 | ; 1000H=DATE STRING (VALUE LIST WON'T BE CHECKED) | ||
| 339 | ; 0800H=TIME STRING (VALUE LIST WON'T BE CHECKED) | ||
| 340 | ; 0400H=COMPLEX LIST (VALUE LIST WON'T BE CHECKED) | ||
| 341 | ; 0200H=FILE SPEC (VALUE LIST WON'T BE CHECKED) | ||
| 342 | ; 0100H=DRIVE ONLY (VALUE LIST WON'T BE CHECKED) | ||
| 343 | ; 0080H=QUOTED STRING (VALUE LIST WON'T BE CHECKED) | ||
| 344 | ; 0010H=IGNORE ":" AT END IN MATCH | ||
| 345 | ; 0002H=REPEATS ALLOWED | ||
| 346 | ; 0001H=OPTIONAL | ||
| 347 | |||
| 348 | DW 0000H ;AN000;FUNCTION_FLAGS ("NO CAPS") | ||
| 349 | ; 0001H=CAP RESULT BY FILE TABLE | ||
| 350 | ; 0002H=CAP RESULT BY CHAR TABLE | ||
| 351 | ; 0010H=REMOVE ":" AT END | ||
| 352 | |||
| 353 | DW RESULT ;AN000; RESULT BUFFER | ||
| 354 | ;(USE SAME RESULT BUF AS DID POSITIONAL PARM) | ||
| 355 | DW NOVALS ;AN000; VALUE LISTS | ||
| 356 | DB 2 ;AN000; NUMBER OF KEYWORD/SWITCH SYNONYMS | ||
| 357 | ; IN FOLLOWING LIST | ||
| 358 | SW_STA DB "/STA",0 ;AN000; IF n >0, KEYWORD 1 | ||
| 359 | SW_STATUS DB "/STATUS",0 ;AN000;SECOND KEYWORD | ||
| 360 | |||
| 361 | ;VALUE CONTROL BLOCK FOR THE SWITCHES | ||
| 362 | NOVALS LABEL BYTE ;AN000; | ||
| 363 | DB 0 ;AN000; NUMBER OF VALUE DEFINITIONS (0 - 3) | ||
| 364 | ; = = = = = = = = = = = = | ||
| 365 | PATHLABL GRTABPAR ;AN006; | ||
| 366 | HEADER <PARSER - ASK SYSPARM TO DECODE PARAMETERS> ;AN000; | ||
| 367 | ; $SALUT (4,4,9,36) ;AN000; | ||
| 368 | PARSER PROC NEAR ;AN000; | ||
| 369 | PUBLIC PARSER ;AN000; | ||
| 370 | |||
| 371 | ;INPUT: "CURRENT_PARM" = OFFSET TO NEXT PARM IN COMMAND STRING | ||
| 372 | ; "ORDINAL" = COUNT OF NEXT PARM TO PARSE | ||
| 373 | ; PSP+81H = TEXT OF DOS COMMAND LINE PARMS STRING | ||
| 374 | ;OUTPUT: IF A CODEPAGE NUMBER WAS SPECIFIED | ||
| 375 | ; BX = OFFSET TO LANGUAGE TABLE TO BE LOADED | ||
| 376 | ; DX = INTEGER VALUE OF CODEPAGE SPECIFIED | ||
| 377 | ; IF /STATUS WAS SPECIFIED | ||
| 378 | ; BX = 0 | ||
| 379 | ; IF QUESTION MARK WAS SPECIFIED | ||
| 380 | ; BX=-1 | ||
| 381 | |||
| 382 | ;IF THERE WAS ANY PROBLEM WITH THE PARMS, THE QUESTION MARK IS ASSUMED, | ||
| 383 | ;AND "EXITFL" SET TO "EXPAR" TO INDICATE PARM ERROR. | ||
| 384 | |||
| 385 | ;IT A CP IS SPECIFIED, A STATUS REPORT IS ALWAYS GIVEN TO SAY WHAT WHAT | ||
| 386 | ;THERE PREVIOUSLY, SO IF THE USER SPECIFIED A CP AND THE /STATUS SWITCH, | ||
| 387 | ;THEN THE /STATUS DOES NOTHING BEYOND WHAT WOULD HAVE BEEN DONE ALREADY | ||
| 388 | ;WITH JUST THE CP SPECIFICATION. I ALWAYS REPORT STATUS. THE ONLY | ||
| 389 | ;REASON TO HAVE /STATUS IS TO BE ABLE TO SEE WHAT IS THERE ALREADY | ||
| 390 | ;WITHOUT INVOKING THE DEFAULT OF 437 (USA) BY NOT SPECIFYING A CP. | ||
| 391 | ; = = = = = = = = = = = = | ||
| 392 | |||
| 393 | ; $SEARCH COMPLEX ;AN000;LOOP THRU COMMAND LINE | ||
| 394 | JMP SHORT $$SS1 | ||
| 395 | $$DO1: | ||
| 396 | ;LOOKING AT RET CODE IN AX SET BY SYSPARSE | ||
| 397 | CMP AX,ZERO ;AN000;WERE THERE ANY ERRORS? | ||
| 398 | ; $EXITIF NE ;AN000;HAD A PROBLEM | ||
| 399 | JE $$IF1 | ||
| 400 | CALL PARSE_ERROR ;AN000;DISPLAY REASON FOR ERROR | ||
| 401 | |||
| 402 | ; $ORELSE LONG ;AN000;SINCE NO PROBLEM, SO FAR | ||
| 403 | JMP $$SR1 | ||
| 404 | $$IF1: | ||
| 405 | MOV ORDINAL,CX ;AN000;SAVE UPDATED COUNT | ||
| 406 | CMP FIRST_TIME,ZERO ;AN000;DO I HAVE A PARM YET? | ||
| 407 | ; $IF E ;AN000;NOT YET, LOOK AT THIS ONE JUST FOUND | ||
| 408 | JNE $$IF4 | ||
| 409 | MOV CURRENT_PARM,SI ;AN000;REMEMBER HOW FAR I GOT | ||
| 410 | CMP RESULT_SYN,ZERO ;AN000;WAS POSITIONAL PARM SPECIFIED? | ||
| 411 | ; $IF E ;AN000;IF POSITIONAL PARM SPECIFIED, | ||
| 412 | JNE $$IF5 | ||
| 413 | MOV CL,RESULT_TAG ;AN000;GET ID OF SPECIFIED PARM | ||
| 414 | XOR CH,CH ;AN000;CLEAR HIGH BYTE | ||
| 415 | CMP CL,VAL_QUESTION ;AN000;WAS "?" SPECIFIED? | ||
| 416 | ; $IF E ;AN000;IF "?" SPECIFIED | ||
| 417 | JNE $$IF6 | ||
| 418 | MOV BX,RETCODE_QUESTION ;AN000;INDICATE THAT "?" SPECIFIED | ||
| 419 | ; $ELSE ;AN000;SINCE "?" NOT SPECIFIED | ||
| 420 | JMP SHORT $$EN6 | ||
| 421 | $$IF6: | ||
| 422 | LEA BX,TABLEUS ;AN000;GET WHERE FIRST CODEPAGE STARTS, USING CX | ||
| 423 | ; AS A COUNTER, STEP THRU THE LANGUAGE TABLES | ||
| 424 | ; UNTIL GETTING TO THE SPECIFIED ONE | ||
| 425 | ; $DO COMPLEX ;AN000; | ||
| 426 | JMP SHORT $$SD8 | ||
| 427 | $$DO8: | ||
| 428 | ADD BX,TYPE LANGUAGE ;AN000;POINT TO NEXT TABLE | ||
| 429 | ADD ACTIVECPID,CPID_L ;AN000;SELECT NEXT CPID ENTRY | ||
| 430 | ; $STRTDO ;AN000; | ||
| 431 | $$SD8: | ||
| 432 | ; $ENDDO LOOP ;AN000;DECREMENT INDEX | ||
| 433 | LOOP $$DO8 | ||
| 434 | ;BX-OFFSET TO LANGUAGE TABLE | ||
| 435 | ; INDICATED BY POSITIONAL PARM | ||
| 436 | ; $ENDIF ;AN000;"?" SPECIFIED? | ||
| 437 | $$EN6: | ||
| 438 | ; $ELSE ;AN000;SINCE NOT POSITIONAL PARM SPECIFIED | ||
| 439 | JMP SHORT $$EN5 | ||
| 440 | $$IF5: | ||
| 441 | ;RESULT_SYN POINTS TO A SWITCH | ||
| 442 | XOR BX,BX ;AN000; MUST HAVE BEEN THE SWITCH, /STATUS | ||
| 443 | MOV SW_STA,BLANK ;AN002;AVOID THE DUPLICATION OF THIS SWITCH | ||
| 444 | MOV SW_STATUS,BLANK ;AN002;AVOID THE DUPLICATION OF THIS SWITCH | ||
| 445 | ; $ENDIF ;AN000;POSITIONAL? | ||
| 446 | $$EN5: | ||
| 447 | INC FIRST_TIME ;AN000;INDICATE A PARM HAS BEEN FOUND | ||
| 448 | ; $ELSE ;AN000;SINCE ALREADY HAVE A PARM | ||
| 449 | JMP SHORT $$EN4 | ||
| 450 | $$IF4: | ||
| 451 | PUSH SI ;AN003;SAVE NEW INDEX TO COMMAND LINE | ||
| 452 | CALL PARSE_ERROR ;AN000;FUSS ABOUT TOO MANY PARMS | ||
| 453 | |||
| 454 | POP CURRENT_PARM ;AN000;REMEMBER HOW FAR I GOT | ||
| 455 | |||
| 456 | ; $ENDIF ;AN000;ALREADY HAVE A PARM? | ||
| 457 | $$EN4: | ||
| 458 | MOV PARSE_RESULT,BX ;AN000;SAVE THE RESULT OF THIS PARSE | ||
| 459 | ; $STRTSRCH ;AN000; | ||
| 460 | $$SS1: | ||
| 461 | LEA DI,PARMS ;AN000; ES:DI = PARSE CONTROL DEFINITON | ||
| 462 | MOV SI,CURRENT_PARM ;AN000; DS:SI = COMMAND STRING, NEXT PARM | ||
| 463 | XOR DX,DX ;AN000; RESERVED, INIT TO ZERO | ||
| 464 | MOV CX,ORDINAL ;AN000; OPERAND ORDINAL, INITIALLY ZERO | ||
| 465 | CALL SYSPARSE ;AN000;LOOK AT DOS PARMS | ||
| 466 | ; AX=EXIT CODE | ||
| 467 | ; BL=TERMINATED DELIMETER CODE | ||
| 468 | ; CX=NEW OPERAND ORDINAL | ||
| 469 | ; SI=SET TO PAST SCANNED OPERAND | ||
| 470 | ; DX=SELECTED RESULT BUFFER | ||
| 471 | CMP AX,SYSPRM_EX_EOL ;AN000; IS THAT THE END OF THE PARMS? | ||
| 472 | ;IF NOT, LOOP BACK AND FIND OUT | ||
| 473 | ; WHAT THAT PARM IS | ||
| 474 | ; $ENDLOOP E ;AN000;END OF LIST | ||
| 475 | JNE $$DO1 | ||
| 476 | CMP FIRST_TIME,ZERO ;AN000;FIND ANYTHING YET? | ||
| 477 | ; $IF E ;AN000;IF NO PARM SPECIFIED | ||
| 478 | JNE $$IF18 | ||
| 479 | LEA BX,TABLEUS ;AN000;SPECIFY 437 (USA) AS DEFAULT | ||
| 480 | ; $ELSE ;AN000;SINCE A PARM WAS FOUND | ||
| 481 | JMP SHORT $$EN18 | ||
| 482 | $$IF18: | ||
| 483 | MOV BX,PARSE_RESULT ;AN000;REMEMBER PARM ALREADY FOUND | ||
| 484 | ; $ENDIF ;AN000; | ||
| 485 | $$EN18: | ||
| 486 | ;BX=-1, "?"; BX=0, "/STATUS";BX>0, CP TABLE | ||
| 487 | CMP BX,ZERO ;AN000;WAS A CP TABLE FOUND? | ||
| 488 | ; $IF A ;AN000;IF A CP TABLE FOUND | ||
| 489 | JNA $$IF21 | ||
| 490 | MOV DX,[BX].LANID ;AN000;FETCH THE TWO CHAR ID FROM TABLE | ||
| 491 | ; $ENDIF ;AN000; | ||
| 492 | $$IF21: | ||
| 493 | ; $ENDSRCH ;AN000;FINISHED WITH DOS COMMAND LINE | ||
| 494 | $$SR1: | ||
| 495 | RET ;AN000;RETURN TO CALLER | ||
| 496 | PARSER ENDP ;AN000; | ||
| 497 | ; = = = = = = = = = = = = ;AN000; | ||
| 498 | HEADER <PARSE_ERROR - DISPLAY REASON FOR PARSE ERROR> ;AN000; | ||
| 499 | PARSE_ERROR PROC NEAR ;AN000; | ||
| 500 | ;INPUT: "FIRST_TIME" - IF NON-ZERO, FORCE ERROR CODE TO "TOO MANY PARMS" | ||
| 501 | ; AX - ERROR NUMBER RETURNED FROM PARSE. | ||
| 502 | ; SI - OFFSET INTO COMMAND OF FIRST BYTE BEYOND PARM IN ERROR | ||
| 503 | ; "CURRENT_PARM" - OFFSET INTO COMMAND OF WHERE TO START LOOKING FOR PARM | ||
| 504 | ;OUTPUT: APPROPRIATE ERROR MESSAGE IS DISPLAYED. | ||
| 505 | ; BX IS SET TO PRETEND THAT THE "?" WAS SPECIFIED. | ||
| 506 | ; "EXITFL" SET TO "EXPAR" TO INDICATE PARM ERROR. | ||
| 507 | ; = = = = = = = = = = = = | ||
| 508 | |||
| 509 | CMP FIRST_TIME,ZERO ;AN000;ANY PARMS FOUND YET? | ||
| 510 | ; $IF NE ;AN000;IF PARM ALREADY FOUND | ||
| 511 | JE $$IF24 | ||
| 512 | MOV AX,SYSPRM_EX_MANY ;AN000;CHANGE RETURN CODE TO "TOO MANY PARMS" | ||
| 513 | ; $ENDIF ;AN000;PARMS FOUND? | ||
| 514 | $$IF24: | ||
| 515 | MOV MSGNUM_PARSE,AX ;AN000;PASS MESSAGE NUMBER TO DESCRIPTOR | ||
| 516 | MOV AX,CURRENT_PARM ;AN003;GET POINTER TO START OF BAD PARM | ||
| 517 | CMP SI,AX ;AN003;HAS THE INDEX TO COMMAND LINE MOVED? | ||
| 518 | ; $IF NE ;AN003;YES, THERE IS A FAULTY PARM | ||
| 519 | JE $$IF26 | ||
| 520 | MOV BYTE PTR [SI],NUL ;AN003;DELIMIT THE BAD PARM | ||
| 521 | MOV SUBLIST_PARSE.SUB_VALUE,AX ;AN000;POINT SUBLIST TO BAD PARM | ||
| 522 | |||
| 523 | MOV MSGNUM_PARSE.MSG_SUBLIST,OFFSET SUBLIST_PARSE ;AN003;POINT TO SUBLIST | ||
| 524 | MOV MSGNUM_PARSE.MSG_COUNT,ONE_SUBS ;AN003;SET COUNT OF SUBLISTS TO ONE | ||
| 525 | ; $ENDIF ;AN003;INDEX MOVED? | ||
| 526 | $$IF26: | ||
| 527 | LEA DI,MSGNUM_PARSE ;AN000;PASS MESSAGE DESCRIPTOR | ||
| 528 | CALL SENDMSG ;AN000;DISPLAY ERROR MESSAGE | ||
| 529 | |||
| 530 | MOV BX,RETCODE_QUESTION ;AN000;INDICATE THAT "?" SPECIFIED | ||
| 531 | MOV EXITFL,EXPAR ;AN000;ERRORLEVEL CODE TO "PARM ERROR" | ||
| 532 | RET ;AN000;RETURN TO CALLER | ||
| 533 | PARSE_ERROR ENDP ;AN000; | ||
| 534 | ; = = = = = = = = = = = = | ||
| 535 | PATHLABL GRTABPAR ;AN006; | ||
| 536 | CSEG ENDS ;AN000; | ||
| 537 | END ;AN000; | ||
| 538 | \ No newline at end of file | ||