Contents of /trunk/mkinitrd-magellan/isolinux/parsecmd.inc
Parent Directory | Revision Log
Revision 1133 -
(show annotations)
(download)
Thu Aug 19 09:50:43 2010 UTC (14 years, 1 month ago) by niro
File size: 3738 byte(s)
Thu Aug 19 09:50:43 2010 UTC (14 years, 1 month ago) by niro
File size: 3738 byte(s)
-updated to isolinux-3.86
1 | ;; ----------------------------------------------------------------------- |
2 | ;; |
3 | ;; Copyright 1994-2009 H. Peter Anvin - All Rights Reserved |
4 | ;; Copyright 2009 Intel Corporation; author: H. Peter Anvin |
5 | ;; |
6 | ;; This program is free software; you can redistribute it and/or modify |
7 | ;; it under the terms of the GNU General Public License as published by |
8 | ;; the Free Software Foundation, Inc., 53 Temple Place Ste 330, |
9 | ;; Boston MA 02111-1307, USA; either version 2 of the License, or |
10 | ;; (at your option) any later version; incorporated herein by reference. |
11 | ;; |
12 | ;; ----------------------------------------------------------------------- |
13 | |
14 | ;; |
15 | ;; parsecmd.inc |
16 | ;; |
17 | ;; Command line parser code |
18 | ;; |
19 | |
20 | section .text |
21 | |
22 | ; ------------------------------------------------------------------------- |
23 | ; getcommand: Get a keyword from the current "getc" file and match it |
24 | ; against a list of keywords (keywd_table). Each entry in |
25 | ; that table should have the following form: |
26 | ; <32 bit hash value> <16 bit handler offset> |
27 | ; |
28 | ; The handler is called, and upon return this function |
29 | ; returns with CF = 0. On EOF, this function returns |
30 | ; with CF = 1. |
31 | ; ------------------------------------------------------------------------- |
32 | |
33 | getcommand.skipline: |
34 | call skipline |
35 | |
36 | getcommand: |
37 | .find: |
38 | call skipspace ; Skip leading whitespace |
39 | jz .eof ; End of file |
40 | jc .find ; End of line: try again |
41 | |
42 | ; Do this explicitly so #foo is treated as a comment |
43 | cmp al,'#' ; Leading hash mark -> comment |
44 | je .skipline |
45 | |
46 | ; Abuse the trackbuf by putting the keyword there for |
47 | ; possible error messaging... |
48 | mov di,trackbuf |
49 | stosb |
50 | or al,20h ; Convert to lower case |
51 | movzx ebx,al ; Hash for a one-char keyword |
52 | .read_loop: |
53 | call getc |
54 | jc .eof |
55 | cmp al,' ' ; Whitespace |
56 | jbe .done |
57 | stosb |
58 | or al,20h |
59 | rol ebx,5 |
60 | xor bl,al |
61 | jmp short .read_loop |
62 | .done: call ungetc |
63 | xor ax,ax |
64 | stosb ; Null-terminate the trackbuf |
65 | call skipspace |
66 | jz .eof |
67 | jc .noparm |
68 | call ungetc ; Return nonwhitespace char to buf |
69 | mov si,keywd_table |
70 | mov cx,keywd_count |
71 | .table_search: |
72 | lodsd |
73 | cmp ebx,eax |
74 | je .found_keywd |
75 | lodsd ; Skip entrypoint/argument |
76 | loop .table_search |
77 | |
78 | ; Otherwise unrecognized keyword |
79 | mov si,err_badcfg |
80 | call writestr |
81 | mov si,trackbuf |
82 | call writestr |
83 | call crlf |
84 | jmp .skipline |
85 | |
86 | ; No parameter |
87 | .noparm: |
88 | mov si,err_noparm |
89 | call writestr |
90 | mov si,trackbuf |
91 | call writestr |
92 | call crlf |
93 | jmp .find |
94 | |
95 | .found_keywd: lodsw ; Load argument into ax |
96 | call [si] |
97 | clc |
98 | ret |
99 | |
100 | .eof: stc |
101 | ret |
102 | |
103 | skipline: cmp al,10 ; Search for LF |
104 | je .end |
105 | call getc |
106 | jnc skipline |
107 | .end: ret |
108 | |
109 | section .data |
110 | err_badcfg db 'Unknown keyword in configuration file: ',0 |
111 | err_noparm db 'Missing parameter in configuration file. Keyword: ',0 |
112 | |
113 | section .uibss |
114 | alignb 4 |
115 | vk_size equ (vk_end + 3) & ~3 |
116 | VKernelBuf: resb vk_size ; "Current" vkernel |
117 | AppendBuf resb max_cmd_len+1 ; append= |
118 | Ontimeout resb max_cmd_len+1 ; ontimeout |
119 | Onerror resb max_cmd_len+1 ; onerror |
120 | ; This could be in .uibss but that makes PXELINUX overflow |
121 | section .bss |
122 | KbdMap resb 256 ; Keyboard map |
123 | FKeyName resb MAX_FKEYS*FILENAME_MAX ; File names for F-key help |
124 | KernelCNameLen resw 1 ; Length of unmangled kernel name |
125 | InitRDCNameLen resw 1 ; Length of unmangled initrd name |
126 | %if IS_SYSLINUX |
127 | KernelName resb FILENAME_MAX+1 ; Mangled name for kernel |
128 | KernelCName resb FILENAME_MAX+2 ; Unmangled kernel name |
129 | InitRDCName resb FILENAME_MAX+2 ; Unmangled initrd name |
130 | %else |
131 | KernelName resb FILENAME_MAX ; Mangled name for kernel |
132 | KernelCName resb FILENAME_MAX ; Unmangled kernel name |
133 | InitRDCName resb FILENAME_MAX ; Unmangled initrd name |
134 | %endif |
135 | MNameBuf resb FILENAME_MAX |
136 | InitRD resb FILENAME_MAX |