summaryrefslogtreecommitdiff
path: root/parsecmd.inc
blob: 34314976a2801132dd859a6ad1ab1bb6d44b8648 (plain)
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