diff options
author | H. Peter Anvin <hpa@zytor.com> | 2009-03-18 21:06:30 -0700 |
---|---|---|
committer | H. Peter Anvin <hpa@zytor.com> | 2009-03-18 21:06:30 -0700 |
commit | 2653670c79b4ac954c1907b627a7a2a97664de7d (patch) | |
tree | 4f981eeb1fbcdaed0294194d836e8fe3b6cf178b | |
parent | ff78e2b62a45f18c0d427153f957d2f06c0f5c1c (diff) | |
download | syslinux-3.74-pre8.tar.gz |
runkernel: further simplify the command-line parsersyslinux-3.74-pre8
Further simplifications to the command-line parser, both from a code
size and a usability perspective.
-rw-r--r-- | core/runkernel.inc | 71 |
1 files changed, 33 insertions, 38 deletions
diff --git a/core/runkernel.inc b/core/runkernel.inc index fe392c0f..b3968dbd 100644 --- a/core/runkernel.inc +++ b/core/runkernel.inc @@ -115,41 +115,37 @@ parse_cmdline: dec di ; ES:DI now points to the beginning of an option - mov bx,options_list - mov cx,options_list_len + mov si,options_list .next_opt: + movzx cx,byte [si] + jcxz .skip_opt push di - mov si,[bx] - add bx,4 -.next_char: - lodsb - and al,al - jz .end_opt - scasb - jne .not_equal - cmp al,'=' - jne .next_char + inc si + repe cmpsb + jne .no_match + + ; This either needs to have been an option with parameter, + ; or be followed by EOL/whitespace + cmp byte [di-1],'=' + je .is_match + cmp byte [di],' ' + ja .no_match .is_match: - pop ax ; Drop pointer to the option - call [bx-2] + pop ax ; Drop option pointer on stack + call [si] .skip_opt: mov al,[es:di] inc di cmp al,' ' ja .skip_opt jmp .skipspace_loaded -.not_equal: +.no_match: pop di - loop .next_opt - jmp .skip_opt -.end_opt: - ; End of a unitary option (no equal sign) - match whitespace - cmp byte [es:di],' ' - ja .not_equal - jmp .is_match + add si,cx ; Skip remaining bytes + inc si ; Skip function pointer + inc si + jmp .next_opt - section .rodata - section .text opt_vga: mov eax,[es:di-1] mov bx,-1 @@ -660,23 +656,22 @@ boot_image_len equ $-boot_image ; ; Command line options we'd like to take a look at ; +%macro cmd_opt 2 +%strlen cmd_opt_len %1 + db cmd_opt_len + db %1 + dw %2 +%endmacro options_list: - dw str_vga, opt_vga - dw str_mem, opt_mem - dw str_quiet, opt_quiet - dw str_initrd, opt_initrd -%if IS_PXELINUX - dw str_keeppxe, opt_keeppxe -%endif -options_list_len equ ($-options_list)/4 - -str_vga db 'vga=' -str_mem db 'mem=' -str_quiet db 'quiet',0 -str_initrd db 'initrd=' + cmd_opt "vga=", opt_vga + cmd_opt "mem=", opt_mem + cmd_opt "quiet", opt_quiet +str_initrd equ $+1 ; Pointer to "initrd=" in memory + cmd_opt "initrd=", opt_initrd %if IS_PXELINUX -str_keeppxe db 'keeppxe',0 + cmd_opt "keeppxe", opt_keeppxe %endif + db 0 section .bss alignb 4 |