home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Source Code 1992 March
/
Source_Code_CD-ROM_Walnut_Creek_March_1992.iso
/
msdos
/
sysutl
/
envrpt.asm
< prev
next >
Wrap
Assembly Source File
|
1985-01-28
|
7KB
|
283 lines
;
; Program to examine the environment and give return codes for BATCH inquiry
;
; Gerald Lotto 01/24/85
;
; Usage:
; ENVRPT <var> [<val>]
; <var> is an environment variable with value
; <val> (optional)
;
; Valid return codes are:
;
; 0 - <var> is found to equal <val>
; 1 - <var> is found to not equal <val>
; 3 - <var> is not found
; 4 - Illegal arguments were given, i.e. ENVRPT (cr)
;
; Revised:
; DATE INIT REASON
;
;
Title ENVRPT
CSEG SEGMENT PARA 'CODE'
NULL EQU 00H
SPACE EQU 20H
CR EQU 0DH
LF EQU 0AH
ENVSIZE EQU 800H ; This is maximum size
; for my (modified) DOS
ORG 2CH
ENVSEG LABEL WORD ; Segment of environment
ORG 80H
DOSCMD LABEL BYTE ; Command line from DOS
ORG 100H
ENVRPT PROC FAR
ASSUME CS:CSEG,DS:NOTHING,ES:NOTHING
JMP START
VALUE DB 80H DUP(0) ; Internal work area for
; storing translation string
START: MOV AX,CS
MOV DS,AX ; Ensure that DS and ES are
MOV ES,AX ; set up
MOV SI,OFFSET DOSCMD + 1 ; Start of argument string
MOV CX,0000
MOV CL,BYTE PTR DOSCMD ; Length of argument string
CALL GETWORD ; Get first argument
CMP BYTE PTR [DI],NULL ; Is it NULL?
JZ ERROR ; Yes, exit with code 4
CALL UPCASE ; Upper case it in place
CALL XLATE ; Get translation string
; from environment in VALUE
CMP BYTE PTR CS:VALUE,NULL ; Is the translation NULL?
JZ NOTFOUND ; Yes, exit with code 3
MOV DI,OFFSET DS:VALUE ; Locate translation string
MOV AX,0200H ; DOS Print character
PRINT: MOV DL,BYTE PTR [DI] ; Get next char to print
INT 21H ; Print it,
INC DI ; and move up one
CMP BYTE PTR [DI],NULL ; Is it the end?
JNZ PRINT ; No, go another round
MOV DL,CR ; Yes, follow by a carriage
INT 21H ; return
MOV DL,LF ; and a line feed
INT 21H
ADD SI,CX ; Position at the end of arg2
MOV BYTE PTR [SI],NULL ; and put a NULL there
INC CX ; Increase to count all chars
STD ; Reverse direction
REPZ CMPS BYTE PTR DS:[SI],ES:[DI] ; and compare the strings
CLD ; Go forward again
JNZ FALSEEXIT ; If the comparison failed,
; exit with code 1
TRUEEXIT:
MOV AX,4C00H ; Otherwise exit with code 0
INT 21H
FALSEEXIT:
MOV AX,4C01H ; This is the exit for a
INT 21H ; non-match
NOTFOUND:
MOV AX,4C03H ; This is the exit for not
INT 21H ; finding the requested
; ENVIRONMENT variable
ERROR:
MOV AX,4C04H ; This is the exit for bad
INT 21H ; arguments
ENVRPT ENDP
; Procedure GETWORD
;
; Call with:
; SI - Pointer in an ASCII string (Possible leading spaces)
; CX - Length to end of string
;
; Returns with:
; DI - Pointer to first word now terminated with a null
; SI, CX - Now point to next word and have remaining string length
;
; Does not look back for data before SI
; AX, BX, CX zapped, all other regs preserved
;
; Thanks to Dan Tappan, this code was modified from OLDER.ASM
;
GETWORD PROC
CLD
PUSH SI
PUSH CX
MOV BX,CX
MOV AL,SPACE
MOV BYTE PTR [BX+SI],AL ; Put a space at the end
MOV DI,SI
CMP CX,+00 ; Check length
JLE GOTWORD ; Return if NULL
REPZ SCASB ; Skip leading spaces
CMP CX,+00 ; See if you ran out of string
JG READWORD ; If not, go to it
MOV DI,SI ; If so, back to the beginning
JMP GOTWORD ; and return
READWORD:
DEC DI ; Back up to the first char
NOT CX ; Count back from -1
PUSH DI ; Save the start
REPNZ SCASB ; Find the next space
DEC DI ; Back up to the end
MOV SI,DI ; Save it,
POP DI ; and restore the pointer
; to the start
GOTWORD:
MOV BYTE PTR [SI],00 ; Terminate word with a null
INC SI ; Advance to next word
POP CX ; Original length
POP BX ; The original location
SUB BX,SI ; - the current location
ADD CX,BX ; + the overall length
RET ; = the remaining length
GETWORD ENDP
; Procedure UPCASE
;
; Call with:
; DI - Pointer in an ASCII string terminated by a space (or less)
;
; Returns with:
; String UPPERCASED in place
;
; AX zapped, all other regs preserved
;
UPCASE PROC
CLD
PUSH SI
MOV SI,DI
NEXTBYTE:
LODSB
AND AL,07FH ; Strip hi bit
CMP AL,SPACE ; Is this the end?
JLE UPCASED ; Yes, we are done.
CMP AL,'a' ; Skip if it is less
JL NEXTBYTE ; then 'a'
CMP AL,'z' ; or if it is greater
JG NEXTBYTE ; then 'z'
AND AL,0DFH ; Else, UPPERCASE it
MOV BYTE PTR [SI-01],AL ; Replace it
JMP NEXTBYTE ; and grab the next one
UPCASED:
POP SI
RET
UPCASE ENDP
; Procedure XLATE
;
; Call with:
; DI - Pointer to an UPPERCASED string, null terminated
;
; Returns with:
; Translation of string in an internal data area, terminated
; with a 00, '$'
;
; AX zapped, all other regs preserved
;
XLATE PROC
CLD
PUSH DS
PUSH SI
PUSH DI
PUSH CX
MOV SI,DI
MOV AX,WORD PTR ENVSEG ; From the PSP, DOS gives
MOV ES,AX ; the segment and offset of
MOV DI,00 ; a copy of the environment
MOV CX,WORD PTR ENVSIZE ; Max size, see params up top
LODS BYTE PTR DS:[SI] ; Get the first char of arg
TESTMATCH:
PUSH AX ; and save it
CMP AL,BYTE PTR ES:[DI] ; Check against ENV string #1
JZ GOTMATCH ; Possible match
FAILED:
MOV AX,0000 ; No match, search ENVIRONMENT
REPNZ SCAS BYTE PTR ES:[DI] ; for next NULL
POP AX ; Restore first char of arg
CMP CX,00 ; Have we run out of space?
JZ TERMINATE ; Yes, stop looking
CMP BYTE PTR ES:[DI],NULL ; Are we at environment end?
JNZ TESTMATCH ; No, test next entry
JMP TERMINATE ; Yes, stop looking
GOTMATCH:
INC DI ; Step to next char in ENV
REPZ CMPS BYTE PTR DS:[SI],ES:[DI] ; Compare strings
DEC SI ; Back up to last character
DEC DI ; in arg and ENV strings
CMP BYTE PTR DS:[SI],NULL ; Are we at the end of arg?
JNZ FAILED ; No, try next ENV string
;
; Insert code to handle wildcards here
;
CMP BYTE PTR ES:[DI],'=' ; End of the ENV string?
JNZ FAILED ; No, try next ENV string
POP AX ; We have a match, trash AX
INC DI
PUSH DI ; Save start of translation
MOV CX,0FFFFH ; Count backwards from -1
MOV AX,0000
REPNZ SCAS BYTE PTR ES:[DI] ; up to the next NULL
NOT CX
DEC CX ; Adjust count to + number
POP SI ; Start of translation string
MOV AX,ES ; Swap seg regs around for
MOV DS,AX ; MOVS with DS = ENVSEG
MOV AX,CS ; and ES = CS
MOV ES,AX
MOV DI,OFFSET CS:VALUE ; Point to the internal data
REPZ MOVS BYTE PTR ES:[DI],DS:[SI] ; area and copy translation
TERMINATE:
MOV BYTE PTR ES:[DI],NULL ; Terminate with a NULL
POP CX
POP DI
POP SI
POP DS
RET
XLATE ENDP
CSEG ENDS
END ENVRPT