You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
303 lines
8.4 KiB
303 lines
8.4 KiB
page 60,132;
|
|
title EDLPARSE for EDLIN
|
|
;/*
|
|
; * Microsoft Confidential
|
|
; * Copyright (C) Microsoft Corporation 1991
|
|
; * All Rights Reserved.
|
|
; */
|
|
|
|
|
|
;******************* START OF SPECIFICATIONS *****************************
|
|
;
|
|
; MODULE NAME: EDLPARSE.SAL
|
|
;
|
|
; DESCRIPTIVE NAME: PARSES THE EXTERNAL COMMAND LINE FOR EDLIN
|
|
;
|
|
; FUNCTION: THIS ROUTINE PROVIDES PARSING CAPABILITIES FOR THE
|
|
; EXTERNAL COMMAND LINE OF EDLIN. IT PARSES FOR THE PRESENCE
|
|
; OF A REQUIRED FILESPEC AND AN OPTIONAL SWITCH (/B).
|
|
;
|
|
; ENTRY POINT: PARSER_COMMAND
|
|
;
|
|
; INPUT: DOS COMMAND LINE
|
|
;
|
|
; EXIT NORMAL: AX = 0FFH - VALID SWITCH AND FILESPEC SPECIFIED
|
|
;
|
|
; EXIT ERROR: AX NOT= 0FFH - INVALID SWITCH OR NO FILESPEC SPECIFIED
|
|
;
|
|
; INTERNAL REFERENCES
|
|
;
|
|
; ROUTINE: PARSER_COMMAND - THIS ROUTINE PARSES FOR THE PRESENCE
|
|
; OF THE /B SWITCH AND A FILESPEC. THE
|
|
; FILEPSEC IS REQUIRED, WHILE THE SWITCH
|
|
; IS OPTIONAL.
|
|
;
|
|
; EXTERNAL REFERENCES:
|
|
;
|
|
; ROUTINE: PARSE.ASM - THIS IS THE PARSER CODE.
|
|
;
|
|
; NOTES: THIS MODULE IS TO BE PREPPED BY SALUT WITH THE "PR" OPTIONS.
|
|
; LINK EDLIN+EDLCMD1+EDLCMD2+EDLMES+EDLPARSE
|
|
;
|
|
; REVISION HISTORY:
|
|
;
|
|
; AN000 VERSION 4.00 - IMPLEMENTS THE SYSTEM PARSER (SYSPARSE)
|
|
;
|
|
; COPYRIGHT: "THE IBM PERSONAL COMPUTER EDLIN UTILITY"
|
|
; "VERSION 4.00 (C) COPYRIGHT 1988"
|
|
; "LICENSED MATERIAL - PROPERTY OF Microsoft"
|
|
;
|
|
;
|
|
;******************** END OF SPECIFICATIONS ******************************
|
|
|
|
|
|
;======================= equates for edlparse ============================
|
|
|
|
parse_ok equ 0 ;an000;good parse return
|
|
parse_command equ 081h ;an000;offset of command line
|
|
nul equ 0 ;an000;nul
|
|
fs_flag equ 05h ;an000;filespec found
|
|
sw_flag equ 03h ;an000;switch found
|
|
true equ 0ffffh ;an000;true
|
|
false equ 00h ;an000;false
|
|
too_many equ 01h ;an000;too many parms
|
|
|
|
;======================= end equates =====================================
|
|
|
|
|
|
CODE SEGMENT PUBLIC BYTE
|
|
CODE ENDS
|
|
|
|
CONST SEGMENT PUBLIC BYTE
|
|
CONST ENDS
|
|
|
|
cstack segment stack
|
|
cstack ends
|
|
|
|
DATA SEGMENT PUBLIC BYTE
|
|
|
|
extrn path_name:byte
|
|
extrn org_ds:word ;an000; dms;
|
|
|
|
public parse_switch_b ;an000;parse switch result
|
|
public parse_switch_? ; parse switch result
|
|
public filespec ;an000;actual filespec
|
|
|
|
;======================= input parameters control blocks =================
|
|
; these control blocks are used by sysparse and must be pointed to by
|
|
; es:di on invocation.
|
|
|
|
public parms ;an000;share parms
|
|
parms label byte ;an000;parms control block
|
|
dw dg:parmsx ;an000;point to parms structure
|
|
db 00h ;an000;no additional delims.
|
|
|
|
parmsx label byte ;an000;parameter types
|
|
db 1,1 ;an000;must have filespec
|
|
dw dg:fs_pos ;an000;filespec control block
|
|
db 2 ;an000;max. number of switches
|
|
dw dg:sw_b ;an000;/b switch control block
|
|
dw dg:sw_? ;an000;/? switch control block
|
|
db 00h ;an000;no keywords
|
|
|
|
;======================= filespec positional tables ======================
|
|
|
|
fs_pos label byte ;an000;filespec positional
|
|
dw 0200h ;an000;filespec/not optional
|
|
dw 0001h ;an000;cap
|
|
dw dg:filespec_res ;an000;filespec result table
|
|
dw dg:noval ;an000;value list/none
|
|
db 0 ;an000;no keyword/switch syns.
|
|
|
|
filespec_res label byte ;an000;filespec result table
|
|
parse_fs_res db ? ;an000;must be filespec (05)
|
|
parse_fs_tag db ? ;an000;item tag
|
|
parse_fs_syn dw ? ;an000;synonym pointer
|
|
parse_fs_off dw ? ;an000;offset to filespec
|
|
parse_fs_seg dw ? ;an000;segment of filespec
|
|
|
|
;======================= switch tables /b ================================
|
|
|
|
sw_b label byte ;an000;/b switch
|
|
dw 0000h ;an000;no match flags
|
|
dw 0000h ;an000;no cap
|
|
dw dg:switch_res ;an000;result buffer
|
|
dw dg:noval ;an000;value list/none
|
|
db 1 ;an000;1 switch
|
|
sw_b_switch db "/B",0 ;an000;/B means ignore CTL-Z
|
|
|
|
sw_? label byte ;an000;/b switch
|
|
dw 0000h ;an000;no match flags
|
|
dw 0000h ;an000;no cap
|
|
dw dg:switch_res ;an000;result buffer
|
|
dw dg:noval ;an000;value list/none
|
|
db 1 ;an000;1 switch
|
|
sw_?_switch db "/?",0 ;an000;/B means ignore CTL-Z
|
|
PUBLIC sw_?_switch
|
|
switch_res label byte ;an000;switch result table
|
|
parse_sw_res db ? ;an000;must be string (03)
|
|
parse_sw_tag db ? ;an000;item tag
|
|
parse_sw_syn dw ? ;an000;synonym pointer
|
|
parse_sw_ptr dd ? ;an000;pointer to result
|
|
|
|
noval label byte ;an000;value table
|
|
db 0 ;an000;no values
|
|
|
|
|
|
;======================= end input parameter control blocks ==============
|
|
|
|
filespec db 128 dup (0) ;an000;holds filespec
|
|
parse_switch_b db false ;an000;hold boolean result
|
|
; of /b parse
|
|
parse_switch_? db false ; true if /? found
|
|
parse_sw_b db "/B" ;an000;comparison switch
|
|
|
|
DATA ENDS
|
|
|
|
DG GROUP CODE,CONST,cstack,DATA
|
|
|
|
code segment public byte ;an000;code segment
|
|
assume cs:dg,ds:dg,es:dg,ss:CStack ;an000;
|
|
|
|
public parser_command ;an000;share this routine
|
|
|
|
|
|
|
|
;======================= begin main routine ==============================
|
|
.xlist
|
|
|
|
include version.inc ; parse.asm include psdata.inc which needs defs from here
|
|
include parse.asm ;an000;parser
|
|
|
|
.list
|
|
|
|
parser_command proc near ;an000;parse routine
|
|
|
|
push es ;an000;save registers
|
|
push ds ;an000;
|
|
push di ;an000;
|
|
push si ;an000;
|
|
|
|
mov dg:parse_switch_b,false ;an000;init. to false
|
|
xor cx,cx ;an000;set cx to 0
|
|
xor dx,dx ;an000;set dx to 0
|
|
mov di,offset dg:parms ;an000;point to parms
|
|
mov si,parse_command ;an000;point to ds:81h
|
|
mov ds,dg:org_ds ;an000;get ds at entry
|
|
assume ds:nothing ;an000;
|
|
|
|
parse_continue: ;an000;loop return point
|
|
|
|
call sysparse ;an000;invoke parser
|
|
cmp ax,parse_ok ;an000;is it a good parse
|
|
jne parse_end ;an000;continue on good parse
|
|
push si
|
|
mov si,dx
|
|
cmp byte ptr es:[si],fs_flag ;an000;do we have a filespec
|
|
; $if e ;an000;yes we do
|
|
JNE $$IF1
|
|
call build_fs ;an000;save filespec
|
|
; $else ;an000;
|
|
JMP SHORT $$EN1
|
|
$$IF1:
|
|
; A switch was found.
|
|
; See which one it was.
|
|
|
|
call val_sw ;an000;see which switch
|
|
|
|
; $endif ;an000;
|
|
$$EN1:
|
|
|
|
pop si
|
|
jmp parse_continue ;an000;continue parsing
|
|
|
|
parse_end: ;an000;end parse routine
|
|
|
|
pop si ;an000;restore registers
|
|
pop di ;an000; for return to caller
|
|
pop ds ;an000;
|
|
assume ds:dg ;an000;
|
|
pop es ;an000;
|
|
|
|
ret ;an000;return to caller
|
|
|
|
parser_command endp ;an000;end parser_command
|
|
|
|
|
|
;======================= subroutine area =================================
|
|
|
|
|
|
;=========================================================================
|
|
; build_fs: This routine saves the filespec for use by the calling program.
|
|
;=========================================================================
|
|
|
|
build_fs proc near ;an000;save filespec
|
|
|
|
push ax ;an000;save affected regs.
|
|
push di ;an000;
|
|
push si ;an000;
|
|
push ds ;an000;
|
|
push es ;an000;
|
|
|
|
mov di,offset dg:filespec ;an000;point to filespec buffer
|
|
lds si,dword ptr es:parse_fs_off ;an000;get offset
|
|
|
|
build_cont: ;an000;continue routine
|
|
|
|
lodsb ;an000;mov ds:si to al
|
|
cmp al,nul ;an000;is it end of filespec
|
|
; $if nz ;an000;if not
|
|
JZ $$IF7
|
|
stosb ;an000;move byte to filespec
|
|
jmp build_cont ;an000;continue buffer fill
|
|
; $endif ;an000;
|
|
$$IF7:
|
|
stosb ;an000;save nul
|
|
|
|
pop es ;an000;restore regs
|
|
pop ds ;an000;
|
|
pop si ;an000;
|
|
pop di ;an000;
|
|
pop ax ;an000;
|
|
|
|
ret ;an000;return to caller
|
|
|
|
build_fs endp ;an000;end proc
|
|
|
|
;=========================================================================
|
|
; val_sw : determines which switch we have.
|
|
;=========================================================================
|
|
|
|
val_sw proc near ;an000;switch determination
|
|
|
|
; Check for /B
|
|
|
|
cmp es:[parse_sw_syn], offset es:sw_b_switch
|
|
jne ValSwitchBDone
|
|
cmp es:[parse_switch_b], true ; see if already given
|
|
jne ValSwitchBOkay ; jump if not
|
|
mov ax, too_many ; set error level
|
|
jmp parse_end ; and exit parser
|
|
ValSwitchBOkay:
|
|
mov es:[parse_switch_b], true ; set the flag on
|
|
jmp short ValSwitchExit ; and done
|
|
ValSwitchBDone:
|
|
|
|
; Check for /?
|
|
|
|
cmp es:[parse_sw_syn], offset es:sw_?_switch
|
|
jne ValSwitch?Done
|
|
mov es:[parse_switch_?], true ; set the flag on
|
|
jmp short ValSwitchExit ; and done
|
|
ValSwitch?Done:
|
|
|
|
ValSwitchExit:
|
|
|
|
ret ;an000;return to caller
|
|
|
|
val_sw endp ;an000;end proc
|
|
|
|
|
|
code ends ;an000;end segment
|
|
end ;an000;
|
|
|