blob: 964fbcc3fe8cb0b3389b3a25b78dd7f5a453240c [file] [log] [blame]
;; $Id$
;; -----------------------------------------------------------------------
;;
;; Copyright 1994-2002 H. Peter Anvin - All Rights Reserved
;;
;; This program is free software; you can redistribute it and/or modify
;; it under the terms of the GNU General Public License as published by
;; the Free Software Foundation, Inc., 53 Temple Place Ste 330,
;; Bostom MA 02111-1307, USA; either version 2 of the License, or
;; (at your option) any later version; incorporated herein by reference.
;;
;; -----------------------------------------------------------------------
;;
;; parsecmd.inc
;;
;; Command line parser code
;;
; -------------------------------------------------------------------------
; getcommand: Get a keyword from the current "getc" file and match it
; against a list of keywords (keywd_table). Each entry in
; that table should have the following form:
; <32 bit hash value> <16 bit handler offset>
;
; The handler is called, and upon return this function
; returns with CF = 0. On EOF, this function returns
; with CF = 1.
; -------------------------------------------------------------------------
getcommand:
.find:
call skipspace ; Skip leading whitespace
jz .eof ; End of file
jc .find ; End of line: try again
cmp al,'0' ; Skip comment line
jb .skipline
or al,20h ; Convert to lower case
movzx ebx,al ; Hash for a one-char keyword
.read_loop:
push ebx
call getc
pop ebx
cmp al,' ' ; Whitespace
jbe .done
or al,20h
rol ebx,5
xor bl,al
jmp short .read_loop
.done: call ungetc
call skipspace
jz .eof
jc .noparm
call ungetc ; Return nonwhitespace char to buf
mov si,keywd_table
mov cx,keywd_count
.table_search:
lodsd
cmp ebx,eax
je .found_keywd
lodsd ; Skip entrypoint/argument
loop .table_search
; Otherwise unrecognized keyword
mov si,err_badcfg
jmp short .error
; No parameter
.noparm:
mov si,err_noparm
.error:
call cwritestr
jmp short .find
.found_keywd: lodsw ; Load argument into ax
call [si]
clc
ret
.eof: stc
ret
.skipline: cmp al,10 ; Search for LF
je .find
call getc
jc .eof
jmp short .skipline