1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
|
;; -----------------------------------------------------------------------
;;
;; Copyright 1994-2007 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 syslinux.cfg.', CR, LF, 0
err_noparm db 'Missing parameter in syslinux.cfg.', 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
|