diff options
Diffstat (limited to 'core/parsecmd.inc')
-rw-r--r-- | core/parsecmd.inc | 120 |
1 files changed, 120 insertions, 0 deletions
diff --git a/core/parsecmd.inc b/core/parsecmd.inc new file mode 100644 index 00000000..8e648699 --- /dev/null +++ b/core/parsecmd.inc @@ -0,0 +1,120 @@ +;; ----------------------------------------------------------------------- +;; +;; Copyright 1994-2008 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, +;; Boston 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 +;; + + section .text + +; ------------------------------------------------------------------------- +; 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 + + ; Do this explicitly so #foo is treated as a comment + cmp al,'#' ; Leading hash mark -> comment + je .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 + jc .eof + 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 + mov al,10 ; Already at EOL +.error: + call cwritestr + jmp short .skipline + +.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 + + section .data +err_badcfg db 'Unknown keyword in configuration file.', CR, LF, 0 +err_noparm db 'Missing parameter in configuration file.', CR, LF, 0 + + section .uibss + alignb 4 +vk_size equ (vk_end + 3) & ~3 +VKernelBuf: resb vk_size ; "Current" vkernel +AppendBuf resb max_cmd_len+1 ; append= +Ontimeout resb max_cmd_len+1 ; ontimeout +Onerror resb max_cmd_len+1 ; onerror +KbdMap resb 256 ; Keyboard map +FKeyName resb MAX_FKEYS*FILENAME_MAX ; File names for F-key help +KernelCNameLen resw 1 ; Length of unmangled kernel name +InitRDCNameLen resw 1 ; Length of unmangled initrd name +%if IS_SYSLINUX +KernelName resb FILENAME_MAX+1 ; Mangled name for kernel +KernelCName resb FILENAME_MAX+2 ; Unmangled kernel name +InitRDCName resb FILENAME_MAX+2 ; Unmangled initrd name +%else +KernelName resb FILENAME_MAX ; Mangled name for kernel +KernelCName resb FILENAME_MAX ; Unmangled kernel name +InitRDCName resb FILENAME_MAX ; Unmangled initrd name +%endif +MNameBuf resb FILENAME_MAX +InitRD resb FILENAME_MAX |