merge mainline into newreloc
This commit is contained in:
commit
298ffd54b0
87 changed files with 13636 additions and 672 deletions
330
ChangeLog
330
ChangeLog
|
@ -1,3 +1,333 @@
|
||||||
|
2010-04-11 Vladimir Serbinenko <phcoder@gmail.com>
|
||||||
|
|
||||||
|
Fix cygwin compilation.
|
||||||
|
|
||||||
|
* configure.ac: Define NEED_REGISTER_FRAME_INFO.
|
||||||
|
* include/grub/misc.h (__register_frame_info)
|
||||||
|
[NEED_REGISTER_FRAME_INFO && !UTIL]: New export.
|
||||||
|
(__deregister_frame_info) [NEED_REGISTER_FRAME_INFO && !UTIL]: Likewise.
|
||||||
|
* kern/misc.c (__register_frame_info)
|
||||||
|
[NEED_REGISTER_FRAME_INFO && !UTIL]: New empty function.
|
||||||
|
(__deregister_frame_info) [NEED_REGISTER_FRAME_INFO && !UTIL]: Likewise.
|
||||||
|
|
||||||
|
2010-04-11 Vladimir Serbinenko <phcoder@gmail.com>
|
||||||
|
|
||||||
|
* configure.ac: Respect grub_cv_asm_uscore when defining dummy symbols.
|
||||||
|
|
||||||
|
2010-04-11 Vladimir Serbinenko <phcoder@gmail.com>
|
||||||
|
|
||||||
|
Unify libgcc processing.
|
||||||
|
|
||||||
|
* Makefile.in (kernel_img_LDFLAGS): New variable.
|
||||||
|
* conf/common.rmk (kernel_img_HEADERS): Add libgcc.h.
|
||||||
|
* conf/i386-coreboot.rmk (kernel_img_LDFLAGS): Append instead of
|
||||||
|
overwriting.
|
||||||
|
* conf/i386-ieee1275.rmk (kernel_img_LDFLAGS): Likewise.
|
||||||
|
* conf/i386-pc.rmk (kernel_img_LDFLAGS): Likewise.
|
||||||
|
* conf/i386-qemu.rmk (kernel_img_LDFLAGS): Likewise.
|
||||||
|
* conf/x86-efi.rmk (kernel_img_LDFLAGS): Likewise.
|
||||||
|
* conf/mips-qemu-mips.rmk (kernel_img_LDFLAGS): Append instead of
|
||||||
|
overwriting. Remove -lgcc and -static-libgcc
|
||||||
|
* conf/mips-yeeloong.rmk (kernel_img_LDFLAGS): Likewise.
|
||||||
|
* conf/mips.rmk (kernel_img_HEADERS): Remove cpu/libgcc.h
|
||||||
|
* conf/powerpc-ieee1275.rmk (kernel_img_HEADERS): Remove cpu/libgcc.h
|
||||||
|
(kernel_img_LDFLAGS): Append instead of overwriting.
|
||||||
|
Remove -lgcc and -static-libgcc
|
||||||
|
* conf/sparc64-ieee1275.rmk: Likewise.
|
||||||
|
* include/grub/powerpc/libgcc.h: Move to ...
|
||||||
|
* include/grub/libgcc.h: .. this.
|
||||||
|
* include/grub/libgcc.h: Don't export most of the function on x86.
|
||||||
|
(__bswapsi2): New export.
|
||||||
|
(__bswapdi2): Likewise.
|
||||||
|
* include/grub/mips/libgcc.h: Removed.
|
||||||
|
* include/grub/sparc64/libgcc.h: Likewise.
|
||||||
|
|
||||||
|
2010-04-10 Vladimir Serbinenko <phcoder@gmail.com>
|
||||||
|
|
||||||
|
* util/hostdisk.c (grub_util_biosdisk_get_grub_dev): Remove
|
||||||
|
disk_info_msg (conflicts with gettexting into languages with cases).
|
||||||
|
|
||||||
|
2010-04-10 Grégoire Sutre <gregoire.sutre@gmail.com>
|
||||||
|
|
||||||
|
Add grub-probe support for NetBSD.
|
||||||
|
|
||||||
|
* util/getroot.c (find_root_device): Convert block device to
|
||||||
|
character device on NetBSD.
|
||||||
|
* util/probe.c (probe): Require character device on NetBSD.
|
||||||
|
* util/hostdisk.c: NetBSD specific headers.
|
||||||
|
(configure_device_driver): new function to tune device driver
|
||||||
|
parameters (currently only for NetBSD floppy driver).
|
||||||
|
(grub_util_biosdisk_open): NetBSD specific code (get disk size
|
||||||
|
via disklabel ioctl).
|
||||||
|
(open_device): call configure_device_driver on NetBSD.
|
||||||
|
(convert_system_partition_to_system_disk): NetBSD specific code.
|
||||||
|
(device_is_wholedisk): Likewise.
|
||||||
|
(grub_util_biosdisk_get_grub_dev): Likewise.
|
||||||
|
(make_device_name): Fixed a typo in bsd_part_str.
|
||||||
|
* configure.ac: check for opendisk() and getrawpartition() on
|
||||||
|
NetBSD and set LIBUTIL.
|
||||||
|
* Makefile.in: add LIBUTIL to LIBS.
|
||||||
|
|
||||||
|
2010-04-10 BVK Chaitanya <bvk.groups@gmail.com>
|
||||||
|
|
||||||
|
Documentation fix.
|
||||||
|
|
||||||
|
* util/grub-script-check.c: Better help message.
|
||||||
|
|
||||||
|
2010-04-10 BVK Chaitanya <bvk.groups@gmail.com>
|
||||||
|
|
||||||
|
Fix FreeBSD build.
|
||||||
|
|
||||||
|
* configure.ac: Flex version check.
|
||||||
|
* conf/common.rmk: Add -Wno-error to sh.mod.
|
||||||
|
* script/yylex.l: Remove all #pragma.
|
||||||
|
|
||||||
|
2010-04-10 Vladimir Serbinenko <phcoder@gmail.com>
|
||||||
|
|
||||||
|
* include/grub/util/misc.h (canonicalise_file_name): Add missing
|
||||||
|
prototype.
|
||||||
|
Reported by: Seth Goldberg.
|
||||||
|
|
||||||
|
2010-04-10 Vladimir Serbinenko <phcoder@gmail.com>
|
||||||
|
|
||||||
|
* loader/multiboot.c (GRUB_MOD_INIT) [GRUB_USE_MULTIBOOT2]:
|
||||||
|
Rename "module" to "module2".
|
||||||
|
Reported by: Seth Goldberg.
|
||||||
|
|
||||||
|
2010-04-10 Vladimir Serbinenko <phcoder@gmail.com>
|
||||||
|
|
||||||
|
* include/grub/efi/memory.h (grub_machine_mmap_iterate): Remove
|
||||||
|
EXPORT_FUNC.
|
||||||
|
Reported by: Seth Goldberg.
|
||||||
|
|
||||||
|
2010-04-10 Vladimir Serbinenko <phcoder@gmail.com>
|
||||||
|
|
||||||
|
* lib/posix_wrap/locale.h: Add missing file.
|
||||||
|
Reported by: Seth Goldberg.
|
||||||
|
|
||||||
|
2010-04-10 Vladimir Serbinenko <phcoder@gmail.com>
|
||||||
|
|
||||||
|
grub-emu module load support.
|
||||||
|
|
||||||
|
* Makefile.in (TARGET_NO_MODULES): New variable. All users of
|
||||||
|
NO_DYNAMIC_MODULES switched to this.
|
||||||
|
(TARGET_CFLAGS): Add -DGRUB_TARGET_NO_MODULES=1 if applicable.
|
||||||
|
(CFLAGS): Likewise.
|
||||||
|
* conf/any-emu.rmk: Generate symlist.
|
||||||
|
(kernel_img_HEADERS): Add util/datetime.h.
|
||||||
|
(kernel_img_HEADERS) [sdl]: Add sdl.h.
|
||||||
|
(kernel_img_HEADERS) [libusb]: Add libusb.h.
|
||||||
|
(kernel_img_SOURCES) [TARGET_NO_MODULES = no && !x86]: Add
|
||||||
|
kern/$(target_cpu)/cache.S.
|
||||||
|
* configure.ac (grub-emu-modules): New option.
|
||||||
|
* genmk.rb: Handle multiple source lists.
|
||||||
|
* include/grub/sdl.h: New file.
|
||||||
|
* include/grub/libusb.h: Likewise.
|
||||||
|
* util/grub-emu.c (main): Hanle (host) root.
|
||||||
|
* util/hostdisk.c (grub_util_biosdisk_get_grub_dev): Error with
|
||||||
|
GRUB_ERR_UNKNOWN_DEVICE.
|
||||||
|
* util/misc.c: Move mm functions to ...
|
||||||
|
* util/mm.c: ... here. All users updated.
|
||||||
|
|
||||||
|
2010-04-09 Vladimir Serbinenko <phcoder@gmail.com>
|
||||||
|
|
||||||
|
* Makefile.in (RMKFILES): Search in srcdir and not current directory.
|
||||||
|
(MAINTAINER_CLEANFILES): Don't add $(srcdir) to MKFILES. Add few
|
||||||
|
missing files.
|
||||||
|
(maintainer-clean): Remove libgcrypt-grub.
|
||||||
|
|
||||||
|
2010-04-09 Vladimir Serbinenko <phcoder@gmail.com>
|
||||||
|
|
||||||
|
* term/efi/console.c (grub_console_checkkey): Macroify key contants.
|
||||||
|
|
||||||
|
2010-04-09 EFI Coder <eficoder@hotmail.com>
|
||||||
|
|
||||||
|
* normal/menu_text.c (print_message): Clean up the message and show
|
||||||
|
the Fn information when on EFI
|
||||||
|
* term/efi/console.c (grub_console_checkkey): Add F4 support.
|
||||||
|
|
||||||
|
2010-04-09 Vladimir Serbinenko <phcoder@gmail.com>
|
||||||
|
|
||||||
|
* normal/autofs.c (read_fs_list): New parameter 'prefix'.
|
||||||
|
All users updated.
|
||||||
|
* normal/crypto.c (read_crypto_list): Likewise.
|
||||||
|
* normal/dyncmd.c (read_command_list): Likewise.
|
||||||
|
* normal/term.c (read_terminal_list): Likewise.
|
||||||
|
* normal/main.c (read_lists): Use explicit prefix.
|
||||||
|
(read_lists_hook): Use read_lists.
|
||||||
|
(grub_normal_execute): Likewise.
|
||||||
|
|
||||||
|
2010-04-09 Vladimir Serbinenko <phcoder@gmail.com>
|
||||||
|
|
||||||
|
* util/grub-mkrescue.in: Fix incorrect path in coreboot part.
|
||||||
|
Reported by: Thomas Schmitt.
|
||||||
|
Add -no-emul-boot to grub-mkisofs parameters.
|
||||||
|
|
||||||
|
2010-04-09 Vladimir Serbinenko <phcoder@gmail.com>
|
||||||
|
|
||||||
|
* font/font.c: Indented.
|
||||||
|
|
||||||
|
2010-04-09 BVK Chaitanya <bvk.groups@gmail.com>
|
||||||
|
|
||||||
|
Elif support to GRUB script (by Deepak Vankadaru).
|
||||||
|
|
||||||
|
* tests/grub_script_if.in: New testcase.
|
||||||
|
* conf/tests.rmk: Rule for new testcase.
|
||||||
|
* script/parser.y: Grammar rules for elif.
|
||||||
|
|
||||||
|
2010-04-09 BVK Chaitanya <bvk.groups@gmail.com>
|
||||||
|
|
||||||
|
While and until loops support to GRUB script.
|
||||||
|
|
||||||
|
* include/grub/script_sh.h (grub_script_cmdwhile): New struct.
|
||||||
|
(grub_script_create_cmdwhile): New function prototype.
|
||||||
|
(grub_script_execute_cmdwhile): New function prototype.
|
||||||
|
* script/execute.c (grub_script_execute_cmdwhile): New function.
|
||||||
|
* script/parser.y (command): New commands.
|
||||||
|
(whilecmd): New grammar rule.
|
||||||
|
(untilcmd): New grammar rule.
|
||||||
|
* script/script.c (grub_script_create_cmdwhile): New function.
|
||||||
|
* util/grub-script-check.c (grub_script_execute_cmdwhile): New
|
||||||
|
function.
|
||||||
|
|
||||||
|
* tests/grub_script_while1.in: New testcase.
|
||||||
|
* conf/tests.rmk: Rule for new testcase.
|
||||||
|
|
||||||
|
2010-04-09 Vladimir Serbinenko <phcoder@gmail.com>
|
||||||
|
|
||||||
|
* util/grub.d/00_header.in: Add few missing quotes. Recognise *.jpeg
|
||||||
|
as *.jpg.
|
||||||
|
|
||||||
|
2010-04-09 Mario Vazquez <mariovazq@gmail.com>
|
||||||
|
|
||||||
|
GRUB_BACKGROUND support.
|
||||||
|
|
||||||
|
* util/grub-mkconfig.in: Export GRUB_BACKGROUND.
|
||||||
|
* util/grub.d/00_header.in: Parse GRUB_BACKGROUND.
|
||||||
|
|
||||||
|
2010-04-09 Vladimir Serbinenko <phcoder@gmail.com>
|
||||||
|
|
||||||
|
Load fonts and modules for gfxmenu in grub-mkconfig.
|
||||||
|
Idea by: Mario Vazquez
|
||||||
|
|
||||||
|
* util/grub.d/00_header.in: Load pf2 and image modules.
|
||||||
|
|
||||||
|
2010-04-09 Vladimir Serbinenko <phcoder@gmail.com>
|
||||||
|
|
||||||
|
grub-mkconfig multiple terminal support.
|
||||||
|
|
||||||
|
* util/grub-mkconfig.in: Handle multiple terminals correctly.
|
||||||
|
* util/grub.d/00_header.in: Likewise.
|
||||||
|
|
||||||
|
2010-04-09 Vladimir Serbinenko <phcoder@gmail.com>
|
||||||
|
|
||||||
|
* Makefile.in: Specify files explicitly instead of using $< and $@ since
|
||||||
|
we use cd $(srcdir).
|
||||||
|
|
||||||
|
2010-04-08 Colin Watson <cjwatson@ubuntu.com>
|
||||||
|
|
||||||
|
* util/grub.d/10_linux.in: Only use the first word of
|
||||||
|
GRUB_DISTRIBUTOR for --class, to avoid problems if somebody puts
|
||||||
|
spaces in GRUB_DISTRIBUTOR.
|
||||||
|
* util/grub.d/10_kfreebsd.in: Likewise.
|
||||||
|
* util/grub.d/10_hurd.in: Likewise.
|
||||||
|
|
||||||
|
2010-04-06 BVK Chaitanya <bvk.groups@gmail.com>
|
||||||
|
|
||||||
|
Fix unit testing framework for Qemu 0.12.
|
||||||
|
|
||||||
|
* tests/util/grub-shell.in: Remove -serial stdio option.
|
||||||
|
|
||||||
|
2010-04-06 Vladimir Serbinenko <phcoder@gmail.com>
|
||||||
|
|
||||||
|
POSIX header file wrappers.
|
||||||
|
|
||||||
|
* lib/posix_wrap/assert.h: New file. Wrapper for its POSIX
|
||||||
|
equivalents.
|
||||||
|
* lib/posix_wrap/ctype.h: Likewise.
|
||||||
|
* lib/posix_wrap/errno.h: Likewise.
|
||||||
|
* lib/posix_wrap/langinfo.h: Likewise.
|
||||||
|
* lib/posix_wrap/limits.h: Likewise.
|
||||||
|
* lib/posix_wrap/localcharset.h: Likewise.
|
||||||
|
* lib/posix_wrap/stdint.h: Likewise.
|
||||||
|
* lib/posix_wrap/stdio.h: Likewise.
|
||||||
|
* lib/posix_wrap/stdlib.h: Likewise.
|
||||||
|
* lib/posix_wrap/string.h: Likewise.
|
||||||
|
* lib/posix_wrap/sys/types.h: Likewise.
|
||||||
|
* lib/posix_wrap/unistd.h: Likewise.
|
||||||
|
* lib/posix_wrap/wchar.h: Likewise.
|
||||||
|
* lib/posix_wrap/wctype.h: Likewise.
|
||||||
|
* conf/common.rmk (grub_script.yy.c): Remove #include elimination.
|
||||||
|
(grub_script.yy.h): Likewise.
|
||||||
|
* script/yylex.l: Remove POSIX emulation #defines.
|
||||||
|
* Makefile.in (POSIX_CFLAGS): New variable.
|
||||||
|
(GNULIB_UTIL_CFLAGS): Likewise.
|
||||||
|
|
||||||
|
Regexp support.
|
||||||
|
|
||||||
|
* conf/common.rmk (pkglib_MODULES): Add regexp.mod.
|
||||||
|
(regexp_mod_SOURCES): New variable.
|
||||||
|
(regexp_mod_CFLAGS): Likewise.
|
||||||
|
(regexp_mod_LDFLAGS): Likewise.
|
||||||
|
* commands/regexp.c: New file.
|
||||||
|
* gnulib/regcomp.c: New file. Imported from gnulib.
|
||||||
|
* gnulib/regex.c: Likewise.
|
||||||
|
* gnulib/regex_internal.c: Likewise.
|
||||||
|
* gnulib/regex_internal.h: Likewise.
|
||||||
|
* gnulib/regexec.c: Likewise.
|
||||||
|
* gnulib/regex.h: Likewise.
|
||||||
|
|
||||||
|
2010-04-05 Vladimir Serbinenko <phcoder@gmail.com>
|
||||||
|
|
||||||
|
* loader/i386/multiboot_mbi.c (grub_multiboot_load): Correctly report
|
||||||
|
unsupported video mode types.
|
||||||
|
|
||||||
|
2010-04-05 Vladimir Serbinenko <phcoder@gmail.com>
|
||||||
|
|
||||||
|
* kern/i386/pc/startup.S (grub_getrtsecs): Removed (dead code).
|
||||||
|
|
||||||
|
2010-04-05 Vladimir Serbinenko <phcoder@gmail.com>
|
||||||
|
|
||||||
|
* include/grub/i386/pc/init.h (grub_get_mmap_entry): Don't export.
|
||||||
|
* conf/i386-pc.rmk (kernel_img_HEADERS): Remove machine/init.h.
|
||||||
|
|
||||||
|
2010-04-04 Vladimir Serbinenko <phcoder@gmail.com>
|
||||||
|
|
||||||
|
Remove unused grub_vga_get_font.
|
||||||
|
|
||||||
|
* kern/i386/pc/startup.S (grub_vga_get_font): Removed.
|
||||||
|
* include/grub/i386/pc/vga.h (grub_vga_get_font): Likewise.
|
||||||
|
|
||||||
|
2010-04-03 Grégoire Sutre <gregoire.sutre@gmail.com>
|
||||||
|
|
||||||
|
* kern/misc.c: Disable the __enable_execute_stack hack for utilities.
|
||||||
|
* include/grub/misc.h: Likewise.
|
||||||
|
|
||||||
|
2010-04-03 Grégoire Sutre <gregoire.sutre@gmail.com>
|
||||||
|
|
||||||
|
* util/grub-install.in: Add `|| exit 1' to all grub-probe calls
|
||||||
|
for which failure is fatal.
|
||||||
|
|
||||||
|
2010-04-03 Grégoire Sutre <gregoire.sutre@gmail.com>
|
||||||
|
|
||||||
|
* util/grub-install.in: Use mkdir -p to create grub directory.
|
||||||
|
* util/i386/efi/grub-install.in: Likewise.
|
||||||
|
* util/ieee1275/grub-install.in: Likewise.
|
||||||
|
|
||||||
|
2010-04-03 Grégoire Sutre <gregoire.sutre@gmail.com>
|
||||||
|
|
||||||
|
* Makefile.in (LEX): new variable.
|
||||||
|
|
||||||
|
2010-04-03 Grégoire Sutre <gregoire.sutre@gmail.com>
|
||||||
|
|
||||||
|
* util/i386/efi/grub-dumpdevtree: replaced the non-portable `==' by
|
||||||
|
`=' and added double quotes on operands of this equality test.
|
||||||
|
|
||||||
|
2010-04-03 Vladimir Serbinenko <phcoder@gmail.com>
|
||||||
|
|
||||||
|
* Makefile.in (uninstall): Remove a leftover debug echo.
|
||||||
|
Reported by: Grégoire Sutre
|
||||||
|
|
||||||
2010-04-03 Vladimir Serbinenko <phcoder@gmail.com>
|
2010-04-03 Vladimir Serbinenko <phcoder@gmail.com>
|
||||||
|
|
||||||
MIPS multiboot2 support.
|
MIPS multiboot2 support.
|
||||||
|
|
32
Makefile.in
32
Makefile.in
|
@ -43,6 +43,10 @@ pkglibdir = $(libdir)/`echo @PACKAGE_TARNAME@/$(target_cpu)-$(platform) | sed '
|
||||||
|
|
||||||
# Internationalization library.
|
# Internationalization library.
|
||||||
LIBINTL = @LIBINTL@
|
LIBINTL = @LIBINTL@
|
||||||
|
TARGET_NO_MODULES = @TARGET_NO_MODULES@
|
||||||
|
|
||||||
|
# Util library.
|
||||||
|
LIBUTIL = @LIBUTIL@
|
||||||
|
|
||||||
XGETTEXT = @XGETTEXT@
|
XGETTEXT = @XGETTEXT@
|
||||||
MSGMERGE = @MSGMERGE@
|
MSGMERGE = @MSGMERGE@
|
||||||
|
@ -75,11 +79,13 @@ MKDIR_P = @MKDIR_P@
|
||||||
|
|
||||||
mkinstalldirs = $(srcdir)/mkinstalldirs
|
mkinstalldirs = $(srcdir)/mkinstalldirs
|
||||||
|
|
||||||
LIBS = @LIBS@ $(LIBINTL)
|
LIBS = @LIBS@ $(LIBINTL) $(LIBUTIL)
|
||||||
|
|
||||||
CC = @CC@
|
CC = @CC@
|
||||||
CFLAGS = @CFLAGS@
|
CFLAGS = @CFLAGS@
|
||||||
GNULIB_CFLAGS = -Wno-undef -D_GL_UNUSED="__attribute__ ((unused))"
|
POSIX_CFLAGS = -I$(srcdir)/lib/posix_wrap
|
||||||
|
GNULIB_UTIL_CFLAGS = -Wno-undef -Wno-sign-compare -Wno-unused -D_GL_UNUSED="__attribute__ ((unused))" -I$(srcdir)/gnulib
|
||||||
|
GNULIB_CFLAGS = $(GNULIB_UTIL_CFLAGS) $(POSIX_CFLAGS)
|
||||||
ASFLAGS = @ASFLAGS@
|
ASFLAGS = @ASFLAGS@
|
||||||
LDFLAGS = @LDFLAGS@ $(LIBS)
|
LDFLAGS = @LDFLAGS@ $(LIBS)
|
||||||
CPPFLAGS = @CPPFLAGS@ -I$(builddir) -I$(builddir)/include -I$(srcdir)/gnulib -I$(srcdir)/include -Wall -W \
|
CPPFLAGS = @CPPFLAGS@ -I$(builddir) -I$(builddir)/include -I$(srcdir)/gnulib -I$(srcdir)/include -Wall -W \
|
||||||
|
@ -97,6 +103,7 @@ TARGET_IMG_LDSCRIPT = @TARGET_IMG_LDSCRIPT@
|
||||||
TARGET_IMG_LDFLAGS = -nostdlib @TARGET_IMG_LDFLAGS@
|
TARGET_IMG_LDFLAGS = -nostdlib @TARGET_IMG_LDFLAGS@
|
||||||
TARGET_IMG_CFLAGS = @TARGET_IMG_CFLAGS@
|
TARGET_IMG_CFLAGS = @TARGET_IMG_CFLAGS@
|
||||||
TARGET_OBJ2ELF = @TARGET_OBJ2ELF@
|
TARGET_OBJ2ELF = @TARGET_OBJ2ELF@
|
||||||
|
kernel_img_LDFLAGS = -static-libgcc -lgcc
|
||||||
EXEEXT = @EXEEXT@
|
EXEEXT = @EXEEXT@
|
||||||
OBJCOPY = @OBJCOPY@
|
OBJCOPY = @OBJCOPY@
|
||||||
STRIP = @STRIP@
|
STRIP = @STRIP@
|
||||||
|
@ -117,6 +124,7 @@ LIBCURSES = @LIBCURSES@
|
||||||
LIBUSB = @LIBUSB@
|
LIBUSB = @LIBUSB@
|
||||||
LIBSDL = @LIBSDL@
|
LIBSDL = @LIBSDL@
|
||||||
LIBPCIACCESS = @LIBPCIACCESS@
|
LIBPCIACCESS = @LIBPCIACCESS@
|
||||||
|
LEX = @LEX@
|
||||||
YACC = @YACC@
|
YACC = @YACC@
|
||||||
FONT_SOURCE = @FONT_SOURCE@
|
FONT_SOURCE = @FONT_SOURCE@
|
||||||
|
|
||||||
|
@ -133,7 +141,7 @@ enable_efiemu = @enable_efiemu@
|
||||||
|
|
||||||
### General variables.
|
### General variables.
|
||||||
|
|
||||||
RMKFILES = $(wildcard conf/*.rmk)
|
RMKFILES = $(wildcard $(srcdir)/conf/*.rmk)
|
||||||
|
|
||||||
MKFILES = $(patsubst %.rmk,%.mk,$(RMKFILES))
|
MKFILES = $(patsubst %.rmk,%.mk,$(RMKFILES))
|
||||||
|
|
||||||
|
@ -152,7 +160,9 @@ DISTCLEANFILES = config.status config.cache config.log config.h \
|
||||||
gensymlist.sh genkernsyms.sh build_env.mk \
|
gensymlist.sh genkernsyms.sh build_env.mk \
|
||||||
docs/grub.info docs/version.texi docs/stamp-vti
|
docs/grub.info docs/version.texi docs/stamp-vti
|
||||||
|
|
||||||
MAINTAINER_CLEANFILES = $(srcdir)/configure $(addprefix $(srcdir)/,$(MKFILES)) \
|
MAINTAINER_CLEANFILES = $(srcdir)/configure $(srcdir)/aclocal.m4 \
|
||||||
|
$(MKFILES) $(srcdir)/config.guess \
|
||||||
|
$(srcdir)/config.sub $(srcdir)/install-sh $(srcdir)/missing \
|
||||||
$(srcdir)/DISTLIST $(srcdir)/config.h.in $(srcdir)/stamp-h.in $(INFOS)
|
$(srcdir)/DISTLIST $(srcdir)/config.h.in $(srcdir)/stamp-h.in $(INFOS)
|
||||||
|
|
||||||
# The default target.
|
# The default target.
|
||||||
|
@ -176,10 +186,15 @@ include $(srcdir)/conf/tests.mk
|
||||||
-include $(wildcard $(GRUB_CONTRIB)/*/conf/common.mk)
|
-include $(wildcard $(GRUB_CONTRIB)/*/conf/common.mk)
|
||||||
endif
|
endif
|
||||||
|
|
||||||
|
ifeq ($(TARGET_NO_MODULES), yes)
|
||||||
|
TARGET_CFLAGS += -DGRUB_TARGET_NO_MODULES=1
|
||||||
|
CFLAGS += -DGRUB_TARGET_NO_MODULES=1
|
||||||
|
endif
|
||||||
|
|
||||||
### General targets.
|
### General targets.
|
||||||
|
|
||||||
CLEANFILES += $(pkglib_DATA) $(pkgdata_DATA) po/*.mo
|
CLEANFILES += $(pkglib_DATA) $(pkgdata_DATA) po/*.mo
|
||||||
ifneq ($(platform), emu)
|
ifneq ($(TARGET_NO_MODULES), yes)
|
||||||
pkglib_DATA += moddep.lst command.lst fs.lst partmap.lst parttool.lst handler.lst video.lst crypto.lst terminal.lst
|
pkglib_DATA += moddep.lst command.lst fs.lst partmap.lst parttool.lst handler.lst video.lst crypto.lst terminal.lst
|
||||||
endif
|
endif
|
||||||
moddep.lst: $(DEFSYMFILES) $(UNDSYMFILES) genmoddep.awk
|
moddep.lst: $(DEFSYMFILES) $(UNDSYMFILES) genmoddep.awk
|
||||||
|
@ -396,7 +411,6 @@ uninstall:
|
||||||
@list='$(lib_SCRIPTS)'; \
|
@list='$(lib_SCRIPTS)'; \
|
||||||
for file in $$list; do \
|
for file in $$list; do \
|
||||||
dest="`echo $$file | sed 's,.*/,,'`"; \
|
dest="`echo $$file | sed 's,.*/,,'`"; \
|
||||||
echo rm -f $(DESTDIR)$(libdir)/$$dest; \
|
|
||||||
rm -f $(DESTDIR)$(libdir)/grub/$$dest; \
|
rm -f $(DESTDIR)$(libdir)/grub/$$dest; \
|
||||||
done
|
done
|
||||||
@list='$(info_INFOS)'; \
|
@list='$(info_INFOS)'; \
|
||||||
|
@ -425,6 +439,8 @@ distclean: mostlyclean
|
||||||
|
|
||||||
maintainer-clean: distclean
|
maintainer-clean: distclean
|
||||||
-test -z "$(MAINTAINER_CLEANFILES)" || rm -f $(MAINTAINER_CLEANFILES)
|
-test -z "$(MAINTAINER_CLEANFILES)" || rm -f $(MAINTAINER_CLEANFILES)
|
||||||
|
-rmdir $(srcdir)/lib/libgcrypt-grub/cipher
|
||||||
|
-rmdir $(srcdir)/lib/libgcrypt-grub
|
||||||
|
|
||||||
info:
|
info:
|
||||||
|
|
||||||
|
@ -528,8 +544,8 @@ genkernsyms.sh: genkernsyms.sh.in config.status
|
||||||
$(SHELL) ./config.status
|
$(SHELL) ./config.status
|
||||||
|
|
||||||
$(srcdir)/po/$(PACKAGE).pot: po/POTFILES po/POTFILES-shell
|
$(srcdir)/po/$(PACKAGE).pot: po/POTFILES po/POTFILES-shell
|
||||||
cd $(srcdir) && $(XGETTEXT) -ctranslate --from-code=utf-8 -o $@ -f $< --keyword=_ --keyword=N_
|
cd $(srcdir) && $(XGETTEXT) -ctranslate --from-code=utf-8 -o po/$(PACKAGE).pot -f po/POTFILES --keyword=_ --keyword=N_
|
||||||
cd $(srcdir) && $(XGETTEXT) -ctranslate --from-code=utf-8 -o $@ -f po/POTFILES-shell -j --language=Shell
|
cd $(srcdir) && $(XGETTEXT) -ctranslate --from-code=utf-8 -o po/$(PACKAGE).pot -f po/POTFILES-shell -j --language=Shell
|
||||||
|
|
||||||
$(foreach lang, $(LINGUAS), $(srcdir)/po/$(lang).po): po/$(PACKAGE).pot
|
$(foreach lang, $(LINGUAS), $(srcdir)/po/$(lang).po): po/$(PACKAGE).pot
|
||||||
$(MSGMERGE) -U $@ $^
|
$(MSGMERGE) -U $@ $^
|
||||||
|
|
79
commands/regexp.c
Normal file
79
commands/regexp.c
Normal file
|
@ -0,0 +1,79 @@
|
||||||
|
/* regexp.c -- The regexp command. */
|
||||||
|
/*
|
||||||
|
* GRUB -- GRand Unified Bootloader
|
||||||
|
* Copyright (C) 2005,2007 Free Software Foundation, Inc.
|
||||||
|
*
|
||||||
|
* GRUB 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, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* GRUB is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with GRUB. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <grub/dl.h>
|
||||||
|
#include <grub/misc.h>
|
||||||
|
#include <grub/mm.h>
|
||||||
|
#include <grub/command.h>
|
||||||
|
#include <regex.h>
|
||||||
|
|
||||||
|
static grub_err_t
|
||||||
|
grub_cmd_regexp (grub_command_t cmd __attribute__ ((unused)),
|
||||||
|
int argc, char **args)
|
||||||
|
{
|
||||||
|
int argn = 0;
|
||||||
|
int matches = 0;
|
||||||
|
regex_t regex;
|
||||||
|
int ret;
|
||||||
|
grub_size_t s;
|
||||||
|
char *comperr;
|
||||||
|
grub_err_t err;
|
||||||
|
|
||||||
|
if (argc != 2)
|
||||||
|
return grub_error (GRUB_ERR_BAD_ARGUMENT, "2 arguments expected");
|
||||||
|
|
||||||
|
ret = regcomp (®ex, args[0], RE_SYNTAX_GNU_AWK);
|
||||||
|
if (ret)
|
||||||
|
goto fail;
|
||||||
|
|
||||||
|
ret = regexec (®ex, args[1], 0, 0, 0);
|
||||||
|
if (!ret)
|
||||||
|
{
|
||||||
|
regfree (®ex);
|
||||||
|
return GRUB_ERR_NONE;
|
||||||
|
}
|
||||||
|
|
||||||
|
fail:
|
||||||
|
s = regerror (ret, ®ex, 0, 0);
|
||||||
|
comperr = grub_malloc (s);
|
||||||
|
if (!comperr)
|
||||||
|
{
|
||||||
|
regfree (®ex);
|
||||||
|
return grub_errno;
|
||||||
|
}
|
||||||
|
regerror (ret, ®ex, comperr, s);
|
||||||
|
err = grub_error (GRUB_ERR_TEST_FAILURE, "%s", comperr);
|
||||||
|
regfree (®ex);
|
||||||
|
grub_free (comperr);
|
||||||
|
return err;
|
||||||
|
}
|
||||||
|
|
||||||
|
static grub_command_t cmd;
|
||||||
|
|
||||||
|
GRUB_MOD_INIT(regexp)
|
||||||
|
{
|
||||||
|
cmd = grub_register_command ("regexp", grub_cmd_regexp,
|
||||||
|
"REGEXP STRING",
|
||||||
|
"Test if REGEXP matches STRING.");
|
||||||
|
}
|
||||||
|
|
||||||
|
GRUB_MOD_FINI(regexp)
|
||||||
|
{
|
||||||
|
grub_unregister_command (cmd);
|
||||||
|
}
|
|
@ -1,9 +1,7 @@
|
||||||
# -*- makefile -*-
|
# -*- makefile -*-
|
||||||
|
|
||||||
COMMON_LDFLAGS += -nostdlib
|
COMMON_CFLAGS += -nostdinc -isystem $(shell $(TARGET_CC) -print-file-name=include)
|
||||||
COMMON_CFLAGS += -nostdinc -isystem $(shell $(TARGET_CC) -print-file-name=include) -fno-builtin
|
|
||||||
|
|
||||||
util/grub-emu.c_DEPENDENCIES = grub_emu_init.h
|
|
||||||
kernel_img_RELOCATABLE = yes
|
kernel_img_RELOCATABLE = yes
|
||||||
pkglib_PROGRAMS = kernel.img
|
pkglib_PROGRAMS = kernel.img
|
||||||
kernel_img_SOURCES = kern/device.c kern/disk.c kern/dl.c kern/env.c \
|
kernel_img_SOURCES = kern/device.c kern/disk.c kern/dl.c kern/env.c \
|
||||||
|
@ -11,15 +9,26 @@ kernel_img_SOURCES = kern/device.c kern/disk.c kern/dl.c kern/env.c \
|
||||||
kern/corecmd.c kern/file.c kern/fs.c kern/main.c kern/misc.c \
|
kern/corecmd.c kern/file.c kern/fs.c kern/main.c kern/misc.c \
|
||||||
kern/parser.c kern/partition.c kern/term.c \
|
kern/parser.c kern/partition.c kern/term.c \
|
||||||
kern/rescue_reader.c kern/rescue_parser.c \
|
kern/rescue_reader.c kern/rescue_parser.c \
|
||||||
\
|
\
|
||||||
util/console.c util/grub-emu.c util/misc.c util/hostdisk.c \
|
util/console.c util/grub-emu.c util/misc.c \
|
||||||
util/getroot.c util/time.c \
|
util/hostdisk.c util/getroot.c util/mm.c util/time.c \
|
||||||
\
|
\
|
||||||
grub_emu_init.c gnulib/progname.c util/hostfs.c disk/host.c
|
gnulib/progname.c util/hostfs.c disk/host.c
|
||||||
|
kernel_img_HEADERS += datetime.h
|
||||||
kernel_img_CFLAGS = $(TARGET_CPPFLAGS) $(TARGET_CFLAGS) -Wno-undef -I$(srcdir)/gnulib
|
kernel_img_CFLAGS = $(TARGET_CPPFLAGS) $(TARGET_CFLAGS) -Wno-undef -I$(srcdir)/gnulib
|
||||||
kernel_img_LDFLAGS = $(COMMON_LDFLAGS)
|
kernel_img_LDFLAGS = $(COMMON_LDFLAGS)
|
||||||
TARGET_NO_STRIP = yes
|
TARGET_NO_STRIP = yes
|
||||||
TARGET_NO_DYNAMIC_MODULES = yes
|
|
||||||
|
ifneq ($(TARGET_NO_MODULES), yes)
|
||||||
|
kernel_img_SOURCES += symlist.c kern/$(target_cpu)/dl.c
|
||||||
|
ifneq ($(target_cpu), i386)
|
||||||
|
ifneq ($(target_cpu), x86_64)
|
||||||
|
kernel_img_SOURCES += kern/$(target_cpu)/cache.S
|
||||||
|
endif
|
||||||
|
endif
|
||||||
|
else
|
||||||
|
kernel_img_SOURCES += grub_emu_init.c
|
||||||
|
endif
|
||||||
|
|
||||||
# For halt.mod.
|
# For halt.mod.
|
||||||
pkglib_MODULES += halt.mod
|
pkglib_MODULES += halt.mod
|
||||||
|
@ -37,6 +46,8 @@ endif
|
||||||
grub_emu_LDFLAGS = $(LIBCURSES)
|
grub_emu_LDFLAGS = $(LIBCURSES)
|
||||||
|
|
||||||
ifeq ($(enable_grub_emu_usb), yes)
|
ifeq ($(enable_grub_emu_usb), yes)
|
||||||
|
kernel_img_HEADERS += libusb.h
|
||||||
|
|
||||||
pkglib_MODULES += libusb.mod
|
pkglib_MODULES += libusb.mod
|
||||||
libusb_mod_SOURCES = util/usb.c
|
libusb_mod_SOURCES = util/usb.c
|
||||||
libusb_mod_CFLAGS =
|
libusb_mod_CFLAGS =
|
||||||
|
@ -69,6 +80,7 @@ sdl_mod_SOURCES = util/sdl.c
|
||||||
sdl_mod_CFLAGS =
|
sdl_mod_CFLAGS =
|
||||||
sdl_mod_LDFLAGS = $(COMMON_LDFLAGS)
|
sdl_mod_LDFLAGS = $(COMMON_LDFLAGS)
|
||||||
grub_emu_LDFLAGS += $(LIBSDL)
|
grub_emu_LDFLAGS += $(LIBSDL)
|
||||||
|
kernel_img_HEADERS += sdl.h
|
||||||
endif
|
endif
|
||||||
|
|
||||||
ifeq ($(enable_grub_emu_pci), yes)
|
ifeq ($(enable_grub_emu_pci), yes)
|
||||||
|
@ -84,12 +96,17 @@ grub_emu_init.h: genemuinitheader.sh $(pkglib_MODULES)
|
||||||
rm -f $@; echo $(pkglib_MODULES) | sh $(srcdir)/genemuinitheader.sh $(NM) > $@
|
rm -f $@; echo $(pkglib_MODULES) | sh $(srcdir)/genemuinitheader.sh $(NM) > $@
|
||||||
DISTCLEANFILES += grub_emu_init.h
|
DISTCLEANFILES += grub_emu_init.h
|
||||||
|
|
||||||
grub_emu_init.c: genemuinit.sh $(pkglib_MODULES)
|
grub_emu_init.c: genemuinit.sh $(pkglib_MODULES) grub_emu_init.h
|
||||||
rm -f $@; echo $(pkglib_MODULES) | sh $(srcdir)/genemuinit.sh $(NM) > $@
|
rm -f $@; echo $(pkglib_MODULES) | sh $(srcdir)/genemuinit.sh $(NM) > $@
|
||||||
DISTCLEANFILES += grub_emu_init.c
|
DISTCLEANFILES += grub_emu_init.c
|
||||||
|
|
||||||
CLEANFILES += grub-emu
|
CLEANFILES += grub-emu
|
||||||
|
ifneq ($(TARGET_NO_MODULES), yes)
|
||||||
|
grub-emu: $(pkglib_PROGRAMS)
|
||||||
|
$(CC) -o $@ $(pkglib_PROGRAMS) $(grub_emu_LDFLAGS) $(LDFLAGS)
|
||||||
|
else
|
||||||
grub-emu: $(pkglib_MODULES) $(pkglib_PROGRAMS)
|
grub-emu: $(pkglib_MODULES) $(pkglib_PROGRAMS)
|
||||||
$(CC) -o $@ $(pkglib_MODULES) $(pkglib_PROGRAMS) $(grub_emu_LDFLAGS) $(LDFLAGS)
|
$(CC) -o $@ $(pkglib_MODULES) $(pkglib_PROGRAMS) $(grub_emu_LDFLAGS) $(LDFLAGS)
|
||||||
|
endif
|
||||||
GRUB_EMU=grub-emu
|
GRUB_EMU=grub-emu
|
||||||
|
|
||||||
|
|
|
@ -25,7 +25,7 @@ util/elf/grub-mkimage.c_DEPENDENCIES = Makefile
|
||||||
sbin_UTILITIES += grub-probe
|
sbin_UTILITIES += grub-probe
|
||||||
util/grub-probe.c_DEPENDENCIES = grub_probe_init.h
|
util/grub-probe.c_DEPENDENCIES = grub_probe_init.h
|
||||||
grub_probe_SOURCES = gnulib/progname.c util/grub-probe.c \
|
grub_probe_SOURCES = gnulib/progname.c util/grub-probe.c \
|
||||||
util/hostdisk.c util/misc.c util/getroot.c \
|
util/hostdisk.c util/misc.c util/getroot.c util/mm.c \
|
||||||
kern/device.c kern/disk.c kern/err.c kern/misc.c \
|
kern/device.c kern/disk.c kern/err.c kern/misc.c \
|
||||||
kern/parser.c kern/partition.c kern/file.c kern/list.c \
|
kern/parser.c kern/partition.c kern/file.c kern/list.c \
|
||||||
\
|
\
|
||||||
|
@ -56,12 +56,12 @@ grub_mkisofs_SOURCES = util/mkisofs/eltorito.c \
|
||||||
gnulib/error.c gnulib/progname.c
|
gnulib/error.c gnulib/progname.c
|
||||||
grub_mkisofs_CFLAGS = -D_FILE_OFFSET_BITS=64 \
|
grub_mkisofs_CFLAGS = -D_FILE_OFFSET_BITS=64 \
|
||||||
-I$(srcdir)/util/mkisofs/include \
|
-I$(srcdir)/util/mkisofs/include \
|
||||||
-Wno-all -Werror $(GNULIB_CFLAGS)
|
-Wno-all -Werror $(GNULIB_UTIL_CFLAGS)
|
||||||
|
|
||||||
# For grub-fstest.
|
# For grub-fstest.
|
||||||
util/grub-fstest.c_DEPENDENCIES = grub_fstest_init.h
|
util/grub-fstest.c_DEPENDENCIES = grub_fstest_init.h
|
||||||
grub_fstest_SOURCES = gnulib/progname.c util/grub-fstest.c util/hostfs.c \
|
grub_fstest_SOURCES = gnulib/progname.c util/grub-fstest.c util/hostfs.c \
|
||||||
util/misc.c \
|
util/misc.c util/mm.c \
|
||||||
kern/file.c kern/device.c kern/disk.c kern/err.c kern/misc.c \
|
kern/file.c kern/device.c kern/disk.c kern/err.c kern/misc.c \
|
||||||
disk/host.c disk/loopback.c kern/list.c kern/command.c \
|
disk/host.c disk/loopback.c kern/list.c kern/command.c \
|
||||||
lib/arg.c commands/extcmd.c normal/datetime.c normal/misc.c \
|
lib/arg.c commands/extcmd.c normal/datetime.c normal/misc.c \
|
||||||
|
@ -98,28 +98,29 @@ grub_bin2h_SOURCES = gnulib/progname.c util/bin2h.c
|
||||||
# For the lexer.
|
# For the lexer.
|
||||||
grub_script.yy.c grub_script.yy.h: script/yylex.l
|
grub_script.yy.c grub_script.yy.h: script/yylex.l
|
||||||
$(LEX) -o grub_script.yy.c --header-file=grub_script.yy.h $(srcdir)/script/yylex.l
|
$(LEX) -o grub_script.yy.c --header-file=grub_script.yy.h $(srcdir)/script/yylex.l
|
||||||
sed -i 's/^#include.*\(<stdio\.h>\|<string\.h>\|<errno\.h>\|<stdlib\.h>\|<unistd\.h>\)//g' grub_script.yy.h
|
|
||||||
sed -i 's/^#include.*\(<stdio\.h>\|<string\.h>\|<errno\.h>\|<stdlib\.h>\|<unistd\.h>\)//g' grub_script.yy.c
|
|
||||||
DISTCLEANFILES += grub_script.yy.c grub_script.yy.h
|
DISTCLEANFILES += grub_script.yy.c grub_script.yy.h
|
||||||
|
|
||||||
# For grub-script-check.
|
# For grub-script-check.
|
||||||
bin_UTILITIES += grub-script-check
|
bin_UTILITIES += grub-script-check
|
||||||
util/grub-script-check.c_DEPENDENCIES = grub_script_check_init.h
|
util/grub-script-check.c_DEPENDENCIES = grub_script_check_init.h
|
||||||
grub_script_check_SOURCES = gnulib/progname.c gnulib/getdelim.c gnulib/getline.c \
|
grub_script_check_SOURCES = gnulib/progname.c gnulib/getdelim.c gnulib/getline.c \
|
||||||
util/grub-script-check.c util/misc.c \
|
util/grub-script-check.c util/misc.c util/mm.c \
|
||||||
script/main.c script/script.c script/function.c script/lexer.c \
|
script/main.c script/script.c script/function.c script/lexer.c \
|
||||||
kern/handler.c kern/err.c kern/parser.c kern/list.c \
|
kern/handler.c kern/err.c kern/parser.c kern/list.c \
|
||||||
kern/misc.c kern/env.c grub_script_check_init.c grub_script.tab.c \
|
kern/misc.c kern/env.c grub_script_check_init.c grub_script.tab.c \
|
||||||
grub_script.yy.c
|
grub_script.yy.c
|
||||||
grub_script_check_CFLAGS = $(GNULIB_CFLAGS)
|
grub_script_check_CFLAGS = $(GNULIB_UTIL_CFLAGS)
|
||||||
MOSTLYCLEANFILES += symlist.c kernel_syms.lst
|
MOSTLYCLEANFILES += symlist.c kernel_syms.lst
|
||||||
DEFSYMFILES += kernel_syms.lst
|
DEFSYMFILES += kernel_syms.lst
|
||||||
|
|
||||||
kernel_img_HEADERS += boot.h cache.h device.h disk.h dl.h elf.h elfload.h \
|
kernel_img_HEADERS += boot.h cache.h device.h disk.h dl.h elf.h elfload.h \
|
||||||
env.h err.h file.h fs.h kernel.h loader.h misc.h mm.h net.h parser.h \
|
env.h err.h file.h fs.h kernel.h loader.h misc.h mm.h net.h parser.h \
|
||||||
partition.h msdos_partition.h reader.h symbol.h term.h time.h types.h \
|
partition.h msdos_partition.h reader.h symbol.h term.h time.h types.h \
|
||||||
machine/memory.h machine/loader.h machine/kernel.h \
|
list.h handler.h command.h i18n.h env_private.h libgcc.h mm_private.h
|
||||||
list.h handler.h command.h i18n.h env_private.h mm_private.h
|
|
||||||
|
ifneq ($(platform), emu)
|
||||||
|
kernel_img_HEADERS += machine/memory.h machine/loader.h machine/kernel.h
|
||||||
|
endif
|
||||||
|
|
||||||
symlist.c: $(addprefix include/grub/,$(kernel_img_HEADERS)) config.h gensymlist.sh
|
symlist.c: $(addprefix include/grub/,$(kernel_img_HEADERS)) config.h gensymlist.sh
|
||||||
/bin/sh gensymlist.sh $(filter %.h,$^) > $@ || (rm -f $@; exit 1)
|
/bin/sh gensymlist.sh $(filter %.h,$^) > $@ || (rm -f $@; exit 1)
|
||||||
|
@ -186,7 +187,7 @@ DISTCLEANFILES += grub_fstest_init.c
|
||||||
|
|
||||||
# for grub-editenv
|
# for grub-editenv
|
||||||
bin_UTILITIES += grub-editenv
|
bin_UTILITIES += grub-editenv
|
||||||
grub_editenv_SOURCES = gnulib/progname.c util/grub-editenv.c lib/envblk.c util/misc.c kern/misc.c kern/err.c
|
grub_editenv_SOURCES = gnulib/progname.c util/grub-editenv.c lib/envblk.c util/misc.c util/mm.c kern/misc.c kern/err.c
|
||||||
CLEANFILES += grub-editenv
|
CLEANFILES += grub-editenv
|
||||||
|
|
||||||
# Needed for genmk.rb to work
|
# Needed for genmk.rb to work
|
||||||
|
@ -655,7 +656,7 @@ normal_mod_LDFLAGS = $(COMMON_LDFLAGS)
|
||||||
# For sh.mod.
|
# For sh.mod.
|
||||||
sh_mod_SOURCES = script/main.c script/script.c script/execute.c \
|
sh_mod_SOURCES = script/main.c script/script.c script/execute.c \
|
||||||
script/function.c script/lexer.c grub_script.tab.c grub_script.yy.c
|
script/function.c script/lexer.c grub_script.tab.c grub_script.yy.c
|
||||||
sh_mod_CFLAGS = $(COMMON_CFLAGS)
|
sh_mod_CFLAGS = $(COMMON_CFLAGS) $(POSIX_CFLAGS) -Wno-error
|
||||||
sh_mod_LDFLAGS = $(COMMON_LDFLAGS)
|
sh_mod_LDFLAGS = $(COMMON_LDFLAGS)
|
||||||
|
|
||||||
ifneq (, $(FONT_SOURCE))
|
ifneq (, $(FONT_SOURCE))
|
||||||
|
@ -786,6 +787,11 @@ charset_mod_SOURCES = lib/charset.c
|
||||||
charset_mod_CFLAGS = $(COMMON_CFLAGS)
|
charset_mod_CFLAGS = $(COMMON_CFLAGS)
|
||||||
charset_mod_LDFLAGS = $(COMMON_LDFLAGS)
|
charset_mod_LDFLAGS = $(COMMON_LDFLAGS)
|
||||||
|
|
||||||
|
pkglib_MODULES += regexp.mod
|
||||||
|
regexp_mod_SOURCES = gnulib/regex.c commands/regexp.c
|
||||||
|
regexp_mod_CFLAGS = $(COMMON_CFLAGS) $(GNULIB_CFLAGS)
|
||||||
|
regexp_mod_LDFLAGS = $(COMMON_LDFLAGS)
|
||||||
|
|
||||||
pkglib_MODULES += terminal.mod
|
pkglib_MODULES += terminal.mod
|
||||||
terminal_mod_SOURCES = commands/terminal.c
|
terminal_mod_SOURCES = commands/terminal.c
|
||||||
terminal_mod_CFLAGS = $(COMMON_CFLAGS)
|
terminal_mod_CFLAGS = $(COMMON_CFLAGS)
|
||||||
|
@ -849,7 +855,7 @@ boot_mod_CFLAGS = $(COMMON_CFLAGS)
|
||||||
boot_mod_LDFLAGS = $(COMMON_LDFLAGS)
|
boot_mod_LDFLAGS = $(COMMON_LDFLAGS)
|
||||||
|
|
||||||
bin_UTILITIES += grub-mkpasswd-pbkdf2
|
bin_UTILITIES += grub-mkpasswd-pbkdf2
|
||||||
grub_mkpasswd_pbkdf2_SOURCES = gnulib/progname.c gnulib/getdelim.c gnulib/getline.c util/grub-mkpasswd-pbkdf2.c lib/crypto.c lib/libgcrypt-grub/cipher/sha512.c lib/pbkdf2.c util/misc.c kern/err.c
|
grub_mkpasswd_pbkdf2_SOURCES = gnulib/progname.c gnulib/getdelim.c gnulib/getline.c util/grub-mkpasswd-pbkdf2.c lib/crypto.c lib/libgcrypt-grub/cipher/sha512.c lib/pbkdf2.c util/misc.c util/mm.c kern/err.c
|
||||||
grub_mkpasswd_pbkdf2_CFLAGS += -Wno-missing-field-initializers -Wno-error -I$(srcdir)/lib/libgcrypt_wrap -DGRUB_MKPASSWD=1
|
grub_mkpasswd_pbkdf2_CFLAGS += -Wno-missing-field-initializers -Wno-error -I$(srcdir)/lib/libgcrypt_wrap -DGRUB_MKPASSWD=1
|
||||||
|
|
||||||
# Randomly generated
|
# Randomly generated
|
||||||
|
|
|
@ -26,7 +26,7 @@ kernel_img_SOURCES = kern/i386/coreboot/startup.S \
|
||||||
symlist.c
|
symlist.c
|
||||||
kernel_img_CFLAGS = $(COMMON_CFLAGS)
|
kernel_img_CFLAGS = $(COMMON_CFLAGS)
|
||||||
kernel_img_ASFLAGS = $(COMMON_ASFLAGS)
|
kernel_img_ASFLAGS = $(COMMON_ASFLAGS)
|
||||||
kernel_img_LDFLAGS = $(COMMON_LDFLAGS) -Wl,-N,-S,-Ttext,$(GRUB_KERNEL_MACHINE_LINK_ADDR),-Bstatic
|
kernel_img_LDFLAGS += $(COMMON_LDFLAGS) -Wl,-N,-S,-Ttext,$(GRUB_KERNEL_MACHINE_LINK_ADDR),-Bstatic
|
||||||
|
|
||||||
sbin_SCRIPTS += grub-install
|
sbin_SCRIPTS += grub-install
|
||||||
grub_install_SOURCES = util/grub-install.in
|
grub_install_SOURCES = util/grub-install.in
|
||||||
|
|
|
@ -27,7 +27,7 @@ kernel_img_SOURCES = kern/i386/ieee1275/startup.S \
|
||||||
kernel_img_HEADERS += ieee1275/ieee1275.h
|
kernel_img_HEADERS += ieee1275/ieee1275.h
|
||||||
kernel_img_CFLAGS = $(COMMON_CFLAGS)
|
kernel_img_CFLAGS = $(COMMON_CFLAGS)
|
||||||
kernel_img_ASFLAGS = $(COMMON_ASFLAGS)
|
kernel_img_ASFLAGS = $(COMMON_ASFLAGS)
|
||||||
kernel_img_LDFLAGS = $(COMMON_LDFLAGS) -Wl,-N,-S,-Ttext,0x10000,-Bstatic
|
kernel_img_LDFLAGS += $(COMMON_LDFLAGS) -Wl,-N,-S,-Ttext,0x10000,-Bstatic
|
||||||
|
|
||||||
# Scripts.
|
# Scripts.
|
||||||
sbin_SCRIPTS = grub-install
|
sbin_SCRIPTS = grub-install
|
||||||
|
|
|
@ -55,10 +55,10 @@ kernel_img_SOURCES = kern/i386/pc/startup.S \
|
||||||
term/i386/pc/console.c term/i386/vga_common.c \
|
term/i386/pc/console.c term/i386/vga_common.c \
|
||||||
symlist.c
|
symlist.c
|
||||||
kernel_img_HEADERS += machine/biosdisk.h machine/vga.h machine/vbe.h \
|
kernel_img_HEADERS += machine/biosdisk.h machine/vga.h machine/vbe.h \
|
||||||
machine/pxe.h i386/pit.h machine/init.h
|
machine/pxe.h i386/pit.h
|
||||||
kernel_img_CFLAGS = $(COMMON_CFLAGS) $(TARGET_IMG_CFLAGS)
|
kernel_img_CFLAGS = $(COMMON_CFLAGS) $(TARGET_IMG_CFLAGS)
|
||||||
kernel_img_ASFLAGS = $(COMMON_ASFLAGS)
|
kernel_img_ASFLAGS = $(COMMON_ASFLAGS)
|
||||||
kernel_img_LDFLAGS = $(COMMON_LDFLAGS) $(TARGET_IMG_LDFLAGS)$(GRUB_KERNEL_MACHINE_LINK_ADDR) $(COMMON_CFLAGS)
|
kernel_img_LDFLAGS += $(COMMON_LDFLAGS) $(TARGET_IMG_LDFLAGS)$(GRUB_KERNEL_MACHINE_LINK_ADDR) $(COMMON_CFLAGS)
|
||||||
kernel_img_FORMAT = binary
|
kernel_img_FORMAT = binary
|
||||||
|
|
||||||
# Utilities.
|
# Utilities.
|
||||||
|
@ -90,7 +90,7 @@ grub_setup_SOURCES = gnulib/progname.c \
|
||||||
partmap/gpt.c \
|
partmap/gpt.c \
|
||||||
\
|
\
|
||||||
disk/raid.c disk/mdraid_linux.c disk/lvm.c \
|
disk/raid.c disk/mdraid_linux.c disk/lvm.c \
|
||||||
util/raid.c util/lvm.c \
|
util/raid.c util/lvm.c util/mm.c \
|
||||||
grub_setup_init.c
|
grub_setup_init.c
|
||||||
|
|
||||||
sbin_SCRIPTS += grub-install
|
sbin_SCRIPTS += grub-install
|
||||||
|
|
|
@ -39,7 +39,7 @@ kernel_img_SOURCES = kern/i386/qemu/startup.S \
|
||||||
symlist.c
|
symlist.c
|
||||||
kernel_img_CFLAGS = $(COMMON_CFLAGS) -DGRUB_BOOT_MACHINE_LINK_ADDR=$(GRUB_BOOT_MACHINE_LINK_ADDR)
|
kernel_img_CFLAGS = $(COMMON_CFLAGS) -DGRUB_BOOT_MACHINE_LINK_ADDR=$(GRUB_BOOT_MACHINE_LINK_ADDR)
|
||||||
kernel_img_ASFLAGS = $(COMMON_ASFLAGS) -DGRUB_KERNEL_MACHINE_LINK_ADDR=$(GRUB_KERNEL_MACHINE_LINK_ADDR)
|
kernel_img_ASFLAGS = $(COMMON_ASFLAGS) -DGRUB_KERNEL_MACHINE_LINK_ADDR=$(GRUB_KERNEL_MACHINE_LINK_ADDR)
|
||||||
kernel_img_LDFLAGS = $(COMMON_LDFLAGS) $(TARGET_IMG_LDFLAGS)$(GRUB_KERNEL_MACHINE_LINK_ADDR)
|
kernel_img_LDFLAGS += $(COMMON_LDFLAGS) $(TARGET_IMG_LDFLAGS)$(GRUB_KERNEL_MACHINE_LINK_ADDR)
|
||||||
kernel_img_FORMAT = binary
|
kernel_img_FORMAT = binary
|
||||||
|
|
||||||
sbin_SCRIPTS += grub-install
|
sbin_SCRIPTS += grub-install
|
||||||
|
|
|
@ -18,6 +18,5 @@ kernel_img_SOURCES = kern/$(target_cpu)/startup.S \
|
||||||
symlist.c kern/$(target_cpu)/cache.S
|
symlist.c kern/$(target_cpu)/cache.S
|
||||||
kernel_img_CFLAGS = $(COMMON_CFLAGS)
|
kernel_img_CFLAGS = $(COMMON_CFLAGS)
|
||||||
kernel_img_ASFLAGS = $(COMMON_ASFLAGS)
|
kernel_img_ASFLAGS = $(COMMON_ASFLAGS)
|
||||||
kernel_img_LDFLAGS = $(COMMON_LDFLAGS) -static-libgcc -lgcc \
|
kernel_img_LDFLAGS = $(COMMON_LDFLAGS) -Wl,-N,-S,-Ttext,$(LINK_BASE),-Bstatic
|
||||||
-Wl,-N,-S,-Ttext,$(LINK_BASE),-Bstatic
|
|
||||||
kernel_img_FORMAT = binary
|
kernel_img_FORMAT = binary
|
||||||
|
|
|
@ -29,8 +29,7 @@ kernel_img_SOURCES = kern/$(target_cpu)/startup.S \
|
||||||
symlist.c
|
symlist.c
|
||||||
kernel_img_CFLAGS = $(COMMON_CFLAGS) -DUSE_ASCII_FAILBACK
|
kernel_img_CFLAGS = $(COMMON_CFLAGS) -DUSE_ASCII_FAILBACK
|
||||||
kernel_img_ASFLAGS = $(COMMON_ASFLAGS)
|
kernel_img_ASFLAGS = $(COMMON_ASFLAGS)
|
||||||
kernel_img_LDFLAGS = $(COMMON_LDFLAGS) -static-libgcc -lgcc \
|
kernel_img_LDFLAGS += $(COMMON_LDFLAGS) -Wl,-N,-S,-Ttext,$(LINK_BASE),-Bstatic
|
||||||
-Wl,-N,-S,-Ttext,$(LINK_BASE),-Bstatic
|
|
||||||
kernel_img_FORMAT = binary
|
kernel_img_FORMAT = binary
|
||||||
|
|
||||||
# For ata.mod.
|
# For ata.mod.
|
||||||
|
|
|
@ -4,7 +4,7 @@
|
||||||
COMMON_CFLAGS += -mexplicit-relocs -mflush-func=grub_cpu_flush_cache
|
COMMON_CFLAGS += -mexplicit-relocs -mflush-func=grub_cpu_flush_cache
|
||||||
|
|
||||||
# Images.
|
# Images.
|
||||||
kernel_img_HEADERS += cpu/libgcc.h cpu/cache.h
|
kernel_img_HEADERS += cpu/cache.h
|
||||||
|
|
||||||
# Scripts.
|
# Scripts.
|
||||||
sbin_SCRIPTS =
|
sbin_SCRIPTS =
|
||||||
|
|
|
@ -3,7 +3,7 @@
|
||||||
|
|
||||||
# Images.
|
# Images.
|
||||||
|
|
||||||
kernel_img_HEADERS += cpu/libgcc.h ieee1275/ieee1275.h
|
kernel_img_HEADERS += ieee1275/ieee1275.h
|
||||||
|
|
||||||
# Programs
|
# Programs
|
||||||
pkglib_PROGRAMS = kernel.img
|
pkglib_PROGRAMS = kernel.img
|
||||||
|
@ -23,8 +23,7 @@ kernel_img_SOURCES = kern/powerpc/ieee1275/startup.S kern/ieee1275/cmain.c \
|
||||||
symlist.c kern/$(target_cpu)/cache.S
|
symlist.c kern/$(target_cpu)/cache.S
|
||||||
kernel_img_CFLAGS = $(COMMON_CFLAGS)
|
kernel_img_CFLAGS = $(COMMON_CFLAGS)
|
||||||
kernel_img_ASFLAGS = $(COMMON_ASFLAGS)
|
kernel_img_ASFLAGS = $(COMMON_ASFLAGS)
|
||||||
kernel_img_LDFLAGS = $(COMMON_LDFLAGS) -static-libgcc -lgcc \
|
kernel_img_LDFLAGS += $(COMMON_LDFLAGS) -Wl,-N,-S,-Ttext,0x200000,-Bstatic
|
||||||
-Wl,-N,-S,-Ttext,0x200000,-Bstatic
|
|
||||||
|
|
||||||
# Scripts.
|
# Scripts.
|
||||||
sbin_SCRIPTS = grub-install
|
sbin_SCRIPTS = grub-install
|
||||||
|
|
|
@ -19,7 +19,7 @@ diskboot_img_ASFLAGS = $(COMMON_ASFLAGS)
|
||||||
diskboot_img_LDFLAGS = $(COMMON_LDFLAGS) -Wl,-N,-Ttext,0x4200
|
diskboot_img_LDFLAGS = $(COMMON_LDFLAGS) -Wl,-N,-Ttext,0x4200
|
||||||
diskboot_img_FORMAT = binary
|
diskboot_img_FORMAT = binary
|
||||||
|
|
||||||
kernel_img_HEADERS += cpu/libgcc.h ieee1275/ieee1275.h cpu/ieee1275/ieee1275.h
|
kernel_img_HEADERS += ieee1275/ieee1275.h cpu/ieee1275/ieee1275.h
|
||||||
kernel_img_SOURCES = kern/sparc64/ieee1275/crt0.S kern/ieee1275/cmain.c \
|
kernel_img_SOURCES = kern/sparc64/ieee1275/crt0.S kern/ieee1275/cmain.c \
|
||||||
kern/ieee1275/ieee1275.c kern/main.c kern/device.c \
|
kern/ieee1275/ieee1275.c kern/main.c kern/device.c \
|
||||||
kern/disk.c kern/dl.c kern/err.c kern/file.c kern/fs.c \
|
kern/disk.c kern/dl.c kern/err.c kern/file.c kern/fs.c \
|
||||||
|
@ -36,7 +36,7 @@ kernel_img_SOURCES = kern/sparc64/ieee1275/crt0.S kern/ieee1275/cmain.c \
|
||||||
symlist.c kern/$(target_cpu)/cache.S
|
symlist.c kern/$(target_cpu)/cache.S
|
||||||
kernel_img_CFLAGS = $(COMMON_CFLAGS)
|
kernel_img_CFLAGS = $(COMMON_CFLAGS)
|
||||||
kernel_img_ASFLAGS = $(COMMON_ASFLAGS)
|
kernel_img_ASFLAGS = $(COMMON_ASFLAGS)
|
||||||
kernel_img_LDFLAGS = -nostdlib -Wl,-N,-Ttext,0x4400,-Bstatic,-melf64_sparc -static-libgcc -lgcc
|
kernel_img_LDFLAGS += -nostdlib -Wl,-N,-Ttext,0x4400,-Bstatic,-melf64_sparc
|
||||||
kernel_img_FORMAT = binary
|
kernel_img_FORMAT = binary
|
||||||
|
|
||||||
# Utilities.
|
# Utilities.
|
||||||
|
@ -65,7 +65,7 @@ grub_setup_SOURCES = util/sparc64/ieee1275/grub-setup.c util/hostdisk.c \
|
||||||
partmap/bsdlabel.c partmap/sun.c partmap/acorn.c \
|
partmap/bsdlabel.c partmap/sun.c partmap/acorn.c \
|
||||||
\
|
\
|
||||||
disk/raid.c disk/mdraid_linux.c disk/lvm.c \
|
disk/raid.c disk/mdraid_linux.c disk/lvm.c \
|
||||||
util/raid.c util/lvm.c gnulib/progname.c \
|
util/raid.c util/lvm.c util/mm.c gnulib/progname.c \
|
||||||
grub_setup_init.c
|
grub_setup_init.c
|
||||||
|
|
||||||
# For grub-ofpathname.
|
# For grub-ofpathname.
|
||||||
|
|
|
@ -53,6 +53,12 @@ grub_script_vars1_SOURCES = tests/grub_script_vars1.in
|
||||||
check_SCRIPTS += grub_script_for1
|
check_SCRIPTS += grub_script_for1
|
||||||
grub_script_for1_SOURCES = tests/grub_script_for1.in
|
grub_script_for1_SOURCES = tests/grub_script_for1.in
|
||||||
|
|
||||||
|
check_SCRIPTS += grub_script_while1
|
||||||
|
grub_script_while1_SOURCES = tests/grub_script_while1.in
|
||||||
|
|
||||||
|
check_SCRIPTS += grub_script_if
|
||||||
|
grub_script_if_SOURCES = tests/grub_script_if.in
|
||||||
|
|
||||||
check_SCRIPTS += grub_script_blanklines
|
check_SCRIPTS += grub_script_blanklines
|
||||||
grub_script_blanklines_SOURCES = tests/grub_script_blanklines.in
|
grub_script_blanklines_SOURCES = tests/grub_script_blanklines.in
|
||||||
|
|
||||||
|
@ -69,9 +75,12 @@ SCRIPTED_TESTS = grub_script_echo1
|
||||||
SCRIPTED_TESTS += grub_script_echo_keywords
|
SCRIPTED_TESTS += grub_script_echo_keywords
|
||||||
SCRIPTED_TESTS += grub_script_vars1
|
SCRIPTED_TESTS += grub_script_vars1
|
||||||
SCRIPTED_TESTS += grub_script_for1
|
SCRIPTED_TESTS += grub_script_for1
|
||||||
|
SCRIPTED_TESTS += grub_script_while1
|
||||||
|
SCRIPTED_TESTS += grub_script_if
|
||||||
SCRIPTED_TESTS += grub_script_blanklines
|
SCRIPTED_TESTS += grub_script_blanklines
|
||||||
SCRIPTED_TESTS += grub_script_final_semicolon
|
SCRIPTED_TESTS += grub_script_final_semicolon
|
||||||
|
|
||||||
|
|
||||||
# dependencies between tests and testing-tools
|
# dependencies between tests and testing-tools
|
||||||
$(SCRIPTED_TESTS): grub-shell grub-shell-tester
|
$(SCRIPTED_TESTS): grub-shell grub-shell-tester
|
||||||
$(FUNCTIONAL_TESTS): functional_test.mod
|
$(FUNCTIONAL_TESTS): functional_test.mod
|
||||||
|
|
|
@ -39,7 +39,7 @@ endif
|
||||||
kernel_img_HEADERS += efi/efi.h efi/time.h efi/disk.h i386/pit.h
|
kernel_img_HEADERS += efi/efi.h efi/time.h efi/disk.h i386/pit.h
|
||||||
kernel_img_CFLAGS = $(COMMON_CFLAGS)
|
kernel_img_CFLAGS = $(COMMON_CFLAGS)
|
||||||
kernel_img_ASFLAGS = $(COMMON_ASFLAGS)
|
kernel_img_ASFLAGS = $(COMMON_ASFLAGS)
|
||||||
kernel_img_LDFLAGS = $(COMMON_LDFLAGS)
|
kernel_img_LDFLAGS += $(COMMON_LDFLAGS)
|
||||||
|
|
||||||
# For acpi.mod.
|
# For acpi.mod.
|
||||||
acpi_mod_SOURCES = commands/acpi.c commands/efi/acpi.c
|
acpi_mod_SOURCES = commands/acpi.c commands/efi/acpi.c
|
||||||
|
|
64
configure.ac
64
configure.ac
|
@ -130,6 +130,7 @@ case "$host_os" in
|
||||||
gnu*) host_kernel=hurd ;;
|
gnu*) host_kernel=hurd ;;
|
||||||
linux*) host_kernel=linux ;;
|
linux*) host_kernel=linux ;;
|
||||||
freebsd* | kfreebsd*-gnu) host_kernel=kfreebsd ;;
|
freebsd* | kfreebsd*-gnu) host_kernel=kfreebsd ;;
|
||||||
|
netbsd*) host_kernel=netbsd ;;
|
||||||
cygwin) host_kernel=windows ;;
|
cygwin) host_kernel=windows ;;
|
||||||
esac
|
esac
|
||||||
|
|
||||||
|
@ -170,11 +171,6 @@ if test "x$CMP" = x; then
|
||||||
AC_MSG_ERROR([cmp is not found])
|
AC_MSG_ERROR([cmp is not found])
|
||||||
fi
|
fi
|
||||||
|
|
||||||
AC_CHECK_PROGS([LEX], [flex])
|
|
||||||
if test "x$LEX" = x; then
|
|
||||||
AC_MSG_ERROR([flex is not found])
|
|
||||||
fi
|
|
||||||
|
|
||||||
AC_CHECK_PROGS([YACC], [bison])
|
AC_CHECK_PROGS([YACC], [bison])
|
||||||
if test "x$YACC" = x; then
|
if test "x$YACC" = x; then
|
||||||
AC_MSG_ERROR([bison is not found])
|
AC_MSG_ERROR([bison is not found])
|
||||||
|
@ -189,9 +185,21 @@ done
|
||||||
|
|
||||||
AC_PROG_INSTALL
|
AC_PROG_INSTALL
|
||||||
AC_PROG_AWK
|
AC_PROG_AWK
|
||||||
|
AC_PROG_LEX
|
||||||
AC_PROG_MAKE_SET
|
AC_PROG_MAKE_SET
|
||||||
AC_PROG_MKDIR_P
|
AC_PROG_MKDIR_P
|
||||||
|
|
||||||
|
if test "x$LEX" = x; then
|
||||||
|
AC_MSG_ERROR([flex is not found])
|
||||||
|
else
|
||||||
|
version=`$LEX --version | $AWK '{ split($NF,x,"."); print x[[1]]*10000+x[[2]]*100+x[[3]]; }'`
|
||||||
|
if test -n "$version" -a "$version" -ge 20535; then
|
||||||
|
:
|
||||||
|
else
|
||||||
|
AC_MSG_ERROR([flex is too old. GRUB requires 2.5.35 or above])
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
# These are not a "must".
|
# These are not a "must".
|
||||||
AC_PATH_PROG(RUBY, ruby)
|
AC_PATH_PROG(RUBY, ruby)
|
||||||
AC_PATH_PROG(MAKEINFO, makeinfo)
|
AC_PATH_PROG(MAKEINFO, makeinfo)
|
||||||
|
@ -235,6 +243,20 @@ AC_CHECK_FUNCS(memmove sbrk strdup lstat getuid getgid)
|
||||||
AC_CHECK_HEADERS(sys/mkdev.h sys/sysmacros.h malloc.h termios.h sys/types.h)
|
AC_CHECK_HEADERS(sys/mkdev.h sys/sysmacros.h malloc.h termios.h sys/types.h)
|
||||||
AC_CHECK_HEADERS(unistd.h string.h strings.h sys/stat.h sys/fcntl.h limits.h)
|
AC_CHECK_HEADERS(unistd.h string.h strings.h sys/stat.h sys/fcntl.h limits.h)
|
||||||
|
|
||||||
|
# For opendisk() and getrawpartition() on NetBSD.
|
||||||
|
# Used in util/deviceiter.c and in util/hostdisk.c.
|
||||||
|
AC_CHECK_HEADER([util.h], [
|
||||||
|
AC_CHECK_LIB([util], [opendisk], [
|
||||||
|
LIBUTIL="-lutil"
|
||||||
|
AC_DEFINE(HAVE_OPENDISK, 1, [Define if opendisk() in -lutil can be used])
|
||||||
|
])
|
||||||
|
AC_CHECK_LIB([util], [getrawpartition], [
|
||||||
|
LIBUTIL="-lutil"
|
||||||
|
AC_DEFINE(HAVE_GETRAWPARTITION, 1, [Define if getrawpartition() in -lutil can be used])
|
||||||
|
])
|
||||||
|
])
|
||||||
|
AC_SUBST([LIBUTIL])
|
||||||
|
|
||||||
#
|
#
|
||||||
# Check for target programs.
|
# Check for target programs.
|
||||||
#
|
#
|
||||||
|
@ -354,7 +376,11 @@ AC_SUBST(TARGET_IMG_CFLAGS)
|
||||||
# For platforms where ELF is not the default link format.
|
# For platforms where ELF is not the default link format.
|
||||||
AC_MSG_CHECKING([for command to convert module to ELF format])
|
AC_MSG_CHECKING([for command to convert module to ELF format])
|
||||||
case "${host_os}" in
|
case "${host_os}" in
|
||||||
cygwin) TARGET_OBJ2ELF='grub-pe2elf' ;;
|
cygwin) TARGET_OBJ2ELF='grub-pe2elf';
|
||||||
|
# FIXME: put proper test here
|
||||||
|
AC_DEFINE([NEED_REGISTER_FRAME_INFO], 1,
|
||||||
|
[Define to 1 if GCC generates calls to __register_frame_info()])
|
||||||
|
;;
|
||||||
*) ;;
|
*) ;;
|
||||||
esac
|
esac
|
||||||
AC_SUBST(TARGET_OBJ2ELF)
|
AC_SUBST(TARGET_OBJ2ELF)
|
||||||
|
@ -457,12 +483,19 @@ CC="$TARGET_CC"
|
||||||
if test "x$TARGET_APPLE_CC" = x1 ; then
|
if test "x$TARGET_APPLE_CC" = x1 ; then
|
||||||
CFLAGS="$TARGET_CFLAGS -nostdlib -Wno-error"
|
CFLAGS="$TARGET_CFLAGS -nostdlib -Wno-error"
|
||||||
else
|
else
|
||||||
CFLAGS="$TARGET_CFLAGS -nostdlib -Wl,--defsym,___main=0x8100 -Wl,--defsym,abort=main -Wno-error"
|
CFLAGS="$TARGET_CFLAGS -nostdlib -Wl,--defsym,___main=0x8100 -Wno-error"
|
||||||
fi
|
fi
|
||||||
CPPFLAGS="$TARGET_CPPFLAGS"
|
CPPFLAGS="$TARGET_CPPFLAGS"
|
||||||
LDFLAGS="$TARGET_LDFLAGS"
|
LDFLAGS="$TARGET_LDFLAGS"
|
||||||
LIBS=-lgcc
|
LIBS=-lgcc
|
||||||
|
|
||||||
|
grub_ASM_USCORE
|
||||||
|
if test x$grub_cv_asm_uscore = xyes; then
|
||||||
|
CFLAGS="$CFLAGS -Wl,--defsym,_abort=_main"
|
||||||
|
else
|
||||||
|
CFLAGS="$CFLAGS -Wl,--defsym,abort=main"
|
||||||
|
fi
|
||||||
|
|
||||||
# Check for libgcc symbols
|
# Check for libgcc symbols
|
||||||
AC_CHECK_FUNCS(__bswapsi2 __bswapdi2 __ashldi3 __ashrdi3 __lshrdi3 __trampoline_setup __ucmpdi2 _restgpr_14_x)
|
AC_CHECK_FUNCS(__bswapsi2 __bswapdi2 __ashldi3 __ashrdi3 __lshrdi3 __trampoline_setup __ucmpdi2 _restgpr_14_x)
|
||||||
|
|
||||||
|
@ -479,7 +512,6 @@ if test "x$TARGET_APPLE_CC" != x1 ; then
|
||||||
grub_PROG_OBJCOPY_ABSOLUTE
|
grub_PROG_OBJCOPY_ABSOLUTE
|
||||||
fi
|
fi
|
||||||
grub_PROG_LD_BUILD_ID_NONE
|
grub_PROG_LD_BUILD_ID_NONE
|
||||||
grub_ASM_USCORE
|
|
||||||
if test "x$target_cpu" = xi386; then
|
if test "x$target_cpu" = xi386; then
|
||||||
if test ! -z "$TARGET_IMG_LDSCRIPT"; then
|
if test ! -z "$TARGET_IMG_LDSCRIPT"; then
|
||||||
# Check symbols provided by linker script.
|
# Check symbols provided by linker script.
|
||||||
|
@ -576,6 +608,10 @@ AC_ARG_ENABLE([grub-emu-pci],
|
||||||
[AS_HELP_STRING([--enable-grub-emu-pci],
|
[AS_HELP_STRING([--enable-grub-emu-pci],
|
||||||
[build and install the `grub-emu' debugging utility with PCI support (potentially dangerous) (default=no)])])
|
[build and install the `grub-emu' debugging utility with PCI support (potentially dangerous) (default=no)])])
|
||||||
|
|
||||||
|
AC_ARG_ENABLE([grub-emu-modules],
|
||||||
|
[AS_HELP_STRING([--enable-grub-emu-modules],
|
||||||
|
[Support module loading in `grub-emu' debugging utility (default=no)])])
|
||||||
|
|
||||||
if test "$platform" = emu; then
|
if test "$platform" = emu; then
|
||||||
missing_ncurses=
|
missing_ncurses=
|
||||||
[# Check for curses libraries.]
|
[# Check for curses libraries.]
|
||||||
|
@ -594,6 +630,13 @@ if test x"$missing_ncurses" = xtrue ; then
|
||||||
AC_MSG_ERROR([grub-emu can't be compiled without ncurses])
|
AC_MSG_ERROR([grub-emu can't be compiled without ncurses])
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
if test x"$enable_grub_emu_modules" = xyes ; then
|
||||||
|
TARGET_NO_MODULES=no
|
||||||
|
else
|
||||||
|
TARGET_NO_MODULES=yes
|
||||||
|
fi
|
||||||
|
AC_SUBST(TARGET_NO_MODULES)
|
||||||
|
|
||||||
if test x"$enable_grub_emu_usb" = xno ; then
|
if test x"$enable_grub_emu_usb" = xno ; then
|
||||||
grub_emu_usb_excuse="explicitly disabled"
|
grub_emu_usb_excuse="explicitly disabled"
|
||||||
fi
|
fi
|
||||||
|
@ -771,6 +814,11 @@ echo PCI support for grub-emu: Yes
|
||||||
else
|
else
|
||||||
echo PCI support for grub-emu: No "($grub_emu_pci_excuse)"
|
echo PCI support for grub-emu: No "($grub_emu_pci_excuse)"
|
||||||
fi
|
fi
|
||||||
|
if [ x"$TARGET_NO_MODULES" = xno ]; then
|
||||||
|
echo Module support for grub-emu: Yes
|
||||||
|
else
|
||||||
|
echo Module support for grub-emu: No
|
||||||
|
fi
|
||||||
fi
|
fi
|
||||||
if [ x"$enable_mm_debug" = xyes ]; then
|
if [ x"$enable_mm_debug" = xyes ]; then
|
||||||
echo With memory debugging: Yes
|
echo With memory debugging: Yes
|
||||||
|
|
462
font/font.c
462
font/font.c
|
@ -91,25 +91,24 @@ struct font_file_section
|
||||||
};
|
};
|
||||||
|
|
||||||
/* Replace unknown glyphs with a rounded question mark. */
|
/* Replace unknown glyphs with a rounded question mark. */
|
||||||
static grub_uint8_t unknown_glyph_bitmap[] =
|
static grub_uint8_t unknown_glyph_bitmap[] = {
|
||||||
{
|
/* 76543210 */
|
||||||
/* 76543210 */
|
0x7C, /* ooooo */
|
||||||
0x7C, /* ooooo */
|
0x82, /* o o */
|
||||||
0x82, /* o o */
|
0xBA, /* o ooo o */
|
||||||
0xBA, /* o ooo o */
|
0xAA, /* o o o o */
|
||||||
0xAA, /* o o o o */
|
0xAA, /* o o o o */
|
||||||
0xAA, /* o o o o */
|
0x8A, /* o o o */
|
||||||
0x8A, /* o o o */
|
0x9A, /* o oo o */
|
||||||
0x9A, /* o oo o */
|
0x92, /* o o o */
|
||||||
0x92, /* o o o */
|
0x92, /* o o o */
|
||||||
0x92, /* o o o */
|
0x92, /* o o o */
|
||||||
0x92, /* o o o */
|
0x92, /* o o o */
|
||||||
0x92, /* o o o */
|
0x82, /* o o */
|
||||||
0x82, /* o o */
|
0x92, /* o o o */
|
||||||
0x92, /* o o o */
|
0x82, /* o o */
|
||||||
0x82, /* o o */
|
0x7C, /* ooooo */
|
||||||
0x7C, /* ooooo */
|
0x00 /* */
|
||||||
0x00 /* */
|
|
||||||
};
|
};
|
||||||
|
|
||||||
/* The "unknown glyph" glyph, used as a last resort. */
|
/* The "unknown glyph" glyph, used as a last resort. */
|
||||||
|
@ -130,7 +129,7 @@ static struct grub_font_glyph *ascii_font_glyph[0x80];
|
||||||
static struct grub_font_glyph *
|
static struct grub_font_glyph *
|
||||||
ascii_glyph_lookup (grub_uint32_t code)
|
ascii_glyph_lookup (grub_uint32_t code)
|
||||||
{
|
{
|
||||||
#ifdef USE_ASCII_FAILBACK
|
#ifdef USE_ASCII_FAILBACK
|
||||||
static int ascii_failback_initialized = 0;
|
static int ascii_failback_initialized = 0;
|
||||||
|
|
||||||
if (code >= 0x80)
|
if (code >= 0x80)
|
||||||
|
@ -140,14 +139,14 @@ ascii_glyph_lookup (grub_uint32_t code)
|
||||||
{
|
{
|
||||||
int current;
|
int current;
|
||||||
for (current = 0; current < 0x80; current++)
|
for (current = 0; current < 0x80; current++)
|
||||||
{
|
{
|
||||||
ascii_font_glyph[current] = grub_malloc(sizeof(struct grub_font_glyph)
|
ascii_font_glyph[current] =
|
||||||
+ ASCII_BITMAP_SIZE);
|
grub_malloc (sizeof (struct grub_font_glyph) + ASCII_BITMAP_SIZE);
|
||||||
|
|
||||||
ascii_font_glyph[current]->width = 8;
|
ascii_font_glyph[current]->width = 8;
|
||||||
ascii_font_glyph[current]->height = 16;
|
ascii_font_glyph[current]->height = 16;
|
||||||
ascii_font_glyph[current]->offset_x = 0;
|
ascii_font_glyph[current]->offset_x = 0;
|
||||||
ascii_font_glyph[current]->offset_y = -2;
|
ascii_font_glyph[current]->offset_y = -2;
|
||||||
ascii_font_glyph[current]->device_width = 8;
|
ascii_font_glyph[current]->device_width = 8;
|
||||||
|
|
||||||
grub_memcpy (ascii_font_glyph[current]->bitmap,
|
grub_memcpy (ascii_font_glyph[current]->bitmap,
|
||||||
|
@ -173,9 +172,9 @@ grub_font_loader_init (void)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
/* Make glyph for unknown glyph. */
|
/* Make glyph for unknown glyph. */
|
||||||
unknown_glyph = grub_malloc(sizeof(struct grub_font_glyph)
|
unknown_glyph = grub_malloc (sizeof (struct grub_font_glyph)
|
||||||
+ sizeof(unknown_glyph_bitmap));
|
+ sizeof (unknown_glyph_bitmap));
|
||||||
if (! unknown_glyph)
|
if (!unknown_glyph)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
unknown_glyph->width = 8;
|
unknown_glyph->width = 8;
|
||||||
|
@ -183,13 +182,13 @@ grub_font_loader_init (void)
|
||||||
unknown_glyph->offset_x = 0;
|
unknown_glyph->offset_x = 0;
|
||||||
unknown_glyph->offset_y = -3;
|
unknown_glyph->offset_y = -3;
|
||||||
unknown_glyph->device_width = 8;
|
unknown_glyph->device_width = 8;
|
||||||
grub_memcpy(unknown_glyph->bitmap,
|
grub_memcpy (unknown_glyph->bitmap,
|
||||||
unknown_glyph_bitmap, sizeof(unknown_glyph_bitmap));
|
unknown_glyph_bitmap, sizeof (unknown_glyph_bitmap));
|
||||||
|
|
||||||
/* Initialize the null font. */
|
/* Initialize the null font. */
|
||||||
font_init (&null_font);
|
font_init (&null_font);
|
||||||
null_font.name = "<No Font>";
|
null_font.name = "<No Font>";
|
||||||
null_font.ascent = unknown_glyph->height-3;
|
null_font.ascent = unknown_glyph->height - 3;
|
||||||
null_font.descent = 3;
|
null_font.descent = 3;
|
||||||
null_font.max_char_width = unknown_glyph->width;
|
null_font.max_char_width = unknown_glyph->width;
|
||||||
null_font.max_char_height = unknown_glyph->height;
|
null_font.max_char_height = unknown_glyph->height;
|
||||||
|
@ -247,7 +246,7 @@ open_section (grub_file_t file, struct font_file_section *section)
|
||||||
else if (retval < 0)
|
else if (retval < 0)
|
||||||
{
|
{
|
||||||
grub_error (GRUB_ERR_BAD_FONT,
|
grub_error (GRUB_ERR_BAD_FONT,
|
||||||
"font format error: can't read section name");
|
"font format error: can't read section name");
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -262,7 +261,7 @@ open_section (grub_file_t file, struct font_file_section *section)
|
||||||
else if (retval < 0)
|
else if (retval < 0)
|
||||||
{
|
{
|
||||||
grub_error (GRUB_ERR_BAD_FONT,
|
grub_error (GRUB_ERR_BAD_FONT,
|
||||||
"font format error: can't read section length");
|
"font format error: can't read section length");
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -283,22 +282,22 @@ open_section (grub_file_t file, struct font_file_section *section)
|
||||||
grub_errno is set appropriately). */
|
grub_errno is set appropriately). */
|
||||||
static int
|
static int
|
||||||
load_font_index (grub_file_t file, grub_uint32_t sect_length, struct
|
load_font_index (grub_file_t file, grub_uint32_t sect_length, struct
|
||||||
grub_font *font)
|
grub_font *font)
|
||||||
{
|
{
|
||||||
unsigned i;
|
unsigned i;
|
||||||
grub_uint32_t last_code;
|
grub_uint32_t last_code;
|
||||||
|
|
||||||
#if FONT_DEBUG >= 2
|
#if FONT_DEBUG >= 2
|
||||||
grub_printf("load_font_index(sect_length=%d)\n", sect_length);
|
grub_printf ("load_font_index(sect_length=%d)\n", sect_length);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* Sanity check: ensure section length is divisible by the entry size. */
|
/* Sanity check: ensure section length is divisible by the entry size. */
|
||||||
if ((sect_length % FONT_CHAR_INDEX_ENTRY_SIZE) != 0)
|
if ((sect_length % FONT_CHAR_INDEX_ENTRY_SIZE) != 0)
|
||||||
{
|
{
|
||||||
grub_error (GRUB_ERR_BAD_FONT,
|
grub_error (GRUB_ERR_BAD_FONT,
|
||||||
"font file format error: character index length %d "
|
"font file format error: character index length %d "
|
||||||
"is not a multiple of the entry size %d",
|
"is not a multiple of the entry size %d",
|
||||||
sect_length, FONT_CHAR_INDEX_ENTRY_SIZE);
|
sect_length, FONT_CHAR_INDEX_ENTRY_SIZE);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -307,11 +306,11 @@ load_font_index (grub_file_t file, grub_uint32_t sect_length, struct
|
||||||
|
|
||||||
/* Allocate the character index array. */
|
/* Allocate the character index array. */
|
||||||
font->char_index = grub_malloc (font->num_chars
|
font->char_index = grub_malloc (font->num_chars
|
||||||
* sizeof (struct char_index_entry));
|
* sizeof (struct char_index_entry));
|
||||||
if (! font->char_index)
|
if (!font->char_index)
|
||||||
return 1;
|
return 1;
|
||||||
font->bmp_idx = grub_malloc (0x10000 * sizeof (grub_uint16_t));
|
font->bmp_idx = grub_malloc (0x10000 * sizeof (grub_uint16_t));
|
||||||
if (! font->bmp_idx)
|
if (!font->bmp_idx)
|
||||||
{
|
{
|
||||||
grub_free (font->char_index);
|
grub_free (font->char_index);
|
||||||
return 1;
|
return 1;
|
||||||
|
@ -320,7 +319,7 @@ load_font_index (grub_file_t file, grub_uint32_t sect_length, struct
|
||||||
|
|
||||||
|
|
||||||
#if FONT_DEBUG >= 2
|
#if FONT_DEBUG >= 2
|
||||||
grub_printf("num_chars=%d)\n", font->num_chars);
|
grub_printf ("num_chars=%d)\n", font->num_chars);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
last_code = 0;
|
last_code = 0;
|
||||||
|
@ -332,17 +331,17 @@ load_font_index (grub_file_t file, grub_uint32_t sect_length, struct
|
||||||
|
|
||||||
/* Read code point value; convert to native byte order. */
|
/* Read code point value; convert to native byte order. */
|
||||||
if (grub_file_read (file, &entry->code, 4) != 4)
|
if (grub_file_read (file, &entry->code, 4) != 4)
|
||||||
return 1;
|
return 1;
|
||||||
entry->code = grub_be_to_cpu32 (entry->code);
|
entry->code = grub_be_to_cpu32 (entry->code);
|
||||||
|
|
||||||
/* Verify that characters are in ascending order. */
|
/* Verify that characters are in ascending order. */
|
||||||
if (i != 0 && entry->code <= last_code)
|
if (i != 0 && entry->code <= last_code)
|
||||||
{
|
{
|
||||||
grub_error (GRUB_ERR_BAD_FONT,
|
grub_error (GRUB_ERR_BAD_FONT,
|
||||||
"font characters not in ascending order: %u <= %u",
|
"font characters not in ascending order: %u <= %u",
|
||||||
entry->code, last_code);
|
entry->code, last_code);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (entry->code < 0x10000)
|
if (entry->code < 0x10000)
|
||||||
font->bmp_idx[entry->code] = i;
|
font->bmp_idx[entry->code] = i;
|
||||||
|
@ -351,11 +350,11 @@ load_font_index (grub_file_t file, grub_uint32_t sect_length, struct
|
||||||
|
|
||||||
/* Read storage flags byte. */
|
/* Read storage flags byte. */
|
||||||
if (grub_file_read (file, &entry->storage_flags, 1) != 1)
|
if (grub_file_read (file, &entry->storage_flags, 1) != 1)
|
||||||
return 1;
|
return 1;
|
||||||
|
|
||||||
/* Read glyph data offset; convert to native byte order. */
|
/* Read glyph data offset; convert to native byte order. */
|
||||||
if (grub_file_read (file, &entry->offset, 4) != 4)
|
if (grub_file_read (file, &entry->offset, 4) != 4)
|
||||||
return 1;
|
return 1;
|
||||||
entry->offset = grub_be_to_cpu32 (entry->offset);
|
entry->offset = grub_be_to_cpu32 (entry->offset);
|
||||||
|
|
||||||
/* No glyph loaded. Will be loaded on demand and cached thereafter. */
|
/* No glyph loaded. Will be loaded on demand and cached thereafter. */
|
||||||
|
@ -364,7 +363,7 @@ load_font_index (grub_file_t file, grub_uint32_t sect_length, struct
|
||||||
#if FONT_DEBUG >= 5
|
#if FONT_DEBUG >= 5
|
||||||
/* Print the 1st 10 characters. */
|
/* Print the 1st 10 characters. */
|
||||||
if (i < 10)
|
if (i < 10)
|
||||||
grub_printf("c=%d o=%d\n", entry->code, entry->offset);
|
grub_printf ("c=%d o=%d\n", entry->code, entry->offset);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -380,7 +379,7 @@ read_section_as_string (struct font_file_section *section)
|
||||||
grub_ssize_t ret;
|
grub_ssize_t ret;
|
||||||
|
|
||||||
str = grub_malloc (section->length + 1);
|
str = grub_malloc (section->length + 1);
|
||||||
if (! str)
|
if (!str)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
ret = grub_file_read (section->file, str, section->length);
|
ret = grub_file_read (section->file, str, section->length);
|
||||||
|
@ -398,18 +397,18 @@ read_section_as_string (struct font_file_section *section)
|
||||||
which is stored into *VALUE.
|
which is stored into *VALUE.
|
||||||
Returns 0 upon success, nonzero upon failure. */
|
Returns 0 upon success, nonzero upon failure. */
|
||||||
static int
|
static int
|
||||||
read_section_as_short (struct font_file_section *section, grub_int16_t *value)
|
read_section_as_short (struct font_file_section *section,
|
||||||
|
grub_int16_t * value)
|
||||||
{
|
{
|
||||||
grub_uint16_t raw_value;
|
grub_uint16_t raw_value;
|
||||||
|
|
||||||
if (section->length != 2)
|
if (section->length != 2)
|
||||||
{
|
{
|
||||||
grub_error (GRUB_ERR_BAD_FONT,
|
grub_error (GRUB_ERR_BAD_FONT,
|
||||||
"font file format error: section %c%c%c%c length "
|
"font file format error: section %c%c%c%c length "
|
||||||
"is %d but should be 2",
|
"is %d but should be 2",
|
||||||
section->name[0], section->name[1],
|
section->name[0], section->name[1],
|
||||||
section->name[2], section->name[3],
|
section->name[2], section->name[3], section->length);
|
||||||
section->length);
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
if (grub_file_read (section->file, &raw_value, 2) != 2)
|
if (grub_file_read (section->file, &raw_value, 2) != 2)
|
||||||
|
@ -430,7 +429,7 @@ grub_font_load (const char *filename)
|
||||||
grub_font_t font = 0;
|
grub_font_t font = 0;
|
||||||
|
|
||||||
#if FONT_DEBUG >= 1
|
#if FONT_DEBUG >= 1
|
||||||
grub_printf("add_font(%s)\n", filename);
|
grub_printf ("add_font(%s)\n", filename);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
file = grub_buffile_open (filename, 1024);
|
file = grub_buffile_open (filename, 1024);
|
||||||
|
@ -438,7 +437,7 @@ grub_font_load (const char *filename)
|
||||||
goto fail;
|
goto fail;
|
||||||
|
|
||||||
#if FONT_DEBUG >= 3
|
#if FONT_DEBUG >= 3
|
||||||
grub_printf("file opened\n");
|
grub_printf ("file opened\n");
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* Read the FILE section. It indicates the file format. */
|
/* Read the FILE section. It indicates the file format. */
|
||||||
|
@ -446,159 +445,166 @@ grub_font_load (const char *filename)
|
||||||
goto fail;
|
goto fail;
|
||||||
|
|
||||||
#if FONT_DEBUG >= 3
|
#if FONT_DEBUG >= 3
|
||||||
grub_printf("opened FILE section\n");
|
grub_printf ("opened FILE section\n");
|
||||||
#endif
|
#endif
|
||||||
if (grub_memcmp (section.name, FONT_FORMAT_SECTION_NAMES_FILE,
|
if (grub_memcmp (section.name, FONT_FORMAT_SECTION_NAMES_FILE,
|
||||||
sizeof(FONT_FORMAT_SECTION_NAMES_FILE) - 1) != 0)
|
sizeof (FONT_FORMAT_SECTION_NAMES_FILE) - 1) != 0)
|
||||||
{
|
{
|
||||||
grub_error (GRUB_ERR_BAD_FONT,
|
grub_error (GRUB_ERR_BAD_FONT,
|
||||||
"font file format error: 1st section must be FILE");
|
"font file format error: 1st section must be FILE");
|
||||||
goto fail;
|
goto fail;
|
||||||
}
|
}
|
||||||
|
|
||||||
#if FONT_DEBUG >= 3
|
#if FONT_DEBUG >= 3
|
||||||
grub_printf("section name ok\n");
|
grub_printf ("section name ok\n");
|
||||||
#endif
|
#endif
|
||||||
if (section.length != 4)
|
if (section.length != 4)
|
||||||
{
|
{
|
||||||
grub_error (GRUB_ERR_BAD_FONT,
|
grub_error (GRUB_ERR_BAD_FONT,
|
||||||
"font file format error (file type ID length is %d "
|
"font file format error (file type ID length is %d "
|
||||||
"but should be 4)", section.length);
|
"but should be 4)", section.length);
|
||||||
goto fail;
|
goto fail;
|
||||||
}
|
}
|
||||||
|
|
||||||
#if FONT_DEBUG >= 3
|
#if FONT_DEBUG >= 3
|
||||||
grub_printf("section length ok\n");
|
grub_printf ("section length ok\n");
|
||||||
#endif
|
#endif
|
||||||
/* Check the file format type code. */
|
/* Check the file format type code. */
|
||||||
if (grub_file_read (file, magic, 4) != 4)
|
if (grub_file_read (file, magic, 4) != 4)
|
||||||
goto fail;
|
goto fail;
|
||||||
|
|
||||||
#if FONT_DEBUG >= 3
|
#if FONT_DEBUG >= 3
|
||||||
grub_printf("read magic ok\n");
|
grub_printf ("read magic ok\n");
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
if (grub_memcmp (magic, FONT_FORMAT_PFF2_MAGIC, 4) != 0)
|
if (grub_memcmp (magic, FONT_FORMAT_PFF2_MAGIC, 4) != 0)
|
||||||
{
|
{
|
||||||
grub_error (GRUB_ERR_BAD_FONT, "invalid font magic %x %x %x %x",
|
grub_error (GRUB_ERR_BAD_FONT, "invalid font magic %x %x %x %x",
|
||||||
magic[0], magic[1], magic[2], magic[3]);
|
magic[0], magic[1], magic[2], magic[3]);
|
||||||
goto fail;
|
goto fail;
|
||||||
}
|
}
|
||||||
|
|
||||||
#if FONT_DEBUG >= 3
|
#if FONT_DEBUG >= 3
|
||||||
grub_printf("compare magic ok\n");
|
grub_printf ("compare magic ok\n");
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* Allocate the font object. */
|
/* Allocate the font object. */
|
||||||
font = (grub_font_t) grub_malloc (sizeof (struct grub_font));
|
font = (grub_font_t) grub_malloc (sizeof (struct grub_font));
|
||||||
if (! font)
|
if (!font)
|
||||||
goto fail;
|
goto fail;
|
||||||
|
|
||||||
font_init (font);
|
font_init (font);
|
||||||
font->file = file;
|
font->file = file;
|
||||||
|
|
||||||
#if FONT_DEBUG >= 3
|
#if FONT_DEBUG >= 3
|
||||||
grub_printf("allocate font ok; loading font info\n");
|
grub_printf ("allocate font ok; loading font info\n");
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* Load the font information. */
|
/* Load the font information. */
|
||||||
while (1)
|
while (1)
|
||||||
{
|
{
|
||||||
if (open_section (file, §ion) != 0)
|
if (open_section (file, §ion) != 0)
|
||||||
{
|
{
|
||||||
if (section.eof)
|
if (section.eof)
|
||||||
break; /* Done reading the font file. */
|
break; /* Done reading the font file. */
|
||||||
else
|
else
|
||||||
goto fail;
|
goto fail;
|
||||||
}
|
}
|
||||||
|
|
||||||
#if FONT_DEBUG >= 2
|
#if FONT_DEBUG >= 2
|
||||||
grub_printf("opened section %c%c%c%c ok\n",
|
grub_printf ("opened section %c%c%c%c ok\n",
|
||||||
section.name[0], section.name[1],
|
section.name[0], section.name[1],
|
||||||
section.name[2], section.name[3]);
|
section.name[2], section.name[3]);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
if (grub_memcmp (section.name, FONT_FORMAT_SECTION_NAMES_FONT_NAME,
|
if (grub_memcmp (section.name, FONT_FORMAT_SECTION_NAMES_FONT_NAME,
|
||||||
sizeof(FONT_FORMAT_SECTION_NAMES_FONT_NAME) - 1) == 0)
|
sizeof (FONT_FORMAT_SECTION_NAMES_FONT_NAME) - 1) == 0)
|
||||||
{
|
{
|
||||||
font->name = read_section_as_string (§ion);
|
font->name = read_section_as_string (§ion);
|
||||||
if (!font->name)
|
if (!font->name)
|
||||||
goto fail;
|
goto fail;
|
||||||
}
|
}
|
||||||
else if (grub_memcmp (section.name,
|
else if (grub_memcmp (section.name,
|
||||||
FONT_FORMAT_SECTION_NAMES_POINT_SIZE,
|
FONT_FORMAT_SECTION_NAMES_POINT_SIZE,
|
||||||
sizeof(FONT_FORMAT_SECTION_NAMES_POINT_SIZE) - 1) == 0)
|
sizeof (FONT_FORMAT_SECTION_NAMES_POINT_SIZE) -
|
||||||
{
|
1) == 0)
|
||||||
if (read_section_as_short (§ion, &font->point_size) != 0)
|
{
|
||||||
goto fail;
|
if (read_section_as_short (§ion, &font->point_size) != 0)
|
||||||
}
|
goto fail;
|
||||||
|
}
|
||||||
else if (grub_memcmp (section.name, FONT_FORMAT_SECTION_NAMES_WEIGHT,
|
else if (grub_memcmp (section.name, FONT_FORMAT_SECTION_NAMES_WEIGHT,
|
||||||
sizeof(FONT_FORMAT_SECTION_NAMES_WEIGHT) - 1) == 0)
|
sizeof (FONT_FORMAT_SECTION_NAMES_WEIGHT) - 1)
|
||||||
{
|
== 0)
|
||||||
char *wt;
|
{
|
||||||
wt = read_section_as_string (§ion);
|
char *wt;
|
||||||
if (!wt)
|
wt = read_section_as_string (§ion);
|
||||||
continue;
|
if (!wt)
|
||||||
/* Convert the weight string 'normal' or 'bold' into a number. */
|
continue;
|
||||||
if (grub_strcmp (wt, "normal") == 0)
|
/* Convert the weight string 'normal' or 'bold' into a number. */
|
||||||
font->weight = FONT_WEIGHT_NORMAL;
|
if (grub_strcmp (wt, "normal") == 0)
|
||||||
else if (grub_strcmp (wt, "bold") == 0)
|
font->weight = FONT_WEIGHT_NORMAL;
|
||||||
font->weight = FONT_WEIGHT_BOLD;
|
else if (grub_strcmp (wt, "bold") == 0)
|
||||||
grub_free (wt);
|
font->weight = FONT_WEIGHT_BOLD;
|
||||||
}
|
grub_free (wt);
|
||||||
|
}
|
||||||
else if (grub_memcmp (section.name,
|
else if (grub_memcmp (section.name,
|
||||||
FONT_FORMAT_SECTION_NAMES_MAX_CHAR_WIDTH,
|
FONT_FORMAT_SECTION_NAMES_MAX_CHAR_WIDTH,
|
||||||
sizeof(FONT_FORMAT_SECTION_NAMES_MAX_CHAR_WIDTH) - 1) == 0)
|
sizeof (FONT_FORMAT_SECTION_NAMES_MAX_CHAR_WIDTH)
|
||||||
{
|
- 1) == 0)
|
||||||
if (read_section_as_short (§ion, &font->max_char_width) != 0)
|
{
|
||||||
goto fail;
|
if (read_section_as_short (§ion, &font->max_char_width) != 0)
|
||||||
}
|
goto fail;
|
||||||
|
}
|
||||||
else if (grub_memcmp (section.name,
|
else if (grub_memcmp (section.name,
|
||||||
FONT_FORMAT_SECTION_NAMES_MAX_CHAR_HEIGHT,
|
FONT_FORMAT_SECTION_NAMES_MAX_CHAR_HEIGHT,
|
||||||
sizeof(FONT_FORMAT_SECTION_NAMES_MAX_CHAR_HEIGHT) - 1) == 0)
|
sizeof (FONT_FORMAT_SECTION_NAMES_MAX_CHAR_HEIGHT)
|
||||||
{
|
- 1) == 0)
|
||||||
if (read_section_as_short (§ion, &font->max_char_height) != 0)
|
{
|
||||||
goto fail;
|
if (read_section_as_short (§ion, &font->max_char_height) != 0)
|
||||||
}
|
goto fail;
|
||||||
|
}
|
||||||
else if (grub_memcmp (section.name,
|
else if (grub_memcmp (section.name,
|
||||||
FONT_FORMAT_SECTION_NAMES_ASCENT,
|
FONT_FORMAT_SECTION_NAMES_ASCENT,
|
||||||
sizeof(FONT_FORMAT_SECTION_NAMES_ASCENT) - 1) == 0)
|
sizeof (FONT_FORMAT_SECTION_NAMES_ASCENT) - 1)
|
||||||
{
|
== 0)
|
||||||
if (read_section_as_short (§ion, &font->ascent) != 0)
|
{
|
||||||
goto fail;
|
if (read_section_as_short (§ion, &font->ascent) != 0)
|
||||||
}
|
goto fail;
|
||||||
|
}
|
||||||
else if (grub_memcmp (section.name, FONT_FORMAT_SECTION_NAMES_DESCENT,
|
else if (grub_memcmp (section.name, FONT_FORMAT_SECTION_NAMES_DESCENT,
|
||||||
sizeof(FONT_FORMAT_SECTION_NAMES_DESCENT) - 1) == 0)
|
sizeof (FONT_FORMAT_SECTION_NAMES_DESCENT) - 1)
|
||||||
{
|
== 0)
|
||||||
if (read_section_as_short (§ion, &font->descent) != 0)
|
{
|
||||||
goto fail;
|
if (read_section_as_short (§ion, &font->descent) != 0)
|
||||||
}
|
goto fail;
|
||||||
|
}
|
||||||
else if (grub_memcmp (section.name,
|
else if (grub_memcmp (section.name,
|
||||||
FONT_FORMAT_SECTION_NAMES_CHAR_INDEX,
|
FONT_FORMAT_SECTION_NAMES_CHAR_INDEX,
|
||||||
sizeof(FONT_FORMAT_SECTION_NAMES_CHAR_INDEX) - 1) == 0)
|
sizeof (FONT_FORMAT_SECTION_NAMES_CHAR_INDEX) -
|
||||||
{
|
1) == 0)
|
||||||
if (load_font_index (file, section.length, font) != 0)
|
{
|
||||||
goto fail;
|
if (load_font_index (file, section.length, font) != 0)
|
||||||
}
|
goto fail;
|
||||||
|
}
|
||||||
else if (grub_memcmp (section.name, FONT_FORMAT_SECTION_NAMES_DATA,
|
else if (grub_memcmp (section.name, FONT_FORMAT_SECTION_NAMES_DATA,
|
||||||
sizeof(FONT_FORMAT_SECTION_NAMES_DATA) - 1) == 0)
|
sizeof (FONT_FORMAT_SECTION_NAMES_DATA) - 1) == 0)
|
||||||
{
|
{
|
||||||
/* When the DATA section marker is reached, we stop reading. */
|
/* When the DATA section marker is reached, we stop reading. */
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
/* Unhandled section type, simply skip past it. */
|
/* Unhandled section type, simply skip past it. */
|
||||||
#if FONT_DEBUG >= 3
|
#if FONT_DEBUG >= 3
|
||||||
grub_printf("Unhandled section type, skipping.\n");
|
grub_printf ("Unhandled section type, skipping.\n");
|
||||||
#endif
|
#endif
|
||||||
grub_off_t section_end = grub_file_tell (file) + section.length;
|
grub_off_t section_end = grub_file_tell (file) + section.length;
|
||||||
if ((int) grub_file_seek (file, section_end) == -1)
|
if ((int) grub_file_seek (file, section_end) == -1)
|
||||||
goto fail;
|
goto fail;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (! font->name)
|
if (!font->name)
|
||||||
{
|
{
|
||||||
grub_printf ("Note: Font has no name.\n");
|
grub_printf ("Note: Font has no name.\n");
|
||||||
font->name = grub_strdup ("Unknown");
|
font->name = grub_strdup ("Unknown");
|
||||||
|
@ -606,22 +612,19 @@ grub_font_load (const char *filename)
|
||||||
|
|
||||||
#if FONT_DEBUG >= 1
|
#if FONT_DEBUG >= 1
|
||||||
grub_printf ("Loaded font `%s'.\n"
|
grub_printf ("Loaded font `%s'.\n"
|
||||||
"Ascent=%d Descent=%d MaxW=%d MaxH=%d Number of characters=%d.\n",
|
"Ascent=%d Descent=%d MaxW=%d MaxH=%d Number of characters=%d.\n",
|
||||||
font->name,
|
font->name,
|
||||||
font->ascent, font->descent,
|
font->ascent, font->descent,
|
||||||
font->max_char_width, font->max_char_height,
|
font->max_char_width, font->max_char_height, font->num_chars);
|
||||||
font->num_chars);
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
if (font->max_char_width == 0
|
if (font->max_char_width == 0
|
||||||
|| font->max_char_height == 0
|
|| font->max_char_height == 0
|
||||||
|| font->num_chars == 0
|
|| font->num_chars == 0
|
||||||
|| font->char_index == 0
|
|| font->char_index == 0 || font->ascent == 0 || font->descent == 0)
|
||||||
|| font->ascent == 0
|
|
||||||
|| font->descent == 0)
|
|
||||||
{
|
{
|
||||||
grub_error (GRUB_ERR_BAD_FONT,
|
grub_error (GRUB_ERR_BAD_FONT,
|
||||||
"invalid font file: missing some required data");
|
"invalid font file: missing some required data");
|
||||||
goto fail;
|
goto fail;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -679,18 +682,18 @@ find_glyph (const grub_font_t font, grub_uint32_t code)
|
||||||
lo = 0;
|
lo = 0;
|
||||||
hi = font->num_chars - 1;
|
hi = font->num_chars - 1;
|
||||||
|
|
||||||
if (! table)
|
if (!table)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
while (lo <= hi)
|
while (lo <= hi)
|
||||||
{
|
{
|
||||||
mid = lo + (hi - lo) / 2;
|
mid = lo + (hi - lo) / 2;
|
||||||
if (code < table[mid].code)
|
if (code < table[mid].code)
|
||||||
hi = mid - 1;
|
hi = mid - 1;
|
||||||
else if (code > table[mid].code)
|
else if (code > table[mid].code)
|
||||||
lo = mid + 1;
|
lo = mid + 1;
|
||||||
else
|
else
|
||||||
return &table[mid];
|
return &table[mid];
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -716,12 +719,12 @@ grub_font_get_glyph_internal (grub_font_t font, grub_uint32_t code)
|
||||||
int len;
|
int len;
|
||||||
|
|
||||||
if (index_entry->glyph)
|
if (index_entry->glyph)
|
||||||
/* Return cached glyph. */
|
/* Return cached glyph. */
|
||||||
return index_entry->glyph;
|
return index_entry->glyph;
|
||||||
|
|
||||||
if (! font->file)
|
if (!font->file)
|
||||||
/* No open file, can't load any glyphs. */
|
/* No open file, can't load any glyphs. */
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
/* Make sure we can find glyphs for error messages. Push active
|
/* Make sure we can find glyphs for error messages. Push active
|
||||||
error message to error stack and reset error message. */
|
error message to error stack and reset error message. */
|
||||||
|
@ -730,23 +733,23 @@ grub_font_get_glyph_internal (grub_font_t font, grub_uint32_t code)
|
||||||
grub_file_seek (font->file, index_entry->offset);
|
grub_file_seek (font->file, index_entry->offset);
|
||||||
|
|
||||||
/* Read the glyph width, height, and baseline. */
|
/* Read the glyph width, height, and baseline. */
|
||||||
if (read_be_uint16(font->file, &width) != 0
|
if (read_be_uint16 (font->file, &width) != 0
|
||||||
|| read_be_uint16(font->file, &height) != 0
|
|| read_be_uint16 (font->file, &height) != 0
|
||||||
|| read_be_int16(font->file, &xoff) != 0
|
|| read_be_int16 (font->file, &xoff) != 0
|
||||||
|| read_be_int16(font->file, &yoff) != 0
|
|| read_be_int16 (font->file, &yoff) != 0
|
||||||
|| read_be_int16(font->file, &dwidth) != 0)
|
|| read_be_int16 (font->file, &dwidth) != 0)
|
||||||
{
|
{
|
||||||
remove_font (font);
|
remove_font (font);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
len = (width * height + 7) / 8;
|
len = (width * height + 7) / 8;
|
||||||
glyph = grub_malloc (sizeof (struct grub_font_glyph) + len);
|
glyph = grub_malloc (sizeof (struct grub_font_glyph) + len);
|
||||||
if (! glyph)
|
if (!glyph)
|
||||||
{
|
{
|
||||||
remove_font (font);
|
remove_font (font);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
glyph->font = font;
|
glyph->font = font;
|
||||||
glyph->width = width;
|
glyph->width = width;
|
||||||
|
@ -757,13 +760,13 @@ grub_font_get_glyph_internal (grub_font_t font, grub_uint32_t code)
|
||||||
|
|
||||||
/* Don't try to read empty bitmaps (e.g., space characters). */
|
/* Don't try to read empty bitmaps (e.g., space characters). */
|
||||||
if (len != 0)
|
if (len != 0)
|
||||||
{
|
{
|
||||||
if (grub_file_read (font->file, glyph->bitmap, len) != len)
|
if (grub_file_read (font->file, glyph->bitmap, len) != len)
|
||||||
{
|
{
|
||||||
remove_font (font);
|
remove_font (font);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Restore old error message. */
|
/* Restore old error message. */
|
||||||
grub_error_pop ();
|
grub_error_pop ();
|
||||||
|
@ -787,7 +790,7 @@ free_font (grub_font_t font)
|
||||||
if (font)
|
if (font)
|
||||||
{
|
{
|
||||||
if (font->file)
|
if (font->file)
|
||||||
grub_file_close (font->file);
|
grub_file_close (font->file);
|
||||||
grub_free (font->name);
|
grub_free (font->name);
|
||||||
grub_free (font->family);
|
grub_free (font->family);
|
||||||
grub_free (font->char_index);
|
grub_free (font->char_index);
|
||||||
|
@ -804,7 +807,7 @@ register_font (grub_font_t font)
|
||||||
struct grub_font_node *node = 0;
|
struct grub_font_node *node = 0;
|
||||||
|
|
||||||
node = grub_malloc (sizeof (struct grub_font_node));
|
node = grub_malloc (sizeof (struct grub_font_node));
|
||||||
if (! node)
|
if (!node)
|
||||||
return 1;
|
return 1;
|
||||||
|
|
||||||
node->value = font;
|
node->value = font;
|
||||||
|
@ -822,18 +825,17 @@ remove_font (grub_font_t font)
|
||||||
struct grub_font_node **nextp, *cur;
|
struct grub_font_node **nextp, *cur;
|
||||||
|
|
||||||
for (nextp = &grub_font_list, cur = *nextp;
|
for (nextp = &grub_font_list, cur = *nextp;
|
||||||
cur;
|
cur; nextp = &cur->next, cur = cur->next)
|
||||||
nextp = &cur->next, cur = cur->next)
|
|
||||||
{
|
{
|
||||||
if (cur->value == font)
|
if (cur->value == font)
|
||||||
{
|
{
|
||||||
*nextp = cur->next;
|
*nextp = cur->next;
|
||||||
|
|
||||||
/* Free the node, but not the font itself. */
|
/* Free the node, but not the font itself. */
|
||||||
grub_free (cur);
|
grub_free (cur);
|
||||||
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -850,7 +852,7 @@ grub_font_get (const char *font_name)
|
||||||
{
|
{
|
||||||
grub_font_t font = node->value;
|
grub_font_t font = node->value;
|
||||||
if (grub_strcmp (font->name, font_name) == 0)
|
if (grub_strcmp (font->name, font_name) == 0)
|
||||||
return font;
|
return font;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* If no font by that name is found, return the first font in the list
|
/* If no font by that name is found, return the first font in the list
|
||||||
|
@ -927,7 +929,7 @@ grub_font_get_string_width (grub_font_t font, const char *str)
|
||||||
const grub_uint8_t *ptr;
|
const grub_uint8_t *ptr;
|
||||||
|
|
||||||
for (ptr = (const grub_uint8_t *) str, width = 0;
|
for (ptr = (const grub_uint8_t *) str, width = 0;
|
||||||
grub_utf8_to_ucs4 (&code, 1, ptr, -1, &ptr) > 0; )
|
grub_utf8_to_ucs4 (&code, 1, ptr, -1, &ptr) > 0;)
|
||||||
{
|
{
|
||||||
glyph = grub_font_get_glyph_with_fallback (font, code);
|
glyph = grub_font_get_glyph_with_fallback (font, code);
|
||||||
width += glyph->device_width;
|
width += glyph->device_width;
|
||||||
|
@ -961,7 +963,7 @@ grub_font_get_glyph (grub_font_t font, grub_uint32_t code)
|
||||||
sizes are used so that tiny 8 point glyphs are not mixed into a string
|
sizes are used so that tiny 8 point glyphs are not mixed into a string
|
||||||
of 24 point text unless there is no other choice. */
|
of 24 point text unless there is no other choice. */
|
||||||
static int
|
static int
|
||||||
get_font_diversity(grub_font_t a, grub_font_t b)
|
get_font_diversity (grub_font_t a, grub_font_t b)
|
||||||
{
|
{
|
||||||
int d;
|
int d;
|
||||||
|
|
||||||
|
@ -1011,7 +1013,7 @@ grub_font_get_glyph_with_fallback (grub_font_t font, grub_uint32_t code)
|
||||||
/* First try to get the glyph from the specified font. */
|
/* First try to get the glyph from the specified font. */
|
||||||
glyph = grub_font_get_glyph_internal (font, code);
|
glyph = grub_font_get_glyph_internal (font, code);
|
||||||
if (glyph)
|
if (glyph)
|
||||||
return glyph;
|
return glyph;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Otherwise, search all loaded fonts for the glyph and use the one from
|
/* Otherwise, search all loaded fonts for the glyph and use the one from
|
||||||
|
@ -1028,16 +1030,16 @@ grub_font_get_glyph_with_fallback (grub_font_t font, grub_uint32_t code)
|
||||||
|
|
||||||
glyph = grub_font_get_glyph_internal (curfont, code);
|
glyph = grub_font_get_glyph_internal (curfont, code);
|
||||||
if (glyph)
|
if (glyph)
|
||||||
{
|
{
|
||||||
int d;
|
int d;
|
||||||
|
|
||||||
d = get_font_diversity (curfont, font);
|
d = get_font_diversity (curfont, font);
|
||||||
if (d < best_diversity)
|
if (d < best_diversity)
|
||||||
{
|
{
|
||||||
best_diversity = d;
|
best_diversity = d;
|
||||||
best_glyph = glyph;
|
best_glyph = glyph;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (best_glyph)
|
if (best_glyph)
|
||||||
|
@ -1052,9 +1054,8 @@ grub_font_get_glyph_with_fallback (grub_font_t font, grub_uint32_t code)
|
||||||
baseline of the character, while the x coordinate designates the left
|
baseline of the character, while the x coordinate designates the left
|
||||||
side location of the character. */
|
side location of the character. */
|
||||||
grub_err_t
|
grub_err_t
|
||||||
grub_font_draw_glyph (struct grub_font_glyph *glyph,
|
grub_font_draw_glyph (struct grub_font_glyph * glyph,
|
||||||
grub_video_color_t color,
|
grub_video_color_t color, int left_x, int baseline_y)
|
||||||
int left_x, int baseline_y)
|
|
||||||
{
|
{
|
||||||
struct grub_video_bitmap glyph_bitmap;
|
struct grub_video_bitmap glyph_bitmap;
|
||||||
|
|
||||||
|
@ -1065,8 +1066,7 @@ grub_font_draw_glyph (struct grub_font_glyph *glyph,
|
||||||
glyph_bitmap.mode_info.width = glyph->width;
|
glyph_bitmap.mode_info.width = glyph->width;
|
||||||
glyph_bitmap.mode_info.height = glyph->height;
|
glyph_bitmap.mode_info.height = glyph->height;
|
||||||
glyph_bitmap.mode_info.mode_type =
|
glyph_bitmap.mode_info.mode_type =
|
||||||
(1 << GRUB_VIDEO_MODE_TYPE_DEPTH_POS)
|
(1 << GRUB_VIDEO_MODE_TYPE_DEPTH_POS) | GRUB_VIDEO_MODE_TYPE_1BIT_BITMAP;
|
||||||
| GRUB_VIDEO_MODE_TYPE_1BIT_BITMAP;
|
|
||||||
glyph_bitmap.mode_info.blit_format = GRUB_VIDEO_BLIT_FORMAT_1BIT_PACKED;
|
glyph_bitmap.mode_info.blit_format = GRUB_VIDEO_BLIT_FORMAT_1BIT_PACKED;
|
||||||
glyph_bitmap.mode_info.bpp = 1;
|
glyph_bitmap.mode_info.bpp = 1;
|
||||||
|
|
||||||
|
@ -1081,11 +1081,11 @@ grub_font_draw_glyph (struct grub_font_glyph *glyph,
|
||||||
glyph_bitmap.mode_info.bg_green = 0;
|
glyph_bitmap.mode_info.bg_green = 0;
|
||||||
glyph_bitmap.mode_info.bg_blue = 0;
|
glyph_bitmap.mode_info.bg_blue = 0;
|
||||||
glyph_bitmap.mode_info.bg_alpha = 0;
|
glyph_bitmap.mode_info.bg_alpha = 0;
|
||||||
grub_video_unmap_color(color,
|
grub_video_unmap_color (color,
|
||||||
&glyph_bitmap.mode_info.fg_red,
|
&glyph_bitmap.mode_info.fg_red,
|
||||||
&glyph_bitmap.mode_info.fg_green,
|
&glyph_bitmap.mode_info.fg_green,
|
||||||
&glyph_bitmap.mode_info.fg_blue,
|
&glyph_bitmap.mode_info.fg_blue,
|
||||||
&glyph_bitmap.mode_info.fg_alpha);
|
&glyph_bitmap.mode_info.fg_alpha);
|
||||||
glyph_bitmap.data = glyph->bitmap;
|
glyph_bitmap.data = glyph->bitmap;
|
||||||
|
|
||||||
int bitmap_left = left_x + glyph->offset_x;
|
int bitmap_left = left_x + glyph->offset_x;
|
||||||
|
@ -1093,9 +1093,8 @@ grub_font_draw_glyph (struct grub_font_glyph *glyph,
|
||||||
int bitmap_top = bitmap_bottom - glyph->height;
|
int bitmap_top = bitmap_bottom - glyph->height;
|
||||||
|
|
||||||
return grub_video_blit_bitmap (&glyph_bitmap, GRUB_VIDEO_BLIT_BLEND,
|
return grub_video_blit_bitmap (&glyph_bitmap, GRUB_VIDEO_BLIT_BLEND,
|
||||||
bitmap_left, bitmap_top,
|
bitmap_left, bitmap_top,
|
||||||
0, 0,
|
0, 0, glyph->width, glyph->height);
|
||||||
glyph->width, glyph->height);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Draw a UTF-8 string of text on the current video render target.
|
/* Draw a UTF-8 string of text on the current video render target.
|
||||||
|
@ -1105,8 +1104,7 @@ grub_font_draw_glyph (struct grub_font_glyph *glyph,
|
||||||
a glyph from another loaded font may be used instead. */
|
a glyph from another loaded font may be used instead. */
|
||||||
grub_err_t
|
grub_err_t
|
||||||
grub_font_draw_string (const char *str, grub_font_t font,
|
grub_font_draw_string (const char *str, grub_font_t font,
|
||||||
grub_video_color_t color,
|
grub_video_color_t color, int left_x, int baseline_y)
|
||||||
int left_x, int baseline_y)
|
|
||||||
{
|
{
|
||||||
int x;
|
int x;
|
||||||
struct grub_font_glyph *glyph;
|
struct grub_font_glyph *glyph;
|
||||||
|
@ -1114,15 +1112,13 @@ grub_font_draw_string (const char *str, grub_font_t font,
|
||||||
const grub_uint8_t *ptr;
|
const grub_uint8_t *ptr;
|
||||||
|
|
||||||
for (ptr = (const grub_uint8_t *) str, x = left_x;
|
for (ptr = (const grub_uint8_t *) str, x = left_x;
|
||||||
grub_utf8_to_ucs4 (&code, 1, ptr, -1, &ptr) > 0; )
|
grub_utf8_to_ucs4 (&code, 1, ptr, -1, &ptr) > 0;)
|
||||||
{
|
{
|
||||||
glyph = grub_font_get_glyph_with_fallback (font, code);
|
glyph = grub_font_get_glyph_with_fallback (font, code);
|
||||||
if (grub_font_draw_glyph (glyph, color, x, baseline_y)
|
if (grub_font_draw_glyph (glyph, color, x, baseline_y) != GRUB_ERR_NONE)
|
||||||
!= GRUB_ERR_NONE)
|
return grub_errno;
|
||||||
return grub_errno;
|
|
||||||
x += glyph->device_width;
|
x += glyph->device_width;
|
||||||
}
|
}
|
||||||
|
|
||||||
return GRUB_ERR_NONE;
|
return GRUB_ERR_NONE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
34
genmk.rb
34
genmk.rb
|
@ -143,7 +143,7 @@ mostlyclean-module-#{@name}.#{@rule_count}:
|
||||||
MOSTLYCLEAN_MODULE_TARGETS += mostlyclean-module-#{@name}.#{@rule_count}
|
MOSTLYCLEAN_MODULE_TARGETS += mostlyclean-module-#{@name}.#{@rule_count}
|
||||||
UNDSYMFILES += #{undsym}
|
UNDSYMFILES += #{undsym}
|
||||||
|
|
||||||
ifeq ($(TARGET_NO_DYNAMIC_MODULES), yes)
|
ifeq ($(TARGET_NO_MODULES), yes)
|
||||||
#{@name}: #{pre_obj} $(TARGET_OBJ2ELF)
|
#{@name}: #{pre_obj} $(TARGET_OBJ2ELF)
|
||||||
-rm -f $@
|
-rm -f $@
|
||||||
$(TARGET_CC) $(#{prefix}_LDFLAGS) $(TARGET_LDFLAGS) -Wl,-r,-d -o $@ #{pre_obj}
|
$(TARGET_CC) $(#{prefix}_LDFLAGS) $(TARGET_LDFLAGS) -Wl,-r,-d -o $@ #{pre_obj}
|
||||||
|
@ -322,28 +322,32 @@ class Program
|
||||||
end
|
end
|
||||||
attr_reader :dir, :name
|
attr_reader :dir, :name
|
||||||
|
|
||||||
|
def print_tail()
|
||||||
|
prefix = @name.to_var
|
||||||
|
print "CLEANFILES += #{@name} $(#{prefix}_OBJECTS)
|
||||||
|
ifeq ($(#{prefix}_RELOCATABLE),yes)
|
||||||
|
#{@name}: $(#{prefix}_DEPENDENCIES) $(#{prefix}_OBJECTS)
|
||||||
|
$(TARGET_CC) -Wl,-r,-d -o $@ $(#{prefix}_OBJECTS) $(TARGET_LDFLAGS) $(#{prefix}_LDFLAGS)
|
||||||
|
if test x$(TARGET_NO_STRIP) != xyes ; then $(STRIP) --strip-unneeded -K start -R .note -R .comment $@; fi
|
||||||
|
else
|
||||||
|
#{@name}: $(#{prefix}_DEPENDENCIES) $(#{prefix}_OBJECTS)
|
||||||
|
$(TARGET_CC) -o $@ $(#{prefix}_OBJECTS) $(TARGET_LDFLAGS) $(#{prefix}_LDFLAGS)
|
||||||
|
if test x$(TARGET_NO_STRIP) != xyes ; then $(STRIP) -R .rel.dyn -R .reginfo -R .note -R .comment $@; fi
|
||||||
|
endif
|
||||||
|
|
||||||
|
"
|
||||||
|
end
|
||||||
|
|
||||||
def rule(sources)
|
def rule(sources)
|
||||||
prefix = @name.to_var
|
prefix = @name.to_var
|
||||||
objs = sources.collect do |src|
|
objs = sources.collect do |src|
|
||||||
raise "unknown source file `#{src}'" if /\.[cS]$/ !~ src
|
raise "unknown source file `#{src}'" if /\.[cS]$/ !~ src
|
||||||
prefix + '-' + src.to_obj
|
prefix + '-' + src.to_obj
|
||||||
end
|
end
|
||||||
objs_str = objs.join(' ');
|
|
||||||
deps = objs.collect {|obj| obj.suffix('d')}
|
deps = objs.collect {|obj| obj.suffix('d')}
|
||||||
deps_str = deps.join(' ');
|
deps_str = deps.join(' ');
|
||||||
|
|
||||||
"CLEANFILES += #{@name} #{objs_str}
|
"MOSTLYCLEANFILES += #{deps_str}
|
||||||
MOSTLYCLEANFILES += #{deps_str}
|
|
||||||
|
|
||||||
ifeq ($(#{prefix}_RELOCATABLE),yes)
|
|
||||||
#{@name}: $(#{prefix}_DEPENDENCIES) #{objs_str}
|
|
||||||
$(TARGET_CC) -Wl,-r,-d -o $@ #{objs_str} $(TARGET_LDFLAGS) $(#{prefix}_LDFLAGS)
|
|
||||||
if test x$(TARGET_NO_STRIP) != xyes ; then $(STRIP) --strip-unneeded -K start -R .note -R .comment $@; fi
|
|
||||||
else
|
|
||||||
#{@name}: $(#{prefix}_DEPENDENCIES) #{objs_str}
|
|
||||||
$(TARGET_CC) -o $@ #{objs_str} $(TARGET_LDFLAGS) $(#{prefix}_LDFLAGS)
|
|
||||||
if test x$(TARGET_NO_STRIP) != xyes ; then $(STRIP) -R .rel.dyn -R .reginfo -R .note -R .comment $@; fi
|
|
||||||
endif
|
|
||||||
|
|
||||||
" + objs.collect_with_index do |obj, i|
|
" + objs.collect_with_index do |obj, i|
|
||||||
src = sources[i]
|
src = sources[i]
|
||||||
|
@ -358,6 +362,7 @@ endif
|
||||||
|
|
||||||
-include #{dep}
|
-include #{dep}
|
||||||
|
|
||||||
|
#{prefix}_OBJECTS += #{obj}
|
||||||
"
|
"
|
||||||
end.join('')
|
end.join('')
|
||||||
end
|
end
|
||||||
|
@ -466,4 +471,5 @@ while l = gets
|
||||||
|
|
||||||
end
|
end
|
||||||
utils.each {|util| util.print_tail()}
|
utils.each {|util| util.print_tail()}
|
||||||
|
programs.each {|program| program.print_tail()}
|
||||||
|
|
||||||
|
|
3877
gnulib/regcomp.c
Normal file
3877
gnulib/regcomp.c
Normal file
File diff suppressed because it is too large
Load diff
72
gnulib/regex.c
Normal file
72
gnulib/regex.c
Normal file
|
@ -0,0 +1,72 @@
|
||||||
|
/* Extended regular expression matching and search library.
|
||||||
|
Copyright (C) 2002, 2003, 2005, 2006, 2009, 2010 Free Software Foundation,
|
||||||
|
Inc.
|
||||||
|
This file is part of the GNU C Library.
|
||||||
|
Contributed by Isamu Hasegawa <isamu@yamato.ibm.com>.
|
||||||
|
|
||||||
|
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; either version 2, or (at your option)
|
||||||
|
any later version.
|
||||||
|
|
||||||
|
This program is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License along
|
||||||
|
with this program; if not, write to the Free Software Foundation,
|
||||||
|
Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
|
||||||
|
|
||||||
|
#include <config.h>
|
||||||
|
|
||||||
|
/* Make sure noone compiles this code with a C++ compiler. */
|
||||||
|
#if defined __cplusplus && defined _LIBC
|
||||||
|
# error "This is C code, use a C compiler"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef _LIBC
|
||||||
|
/* We have to keep the namespace clean. */
|
||||||
|
# define regfree(preg) __regfree (preg)
|
||||||
|
# define regexec(pr, st, nm, pm, ef) __regexec (pr, st, nm, pm, ef)
|
||||||
|
# define regcomp(preg, pattern, cflags) __regcomp (preg, pattern, cflags)
|
||||||
|
# define regerror(errcode, preg, errbuf, errbuf_size) \
|
||||||
|
__regerror(errcode, preg, errbuf, errbuf_size)
|
||||||
|
# define re_set_registers(bu, re, nu, st, en) \
|
||||||
|
__re_set_registers (bu, re, nu, st, en)
|
||||||
|
# define re_match_2(bufp, string1, size1, string2, size2, pos, regs, stop) \
|
||||||
|
__re_match_2 (bufp, string1, size1, string2, size2, pos, regs, stop)
|
||||||
|
# define re_match(bufp, string, size, pos, regs) \
|
||||||
|
__re_match (bufp, string, size, pos, regs)
|
||||||
|
# define re_search(bufp, string, size, startpos, range, regs) \
|
||||||
|
__re_search (bufp, string, size, startpos, range, regs)
|
||||||
|
# define re_compile_pattern(pattern, length, bufp) \
|
||||||
|
__re_compile_pattern (pattern, length, bufp)
|
||||||
|
# define re_set_syntax(syntax) __re_set_syntax (syntax)
|
||||||
|
# define re_search_2(bufp, st1, s1, st2, s2, startpos, range, regs, stop) \
|
||||||
|
__re_search_2 (bufp, st1, s1, st2, s2, startpos, range, regs, stop)
|
||||||
|
# define re_compile_fastmap(bufp) __re_compile_fastmap (bufp)
|
||||||
|
|
||||||
|
# include "../locale/localeinfo.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* On some systems, limits.h sets RE_DUP_MAX to a lower value than
|
||||||
|
GNU regex allows. Include it before <regex.h>, which correctly
|
||||||
|
#undefs RE_DUP_MAX and sets it to the right value. */
|
||||||
|
#include <limits.h>
|
||||||
|
|
||||||
|
#include <regex.h>
|
||||||
|
#include "regex_internal.h"
|
||||||
|
|
||||||
|
#include "regex_internal.c"
|
||||||
|
#include "regcomp.c"
|
||||||
|
#include "regexec.c"
|
||||||
|
|
||||||
|
/* Binary backward compatibility. */
|
||||||
|
#if _LIBC
|
||||||
|
# include <shlib-compat.h>
|
||||||
|
# if SHLIB_COMPAT (libc, GLIBC_2_0, GLIBC_2_3)
|
||||||
|
link_warning (re_max_failures, "the 're_max_failures' variable is obsolete and will go away.")
|
||||||
|
int re_max_failures = 2000;
|
||||||
|
# endif
|
||||||
|
#endif
|
676
gnulib/regex.h
Normal file
676
gnulib/regex.h
Normal file
|
@ -0,0 +1,676 @@
|
||||||
|
/* Definitions for data structures and routines for the regular
|
||||||
|
expression library.
|
||||||
|
Copyright (C) 1985, 1989, 1990, 1991, 1992, 1993, 1995, 1996, 1997, 1998,
|
||||||
|
2000, 2001, 2002, 2003, 2005, 2006, 2009, 2010 Free Software Foundation,
|
||||||
|
Inc.
|
||||||
|
This file is part of the GNU C Library.
|
||||||
|
|
||||||
|
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; either version 2, or (at your option)
|
||||||
|
any later version.
|
||||||
|
|
||||||
|
This program is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License along
|
||||||
|
with this program; if not, write to the Free Software Foundation,
|
||||||
|
Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
|
||||||
|
|
||||||
|
#ifndef _REGEX_H
|
||||||
|
#define _REGEX_H 1
|
||||||
|
|
||||||
|
#include <sys/types.h>
|
||||||
|
|
||||||
|
/* Allow the use in C++ code. */
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Define __USE_GNU_REGEX to declare GNU extensions that violate the
|
||||||
|
POSIX name space rules. */
|
||||||
|
#undef __USE_GNU_REGEX
|
||||||
|
#if (defined _GNU_SOURCE \
|
||||||
|
|| (!defined _POSIX_C_SOURCE && !defined _POSIX_SOURCE \
|
||||||
|
&& !defined _XOPEN_SOURCE))
|
||||||
|
# define __USE_GNU_REGEX 1
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef _REGEX_LARGE_OFFSETS
|
||||||
|
|
||||||
|
/* Use types and values that are wide enough to represent signed and
|
||||||
|
unsigned byte offsets in memory. This currently works only when
|
||||||
|
the regex code is used outside of the GNU C library; it is not yet
|
||||||
|
supported within glibc itself, and glibc users should not define
|
||||||
|
_REGEX_LARGE_OFFSETS. */
|
||||||
|
|
||||||
|
/* The type of the offset of a byte within a string.
|
||||||
|
For historical reasons POSIX 1003.1-2004 requires that regoff_t be
|
||||||
|
at least as wide as off_t. However, many common POSIX platforms set
|
||||||
|
regoff_t to the more-sensible ssize_t and the Open Group has
|
||||||
|
signalled its intention to change the requirement to be that
|
||||||
|
regoff_t be at least as wide as ptrdiff_t and ssize_t; see XBD ERN
|
||||||
|
60 (2005-08-25). We don't know of any hosts where ssize_t or
|
||||||
|
ptrdiff_t is wider than ssize_t, so ssize_t is safe. */
|
||||||
|
typedef ssize_t regoff_t;
|
||||||
|
|
||||||
|
/* The type of nonnegative object indexes. Traditionally, GNU regex
|
||||||
|
uses 'int' for these. Code that uses __re_idx_t should work
|
||||||
|
regardless of whether the type is signed. */
|
||||||
|
typedef size_t __re_idx_t;
|
||||||
|
|
||||||
|
/* The type of object sizes. */
|
||||||
|
typedef size_t __re_size_t;
|
||||||
|
|
||||||
|
/* The type of object sizes, in places where the traditional code
|
||||||
|
uses unsigned long int. */
|
||||||
|
typedef size_t __re_long_size_t;
|
||||||
|
|
||||||
|
#else
|
||||||
|
|
||||||
|
/* Use types that are binary-compatible with the traditional GNU regex
|
||||||
|
implementation, which mishandles strings longer than INT_MAX. */
|
||||||
|
|
||||||
|
typedef int regoff_t;
|
||||||
|
typedef int __re_idx_t;
|
||||||
|
typedef unsigned int __re_size_t;
|
||||||
|
typedef unsigned long int __re_long_size_t;
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* The following two types have to be signed and unsigned integer type
|
||||||
|
wide enough to hold a value of a pointer. For most ANSI compilers
|
||||||
|
ptrdiff_t and size_t should be likely OK. Still size of these two
|
||||||
|
types is 2 for Microsoft C. Ugh... */
|
||||||
|
typedef long int s_reg_t;
|
||||||
|
typedef unsigned long int active_reg_t;
|
||||||
|
|
||||||
|
/* The following bits are used to determine the regexp syntax we
|
||||||
|
recognize. The set/not-set meanings are chosen so that Emacs syntax
|
||||||
|
remains the value 0. The bits are given in alphabetical order, and
|
||||||
|
the definitions shifted by one from the previous bit; thus, when we
|
||||||
|
add or remove a bit, only one other definition need change. */
|
||||||
|
typedef unsigned long int reg_syntax_t;
|
||||||
|
|
||||||
|
#ifdef __USE_GNU_REGEX
|
||||||
|
|
||||||
|
/* If this bit is not set, then \ inside a bracket expression is literal.
|
||||||
|
If set, then such a \ quotes the following character. */
|
||||||
|
# define RE_BACKSLASH_ESCAPE_IN_LISTS ((unsigned long int) 1)
|
||||||
|
|
||||||
|
/* If this bit is not set, then + and ? are operators, and \+ and \? are
|
||||||
|
literals.
|
||||||
|
If set, then \+ and \? are operators and + and ? are literals. */
|
||||||
|
# define RE_BK_PLUS_QM (RE_BACKSLASH_ESCAPE_IN_LISTS << 1)
|
||||||
|
|
||||||
|
/* If this bit is set, then character classes are supported. They are:
|
||||||
|
[:alpha:], [:upper:], [:lower:], [:digit:], [:alnum:], [:xdigit:],
|
||||||
|
[:space:], [:print:], [:punct:], [:graph:], and [:cntrl:].
|
||||||
|
If not set, then character classes are not supported. */
|
||||||
|
# define RE_CHAR_CLASSES (RE_BK_PLUS_QM << 1)
|
||||||
|
|
||||||
|
/* If this bit is set, then ^ and $ are always anchors (outside bracket
|
||||||
|
expressions, of course).
|
||||||
|
If this bit is not set, then it depends:
|
||||||
|
^ is an anchor if it is at the beginning of a regular
|
||||||
|
expression or after an open-group or an alternation operator;
|
||||||
|
$ is an anchor if it is at the end of a regular expression, or
|
||||||
|
before a close-group or an alternation operator.
|
||||||
|
|
||||||
|
This bit could be (re)combined with RE_CONTEXT_INDEP_OPS, because
|
||||||
|
POSIX draft 11.2 says that * etc. in leading positions is undefined.
|
||||||
|
We already implemented a previous draft which made those constructs
|
||||||
|
invalid, though, so we haven't changed the code back. */
|
||||||
|
# define RE_CONTEXT_INDEP_ANCHORS (RE_CHAR_CLASSES << 1)
|
||||||
|
|
||||||
|
/* If this bit is set, then special characters are always special
|
||||||
|
regardless of where they are in the pattern.
|
||||||
|
If this bit is not set, then special characters are special only in
|
||||||
|
some contexts; otherwise they are ordinary. Specifically,
|
||||||
|
* + ? and intervals are only special when not after the beginning,
|
||||||
|
open-group, or alternation operator. */
|
||||||
|
# define RE_CONTEXT_INDEP_OPS (RE_CONTEXT_INDEP_ANCHORS << 1)
|
||||||
|
|
||||||
|
/* If this bit is set, then *, +, ?, and { cannot be first in an re or
|
||||||
|
immediately after an alternation or begin-group operator. */
|
||||||
|
# define RE_CONTEXT_INVALID_OPS (RE_CONTEXT_INDEP_OPS << 1)
|
||||||
|
|
||||||
|
/* If this bit is set, then . matches newline.
|
||||||
|
If not set, then it doesn't. */
|
||||||
|
# define RE_DOT_NEWLINE (RE_CONTEXT_INVALID_OPS << 1)
|
||||||
|
|
||||||
|
/* If this bit is set, then . doesn't match NUL.
|
||||||
|
If not set, then it does. */
|
||||||
|
# define RE_DOT_NOT_NULL (RE_DOT_NEWLINE << 1)
|
||||||
|
|
||||||
|
/* If this bit is set, nonmatching lists [^...] do not match newline.
|
||||||
|
If not set, they do. */
|
||||||
|
# define RE_HAT_LISTS_NOT_NEWLINE (RE_DOT_NOT_NULL << 1)
|
||||||
|
|
||||||
|
/* If this bit is set, either \{...\} or {...} defines an
|
||||||
|
interval, depending on RE_NO_BK_BRACES.
|
||||||
|
If not set, \{, \}, {, and } are literals. */
|
||||||
|
# define RE_INTERVALS (RE_HAT_LISTS_NOT_NEWLINE << 1)
|
||||||
|
|
||||||
|
/* If this bit is set, +, ? and | aren't recognized as operators.
|
||||||
|
If not set, they are. */
|
||||||
|
# define RE_LIMITED_OPS (RE_INTERVALS << 1)
|
||||||
|
|
||||||
|
/* If this bit is set, newline is an alternation operator.
|
||||||
|
If not set, newline is literal. */
|
||||||
|
# define RE_NEWLINE_ALT (RE_LIMITED_OPS << 1)
|
||||||
|
|
||||||
|
/* If this bit is set, then `{...}' defines an interval, and \{ and \}
|
||||||
|
are literals.
|
||||||
|
If not set, then `\{...\}' defines an interval. */
|
||||||
|
# define RE_NO_BK_BRACES (RE_NEWLINE_ALT << 1)
|
||||||
|
|
||||||
|
/* If this bit is set, (...) defines a group, and \( and \) are literals.
|
||||||
|
If not set, \(...\) defines a group, and ( and ) are literals. */
|
||||||
|
# define RE_NO_BK_PARENS (RE_NO_BK_BRACES << 1)
|
||||||
|
|
||||||
|
/* If this bit is set, then \<digit> matches <digit>.
|
||||||
|
If not set, then \<digit> is a back-reference. */
|
||||||
|
# define RE_NO_BK_REFS (RE_NO_BK_PARENS << 1)
|
||||||
|
|
||||||
|
/* If this bit is set, then | is an alternation operator, and \| is literal.
|
||||||
|
If not set, then \| is an alternation operator, and | is literal. */
|
||||||
|
# define RE_NO_BK_VBAR (RE_NO_BK_REFS << 1)
|
||||||
|
|
||||||
|
/* If this bit is set, then an ending range point collating higher
|
||||||
|
than the starting range point, as in [z-a], is invalid.
|
||||||
|
If not set, then when ending range point collates higher than the
|
||||||
|
starting range point, the range is ignored. */
|
||||||
|
# define RE_NO_EMPTY_RANGES (RE_NO_BK_VBAR << 1)
|
||||||
|
|
||||||
|
/* If this bit is set, then an unmatched ) is ordinary.
|
||||||
|
If not set, then an unmatched ) is invalid. */
|
||||||
|
# define RE_UNMATCHED_RIGHT_PAREN_ORD (RE_NO_EMPTY_RANGES << 1)
|
||||||
|
|
||||||
|
/* If this bit is set, succeed as soon as we match the whole pattern,
|
||||||
|
without further backtracking. */
|
||||||
|
# define RE_NO_POSIX_BACKTRACKING (RE_UNMATCHED_RIGHT_PAREN_ORD << 1)
|
||||||
|
|
||||||
|
/* If this bit is set, do not process the GNU regex operators.
|
||||||
|
If not set, then the GNU regex operators are recognized. */
|
||||||
|
# define RE_NO_GNU_OPS (RE_NO_POSIX_BACKTRACKING << 1)
|
||||||
|
|
||||||
|
/* If this bit is set, turn on internal regex debugging.
|
||||||
|
If not set, and debugging was on, turn it off.
|
||||||
|
This only works if regex.c is compiled -DDEBUG.
|
||||||
|
We define this bit always, so that all that's needed to turn on
|
||||||
|
debugging is to recompile regex.c; the calling code can always have
|
||||||
|
this bit set, and it won't affect anything in the normal case. */
|
||||||
|
# define RE_DEBUG (RE_NO_GNU_OPS << 1)
|
||||||
|
|
||||||
|
/* If this bit is set, a syntactically invalid interval is treated as
|
||||||
|
a string of ordinary characters. For example, the ERE 'a{1' is
|
||||||
|
treated as 'a\{1'. */
|
||||||
|
# define RE_INVALID_INTERVAL_ORD (RE_DEBUG << 1)
|
||||||
|
|
||||||
|
/* If this bit is set, then ignore case when matching.
|
||||||
|
If not set, then case is significant. */
|
||||||
|
# define RE_ICASE (RE_INVALID_INTERVAL_ORD << 1)
|
||||||
|
|
||||||
|
/* This bit is used internally like RE_CONTEXT_INDEP_ANCHORS but only
|
||||||
|
for ^, because it is difficult to scan the regex backwards to find
|
||||||
|
whether ^ should be special. */
|
||||||
|
# define RE_CARET_ANCHORS_HERE (RE_ICASE << 1)
|
||||||
|
|
||||||
|
/* If this bit is set, then \{ cannot be first in an bre or
|
||||||
|
immediately after an alternation or begin-group operator. */
|
||||||
|
# define RE_CONTEXT_INVALID_DUP (RE_CARET_ANCHORS_HERE << 1)
|
||||||
|
|
||||||
|
/* If this bit is set, then no_sub will be set to 1 during
|
||||||
|
re_compile_pattern. */
|
||||||
|
# define RE_NO_SUB (RE_CONTEXT_INVALID_DUP << 1)
|
||||||
|
|
||||||
|
#endif /* defined __USE_GNU_REGEX */
|
||||||
|
|
||||||
|
/* This global variable defines the particular regexp syntax to use (for
|
||||||
|
some interfaces). When a regexp is compiled, the syntax used is
|
||||||
|
stored in the pattern buffer, so changing this does not affect
|
||||||
|
already-compiled regexps. */
|
||||||
|
extern reg_syntax_t re_syntax_options;
|
||||||
|
|
||||||
|
#ifdef __USE_GNU_REGEX
|
||||||
|
/* Define combinations of the above bits for the standard possibilities.
|
||||||
|
(The [[[ comments delimit what gets put into the Texinfo file, so
|
||||||
|
don't delete them!) */
|
||||||
|
/* [[[begin syntaxes]]] */
|
||||||
|
# define RE_SYNTAX_EMACS 0
|
||||||
|
|
||||||
|
# define RE_SYNTAX_AWK \
|
||||||
|
(RE_BACKSLASH_ESCAPE_IN_LISTS | RE_DOT_NOT_NULL \
|
||||||
|
| RE_NO_BK_PARENS | RE_NO_BK_REFS \
|
||||||
|
| RE_NO_BK_VBAR | RE_NO_EMPTY_RANGES \
|
||||||
|
| RE_DOT_NEWLINE | RE_CONTEXT_INDEP_ANCHORS \
|
||||||
|
| RE_UNMATCHED_RIGHT_PAREN_ORD | RE_NO_GNU_OPS)
|
||||||
|
|
||||||
|
# define RE_SYNTAX_GNU_AWK \
|
||||||
|
((RE_SYNTAX_POSIX_EXTENDED | RE_BACKSLASH_ESCAPE_IN_LISTS | RE_DEBUG) \
|
||||||
|
& ~(RE_DOT_NOT_NULL | RE_INTERVALS | RE_CONTEXT_INDEP_OPS \
|
||||||
|
| RE_CONTEXT_INVALID_OPS ))
|
||||||
|
|
||||||
|
# define RE_SYNTAX_POSIX_AWK \
|
||||||
|
(RE_SYNTAX_POSIX_EXTENDED | RE_BACKSLASH_ESCAPE_IN_LISTS \
|
||||||
|
| RE_INTERVALS | RE_NO_GNU_OPS)
|
||||||
|
|
||||||
|
# define RE_SYNTAX_GREP \
|
||||||
|
(RE_BK_PLUS_QM | RE_CHAR_CLASSES \
|
||||||
|
| RE_HAT_LISTS_NOT_NEWLINE | RE_INTERVALS \
|
||||||
|
| RE_NEWLINE_ALT)
|
||||||
|
|
||||||
|
# define RE_SYNTAX_EGREP \
|
||||||
|
(RE_CHAR_CLASSES | RE_CONTEXT_INDEP_ANCHORS \
|
||||||
|
| RE_CONTEXT_INDEP_OPS | RE_HAT_LISTS_NOT_NEWLINE \
|
||||||
|
| RE_NEWLINE_ALT | RE_NO_BK_PARENS \
|
||||||
|
| RE_NO_BK_VBAR)
|
||||||
|
|
||||||
|
# define RE_SYNTAX_POSIX_EGREP \
|
||||||
|
(RE_SYNTAX_EGREP | RE_INTERVALS | RE_NO_BK_BRACES \
|
||||||
|
| RE_INVALID_INTERVAL_ORD)
|
||||||
|
|
||||||
|
/* P1003.2/D11.2, section 4.20.7.1, lines 5078ff. */
|
||||||
|
# define RE_SYNTAX_ED RE_SYNTAX_POSIX_BASIC
|
||||||
|
|
||||||
|
# define RE_SYNTAX_SED RE_SYNTAX_POSIX_BASIC
|
||||||
|
|
||||||
|
/* Syntax bits common to both basic and extended POSIX regex syntax. */
|
||||||
|
# define _RE_SYNTAX_POSIX_COMMON \
|
||||||
|
(RE_CHAR_CLASSES | RE_DOT_NEWLINE | RE_DOT_NOT_NULL \
|
||||||
|
| RE_INTERVALS | RE_NO_EMPTY_RANGES)
|
||||||
|
|
||||||
|
# define RE_SYNTAX_POSIX_BASIC \
|
||||||
|
(_RE_SYNTAX_POSIX_COMMON | RE_BK_PLUS_QM | RE_CONTEXT_INVALID_DUP)
|
||||||
|
|
||||||
|
/* Differs from ..._POSIX_BASIC only in that RE_BK_PLUS_QM becomes
|
||||||
|
RE_LIMITED_OPS, i.e., \? \+ \| are not recognized. Actually, this
|
||||||
|
isn't minimal, since other operators, such as \`, aren't disabled. */
|
||||||
|
# define RE_SYNTAX_POSIX_MINIMAL_BASIC \
|
||||||
|
(_RE_SYNTAX_POSIX_COMMON | RE_LIMITED_OPS)
|
||||||
|
|
||||||
|
# define RE_SYNTAX_POSIX_EXTENDED \
|
||||||
|
(_RE_SYNTAX_POSIX_COMMON | RE_CONTEXT_INDEP_ANCHORS \
|
||||||
|
| RE_CONTEXT_INDEP_OPS | RE_NO_BK_BRACES \
|
||||||
|
| RE_NO_BK_PARENS | RE_NO_BK_VBAR \
|
||||||
|
| RE_CONTEXT_INVALID_OPS | RE_UNMATCHED_RIGHT_PAREN_ORD)
|
||||||
|
|
||||||
|
/* Differs from ..._POSIX_EXTENDED in that RE_CONTEXT_INDEP_OPS is
|
||||||
|
removed and RE_NO_BK_REFS is added. */
|
||||||
|
# define RE_SYNTAX_POSIX_MINIMAL_EXTENDED \
|
||||||
|
(_RE_SYNTAX_POSIX_COMMON | RE_CONTEXT_INDEP_ANCHORS \
|
||||||
|
| RE_CONTEXT_INVALID_OPS | RE_NO_BK_BRACES \
|
||||||
|
| RE_NO_BK_PARENS | RE_NO_BK_REFS \
|
||||||
|
| RE_NO_BK_VBAR | RE_UNMATCHED_RIGHT_PAREN_ORD)
|
||||||
|
/* [[[end syntaxes]]] */
|
||||||
|
|
||||||
|
#endif /* defined __USE_GNU_REGEX */
|
||||||
|
|
||||||
|
#ifdef __USE_GNU_REGEX
|
||||||
|
|
||||||
|
/* Maximum number of duplicates an interval can allow. POSIX-conforming
|
||||||
|
systems might define this in <limits.h>, but we want our
|
||||||
|
value, so remove any previous define. */
|
||||||
|
# ifdef RE_DUP_MAX
|
||||||
|
# undef RE_DUP_MAX
|
||||||
|
# endif
|
||||||
|
|
||||||
|
/* RE_DUP_MAX is 2**15 - 1 because an earlier implementation stored
|
||||||
|
the counter as a 2-byte signed integer. This is no longer true, so
|
||||||
|
RE_DUP_MAX could be increased to (INT_MAX / 10 - 1), or to
|
||||||
|
((SIZE_MAX - 2) / 10 - 1) if _REGEX_LARGE_OFFSETS is defined.
|
||||||
|
However, there would be a huge performance problem if someone
|
||||||
|
actually used a pattern like a\{214748363\}, so RE_DUP_MAX retains
|
||||||
|
its historical value. */
|
||||||
|
# define RE_DUP_MAX (0x7fff)
|
||||||
|
|
||||||
|
#endif /* defined __USE_GNU_REGEX */
|
||||||
|
|
||||||
|
|
||||||
|
/* POSIX `cflags' bits (i.e., information for `regcomp'). */
|
||||||
|
|
||||||
|
/* If this bit is set, then use extended regular expression syntax.
|
||||||
|
If not set, then use basic regular expression syntax. */
|
||||||
|
#define REG_EXTENDED 1
|
||||||
|
|
||||||
|
/* If this bit is set, then ignore case when matching.
|
||||||
|
If not set, then case is significant. */
|
||||||
|
#define REG_ICASE (1 << 1)
|
||||||
|
|
||||||
|
/* If this bit is set, then anchors do not match at newline
|
||||||
|
characters in the string.
|
||||||
|
If not set, then anchors do match at newlines. */
|
||||||
|
#define REG_NEWLINE (1 << 2)
|
||||||
|
|
||||||
|
/* If this bit is set, then report only success or fail in regexec.
|
||||||
|
If not set, then returns differ between not matching and errors. */
|
||||||
|
#define REG_NOSUB (1 << 3)
|
||||||
|
|
||||||
|
|
||||||
|
/* POSIX `eflags' bits (i.e., information for regexec). */
|
||||||
|
|
||||||
|
/* If this bit is set, then the beginning-of-line operator doesn't match
|
||||||
|
the beginning of the string (presumably because it's not the
|
||||||
|
beginning of a line).
|
||||||
|
If not set, then the beginning-of-line operator does match the
|
||||||
|
beginning of the string. */
|
||||||
|
#define REG_NOTBOL 1
|
||||||
|
|
||||||
|
/* Like REG_NOTBOL, except for the end-of-line. */
|
||||||
|
#define REG_NOTEOL (1 << 1)
|
||||||
|
|
||||||
|
/* Use PMATCH[0] to delimit the start and end of the search in the
|
||||||
|
buffer. */
|
||||||
|
#define REG_STARTEND (1 << 2)
|
||||||
|
|
||||||
|
|
||||||
|
/* If any error codes are removed, changed, or added, update the
|
||||||
|
`__re_error_msgid' table in regcomp.c. */
|
||||||
|
|
||||||
|
typedef enum
|
||||||
|
{
|
||||||
|
_REG_ENOSYS = -1, /* This will never happen for this implementation. */
|
||||||
|
_REG_NOERROR = 0, /* Success. */
|
||||||
|
_REG_NOMATCH, /* Didn't find a match (for regexec). */
|
||||||
|
|
||||||
|
/* POSIX regcomp return error codes. (In the order listed in the
|
||||||
|
standard.) */
|
||||||
|
_REG_BADPAT, /* Invalid pattern. */
|
||||||
|
_REG_ECOLLATE, /* Invalid collating element. */
|
||||||
|
_REG_ECTYPE, /* Invalid character class name. */
|
||||||
|
_REG_EESCAPE, /* Trailing backslash. */
|
||||||
|
_REG_ESUBREG, /* Invalid back reference. */
|
||||||
|
_REG_EBRACK, /* Unmatched left bracket. */
|
||||||
|
_REG_EPAREN, /* Parenthesis imbalance. */
|
||||||
|
_REG_EBRACE, /* Unmatched \{. */
|
||||||
|
_REG_BADBR, /* Invalid contents of \{\}. */
|
||||||
|
_REG_ERANGE, /* Invalid range end. */
|
||||||
|
_REG_ESPACE, /* Ran out of memory. */
|
||||||
|
_REG_BADRPT, /* No preceding re for repetition op. */
|
||||||
|
|
||||||
|
/* Error codes we've added. */
|
||||||
|
_REG_EEND, /* Premature end. */
|
||||||
|
_REG_ESIZE, /* Compiled pattern bigger than 2^16 bytes. */
|
||||||
|
_REG_ERPAREN /* Unmatched ) or \); not returned from regcomp. */
|
||||||
|
} reg_errcode_t;
|
||||||
|
|
||||||
|
#ifdef _XOPEN_SOURCE
|
||||||
|
# define REG_ENOSYS _REG_ENOSYS
|
||||||
|
#endif
|
||||||
|
#define REG_NOERROR _REG_NOERROR
|
||||||
|
#define REG_NOMATCH _REG_NOMATCH
|
||||||
|
#define REG_BADPAT _REG_BADPAT
|
||||||
|
#define REG_ECOLLATE _REG_ECOLLATE
|
||||||
|
#define REG_ECTYPE _REG_ECTYPE
|
||||||
|
#define REG_EESCAPE _REG_EESCAPE
|
||||||
|
#define REG_ESUBREG _REG_ESUBREG
|
||||||
|
#define REG_EBRACK _REG_EBRACK
|
||||||
|
#define REG_EPAREN _REG_EPAREN
|
||||||
|
#define REG_EBRACE _REG_EBRACE
|
||||||
|
#define REG_BADBR _REG_BADBR
|
||||||
|
#define REG_ERANGE _REG_ERANGE
|
||||||
|
#define REG_ESPACE _REG_ESPACE
|
||||||
|
#define REG_BADRPT _REG_BADRPT
|
||||||
|
#define REG_EEND _REG_EEND
|
||||||
|
#define REG_ESIZE _REG_ESIZE
|
||||||
|
#define REG_ERPAREN _REG_ERPAREN
|
||||||
|
|
||||||
|
/* struct re_pattern_buffer normally uses member names like `buffer'
|
||||||
|
that POSIX does not allow. In POSIX mode these members have names
|
||||||
|
with leading `re_' (e.g., `re_buffer'). */
|
||||||
|
#ifdef __USE_GNU_REGEX
|
||||||
|
# define _REG_RE_NAME(id) id
|
||||||
|
# define _REG_RM_NAME(id) id
|
||||||
|
#else
|
||||||
|
# define _REG_RE_NAME(id) re_##id
|
||||||
|
# define _REG_RM_NAME(id) rm_##id
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* The user can specify the type of the re_translate member by
|
||||||
|
defining the macro RE_TRANSLATE_TYPE, which defaults to unsigned
|
||||||
|
char *. This pollutes the POSIX name space, so in POSIX mode just
|
||||||
|
use unsigned char *. */
|
||||||
|
#ifdef __USE_GNU_REGEX
|
||||||
|
# ifndef RE_TRANSLATE_TYPE
|
||||||
|
# define RE_TRANSLATE_TYPE unsigned char *
|
||||||
|
# endif
|
||||||
|
# define REG_TRANSLATE_TYPE RE_TRANSLATE_TYPE
|
||||||
|
#else
|
||||||
|
# define REG_TRANSLATE_TYPE unsigned char *
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* This data structure represents a compiled pattern. Before calling
|
||||||
|
the pattern compiler, the fields `buffer', `allocated', `fastmap',
|
||||||
|
`translate', and `no_sub' can be set. After the pattern has been
|
||||||
|
compiled, the `re_nsub' field is available. All other fields are
|
||||||
|
private to the regex routines. */
|
||||||
|
|
||||||
|
struct re_pattern_buffer
|
||||||
|
{
|
||||||
|
/* Space that holds the compiled pattern. It is declared as
|
||||||
|
`unsigned char *' because its elements are sometimes used as
|
||||||
|
array indexes. */
|
||||||
|
unsigned char *_REG_RE_NAME (buffer);
|
||||||
|
|
||||||
|
/* Number of bytes to which `buffer' points. */
|
||||||
|
__re_long_size_t _REG_RE_NAME (allocated);
|
||||||
|
|
||||||
|
/* Number of bytes actually used in `buffer'. */
|
||||||
|
__re_long_size_t _REG_RE_NAME (used);
|
||||||
|
|
||||||
|
/* Syntax setting with which the pattern was compiled. */
|
||||||
|
reg_syntax_t _REG_RE_NAME (syntax);
|
||||||
|
|
||||||
|
/* Pointer to a fastmap, if any, otherwise zero. re_search uses the
|
||||||
|
fastmap, if there is one, to skip over impossible starting points
|
||||||
|
for matches. */
|
||||||
|
char *_REG_RE_NAME (fastmap);
|
||||||
|
|
||||||
|
/* Either a translate table to apply to all characters before
|
||||||
|
comparing them, or zero for no translation. The translation is
|
||||||
|
applied to a pattern when it is compiled and to a string when it
|
||||||
|
is matched. */
|
||||||
|
REG_TRANSLATE_TYPE _REG_RE_NAME (translate);
|
||||||
|
|
||||||
|
/* Number of subexpressions found by the compiler. */
|
||||||
|
size_t re_nsub;
|
||||||
|
|
||||||
|
/* Zero if this pattern cannot match the empty string, one else.
|
||||||
|
Well, in truth it's used only in `re_search_2', to see whether or
|
||||||
|
not we should use the fastmap, so we don't set this absolutely
|
||||||
|
perfectly; see `re_compile_fastmap' (the `duplicate' case). */
|
||||||
|
unsigned int _REG_RE_NAME (can_be_null) : 1;
|
||||||
|
|
||||||
|
/* If REGS_UNALLOCATED, allocate space in the `regs' structure
|
||||||
|
for `max (RE_NREGS, re_nsub + 1)' groups.
|
||||||
|
If REGS_REALLOCATE, reallocate space if necessary.
|
||||||
|
If REGS_FIXED, use what's there. */
|
||||||
|
#ifdef __USE_GNU_REGEX
|
||||||
|
# define REGS_UNALLOCATED 0
|
||||||
|
# define REGS_REALLOCATE 1
|
||||||
|
# define REGS_FIXED 2
|
||||||
|
#endif
|
||||||
|
unsigned int _REG_RE_NAME (regs_allocated) : 2;
|
||||||
|
|
||||||
|
/* Set to zero when `regex_compile' compiles a pattern; set to one
|
||||||
|
by `re_compile_fastmap' if it updates the fastmap. */
|
||||||
|
unsigned int _REG_RE_NAME (fastmap_accurate) : 1;
|
||||||
|
|
||||||
|
/* If set, `re_match_2' does not return information about
|
||||||
|
subexpressions. */
|
||||||
|
unsigned int _REG_RE_NAME (no_sub) : 1;
|
||||||
|
|
||||||
|
/* If set, a beginning-of-line anchor doesn't match at the beginning
|
||||||
|
of the string. */
|
||||||
|
unsigned int _REG_RE_NAME (not_bol) : 1;
|
||||||
|
|
||||||
|
/* Similarly for an end-of-line anchor. */
|
||||||
|
unsigned int _REG_RE_NAME (not_eol) : 1;
|
||||||
|
|
||||||
|
/* If true, an anchor at a newline matches. */
|
||||||
|
unsigned int _REG_RE_NAME (newline_anchor) : 1;
|
||||||
|
|
||||||
|
/* [[[end pattern_buffer]]] */
|
||||||
|
};
|
||||||
|
|
||||||
|
typedef struct re_pattern_buffer regex_t;
|
||||||
|
|
||||||
|
/* This is the structure we store register match data in. See
|
||||||
|
regex.texinfo for a full description of what registers match. */
|
||||||
|
struct re_registers
|
||||||
|
{
|
||||||
|
__re_size_t _REG_RM_NAME (num_regs);
|
||||||
|
regoff_t *_REG_RM_NAME (start);
|
||||||
|
regoff_t *_REG_RM_NAME (end);
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
/* If `regs_allocated' is REGS_UNALLOCATED in the pattern buffer,
|
||||||
|
`re_match_2' returns information about at least this many registers
|
||||||
|
the first time a `regs' structure is passed. */
|
||||||
|
#if !defined RE_NREGS && defined __USE_GNU_REGEX
|
||||||
|
# define RE_NREGS 30
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
/* POSIX specification for registers. Aside from the different names than
|
||||||
|
`re_registers', POSIX uses an array of structures, instead of a
|
||||||
|
structure of arrays. */
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
regoff_t rm_so; /* Byte offset from string's start to substring's start. */
|
||||||
|
regoff_t rm_eo; /* Byte offset from string's start to substring's end. */
|
||||||
|
} regmatch_t;
|
||||||
|
|
||||||
|
/* Declarations for routines. */
|
||||||
|
|
||||||
|
/* Sets the current default syntax to SYNTAX, and return the old syntax.
|
||||||
|
You can also simply assign to the `re_syntax_options' variable. */
|
||||||
|
extern reg_syntax_t re_set_syntax (reg_syntax_t __syntax);
|
||||||
|
|
||||||
|
/* Compile the regular expression PATTERN, with length LENGTH
|
||||||
|
and syntax given by the global `re_syntax_options', into the buffer
|
||||||
|
BUFFER. Return NULL if successful, and an error string if not. */
|
||||||
|
extern const char *re_compile_pattern (const char *__pattern, size_t __length,
|
||||||
|
struct re_pattern_buffer *__buffer);
|
||||||
|
|
||||||
|
|
||||||
|
/* Compile a fastmap for the compiled pattern in BUFFER; used to
|
||||||
|
accelerate searches. Return 0 if successful and -2 if was an
|
||||||
|
internal error. */
|
||||||
|
extern int re_compile_fastmap (struct re_pattern_buffer *__buffer);
|
||||||
|
|
||||||
|
|
||||||
|
/* Search in the string STRING (with length LENGTH) for the pattern
|
||||||
|
compiled into BUFFER. Start searching at position START, for RANGE
|
||||||
|
characters. Return the starting position of the match, -1 for no
|
||||||
|
match, or -2 for an internal error. Also return register
|
||||||
|
information in REGS (if REGS and BUFFER->no_sub are nonzero). */
|
||||||
|
extern regoff_t re_search (struct re_pattern_buffer *__buffer,
|
||||||
|
const char *__string, __re_idx_t __length,
|
||||||
|
__re_idx_t __start, regoff_t __range,
|
||||||
|
struct re_registers *__regs);
|
||||||
|
|
||||||
|
|
||||||
|
/* Like `re_search', but search in the concatenation of STRING1 and
|
||||||
|
STRING2. Also, stop searching at index START + STOP. */
|
||||||
|
extern regoff_t re_search_2 (struct re_pattern_buffer *__buffer,
|
||||||
|
const char *__string1, __re_idx_t __length1,
|
||||||
|
const char *__string2, __re_idx_t __length2,
|
||||||
|
__re_idx_t __start, regoff_t __range,
|
||||||
|
struct re_registers *__regs,
|
||||||
|
__re_idx_t __stop);
|
||||||
|
|
||||||
|
|
||||||
|
/* Like `re_search', but return how many characters in STRING the regexp
|
||||||
|
in BUFFER matched, starting at position START. */
|
||||||
|
extern regoff_t re_match (struct re_pattern_buffer *__buffer,
|
||||||
|
const char *__string, __re_idx_t __length,
|
||||||
|
__re_idx_t __start, struct re_registers *__regs);
|
||||||
|
|
||||||
|
|
||||||
|
/* Relates to `re_match' as `re_search_2' relates to `re_search'. */
|
||||||
|
extern regoff_t re_match_2 (struct re_pattern_buffer *__buffer,
|
||||||
|
const char *__string1, __re_idx_t __length1,
|
||||||
|
const char *__string2, __re_idx_t __length2,
|
||||||
|
__re_idx_t __start, struct re_registers *__regs,
|
||||||
|
__re_idx_t __stop);
|
||||||
|
|
||||||
|
|
||||||
|
/* Set REGS to hold NUM_REGS registers, storing them in STARTS and
|
||||||
|
ENDS. Subsequent matches using BUFFER and REGS will use this memory
|
||||||
|
for recording register information. STARTS and ENDS must be
|
||||||
|
allocated with malloc, and must each be at least `NUM_REGS * sizeof
|
||||||
|
(regoff_t)' bytes long.
|
||||||
|
|
||||||
|
If NUM_REGS == 0, then subsequent matches should allocate their own
|
||||||
|
register data.
|
||||||
|
|
||||||
|
Unless this function is called, the first search or match using
|
||||||
|
PATTERN_BUFFER will allocate its own register data, without
|
||||||
|
freeing the old data. */
|
||||||
|
extern void re_set_registers (struct re_pattern_buffer *__buffer,
|
||||||
|
struct re_registers *__regs,
|
||||||
|
__re_size_t __num_regs,
|
||||||
|
regoff_t *__starts, regoff_t *__ends);
|
||||||
|
|
||||||
|
#if defined _REGEX_RE_COMP || defined _LIBC
|
||||||
|
# ifndef _CRAY
|
||||||
|
/* 4.2 bsd compatibility. */
|
||||||
|
extern char *re_comp (const char *);
|
||||||
|
extern int re_exec (const char *);
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* GCC 2.95 and later have "__restrict"; C99 compilers have
|
||||||
|
"restrict", and "configure" may have defined "restrict".
|
||||||
|
Other compilers use __restrict, __restrict__, and _Restrict, and
|
||||||
|
'configure' might #define 'restrict' to those words, so pick a
|
||||||
|
different name. */
|
||||||
|
#ifndef _Restrict_
|
||||||
|
# if 199901L <= __STDC_VERSION__
|
||||||
|
# define _Restrict_ restrict
|
||||||
|
# elif 2 < __GNUC__ || (2 == __GNUC__ && 95 <= __GNUC_MINOR__)
|
||||||
|
# define _Restrict_ __restrict
|
||||||
|
# else
|
||||||
|
# define _Restrict_
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
/* gcc 3.1 and up support the [restrict] syntax. Don't trust
|
||||||
|
sys/cdefs.h's definition of __restrict_arr, though, as it
|
||||||
|
mishandles gcc -ansi -pedantic. */
|
||||||
|
#ifndef _Restrict_arr_
|
||||||
|
# if ((199901L <= __STDC_VERSION__ \
|
||||||
|
|| ((3 < __GNUC__ || (3 == __GNUC__ && 1 <= __GNUC_MINOR__)) \
|
||||||
|
&& !__STRICT_ANSI__)) \
|
||||||
|
&& !defined __GNUG__)
|
||||||
|
# define _Restrict_arr_ _Restrict_
|
||||||
|
# else
|
||||||
|
# define _Restrict_arr_
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* POSIX compatibility. */
|
||||||
|
extern int regcomp (regex_t *_Restrict_ __preg,
|
||||||
|
const char *_Restrict_ __pattern,
|
||||||
|
int __cflags);
|
||||||
|
|
||||||
|
extern int regexec (const regex_t *_Restrict_ __preg,
|
||||||
|
const char *_Restrict_ __string, size_t __nmatch,
|
||||||
|
regmatch_t __pmatch[_Restrict_arr_],
|
||||||
|
int __eflags);
|
||||||
|
|
||||||
|
extern size_t regerror (int __errcode, const regex_t *_Restrict_ __preg,
|
||||||
|
char *_Restrict_ __errbuf, size_t __errbuf_size);
|
||||||
|
|
||||||
|
extern void regfree (regex_t *__preg);
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif /* C++ */
|
||||||
|
|
||||||
|
#endif /* regex.h */
|
1740
gnulib/regex_internal.c
Normal file
1740
gnulib/regex_internal.c
Normal file
File diff suppressed because it is too large
Load diff
871
gnulib/regex_internal.h
Normal file
871
gnulib/regex_internal.h
Normal file
|
@ -0,0 +1,871 @@
|
||||||
|
/* Extended regular expression matching and search library.
|
||||||
|
Copyright (C) 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 Free
|
||||||
|
Software Foundation, Inc.
|
||||||
|
This file is part of the GNU C Library.
|
||||||
|
Contributed by Isamu Hasegawa <isamu@yamato.ibm.com>.
|
||||||
|
|
||||||
|
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; either version 2, or (at your option)
|
||||||
|
any later version.
|
||||||
|
|
||||||
|
This program is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License along
|
||||||
|
with this program; if not, write to the Free Software Foundation,
|
||||||
|
Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
|
||||||
|
|
||||||
|
#ifndef _REGEX_INTERNAL_H
|
||||||
|
#define _REGEX_INTERNAL_H 1
|
||||||
|
|
||||||
|
#include <assert.h>
|
||||||
|
#include <ctype.h>
|
||||||
|
#include <stdbool.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
|
#include <langinfo.h>
|
||||||
|
#ifndef _LIBC
|
||||||
|
# include "localcharset.h"
|
||||||
|
#endif
|
||||||
|
#if defined HAVE_LOCALE_H || defined _LIBC
|
||||||
|
# include <locale.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include <wchar.h>
|
||||||
|
#include <wctype.h>
|
||||||
|
#include <stdint.h>
|
||||||
|
#if defined _LIBC
|
||||||
|
# include <bits/libc-lock.h>
|
||||||
|
#else
|
||||||
|
# define __libc_lock_init(NAME) do { } while (0)
|
||||||
|
# define __libc_lock_lock(NAME) do { } while (0)
|
||||||
|
# define __libc_lock_unlock(NAME) do { } while (0)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* In case that the system doesn't have isblank(). */
|
||||||
|
#if !defined _LIBC && ! (defined isblank || (HAVE_ISBLANK && HAVE_DECL_ISBLANK))
|
||||||
|
# define isblank(ch) ((ch) == ' ' || (ch) == '\t')
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef _LIBC
|
||||||
|
# ifndef _RE_DEFINE_LOCALE_FUNCTIONS
|
||||||
|
# define _RE_DEFINE_LOCALE_FUNCTIONS 1
|
||||||
|
# include <locale/localeinfo.h>
|
||||||
|
# include <locale/elem-hash.h>
|
||||||
|
# include <locale/coll-lookup.h>
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* This is for other GNU distributions with internationalized messages. */
|
||||||
|
#if (HAVE_LIBINTL_H && ENABLE_NLS) || defined _LIBC
|
||||||
|
# include <libintl.h>
|
||||||
|
# ifdef _LIBC
|
||||||
|
# undef gettext
|
||||||
|
# define gettext(msgid) \
|
||||||
|
INTUSE(__dcgettext) (_libc_intl_domainname, msgid, LC_MESSAGES)
|
||||||
|
# endif
|
||||||
|
#else
|
||||||
|
# define gettext(msgid) (msgid)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef gettext_noop
|
||||||
|
/* This define is so xgettext can find the internationalizable
|
||||||
|
strings. */
|
||||||
|
# define gettext_noop(String) String
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* For loser systems without the definition. */
|
||||||
|
#ifndef SIZE_MAX
|
||||||
|
# define SIZE_MAX ((size_t) -1)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if (defined MB_CUR_MAX && HAVE_LOCALE_H && HAVE_WCTYPE_H && HAVE_ISWCTYPE && HAVE_WCSCOLL) || _LIBC
|
||||||
|
# define RE_ENABLE_I18N
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if __GNUC__ >= 3
|
||||||
|
# define BE(expr, val) __builtin_expect (expr, val)
|
||||||
|
#else
|
||||||
|
# define BE(expr, val) (expr)
|
||||||
|
# ifdef _LIBC
|
||||||
|
# define inline
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Number of ASCII characters. */
|
||||||
|
#define ASCII_CHARS 0x80
|
||||||
|
|
||||||
|
/* Number of single byte characters. */
|
||||||
|
#define SBC_MAX (UCHAR_MAX + 1)
|
||||||
|
|
||||||
|
#define COLL_ELEM_LEN_MAX 8
|
||||||
|
|
||||||
|
/* The character which represents newline. */
|
||||||
|
#define NEWLINE_CHAR '\n'
|
||||||
|
#define WIDE_NEWLINE_CHAR L'\n'
|
||||||
|
|
||||||
|
/* Rename to standard API for using out of glibc. */
|
||||||
|
#ifndef _LIBC
|
||||||
|
# define __wctype wctype
|
||||||
|
# define __iswctype iswctype
|
||||||
|
# define __btowc btowc
|
||||||
|
# define __wcrtomb wcrtomb
|
||||||
|
# define __mbrtowc mbrtowc
|
||||||
|
# define __regfree regfree
|
||||||
|
# define attribute_hidden
|
||||||
|
#endif /* not _LIBC */
|
||||||
|
|
||||||
|
#if __GNUC__ >= 4 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 1)
|
||||||
|
# define __attribute(arg) __attribute__ (arg)
|
||||||
|
#else
|
||||||
|
# define __attribute(arg)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
typedef __re_idx_t Idx;
|
||||||
|
|
||||||
|
/* Special return value for failure to match. */
|
||||||
|
#define REG_MISSING ((Idx) -1)
|
||||||
|
|
||||||
|
/* Special return value for internal error. */
|
||||||
|
#define REG_ERROR ((Idx) -2)
|
||||||
|
|
||||||
|
/* Test whether N is a valid index, and is not one of the above. */
|
||||||
|
#ifdef _REGEX_LARGE_OFFSETS
|
||||||
|
# define REG_VALID_INDEX(n) ((Idx) (n) < REG_ERROR)
|
||||||
|
#else
|
||||||
|
# define REG_VALID_INDEX(n) (0 <= (n))
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Test whether N is a valid nonzero index. */
|
||||||
|
#ifdef _REGEX_LARGE_OFFSETS
|
||||||
|
# define REG_VALID_NONZERO_INDEX(n) ((Idx) ((n) - 1) < (Idx) (REG_ERROR - 1))
|
||||||
|
#else
|
||||||
|
# define REG_VALID_NONZERO_INDEX(n) (0 < (n))
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* A hash value, suitable for computing hash tables. */
|
||||||
|
typedef __re_size_t re_hashval_t;
|
||||||
|
|
||||||
|
/* An integer used to represent a set of bits. It must be unsigned,
|
||||||
|
and must be at least as wide as unsigned int. */
|
||||||
|
typedef unsigned long int bitset_word_t;
|
||||||
|
/* All bits set in a bitset_word_t. */
|
||||||
|
#define BITSET_WORD_MAX ULONG_MAX
|
||||||
|
|
||||||
|
/* Number of bits in a bitset_word_t. For portability to hosts with
|
||||||
|
padding bits, do not use '(sizeof (bitset_word_t) * CHAR_BIT)';
|
||||||
|
instead, deduce it directly from BITSET_WORD_MAX. Avoid
|
||||||
|
greater-than-32-bit integers and unconditional shifts by more than
|
||||||
|
31 bits, as they're not portable. */
|
||||||
|
#if BITSET_WORD_MAX == 0xffffffffUL
|
||||||
|
# define BITSET_WORD_BITS 32
|
||||||
|
#elif BITSET_WORD_MAX >> 31 >> 4 == 1
|
||||||
|
# define BITSET_WORD_BITS 36
|
||||||
|
#elif BITSET_WORD_MAX >> 31 >> 16 == 1
|
||||||
|
# define BITSET_WORD_BITS 48
|
||||||
|
#elif BITSET_WORD_MAX >> 31 >> 28 == 1
|
||||||
|
# define BITSET_WORD_BITS 60
|
||||||
|
#elif BITSET_WORD_MAX >> 31 >> 31 >> 1 == 1
|
||||||
|
# define BITSET_WORD_BITS 64
|
||||||
|
#elif BITSET_WORD_MAX >> 31 >> 31 >> 9 == 1
|
||||||
|
# define BITSET_WORD_BITS 72
|
||||||
|
#elif BITSET_WORD_MAX >> 31 >> 31 >> 31 >> 31 >> 3 == 1
|
||||||
|
# define BITSET_WORD_BITS 128
|
||||||
|
#elif BITSET_WORD_MAX >> 31 >> 31 >> 31 >> 31 >> 31 >> 31 >> 31 >> 31 >> 7 == 1
|
||||||
|
# define BITSET_WORD_BITS 256
|
||||||
|
#elif BITSET_WORD_MAX >> 31 >> 31 >> 31 >> 31 >> 31 >> 31 >> 31 >> 31 >> 7 > 1
|
||||||
|
# define BITSET_WORD_BITS 257 /* any value > SBC_MAX will do here */
|
||||||
|
# if BITSET_WORD_BITS <= SBC_MAX
|
||||||
|
# error "Invalid SBC_MAX"
|
||||||
|
# endif
|
||||||
|
#else
|
||||||
|
# error "Add case for new bitset_word_t size"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Number of bitset_word_t values in a bitset_t. */
|
||||||
|
#define BITSET_WORDS ((SBC_MAX + BITSET_WORD_BITS - 1) / BITSET_WORD_BITS)
|
||||||
|
|
||||||
|
typedef bitset_word_t bitset_t[BITSET_WORDS];
|
||||||
|
typedef bitset_word_t *re_bitset_ptr_t;
|
||||||
|
typedef const bitset_word_t *re_const_bitset_ptr_t;
|
||||||
|
|
||||||
|
#define PREV_WORD_CONSTRAINT 0x0001
|
||||||
|
#define PREV_NOTWORD_CONSTRAINT 0x0002
|
||||||
|
#define NEXT_WORD_CONSTRAINT 0x0004
|
||||||
|
#define NEXT_NOTWORD_CONSTRAINT 0x0008
|
||||||
|
#define PREV_NEWLINE_CONSTRAINT 0x0010
|
||||||
|
#define NEXT_NEWLINE_CONSTRAINT 0x0020
|
||||||
|
#define PREV_BEGBUF_CONSTRAINT 0x0040
|
||||||
|
#define NEXT_ENDBUF_CONSTRAINT 0x0080
|
||||||
|
#define WORD_DELIM_CONSTRAINT 0x0100
|
||||||
|
#define NOT_WORD_DELIM_CONSTRAINT 0x0200
|
||||||
|
|
||||||
|
typedef enum
|
||||||
|
{
|
||||||
|
INSIDE_WORD = PREV_WORD_CONSTRAINT | NEXT_WORD_CONSTRAINT,
|
||||||
|
WORD_FIRST = PREV_NOTWORD_CONSTRAINT | NEXT_WORD_CONSTRAINT,
|
||||||
|
WORD_LAST = PREV_WORD_CONSTRAINT | NEXT_NOTWORD_CONSTRAINT,
|
||||||
|
INSIDE_NOTWORD = PREV_NOTWORD_CONSTRAINT | NEXT_NOTWORD_CONSTRAINT,
|
||||||
|
LINE_FIRST = PREV_NEWLINE_CONSTRAINT,
|
||||||
|
LINE_LAST = NEXT_NEWLINE_CONSTRAINT,
|
||||||
|
BUF_FIRST = PREV_BEGBUF_CONSTRAINT,
|
||||||
|
BUF_LAST = NEXT_ENDBUF_CONSTRAINT,
|
||||||
|
WORD_DELIM = WORD_DELIM_CONSTRAINT,
|
||||||
|
NOT_WORD_DELIM = NOT_WORD_DELIM_CONSTRAINT
|
||||||
|
} re_context_type;
|
||||||
|
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
Idx alloc;
|
||||||
|
Idx nelem;
|
||||||
|
Idx *elems;
|
||||||
|
} re_node_set;
|
||||||
|
|
||||||
|
typedef enum
|
||||||
|
{
|
||||||
|
NON_TYPE = 0,
|
||||||
|
|
||||||
|
/* Node type, These are used by token, node, tree. */
|
||||||
|
CHARACTER = 1,
|
||||||
|
END_OF_RE = 2,
|
||||||
|
SIMPLE_BRACKET = 3,
|
||||||
|
OP_BACK_REF = 4,
|
||||||
|
OP_PERIOD = 5,
|
||||||
|
#ifdef RE_ENABLE_I18N
|
||||||
|
COMPLEX_BRACKET = 6,
|
||||||
|
OP_UTF8_PERIOD = 7,
|
||||||
|
#endif /* RE_ENABLE_I18N */
|
||||||
|
|
||||||
|
/* We define EPSILON_BIT as a macro so that OP_OPEN_SUBEXP is used
|
||||||
|
when the debugger shows values of this enum type. */
|
||||||
|
#define EPSILON_BIT 8
|
||||||
|
OP_OPEN_SUBEXP = EPSILON_BIT | 0,
|
||||||
|
OP_CLOSE_SUBEXP = EPSILON_BIT | 1,
|
||||||
|
OP_ALT = EPSILON_BIT | 2,
|
||||||
|
OP_DUP_ASTERISK = EPSILON_BIT | 3,
|
||||||
|
ANCHOR = EPSILON_BIT | 4,
|
||||||
|
|
||||||
|
/* Tree type, these are used only by tree. */
|
||||||
|
CONCAT = 16,
|
||||||
|
SUBEXP = 17,
|
||||||
|
|
||||||
|
/* Token type, these are used only by token. */
|
||||||
|
OP_DUP_PLUS = 18,
|
||||||
|
OP_DUP_QUESTION,
|
||||||
|
OP_OPEN_BRACKET,
|
||||||
|
OP_CLOSE_BRACKET,
|
||||||
|
OP_CHARSET_RANGE,
|
||||||
|
OP_OPEN_DUP_NUM,
|
||||||
|
OP_CLOSE_DUP_NUM,
|
||||||
|
OP_NON_MATCH_LIST,
|
||||||
|
OP_OPEN_COLL_ELEM,
|
||||||
|
OP_CLOSE_COLL_ELEM,
|
||||||
|
OP_OPEN_EQUIV_CLASS,
|
||||||
|
OP_CLOSE_EQUIV_CLASS,
|
||||||
|
OP_OPEN_CHAR_CLASS,
|
||||||
|
OP_CLOSE_CHAR_CLASS,
|
||||||
|
OP_WORD,
|
||||||
|
OP_NOTWORD,
|
||||||
|
OP_SPACE,
|
||||||
|
OP_NOTSPACE,
|
||||||
|
BACK_SLASH
|
||||||
|
|
||||||
|
} re_token_type_t;
|
||||||
|
|
||||||
|
#ifdef RE_ENABLE_I18N
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
/* Multibyte characters. */
|
||||||
|
wchar_t *mbchars;
|
||||||
|
|
||||||
|
/* Collating symbols. */
|
||||||
|
# ifdef _LIBC
|
||||||
|
int32_t *coll_syms;
|
||||||
|
# endif
|
||||||
|
|
||||||
|
/* Equivalence classes. */
|
||||||
|
# ifdef _LIBC
|
||||||
|
int32_t *equiv_classes;
|
||||||
|
# endif
|
||||||
|
|
||||||
|
/* Range expressions. */
|
||||||
|
# ifdef _LIBC
|
||||||
|
uint32_t *range_starts;
|
||||||
|
uint32_t *range_ends;
|
||||||
|
# else /* not _LIBC */
|
||||||
|
wchar_t *range_starts;
|
||||||
|
wchar_t *range_ends;
|
||||||
|
# endif /* not _LIBC */
|
||||||
|
|
||||||
|
/* Character classes. */
|
||||||
|
wctype_t *char_classes;
|
||||||
|
|
||||||
|
/* If this character set is the non-matching list. */
|
||||||
|
unsigned int non_match : 1;
|
||||||
|
|
||||||
|
/* # of multibyte characters. */
|
||||||
|
Idx nmbchars;
|
||||||
|
|
||||||
|
/* # of collating symbols. */
|
||||||
|
Idx ncoll_syms;
|
||||||
|
|
||||||
|
/* # of equivalence classes. */
|
||||||
|
Idx nequiv_classes;
|
||||||
|
|
||||||
|
/* # of range expressions. */
|
||||||
|
Idx nranges;
|
||||||
|
|
||||||
|
/* # of character classes. */
|
||||||
|
Idx nchar_classes;
|
||||||
|
} re_charset_t;
|
||||||
|
#endif /* RE_ENABLE_I18N */
|
||||||
|
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
union
|
||||||
|
{
|
||||||
|
unsigned char c; /* for CHARACTER */
|
||||||
|
re_bitset_ptr_t sbcset; /* for SIMPLE_BRACKET */
|
||||||
|
#ifdef RE_ENABLE_I18N
|
||||||
|
re_charset_t *mbcset; /* for COMPLEX_BRACKET */
|
||||||
|
#endif /* RE_ENABLE_I18N */
|
||||||
|
Idx idx; /* for BACK_REF */
|
||||||
|
re_context_type ctx_type; /* for ANCHOR */
|
||||||
|
} opr;
|
||||||
|
#if __GNUC__ >= 2 && !__STRICT_ANSI__
|
||||||
|
re_token_type_t type : 8;
|
||||||
|
#else
|
||||||
|
re_token_type_t type;
|
||||||
|
#endif
|
||||||
|
unsigned int constraint : 10; /* context constraint */
|
||||||
|
unsigned int duplicated : 1;
|
||||||
|
unsigned int opt_subexp : 1;
|
||||||
|
#ifdef RE_ENABLE_I18N
|
||||||
|
unsigned int accept_mb : 1;
|
||||||
|
/* These 2 bits can be moved into the union if needed (e.g. if running out
|
||||||
|
of bits; move opr.c to opr.c.c and move the flags to opr.c.flags). */
|
||||||
|
unsigned int mb_partial : 1;
|
||||||
|
#endif
|
||||||
|
unsigned int word_char : 1;
|
||||||
|
} re_token_t;
|
||||||
|
|
||||||
|
#define IS_EPSILON_NODE(type) ((type) & EPSILON_BIT)
|
||||||
|
|
||||||
|
struct re_string_t
|
||||||
|
{
|
||||||
|
/* Indicate the raw buffer which is the original string passed as an
|
||||||
|
argument of regexec(), re_search(), etc.. */
|
||||||
|
const unsigned char *raw_mbs;
|
||||||
|
/* Store the multibyte string. In case of "case insensitive mode" like
|
||||||
|
REG_ICASE, upper cases of the string are stored, otherwise MBS points
|
||||||
|
the same address that RAW_MBS points. */
|
||||||
|
unsigned char *mbs;
|
||||||
|
#ifdef RE_ENABLE_I18N
|
||||||
|
/* Store the wide character string which is corresponding to MBS. */
|
||||||
|
wint_t *wcs;
|
||||||
|
Idx *offsets;
|
||||||
|
mbstate_t cur_state;
|
||||||
|
#endif
|
||||||
|
/* Index in RAW_MBS. Each character mbs[i] corresponds to
|
||||||
|
raw_mbs[raw_mbs_idx + i]. */
|
||||||
|
Idx raw_mbs_idx;
|
||||||
|
/* The length of the valid characters in the buffers. */
|
||||||
|
Idx valid_len;
|
||||||
|
/* The corresponding number of bytes in raw_mbs array. */
|
||||||
|
Idx valid_raw_len;
|
||||||
|
/* The length of the buffers MBS and WCS. */
|
||||||
|
Idx bufs_len;
|
||||||
|
/* The index in MBS, which is updated by re_string_fetch_byte. */
|
||||||
|
Idx cur_idx;
|
||||||
|
/* length of RAW_MBS array. */
|
||||||
|
Idx raw_len;
|
||||||
|
/* This is RAW_LEN - RAW_MBS_IDX + VALID_LEN - VALID_RAW_LEN. */
|
||||||
|
Idx len;
|
||||||
|
/* End of the buffer may be shorter than its length in the cases such
|
||||||
|
as re_match_2, re_search_2. Then, we use STOP for end of the buffer
|
||||||
|
instead of LEN. */
|
||||||
|
Idx raw_stop;
|
||||||
|
/* This is RAW_STOP - RAW_MBS_IDX adjusted through OFFSETS. */
|
||||||
|
Idx stop;
|
||||||
|
|
||||||
|
/* The context of mbs[0]. We store the context independently, since
|
||||||
|
the context of mbs[0] may be different from raw_mbs[0], which is
|
||||||
|
the beginning of the input string. */
|
||||||
|
unsigned int tip_context;
|
||||||
|
/* The translation passed as a part of an argument of re_compile_pattern. */
|
||||||
|
RE_TRANSLATE_TYPE trans;
|
||||||
|
/* Copy of re_dfa_t's word_char. */
|
||||||
|
re_const_bitset_ptr_t word_char;
|
||||||
|
/* true if REG_ICASE. */
|
||||||
|
unsigned char icase;
|
||||||
|
unsigned char is_utf8;
|
||||||
|
unsigned char map_notascii;
|
||||||
|
unsigned char mbs_allocated;
|
||||||
|
unsigned char offsets_needed;
|
||||||
|
unsigned char newline_anchor;
|
||||||
|
unsigned char word_ops_used;
|
||||||
|
int mb_cur_max;
|
||||||
|
};
|
||||||
|
typedef struct re_string_t re_string_t;
|
||||||
|
|
||||||
|
|
||||||
|
struct re_dfa_t;
|
||||||
|
typedef struct re_dfa_t re_dfa_t;
|
||||||
|
|
||||||
|
#ifndef _LIBC
|
||||||
|
# if defined __i386__ && !defined __EMX__
|
||||||
|
# define internal_function __attribute ((regparm (3), stdcall))
|
||||||
|
# else
|
||||||
|
# define internal_function
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
static reg_errcode_t re_string_realloc_buffers (re_string_t *pstr,
|
||||||
|
Idx new_buf_len)
|
||||||
|
internal_function;
|
||||||
|
#ifdef RE_ENABLE_I18N
|
||||||
|
static void build_wcs_buffer (re_string_t *pstr) internal_function;
|
||||||
|
static reg_errcode_t build_wcs_upper_buffer (re_string_t *pstr)
|
||||||
|
internal_function;
|
||||||
|
#endif /* RE_ENABLE_I18N */
|
||||||
|
static void build_upper_buffer (re_string_t *pstr) internal_function;
|
||||||
|
static void re_string_translate_buffer (re_string_t *pstr) internal_function;
|
||||||
|
static unsigned int re_string_context_at (const re_string_t *input, Idx idx,
|
||||||
|
int eflags)
|
||||||
|
internal_function __attribute ((pure));
|
||||||
|
#define re_string_peek_byte(pstr, offset) \
|
||||||
|
((pstr)->mbs[(pstr)->cur_idx + offset])
|
||||||
|
#define re_string_fetch_byte(pstr) \
|
||||||
|
((pstr)->mbs[(pstr)->cur_idx++])
|
||||||
|
#define re_string_first_byte(pstr, idx) \
|
||||||
|
((idx) == (pstr)->valid_len || (pstr)->wcs[idx] != WEOF)
|
||||||
|
#define re_string_is_single_byte_char(pstr, idx) \
|
||||||
|
((pstr)->wcs[idx] != WEOF && ((pstr)->valid_len == (idx) + 1 \
|
||||||
|
|| (pstr)->wcs[(idx) + 1] != WEOF))
|
||||||
|
#define re_string_eoi(pstr) ((pstr)->stop <= (pstr)->cur_idx)
|
||||||
|
#define re_string_cur_idx(pstr) ((pstr)->cur_idx)
|
||||||
|
#define re_string_get_buffer(pstr) ((pstr)->mbs)
|
||||||
|
#define re_string_length(pstr) ((pstr)->len)
|
||||||
|
#define re_string_byte_at(pstr,idx) ((pstr)->mbs[idx])
|
||||||
|
#define re_string_skip_bytes(pstr,idx) ((pstr)->cur_idx += (idx))
|
||||||
|
#define re_string_set_index(pstr,idx) ((pstr)->cur_idx = (idx))
|
||||||
|
|
||||||
|
#include <alloca.h>
|
||||||
|
|
||||||
|
#ifndef _LIBC
|
||||||
|
# if HAVE_ALLOCA
|
||||||
|
/* The OS usually guarantees only one guard page at the bottom of the stack,
|
||||||
|
and a page size can be as small as 4096 bytes. So we cannot safely
|
||||||
|
allocate anything larger than 4096 bytes. Also care for the possibility
|
||||||
|
of a few compiler-allocated temporary stack slots. */
|
||||||
|
# define __libc_use_alloca(n) ((n) < 4032)
|
||||||
|
# else
|
||||||
|
/* alloca is implemented with malloc, so just use malloc. */
|
||||||
|
# define __libc_use_alloca(n) 0
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef MAX
|
||||||
|
# define MAX(a,b) ((a) < (b) ? (b) : (a))
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define re_malloc(t,n) ((t *) malloc ((n) * sizeof (t)))
|
||||||
|
#define re_realloc(p,t,n) ((t *) realloc (p, (n) * sizeof (t)))
|
||||||
|
#define re_free(p) free (p)
|
||||||
|
|
||||||
|
struct bin_tree_t
|
||||||
|
{
|
||||||
|
struct bin_tree_t *parent;
|
||||||
|
struct bin_tree_t *left;
|
||||||
|
struct bin_tree_t *right;
|
||||||
|
struct bin_tree_t *first;
|
||||||
|
struct bin_tree_t *next;
|
||||||
|
|
||||||
|
re_token_t token;
|
||||||
|
|
||||||
|
/* `node_idx' is the index in dfa->nodes, if `type' == 0.
|
||||||
|
Otherwise `type' indicate the type of this node. */
|
||||||
|
Idx node_idx;
|
||||||
|
};
|
||||||
|
typedef struct bin_tree_t bin_tree_t;
|
||||||
|
|
||||||
|
#define BIN_TREE_STORAGE_SIZE \
|
||||||
|
((1024 - sizeof (void *)) / sizeof (bin_tree_t))
|
||||||
|
|
||||||
|
struct bin_tree_storage_t
|
||||||
|
{
|
||||||
|
struct bin_tree_storage_t *next;
|
||||||
|
bin_tree_t data[BIN_TREE_STORAGE_SIZE];
|
||||||
|
};
|
||||||
|
typedef struct bin_tree_storage_t bin_tree_storage_t;
|
||||||
|
|
||||||
|
#define CONTEXT_WORD 1
|
||||||
|
#define CONTEXT_NEWLINE (CONTEXT_WORD << 1)
|
||||||
|
#define CONTEXT_BEGBUF (CONTEXT_NEWLINE << 1)
|
||||||
|
#define CONTEXT_ENDBUF (CONTEXT_BEGBUF << 1)
|
||||||
|
|
||||||
|
#define IS_WORD_CONTEXT(c) ((c) & CONTEXT_WORD)
|
||||||
|
#define IS_NEWLINE_CONTEXT(c) ((c) & CONTEXT_NEWLINE)
|
||||||
|
#define IS_BEGBUF_CONTEXT(c) ((c) & CONTEXT_BEGBUF)
|
||||||
|
#define IS_ENDBUF_CONTEXT(c) ((c) & CONTEXT_ENDBUF)
|
||||||
|
#define IS_ORDINARY_CONTEXT(c) ((c) == 0)
|
||||||
|
|
||||||
|
#define IS_WORD_CHAR(ch) (isalnum (ch) || (ch) == '_')
|
||||||
|
#define IS_NEWLINE(ch) ((ch) == NEWLINE_CHAR)
|
||||||
|
#define IS_WIDE_WORD_CHAR(ch) (iswalnum (ch) || (ch) == L'_')
|
||||||
|
#define IS_WIDE_NEWLINE(ch) ((ch) == WIDE_NEWLINE_CHAR)
|
||||||
|
|
||||||
|
#define NOT_SATISFY_PREV_CONSTRAINT(constraint,context) \
|
||||||
|
((((constraint) & PREV_WORD_CONSTRAINT) && !IS_WORD_CONTEXT (context)) \
|
||||||
|
|| ((constraint & PREV_NOTWORD_CONSTRAINT) && IS_WORD_CONTEXT (context)) \
|
||||||
|
|| ((constraint & PREV_NEWLINE_CONSTRAINT) && !IS_NEWLINE_CONTEXT (context))\
|
||||||
|
|| ((constraint & PREV_BEGBUF_CONSTRAINT) && !IS_BEGBUF_CONTEXT (context)))
|
||||||
|
|
||||||
|
#define NOT_SATISFY_NEXT_CONSTRAINT(constraint,context) \
|
||||||
|
((((constraint) & NEXT_WORD_CONSTRAINT) && !IS_WORD_CONTEXT (context)) \
|
||||||
|
|| (((constraint) & NEXT_NOTWORD_CONSTRAINT) && IS_WORD_CONTEXT (context)) \
|
||||||
|
|| (((constraint) & NEXT_NEWLINE_CONSTRAINT) && !IS_NEWLINE_CONTEXT (context)) \
|
||||||
|
|| (((constraint) & NEXT_ENDBUF_CONSTRAINT) && !IS_ENDBUF_CONTEXT (context)))
|
||||||
|
|
||||||
|
struct re_dfastate_t
|
||||||
|
{
|
||||||
|
re_hashval_t hash;
|
||||||
|
re_node_set nodes;
|
||||||
|
re_node_set non_eps_nodes;
|
||||||
|
re_node_set inveclosure;
|
||||||
|
re_node_set *entrance_nodes;
|
||||||
|
struct re_dfastate_t **trtable, **word_trtable;
|
||||||
|
unsigned int context : 4;
|
||||||
|
unsigned int halt : 1;
|
||||||
|
/* If this state can accept `multi byte'.
|
||||||
|
Note that we refer to multibyte characters, and multi character
|
||||||
|
collating elements as `multi byte'. */
|
||||||
|
unsigned int accept_mb : 1;
|
||||||
|
/* If this state has backreference node(s). */
|
||||||
|
unsigned int has_backref : 1;
|
||||||
|
unsigned int has_constraint : 1;
|
||||||
|
};
|
||||||
|
typedef struct re_dfastate_t re_dfastate_t;
|
||||||
|
|
||||||
|
struct re_state_table_entry
|
||||||
|
{
|
||||||
|
Idx num;
|
||||||
|
Idx alloc;
|
||||||
|
re_dfastate_t **array;
|
||||||
|
};
|
||||||
|
|
||||||
|
/* Array type used in re_sub_match_last_t and re_sub_match_top_t. */
|
||||||
|
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
Idx next_idx;
|
||||||
|
Idx alloc;
|
||||||
|
re_dfastate_t **array;
|
||||||
|
} state_array_t;
|
||||||
|
|
||||||
|
/* Store information about the node NODE whose type is OP_CLOSE_SUBEXP. */
|
||||||
|
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
Idx node;
|
||||||
|
Idx str_idx; /* The position NODE match at. */
|
||||||
|
state_array_t path;
|
||||||
|
} re_sub_match_last_t;
|
||||||
|
|
||||||
|
/* Store information about the node NODE whose type is OP_OPEN_SUBEXP.
|
||||||
|
And information about the node, whose type is OP_CLOSE_SUBEXP,
|
||||||
|
corresponding to NODE is stored in LASTS. */
|
||||||
|
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
Idx str_idx;
|
||||||
|
Idx node;
|
||||||
|
state_array_t *path;
|
||||||
|
Idx alasts; /* Allocation size of LASTS. */
|
||||||
|
Idx nlasts; /* The number of LASTS. */
|
||||||
|
re_sub_match_last_t **lasts;
|
||||||
|
} re_sub_match_top_t;
|
||||||
|
|
||||||
|
struct re_backref_cache_entry
|
||||||
|
{
|
||||||
|
Idx node;
|
||||||
|
Idx str_idx;
|
||||||
|
Idx subexp_from;
|
||||||
|
Idx subexp_to;
|
||||||
|
char more;
|
||||||
|
char unused;
|
||||||
|
unsigned short int eps_reachable_subexps_map;
|
||||||
|
};
|
||||||
|
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
/* The string object corresponding to the input string. */
|
||||||
|
re_string_t input;
|
||||||
|
#if defined _LIBC || (defined __STDC_VERSION__ && __STDC_VERSION__ >= 199901L)
|
||||||
|
const re_dfa_t *const dfa;
|
||||||
|
#else
|
||||||
|
const re_dfa_t *dfa;
|
||||||
|
#endif
|
||||||
|
/* EFLAGS of the argument of regexec. */
|
||||||
|
int eflags;
|
||||||
|
/* Where the matching ends. */
|
||||||
|
Idx match_last;
|
||||||
|
Idx last_node;
|
||||||
|
/* The state log used by the matcher. */
|
||||||
|
re_dfastate_t **state_log;
|
||||||
|
Idx state_log_top;
|
||||||
|
/* Back reference cache. */
|
||||||
|
Idx nbkref_ents;
|
||||||
|
Idx abkref_ents;
|
||||||
|
struct re_backref_cache_entry *bkref_ents;
|
||||||
|
int max_mb_elem_len;
|
||||||
|
Idx nsub_tops;
|
||||||
|
Idx asub_tops;
|
||||||
|
re_sub_match_top_t **sub_tops;
|
||||||
|
} re_match_context_t;
|
||||||
|
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
re_dfastate_t **sifted_states;
|
||||||
|
re_dfastate_t **limited_states;
|
||||||
|
Idx last_node;
|
||||||
|
Idx last_str_idx;
|
||||||
|
re_node_set limits;
|
||||||
|
} re_sift_context_t;
|
||||||
|
|
||||||
|
struct re_fail_stack_ent_t
|
||||||
|
{
|
||||||
|
Idx idx;
|
||||||
|
Idx node;
|
||||||
|
regmatch_t *regs;
|
||||||
|
re_node_set eps_via_nodes;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct re_fail_stack_t
|
||||||
|
{
|
||||||
|
Idx num;
|
||||||
|
Idx alloc;
|
||||||
|
struct re_fail_stack_ent_t *stack;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct re_dfa_t
|
||||||
|
{
|
||||||
|
re_token_t *nodes;
|
||||||
|
size_t nodes_alloc;
|
||||||
|
size_t nodes_len;
|
||||||
|
Idx *nexts;
|
||||||
|
Idx *org_indices;
|
||||||
|
re_node_set *edests;
|
||||||
|
re_node_set *eclosures;
|
||||||
|
re_node_set *inveclosures;
|
||||||
|
struct re_state_table_entry *state_table;
|
||||||
|
re_dfastate_t *init_state;
|
||||||
|
re_dfastate_t *init_state_word;
|
||||||
|
re_dfastate_t *init_state_nl;
|
||||||
|
re_dfastate_t *init_state_begbuf;
|
||||||
|
bin_tree_t *str_tree;
|
||||||
|
bin_tree_storage_t *str_tree_storage;
|
||||||
|
re_bitset_ptr_t sb_char;
|
||||||
|
int str_tree_storage_idx;
|
||||||
|
|
||||||
|
/* number of subexpressions `re_nsub' is in regex_t. */
|
||||||
|
re_hashval_t state_hash_mask;
|
||||||
|
Idx init_node;
|
||||||
|
Idx nbackref; /* The number of backreference in this dfa. */
|
||||||
|
|
||||||
|
/* Bitmap expressing which backreference is used. */
|
||||||
|
bitset_word_t used_bkref_map;
|
||||||
|
bitset_word_t completed_bkref_map;
|
||||||
|
|
||||||
|
unsigned int has_plural_match : 1;
|
||||||
|
/* If this dfa has "multibyte node", which is a backreference or
|
||||||
|
a node which can accept multibyte character or multi character
|
||||||
|
collating element. */
|
||||||
|
unsigned int has_mb_node : 1;
|
||||||
|
unsigned int is_utf8 : 1;
|
||||||
|
unsigned int map_notascii : 1;
|
||||||
|
unsigned int word_ops_used : 1;
|
||||||
|
int mb_cur_max;
|
||||||
|
bitset_t word_char;
|
||||||
|
reg_syntax_t syntax;
|
||||||
|
Idx *subexp_map;
|
||||||
|
#ifdef DEBUG
|
||||||
|
char* re_str;
|
||||||
|
#endif
|
||||||
|
#ifdef _LIBC
|
||||||
|
__libc_lock_define (, lock)
|
||||||
|
#endif
|
||||||
|
};
|
||||||
|
|
||||||
|
#define re_node_set_init_empty(set) memset (set, '\0', sizeof (re_node_set))
|
||||||
|
#define re_node_set_remove(set,id) \
|
||||||
|
(re_node_set_remove_at (set, re_node_set_contains (set, id) - 1))
|
||||||
|
#define re_node_set_empty(p) ((p)->nelem = 0)
|
||||||
|
#define re_node_set_free(set) re_free ((set)->elems)
|
||||||
|
|
||||||
|
|
||||||
|
typedef enum
|
||||||
|
{
|
||||||
|
SB_CHAR,
|
||||||
|
MB_CHAR,
|
||||||
|
EQUIV_CLASS,
|
||||||
|
COLL_SYM,
|
||||||
|
CHAR_CLASS
|
||||||
|
} bracket_elem_type;
|
||||||
|
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
bracket_elem_type type;
|
||||||
|
union
|
||||||
|
{
|
||||||
|
unsigned char ch;
|
||||||
|
unsigned char *name;
|
||||||
|
wchar_t wch;
|
||||||
|
} opr;
|
||||||
|
} bracket_elem_t;
|
||||||
|
|
||||||
|
|
||||||
|
/* Inline functions for bitset_t operation. */
|
||||||
|
|
||||||
|
static inline void
|
||||||
|
bitset_set (bitset_t set, Idx i)
|
||||||
|
{
|
||||||
|
set[i / BITSET_WORD_BITS] |= (bitset_word_t) 1 << i % BITSET_WORD_BITS;
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline void
|
||||||
|
bitset_clear (bitset_t set, Idx i)
|
||||||
|
{
|
||||||
|
set[i / BITSET_WORD_BITS] &= ~ ((bitset_word_t) 1 << i % BITSET_WORD_BITS);
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline bool
|
||||||
|
bitset_contain (const bitset_t set, Idx i)
|
||||||
|
{
|
||||||
|
return (set[i / BITSET_WORD_BITS] >> i % BITSET_WORD_BITS) & 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline void
|
||||||
|
bitset_empty (bitset_t set)
|
||||||
|
{
|
||||||
|
memset (set, '\0', sizeof (bitset_t));
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline void
|
||||||
|
bitset_set_all (bitset_t set)
|
||||||
|
{
|
||||||
|
memset (set, -1, sizeof (bitset_word_t) * (SBC_MAX / BITSET_WORD_BITS));
|
||||||
|
if (SBC_MAX % BITSET_WORD_BITS != 0)
|
||||||
|
set[BITSET_WORDS - 1] =
|
||||||
|
((bitset_word_t) 1 << SBC_MAX % BITSET_WORD_BITS) - 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline void
|
||||||
|
bitset_copy (bitset_t dest, const bitset_t src)
|
||||||
|
{
|
||||||
|
memcpy (dest, src, sizeof (bitset_t));
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline void
|
||||||
|
bitset_not (bitset_t set)
|
||||||
|
{
|
||||||
|
int bitset_i;
|
||||||
|
for (bitset_i = 0; bitset_i < SBC_MAX / BITSET_WORD_BITS; ++bitset_i)
|
||||||
|
set[bitset_i] = ~set[bitset_i];
|
||||||
|
if (SBC_MAX % BITSET_WORD_BITS != 0)
|
||||||
|
set[BITSET_WORDS - 1] =
|
||||||
|
((((bitset_word_t) 1 << SBC_MAX % BITSET_WORD_BITS) - 1)
|
||||||
|
& ~set[BITSET_WORDS - 1]);
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline void
|
||||||
|
bitset_merge (bitset_t dest, const bitset_t src)
|
||||||
|
{
|
||||||
|
int bitset_i;
|
||||||
|
for (bitset_i = 0; bitset_i < BITSET_WORDS; ++bitset_i)
|
||||||
|
dest[bitset_i] |= src[bitset_i];
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline void
|
||||||
|
bitset_mask (bitset_t dest, const bitset_t src)
|
||||||
|
{
|
||||||
|
int bitset_i;
|
||||||
|
for (bitset_i = 0; bitset_i < BITSET_WORDS; ++bitset_i)
|
||||||
|
dest[bitset_i] &= src[bitset_i];
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef RE_ENABLE_I18N
|
||||||
|
/* Inline functions for re_string. */
|
||||||
|
static inline int
|
||||||
|
internal_function __attribute ((pure))
|
||||||
|
re_string_char_size_at (const re_string_t *pstr, Idx idx)
|
||||||
|
{
|
||||||
|
int byte_idx;
|
||||||
|
if (pstr->mb_cur_max == 1)
|
||||||
|
return 1;
|
||||||
|
for (byte_idx = 1; idx + byte_idx < pstr->valid_len; ++byte_idx)
|
||||||
|
if (pstr->wcs[idx + byte_idx] != WEOF)
|
||||||
|
break;
|
||||||
|
return byte_idx;
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline wint_t
|
||||||
|
internal_function __attribute ((pure))
|
||||||
|
re_string_wchar_at (const re_string_t *pstr, Idx idx)
|
||||||
|
{
|
||||||
|
if (pstr->mb_cur_max == 1)
|
||||||
|
return (wint_t) pstr->mbs[idx];
|
||||||
|
return (wint_t) pstr->wcs[idx];
|
||||||
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
internal_function __attribute ((pure))
|
||||||
|
re_string_elem_size_at (const re_string_t *pstr, Idx idx)
|
||||||
|
{
|
||||||
|
# ifdef _LIBC
|
||||||
|
const unsigned char *p, *extra;
|
||||||
|
const int32_t *table, *indirect;
|
||||||
|
int32_t tmp;
|
||||||
|
# include <locale/weight.h>
|
||||||
|
uint_fast32_t nrules = _NL_CURRENT_WORD (LC_COLLATE, _NL_COLLATE_NRULES);
|
||||||
|
|
||||||
|
if (nrules != 0)
|
||||||
|
{
|
||||||
|
table = (const int32_t *) _NL_CURRENT (LC_COLLATE, _NL_COLLATE_TABLEMB);
|
||||||
|
extra = (const unsigned char *)
|
||||||
|
_NL_CURRENT (LC_COLLATE, _NL_COLLATE_EXTRAMB);
|
||||||
|
indirect = (const int32_t *) _NL_CURRENT (LC_COLLATE,
|
||||||
|
_NL_COLLATE_INDIRECTMB);
|
||||||
|
p = pstr->mbs + idx;
|
||||||
|
tmp = findidx (&p);
|
||||||
|
return p - pstr->mbs - idx;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
# endif /* _LIBC */
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
#endif /* RE_ENABLE_I18N */
|
||||||
|
|
||||||
|
#ifndef __GNUC_PREREQ
|
||||||
|
# if defined __GNUC__ && defined __GNUC_MINOR__
|
||||||
|
# define __GNUC_PREREQ(maj, min) \
|
||||||
|
((__GNUC__ << 16) + __GNUC_MINOR__ >= ((maj) << 16) + (min))
|
||||||
|
# else
|
||||||
|
# define __GNUC_PREREQ(maj, min) 0
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if __GNUC_PREREQ (3,4)
|
||||||
|
# undef __attribute_warn_unused_result__
|
||||||
|
# define __attribute_warn_unused_result__ \
|
||||||
|
__attribute__ ((__warn_unused_result__))
|
||||||
|
#else
|
||||||
|
# define __attribute_warn_unused_result__ /* empty */
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif /* _REGEX_INTERNAL_H */
|
4416
gnulib/regexec.c
Normal file
4416
gnulib/regexec.c
Normal file
File diff suppressed because it is too large
Load diff
|
@ -91,7 +91,7 @@ grub_dl_t grub_dl_load_core (void *addr, grub_size_t size);
|
||||||
int EXPORT_FUNC(grub_dl_unload) (grub_dl_t mod);
|
int EXPORT_FUNC(grub_dl_unload) (grub_dl_t mod);
|
||||||
void grub_dl_unload_unneeded (void);
|
void grub_dl_unload_unneeded (void);
|
||||||
void grub_dl_unload_all (void);
|
void grub_dl_unload_all (void);
|
||||||
#if defined (GRUB_MACHINE_EMU) || defined (GRUB_UTIL)
|
#if defined (GRUB_UTIL) || defined (GRUB_TARGET_NO_MODULES)
|
||||||
#define GRUB_NO_MODULES 1
|
#define GRUB_NO_MODULES 1
|
||||||
#else
|
#else
|
||||||
#define GRUB_NO_MODULES 0
|
#define GRUB_NO_MODULES 0
|
||||||
|
@ -121,7 +121,7 @@ grub_err_t grub_dl_register_symbol (const char *name, void *addr,
|
||||||
grub_err_t grub_arch_dl_check_header (void *ehdr);
|
grub_err_t grub_arch_dl_check_header (void *ehdr);
|
||||||
grub_err_t grub_arch_dl_relocate_symbols (grub_dl_t mod, void *ehdr);
|
grub_err_t grub_arch_dl_relocate_symbols (grub_dl_t mod, void *ehdr);
|
||||||
|
|
||||||
#if defined (_mips) && ! defined (GRUB_UTIL) && !defined (GRUB_MACHINE_EMU)
|
#if defined (_mips) && ! GRUB_NO_MODULES
|
||||||
#define GRUB_LINKER_HAVE_INIT 1
|
#define GRUB_LINKER_HAVE_INIT 1
|
||||||
void grub_arch_dl_init_linker (void);
|
void grub_arch_dl_init_linker (void);
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -34,9 +34,9 @@
|
||||||
by firmware. */
|
by firmware. */
|
||||||
#define GRUB_MACHINE_MEMORY_HOLE 6
|
#define GRUB_MACHINE_MEMORY_HOLE 6
|
||||||
|
|
||||||
|
grub_err_t grub_machine_mmap_iterate (int NESTED_FUNC_ATTR (*hook) (grub_uint64_t,
|
||||||
grub_err_t EXPORT_FUNC(grub_machine_mmap_iterate)
|
grub_uint64_t,
|
||||||
(int NESTED_FUNC_ATTR (*hook) (grub_uint64_t, grub_uint64_t, grub_uint32_t));
|
grub_uint32_t));
|
||||||
grub_err_t grub_machine_mmap_register (grub_uint64_t start, grub_uint64_t size,
|
grub_err_t grub_machine_mmap_register (grub_uint64_t start, grub_uint64_t size,
|
||||||
int type, int handle);
|
int type, int handle);
|
||||||
grub_err_t grub_machine_mmap_unregister (int handle);
|
grub_err_t grub_machine_mmap_unregister (int handle);
|
||||||
|
|
1
include/grub/i386/coreboot/loader.h
Normal file
1
include/grub/i386/coreboot/loader.h
Normal file
|
@ -0,0 +1 @@
|
||||||
|
#include <grub/cpu/loader.h>
|
36
include/grub/i386/multiboot.h
Normal file
36
include/grub/i386/multiboot.h
Normal file
|
@ -0,0 +1,36 @@
|
||||||
|
/*
|
||||||
|
* GRUB -- GRand Unified Bootloader
|
||||||
|
* Copyright (C) 2002,2003,2004,2007,2008,2009 Free Software Foundation, Inc.
|
||||||
|
*
|
||||||
|
* GRUB 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, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* GRUB is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with GRUB. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef GRUB_MULTIBOOT_CPU_HEADER
|
||||||
|
#define GRUB_MULTIBOOT_CPU_HEADER 1
|
||||||
|
|
||||||
|
#define MULTIBOOT_INITIAL_STATE { .eax = MULTIBOOT_BOOTLOADER_MAGIC, \
|
||||||
|
.ecx = 0, \
|
||||||
|
.edx = 0, \
|
||||||
|
/* Set esp to some random location in low memory to avoid breaking */ \
|
||||||
|
/* non-compliant kernels. */ \
|
||||||
|
.esp = 0x7ff00 \
|
||||||
|
}
|
||||||
|
#define MULTIBOOT_ENTRY_REGISTER eip
|
||||||
|
#define MULTIBOOT_MBI_REGISTER ebx
|
||||||
|
#define MULTIBOOT_ARCHITECTURE_CURRENT MULTIBOOT_ARCHITECTURE_I386
|
||||||
|
|
||||||
|
#define MULTIBOOT_ELF32_MACHINE EM_386
|
||||||
|
#define MULTIBOOT_ELF64_MACHINE EM_X86_64
|
||||||
|
|
||||||
|
#endif /* ! GRUB_MULTIBOOT_CPU_HEADER */
|
|
@ -33,7 +33,7 @@ grub_uint32_t grub_get_eisa_mmap (void);
|
||||||
|
|
||||||
/* Get a memory map entry. Return next continuation value. Zero means
|
/* Get a memory map entry. Return next continuation value. Zero means
|
||||||
the end. */
|
the end. */
|
||||||
grub_uint32_t EXPORT_FUNC(grub_get_mmap_entry) (struct grub_machine_mmap_entry *entry,
|
grub_uint32_t grub_get_mmap_entry (struct grub_machine_mmap_entry *entry,
|
||||||
grub_uint32_t cont);
|
grub_uint32_t cont);
|
||||||
|
|
||||||
/* Turn on/off Gate A20. */
|
/* Turn on/off Gate A20. */
|
||||||
|
|
|
@ -28,7 +28,4 @@
|
||||||
/* Set the video mode to MODE and return the previous mode. */
|
/* Set the video mode to MODE and return the previous mode. */
|
||||||
unsigned char EXPORT_FUNC(grub_vga_set_mode) (unsigned char mode);
|
unsigned char EXPORT_FUNC(grub_vga_set_mode) (unsigned char mode);
|
||||||
|
|
||||||
/* Return a pointer to the ROM font table. */
|
|
||||||
unsigned char *EXPORT_FUNC(grub_vga_get_font) (void);
|
|
||||||
|
|
||||||
#endif /* ! GRUB_VGA_MACHINE_HEADER */
|
#endif /* ! GRUB_VGA_MACHINE_HEADER */
|
||||||
|
|
|
@ -18,21 +18,31 @@
|
||||||
|
|
||||||
#include <config.h>
|
#include <config.h>
|
||||||
|
|
||||||
#ifdef HAVE___ASHLDI3
|
/* On x86 these functions aren't really needed. Save some space. */
|
||||||
|
#if !defined (__i386__) && !defined (__x86_64__)
|
||||||
|
# ifdef HAVE___ASHLDI3
|
||||||
void EXPORT_FUNC (__ashldi3) (void);
|
void EXPORT_FUNC (__ashldi3) (void);
|
||||||
#endif
|
# endif
|
||||||
#ifdef HAVE___ASHRDI3
|
# ifdef HAVE___ASHRDI3
|
||||||
void EXPORT_FUNC (__ashrdi3) (void);
|
void EXPORT_FUNC (__ashrdi3) (void);
|
||||||
#endif
|
# endif
|
||||||
#ifdef HAVE___LSHRDI3
|
# ifdef HAVE___LSHRDI3
|
||||||
void EXPORT_FUNC (__lshrdi3) (void);
|
void EXPORT_FUNC (__lshrdi3) (void);
|
||||||
|
# endif
|
||||||
|
# ifdef HAVE___UCMPDI2
|
||||||
|
void EXPORT_FUNC (__ucmpdi2) (void);
|
||||||
|
# endif
|
||||||
|
# ifdef HAVE___BSWAPSI2
|
||||||
|
void EXPORT_FUNC (__bswapsi2) (void);
|
||||||
|
# endif
|
||||||
|
# ifdef HAVE___BSWAPDI2
|
||||||
|
void EXPORT_FUNC (__bswapdi2) (void);
|
||||||
|
# endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef HAVE___TRAMPOLINE_SETUP
|
#ifdef HAVE___TRAMPOLINE_SETUP
|
||||||
void EXPORT_FUNC (__trampoline_setup) (void);
|
void EXPORT_FUNC (__trampoline_setup) (void);
|
||||||
#endif
|
#endif
|
||||||
#ifdef HAVE___UCMPDI2
|
|
||||||
void EXPORT_FUNC (__ucmpdi2) (void);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef HAVE__RESTGPR_14_X
|
#ifdef HAVE__RESTGPR_14_X
|
||||||
void EXPORT_FUNC (_restgpr_14_x) (void);
|
void EXPORT_FUNC (_restgpr_14_x) (void);
|
29
include/grub/libusb.h
Normal file
29
include/grub/libusb.h
Normal file
|
@ -0,0 +1,29 @@
|
||||||
|
/*
|
||||||
|
* GRUB -- GRand Unified Bootloader
|
||||||
|
* Copyright (C) 2010 Free Software Foundation, Inc.
|
||||||
|
*
|
||||||
|
* GRUB 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, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* GRUB is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with GRUB. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
void EXPORT_FUNC (usb_bulk_write) (void);
|
||||||
|
void EXPORT_FUNC (usb_find_busses) (void);
|
||||||
|
void EXPORT_FUNC (usb_init) (void);
|
||||||
|
void EXPORT_FUNC (usb_find_devices) (void);
|
||||||
|
void EXPORT_FUNC (usb_open) (void);
|
||||||
|
void EXPORT_FUNC (usb_get_busses) (void);
|
||||||
|
void EXPORT_FUNC (usb_control_msg) (void);
|
||||||
|
void EXPORT_FUNC (usb_release_interface) (void);
|
||||||
|
void EXPORT_FUNC (usb_close) (void);
|
||||||
|
void EXPORT_FUNC (usb_bulk_read) (void);
|
||||||
|
void EXPORT_FUNC (usb_claim_interface) (void);
|
|
@ -263,10 +263,15 @@ grub_size_t EXPORT_FUNC(grub_utf8_to_ucs4) (grub_uint32_t *dest,
|
||||||
grub_uint64_t EXPORT_FUNC(grub_divmod64) (grub_uint64_t n,
|
grub_uint64_t EXPORT_FUNC(grub_divmod64) (grub_uint64_t n,
|
||||||
grub_uint32_t d, grub_uint32_t *r);
|
grub_uint32_t d, grub_uint32_t *r);
|
||||||
|
|
||||||
#ifdef NEED_ENABLE_EXECUTE_STACK
|
#if defined(NEED_ENABLE_EXECUTE_STACK) && !defined(GRUB_UTIL)
|
||||||
void EXPORT_FUNC(__enable_execute_stack) (void *addr);
|
void EXPORT_FUNC(__enable_execute_stack) (void *addr);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#if defined (NEED_REGISTER_FRAME_INFO) && !defined(GRUB_UTIL)
|
||||||
|
void EXPORT_FUNC (__register_frame_info) (void);
|
||||||
|
void EXPORT_FUNC (__deregister_frame_info) (void);
|
||||||
|
#endif
|
||||||
|
|
||||||
/* Inline functions. */
|
/* Inline functions. */
|
||||||
|
|
||||||
static inline unsigned int
|
static inline unsigned int
|
||||||
|
|
|
@ -96,17 +96,17 @@ void read_handler_list (void);
|
||||||
void free_handler_list (void);
|
void free_handler_list (void);
|
||||||
|
|
||||||
/* Defined in `dyncmd.c'. */
|
/* Defined in `dyncmd.c'. */
|
||||||
void read_command_list (void);
|
void read_command_list (const char *prefix);
|
||||||
|
|
||||||
/* Defined in `autofs.c'. */
|
/* Defined in `autofs.c'. */
|
||||||
void read_fs_list (void);
|
void read_fs_list (const char *prefix);
|
||||||
|
|
||||||
void grub_context_init (void);
|
void grub_context_init (void);
|
||||||
void grub_context_fini (void);
|
void grub_context_fini (void);
|
||||||
|
|
||||||
void read_crypto_list (void);
|
void read_crypto_list (const char *prefix);
|
||||||
|
|
||||||
void read_terminal_list (void);
|
void read_terminal_list (const char *prefix);
|
||||||
|
|
||||||
void grub_set_more (int onoff);
|
void grub_set_more (int onoff);
|
||||||
|
|
||||||
|
|
|
@ -121,6 +121,21 @@ struct grub_script_cmdfor
|
||||||
struct grub_script_cmd *list;
|
struct grub_script_cmd *list;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/* A while/until command. */
|
||||||
|
struct grub_script_cmdwhile
|
||||||
|
{
|
||||||
|
struct grub_script_cmd cmd;
|
||||||
|
|
||||||
|
/* The command list used as condition. */
|
||||||
|
struct grub_script_cmd *cond;
|
||||||
|
|
||||||
|
/* The command list executed in each loop. */
|
||||||
|
struct grub_script_cmd *list;
|
||||||
|
|
||||||
|
/* The flag to indicate this as "until" loop. */
|
||||||
|
int until;
|
||||||
|
};
|
||||||
|
|
||||||
/* A menu entry generate statement. */
|
/* A menu entry generate statement. */
|
||||||
struct grub_script_cmd_menuentry
|
struct grub_script_cmd_menuentry
|
||||||
{
|
{
|
||||||
|
@ -234,6 +249,12 @@ grub_script_create_cmdfor (struct grub_parser_param *state,
|
||||||
struct grub_script_arglist *words,
|
struct grub_script_arglist *words,
|
||||||
struct grub_script_cmd *list);
|
struct grub_script_cmd *list);
|
||||||
|
|
||||||
|
struct grub_script_cmd *
|
||||||
|
grub_script_create_cmdwhile (struct grub_parser_param *state,
|
||||||
|
struct grub_script_cmd *cond,
|
||||||
|
struct grub_script_cmd *list,
|
||||||
|
int is_an_until_loop);
|
||||||
|
|
||||||
struct grub_script_cmd *
|
struct grub_script_cmd *
|
||||||
grub_script_create_cmdmenu (struct grub_parser_param *state,
|
grub_script_create_cmdmenu (struct grub_parser_param *state,
|
||||||
struct grub_script_arglist *arglist,
|
struct grub_script_arglist *arglist,
|
||||||
|
@ -283,6 +304,7 @@ grub_err_t grub_script_execute_cmdline (struct grub_script_cmd *cmd);
|
||||||
grub_err_t grub_script_execute_cmdblock (struct grub_script_cmd *cmd);
|
grub_err_t grub_script_execute_cmdblock (struct grub_script_cmd *cmd);
|
||||||
grub_err_t grub_script_execute_cmdif (struct grub_script_cmd *cmd);
|
grub_err_t grub_script_execute_cmdif (struct grub_script_cmd *cmd);
|
||||||
grub_err_t grub_script_execute_cmdfor (struct grub_script_cmd *cmd);
|
grub_err_t grub_script_execute_cmdfor (struct grub_script_cmd *cmd);
|
||||||
|
grub_err_t grub_script_execute_cmdwhile (struct grub_script_cmd *cmd);
|
||||||
grub_err_t grub_script_execute_menuentry (struct grub_script_cmd *cmd);
|
grub_err_t grub_script_execute_menuentry (struct grub_script_cmd *cmd);
|
||||||
|
|
||||||
/* Execute any GRUB pre-parsed command or script. */
|
/* Execute any GRUB pre-parsed command or script. */
|
||||||
|
|
24
include/grub/sdl.h
Normal file
24
include/grub/sdl.h
Normal file
|
@ -0,0 +1,24 @@
|
||||||
|
/*
|
||||||
|
* GRUB -- GRand Unified Bootloader
|
||||||
|
* Copyright (C) 2010 Free Software Foundation, Inc.
|
||||||
|
*
|
||||||
|
* GRUB 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, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* GRUB is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with GRUB. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
void EXPORT_FUNC (SDL_Quit) (void);
|
||||||
|
void EXPORT_FUNC (SDL_SetColors) (void);
|
||||||
|
void EXPORT_FUNC (SDL_Init) (void);
|
||||||
|
void EXPORT_FUNC (SDL_GetError) (void);
|
||||||
|
void EXPORT_FUNC (SDL_Flip) (void);
|
||||||
|
void EXPORT_FUNC (SDL_SetVideoMode) (void);
|
|
@ -88,6 +88,8 @@ grub_int64_t grub_util_get_disk_size (char *name);
|
||||||
|
|
||||||
char *make_system_path_relative_to_its_root (const char *path);
|
char *make_system_path_relative_to_its_root (const char *path);
|
||||||
|
|
||||||
|
char *canonicalize_file_name (const char *path);
|
||||||
|
|
||||||
void grub_util_init_nls (void);
|
void grub_util_init_nls (void);
|
||||||
|
|
||||||
#endif /* ! GRUB_UTIL_MISC_HEADER */
|
#endif /* ! GRUB_UTIL_MISC_HEADER */
|
||||||
|
|
|
@ -1442,47 +1442,6 @@ FUNCTION(grub_console_setcursor)
|
||||||
popl %ebp
|
popl %ebp
|
||||||
ret
|
ret
|
||||||
|
|
||||||
/*
|
|
||||||
* grub_getrtsecs()
|
|
||||||
* if a seconds value can be read, read it and return it (BCD),
|
|
||||||
* otherwise return 0xFF
|
|
||||||
* BIOS call "INT 1AH Function 02H" to check whether a character is pending
|
|
||||||
* Call with %ah = 0x2
|
|
||||||
* Return:
|
|
||||||
* If RT Clock can give correct values
|
|
||||||
* %ch = hour (BCD)
|
|
||||||
* %cl = minutes (BCD)
|
|
||||||
* %dh = seconds (BCD)
|
|
||||||
* %dl = daylight savings time (00h std, 01h daylight)
|
|
||||||
* Carry flag = clear
|
|
||||||
* else
|
|
||||||
* Carry flag = set
|
|
||||||
* (this indicates that the clock is updating, or
|
|
||||||
* that it isn't running)
|
|
||||||
*/
|
|
||||||
FUNCTION(grub_getrtsecs)
|
|
||||||
pushl %ebp
|
|
||||||
|
|
||||||
call prot_to_real /* enter real mode */
|
|
||||||
.code16
|
|
||||||
|
|
||||||
clc
|
|
||||||
movb $0x2, %ah
|
|
||||||
int $0x1a
|
|
||||||
|
|
||||||
DATA32 jnc gottime
|
|
||||||
movb $0xff, %dh
|
|
||||||
|
|
||||||
gottime:
|
|
||||||
DATA32 call real_to_prot
|
|
||||||
.code32
|
|
||||||
|
|
||||||
movb %dh, %al
|
|
||||||
|
|
||||||
popl %ebp
|
|
||||||
ret
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* grub_get_rtc()
|
* grub_get_rtc()
|
||||||
* return the real time in ticks, of which there are about
|
* return the real time in ticks, of which there are about
|
||||||
|
@ -1537,33 +1496,6 @@ FUNCTION(grub_vga_set_mode)
|
||||||
popl %ebp
|
popl %ebp
|
||||||
ret
|
ret
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* unsigned char *grub_vga_get_font (void)
|
|
||||||
*/
|
|
||||||
FUNCTION(grub_vga_get_font)
|
|
||||||
pushl %ebp
|
|
||||||
pushl %ebx
|
|
||||||
|
|
||||||
call prot_to_real
|
|
||||||
.code16
|
|
||||||
movw $0x1130, %ax
|
|
||||||
movb $0x06, %bh
|
|
||||||
int $0x10
|
|
||||||
movw %es, %bx
|
|
||||||
movw %bp, %dx
|
|
||||||
DATA32 call real_to_prot
|
|
||||||
.code32
|
|
||||||
|
|
||||||
movzwl %bx, %ecx
|
|
||||||
shll $4, %ecx
|
|
||||||
movw %dx, %ax
|
|
||||||
addl %ecx, %eax
|
|
||||||
|
|
||||||
popl %ebx
|
|
||||||
popl %ebp
|
|
||||||
ret
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* grub_vbe_bios_status_t grub_vbe_get_controller_info (struct grub_vbe_info_block *controller_info)
|
* grub_vbe_bios_status_t grub_vbe_get_controller_info (struct grub_vbe_info_block *controller_info)
|
||||||
*
|
*
|
||||||
|
|
11
kern/misc.c
11
kern/misc.c
|
@ -1058,7 +1058,7 @@ grub_abort (void)
|
||||||
void abort (void) __attribute__ ((alias ("grub_abort")));
|
void abort (void) __attribute__ ((alias ("grub_abort")));
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef NEED_ENABLE_EXECUTE_STACK
|
#if defined(NEED_ENABLE_EXECUTE_STACK) && !defined(GRUB_UTIL)
|
||||||
/* Some gcc versions generate a call to this function
|
/* Some gcc versions generate a call to this function
|
||||||
in trampolines for nested functions. */
|
in trampolines for nested functions. */
|
||||||
void __enable_execute_stack (void *addr __attribute__ ((unused)))
|
void __enable_execute_stack (void *addr __attribute__ ((unused)))
|
||||||
|
@ -1066,3 +1066,12 @@ void __enable_execute_stack (void *addr __attribute__ ((unused)))
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#if defined (NEED_REGISTER_FRAME_INFO) && !defined(GRUB_UTIL)
|
||||||
|
void __register_frame_info (void)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
void __deregister_frame_info (void)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/*
|
/*
|
||||||
* GRUB -- GRand Unified Bootloader
|
* GRUB -- GRand Unified Bootloader
|
||||||
* Copyright (C) 2004,2007,2009 Free Software Foundation, Inc.
|
* Copyright (C) 2009, 2010 Free Software Foundation, Inc.
|
||||||
*
|
*
|
||||||
* GRUB is free software: you can redistribute it and/or modify
|
* GRUB is free software: you can redistribute it and/or modify
|
||||||
* it under the terms of the GNU General Public License as published by
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
@ -16,23 +16,18 @@
|
||||||
* along with GRUB. If not, see <http://www.gnu.org/licenses/>.
|
* along with GRUB. If not, see <http://www.gnu.org/licenses/>.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <config.h>
|
#ifndef GRUB_POSIX_ASSERT_H
|
||||||
|
#define GRUB_POSIX_ASSERT_H 1
|
||||||
|
|
||||||
|
#include <grub/misc.h>
|
||||||
|
|
||||||
|
#define assert(x) assert_real(__FILE__, __LINE__, x)
|
||||||
|
|
||||||
|
static inline void
|
||||||
|
assert_real (const char *file, int line, int cond)
|
||||||
|
{
|
||||||
|
if (!cond)
|
||||||
|
grub_fatal ("Assertion failed at %s:%d\n", file, line);
|
||||||
|
}
|
||||||
|
|
||||||
#ifdef HAVE___ASHLDI3
|
|
||||||
void EXPORT_FUNC (__ashldi3) (void);
|
|
||||||
#endif
|
|
||||||
#ifdef HAVE___ASHRDI3
|
|
||||||
void EXPORT_FUNC (__ashrdi3) (void);
|
|
||||||
#endif
|
|
||||||
#ifdef HAVE___LSHRDI3
|
|
||||||
void EXPORT_FUNC (__lshrdi3) (void);
|
|
||||||
#endif
|
|
||||||
#ifdef HAVE___UCMPDI2
|
|
||||||
void EXPORT_FUNC (__ucmpdi2) (void);
|
|
||||||
#endif
|
|
||||||
#ifdef HAVE___BSWAPSI2
|
|
||||||
void EXPORT_FUNC (__bswapsi2) (void);
|
|
||||||
#endif
|
|
||||||
#ifdef HAVE___BSWAPDI2
|
|
||||||
void EXPORT_FUNC (__bswapdi2) (void);
|
|
||||||
#endif
|
#endif
|
103
lib/posix_wrap/ctype.h
Normal file
103
lib/posix_wrap/ctype.h
Normal file
|
@ -0,0 +1,103 @@
|
||||||
|
/*
|
||||||
|
* GRUB -- GRand Unified Bootloader
|
||||||
|
* Copyright (C) 2009, 2010 Free Software Foundation, Inc.
|
||||||
|
*
|
||||||
|
* GRUB 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, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* GRUB is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with GRUB. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef GRUB_POSIX_CTYPE_H
|
||||||
|
#define GRUB_POSIX_CTYPE_H 1
|
||||||
|
|
||||||
|
#include <grub/misc.h>
|
||||||
|
|
||||||
|
static inline int
|
||||||
|
toupper (int c)
|
||||||
|
{
|
||||||
|
return grub_toupper (c);
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline int
|
||||||
|
isspace (int c)
|
||||||
|
{
|
||||||
|
return grub_isspace (c);
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline int
|
||||||
|
isdigit (int c)
|
||||||
|
{
|
||||||
|
return grub_isdigit (c);
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline int
|
||||||
|
islower (int c)
|
||||||
|
{
|
||||||
|
return (c >= 'a' && c <= 'z');
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline int
|
||||||
|
isupper (int c)
|
||||||
|
{
|
||||||
|
return (c >= 'A' && c <= 'Z');
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline int
|
||||||
|
isxdigit (int c)
|
||||||
|
{
|
||||||
|
return (c >= 'a' && c <= 'f') || (c >= 'A' && c <= 'F')
|
||||||
|
|| (c >= '0' && c <= '9');
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline int
|
||||||
|
isprint (int c)
|
||||||
|
{
|
||||||
|
return grub_isprint (c);
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline int
|
||||||
|
iscntrl (int c)
|
||||||
|
{
|
||||||
|
return !grub_isprint (c);
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline int
|
||||||
|
isgraph (int c)
|
||||||
|
{
|
||||||
|
return grub_isprint (c) && !grub_isspace (c);
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline int
|
||||||
|
isalnum (int c)
|
||||||
|
{
|
||||||
|
return grub_isalpha (c) || grub_isdigit (c);
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline int
|
||||||
|
ispunct (int c)
|
||||||
|
{
|
||||||
|
return grub_isprint (c) && !grub_isspace (c) && !isalnum (c);
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline int
|
||||||
|
isalpha (int c)
|
||||||
|
{
|
||||||
|
return grub_isalpha (c);
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline int
|
||||||
|
tolower (int c)
|
||||||
|
{
|
||||||
|
return grub_tolower (c);
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
|
@ -1,6 +1,6 @@
|
||||||
/*
|
/*
|
||||||
* GRUB -- GRand Unified Bootloader
|
* GRUB -- GRand Unified Bootloader
|
||||||
* Copyright (C) 2004,2007,2009 Free Software Foundation, Inc.
|
* Copyright (C) 2009, 2010 Free Software Foundation, Inc.
|
||||||
*
|
*
|
||||||
* GRUB is free software: you can redistribute it and/or modify
|
* GRUB is free software: you can redistribute it and/or modify
|
||||||
* it under the terms of the GNU General Public License as published by
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
@ -16,14 +16,13 @@
|
||||||
* along with GRUB. If not, see <http://www.gnu.org/licenses/>.
|
* along with GRUB. If not, see <http://www.gnu.org/licenses/>.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <config.h>
|
#ifndef GRUB_POSIX_ERRNO_H
|
||||||
|
#define GRUB_POSIX_ERRNO_H 1
|
||||||
|
|
||||||
#ifdef HAVE___BSWAPSI2
|
#include <grub/err.h>
|
||||||
typedef int SItype __attribute__ ((mode (SI)));
|
|
||||||
SItype EXPORT_FUNC (__bswapsi2) (SItype);
|
#define errno grub_errno
|
||||||
#endif
|
#define EINVAL GRUB_ERR_BAD_NUMBER
|
||||||
|
#define ENOMEM GRUB_ERR_OUT_OF_MEMORY
|
||||||
|
|
||||||
#ifdef HAVE___BSWAPDI2
|
|
||||||
typedef int DItype __attribute__ ((mode (DI)));
|
|
||||||
DItype EXPORT_FUNC (__bswapdi2) (DItype);
|
|
||||||
#endif
|
#endif
|
38
lib/posix_wrap/langinfo.h
Normal file
38
lib/posix_wrap/langinfo.h
Normal file
|
@ -0,0 +1,38 @@
|
||||||
|
/*
|
||||||
|
* GRUB -- GRand Unified Bootloader
|
||||||
|
* Copyright (C) 2009, 2010 Free Software Foundation, Inc.
|
||||||
|
*
|
||||||
|
* GRUB 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, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* GRUB is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with GRUB. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef GRUB_POSIX_LANGINFO_H
|
||||||
|
#define GRUB_POSIX_LANGINFO_H 1
|
||||||
|
|
||||||
|
#include <localcharset.h>
|
||||||
|
|
||||||
|
typedef enum { CODESET } nl_item;
|
||||||
|
|
||||||
|
static inline char *
|
||||||
|
nl_langinfo (nl_item item)
|
||||||
|
{
|
||||||
|
switch (item)
|
||||||
|
{
|
||||||
|
case CODESET:
|
||||||
|
return locale_charset ();
|
||||||
|
default:
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
0
lib/posix_wrap/limits.h
Normal file
0
lib/posix_wrap/limits.h
Normal file
28
lib/posix_wrap/localcharset.h
Normal file
28
lib/posix_wrap/localcharset.h
Normal file
|
@ -0,0 +1,28 @@
|
||||||
|
/*
|
||||||
|
* GRUB -- GRand Unified Bootloader
|
||||||
|
* Copyright (C) 2009, 2010 Free Software Foundation, Inc.
|
||||||
|
*
|
||||||
|
* GRUB 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, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* GRUB is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with GRUB. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef GRUB_POSIX_LOCALCHARSET_H
|
||||||
|
#define GRUB_POSIX_LOCALCHARSET_H 1
|
||||||
|
|
||||||
|
static inline char *
|
||||||
|
locale_charset (void)
|
||||||
|
{
|
||||||
|
return "UTF-8";
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
0
lib/posix_wrap/locale.h
Normal file
0
lib/posix_wrap/locale.h
Normal file
1
lib/posix_wrap/stdint.h
Normal file
1
lib/posix_wrap/stdint.h
Normal file
|
@ -0,0 +1 @@
|
||||||
|
#include <sys/types.h>
|
29
lib/posix_wrap/stdio.h
Normal file
29
lib/posix_wrap/stdio.h
Normal file
|
@ -0,0 +1,29 @@
|
||||||
|
/*
|
||||||
|
* GRUB -- GRand Unified Bootloader
|
||||||
|
* Copyright (C) 2009, 2010 Free Software Foundation, Inc.
|
||||||
|
*
|
||||||
|
* GRUB 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, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* GRUB is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with GRUB. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef GRUB_POSIX_STDIO_H
|
||||||
|
#define GRUB_POSIX_STDIO_H 1
|
||||||
|
|
||||||
|
#include <grub/misc.h>
|
||||||
|
#include <grub/file.h>
|
||||||
|
|
||||||
|
typedef struct grub_file FILE;
|
||||||
|
|
||||||
|
#define EOF -1
|
||||||
|
|
||||||
|
#endif
|
56
lib/posix_wrap/stdlib.h
Normal file
56
lib/posix_wrap/stdlib.h
Normal file
|
@ -0,0 +1,56 @@
|
||||||
|
/*
|
||||||
|
* GRUB -- GRand Unified Bootloader
|
||||||
|
* Copyright (C) 2009, 2010 Free Software Foundation, Inc.
|
||||||
|
*
|
||||||
|
* GRUB 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, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* GRUB is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with GRUB. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef GRUB_POSIX_STDLIB_H
|
||||||
|
#define GRUB_POSIX_STDLIB_H 1
|
||||||
|
|
||||||
|
#include <grub/mm.h>
|
||||||
|
|
||||||
|
static inline void
|
||||||
|
free (void *ptr)
|
||||||
|
{
|
||||||
|
grub_free (ptr);
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline void *
|
||||||
|
malloc (grub_size_t size)
|
||||||
|
{
|
||||||
|
return grub_malloc (size);
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline void *
|
||||||
|
calloc (grub_size_t size, grub_size_t nelem)
|
||||||
|
{
|
||||||
|
return grub_zalloc (size * nelem);
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline void *
|
||||||
|
realloc (void *ptr, grub_size_t size)
|
||||||
|
{
|
||||||
|
return grub_realloc (ptr, size);
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline void
|
||||||
|
abort (void)
|
||||||
|
{
|
||||||
|
grub_abort ();
|
||||||
|
}
|
||||||
|
|
||||||
|
#define MB_CUR_MAX 6
|
||||||
|
|
||||||
|
#endif
|
40
lib/posix_wrap/string.h
Normal file
40
lib/posix_wrap/string.h
Normal file
|
@ -0,0 +1,40 @@
|
||||||
|
/*
|
||||||
|
* GRUB -- GRand Unified Bootloader
|
||||||
|
* Copyright (C) 2009, 2010 Free Software Foundation, Inc.
|
||||||
|
*
|
||||||
|
* GRUB 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, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* GRUB is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with GRUB. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef GRUB_POSIX_STRING_H
|
||||||
|
#define GRUB_POSIX_STRING_H 1
|
||||||
|
|
||||||
|
static inline grub_size_t
|
||||||
|
strlen (const char *s)
|
||||||
|
{
|
||||||
|
return grub_strlen (s);
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline int
|
||||||
|
strcmp (const char *s1, const char *s2)
|
||||||
|
{
|
||||||
|
return grub_strcmp (s1, s2);
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline int
|
||||||
|
strcasecmp (const char *s1, const char *s2)
|
||||||
|
{
|
||||||
|
return grub_strcasecmp (s1, s2);
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
32
lib/posix_wrap/sys/types.h
Normal file
32
lib/posix_wrap/sys/types.h
Normal file
|
@ -0,0 +1,32 @@
|
||||||
|
/*
|
||||||
|
* GRUB -- GRand Unified Bootloader
|
||||||
|
* Copyright (C) 2009, 2010 Free Software Foundation, Inc.
|
||||||
|
*
|
||||||
|
* GRUB 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, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* GRUB is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with GRUB. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef GRUB_POSIX_SYS_TYPES_H
|
||||||
|
#define GRUB_POSIX_SYS_TYPES_H 1
|
||||||
|
|
||||||
|
#include <grub/misc.h>
|
||||||
|
|
||||||
|
typedef grub_size_t size_t;
|
||||||
|
typedef int bool;
|
||||||
|
static const bool true = 1;
|
||||||
|
static const bool false = 0;
|
||||||
|
|
||||||
|
#define ULONG_MAX GRUB_ULONG_MAX
|
||||||
|
#define UCHAR_MAX 0xff
|
||||||
|
|
||||||
|
#endif
|
0
lib/posix_wrap/unistd.h
Normal file
0
lib/posix_wrap/unistd.h
Normal file
25
lib/posix_wrap/wchar.h
Normal file
25
lib/posix_wrap/wchar.h
Normal file
|
@ -0,0 +1,25 @@
|
||||||
|
/*
|
||||||
|
* GRUB -- GRand Unified Bootloader
|
||||||
|
* Copyright (C) 2009, 2010 Free Software Foundation, Inc.
|
||||||
|
*
|
||||||
|
* GRUB 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, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* GRUB is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with GRUB. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef GRUB_POSIX_WCHAR_H
|
||||||
|
#define GRUB_POSIX_WCHAR_H 1
|
||||||
|
|
||||||
|
/* UCS-4. */
|
||||||
|
typedef grub_uint32_t wchar_t;
|
||||||
|
|
||||||
|
#endif
|
0
lib/posix_wrap/wctype.h
Normal file
0
lib/posix_wrap/wctype.h
Normal file
|
@ -170,6 +170,11 @@ grub_multiboot_load (grub_file_t file)
|
||||||
header->width, header->height,
|
header->width, header->height,
|
||||||
header->depth, 0);
|
header->depth, 0);
|
||||||
break;
|
break;
|
||||||
|
default:
|
||||||
|
err = grub_error (GRUB_ERR_BAD_OS,
|
||||||
|
"unsupported graphical mode type %d",
|
||||||
|
header->mode_type);
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
|
|
@ -29,7 +29,6 @@
|
||||||
|
|
||||||
#include <grub/loader.h>
|
#include <grub/loader.h>
|
||||||
#include <grub/command.h>
|
#include <grub/command.h>
|
||||||
#include <grub/machine/loader.h>
|
|
||||||
#include <grub/multiboot.h>
|
#include <grub/multiboot.h>
|
||||||
#include <grub/cpu/multiboot.h>
|
#include <grub/cpu/multiboot.h>
|
||||||
#include <grub/machine/memory.h>
|
#include <grub/machine/memory.h>
|
||||||
|
@ -320,14 +319,16 @@ GRUB_MOD_INIT(multiboot)
|
||||||
#ifdef GRUB_USE_MULTIBOOT2
|
#ifdef GRUB_USE_MULTIBOOT2
|
||||||
grub_register_command ("multiboot2", grub_cmd_multiboot,
|
grub_register_command ("multiboot2", grub_cmd_multiboot,
|
||||||
0, N_("Load a multiboot 2 kernel."));
|
0, N_("Load a multiboot 2 kernel."));
|
||||||
|
cmd_module =
|
||||||
|
grub_register_command ("module2", grub_cmd_module,
|
||||||
|
0, N_("Load a multiboot 2 module."));
|
||||||
#else
|
#else
|
||||||
grub_register_command ("multiboot", grub_cmd_multiboot,
|
grub_register_command ("multiboot", grub_cmd_multiboot,
|
||||||
0, N_("Load a multiboot kernel."));
|
0, N_("Load a multiboot kernel."));
|
||||||
#endif
|
|
||||||
|
|
||||||
cmd_module =
|
cmd_module =
|
||||||
grub_register_command ("module", grub_cmd_module,
|
grub_register_command ("module", grub_cmd_module,
|
||||||
0, N_("Load a multiboot module."));
|
0, N_("Load a multiboot module."));
|
||||||
|
#endif
|
||||||
|
|
||||||
my_mod = mod;
|
my_mod = mod;
|
||||||
}
|
}
|
||||||
|
|
|
@ -51,11 +51,8 @@ autoload_fs_module (void)
|
||||||
|
|
||||||
/* Read the file fs.lst for auto-loading. */
|
/* Read the file fs.lst for auto-loading. */
|
||||||
void
|
void
|
||||||
read_fs_list (void)
|
read_fs_list (const char *prefix)
|
||||||
{
|
{
|
||||||
const char *prefix;
|
|
||||||
|
|
||||||
prefix = grub_env_get ("prefix");
|
|
||||||
if (prefix)
|
if (prefix)
|
||||||
{
|
{
|
||||||
char *filename;
|
char *filename;
|
||||||
|
|
|
@ -66,14 +66,12 @@ grub_crypto_spec_free (void)
|
||||||
|
|
||||||
/* Read the file crypto.lst for auto-loading. */
|
/* Read the file crypto.lst for auto-loading. */
|
||||||
void
|
void
|
||||||
read_crypto_list (void)
|
read_crypto_list (const char *prefix)
|
||||||
{
|
{
|
||||||
const char *prefix;
|
|
||||||
char *filename;
|
char *filename;
|
||||||
grub_file_t file;
|
grub_file_t file;
|
||||||
char *buf = NULL;
|
char *buf = NULL;
|
||||||
|
|
||||||
prefix = grub_env_get ("prefix");
|
|
||||||
if (!prefix)
|
if (!prefix)
|
||||||
{
|
{
|
||||||
grub_errno = GRUB_ERR_NONE;
|
grub_errno = GRUB_ERR_NONE;
|
||||||
|
|
|
@ -60,11 +60,8 @@ grub_dyncmd_dispatcher (struct grub_command *cmd,
|
||||||
|
|
||||||
/* Read the file command.lst for auto-loading. */
|
/* Read the file command.lst for auto-loading. */
|
||||||
void
|
void
|
||||||
read_command_list (void)
|
read_command_list (const char *prefix)
|
||||||
{
|
{
|
||||||
const char *prefix;
|
|
||||||
|
|
||||||
prefix = grub_env_get ("prefix");
|
|
||||||
if (prefix)
|
if (prefix)
|
||||||
{
|
{
|
||||||
char *filename;
|
char *filename;
|
||||||
|
|
|
@ -434,14 +434,20 @@ grub_normal_init_page (struct grub_term_output *term)
|
||||||
grub_free (unicode_msg);
|
grub_free (unicode_msg);
|
||||||
}
|
}
|
||||||
|
|
||||||
static char *
|
static void
|
||||||
read_lists (struct grub_env_var *var __attribute__ ((unused)),
|
read_lists (const char *val)
|
||||||
const char *val)
|
|
||||||
{
|
{
|
||||||
read_command_list ();
|
read_command_list (val);
|
||||||
read_fs_list ();
|
read_fs_list (val);
|
||||||
read_crypto_list ();
|
read_crypto_list (val);
|
||||||
read_terminal_list ();
|
read_terminal_list (val);
|
||||||
|
}
|
||||||
|
|
||||||
|
static char *
|
||||||
|
read_lists_hook (struct grub_env_var *var __attribute__ ((unused)),
|
||||||
|
const char *val)
|
||||||
|
{
|
||||||
|
read_lists (val);
|
||||||
return val ? grub_strdup (val) : NULL;
|
return val ? grub_strdup (val) : NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -451,10 +457,11 @@ void
|
||||||
grub_normal_execute (const char *config, int nested, int batch)
|
grub_normal_execute (const char *config, int nested, int batch)
|
||||||
{
|
{
|
||||||
grub_menu_t menu = 0;
|
grub_menu_t menu = 0;
|
||||||
|
const char *prefix = grub_env_get ("prefix");
|
||||||
|
|
||||||
read_lists (NULL, NULL);
|
read_lists (prefix);
|
||||||
read_handler_list ();
|
read_handler_list ();
|
||||||
grub_register_variable_hook ("prefix", NULL, read_lists);
|
grub_register_variable_hook ("prefix", NULL, read_lists_hook);
|
||||||
grub_command_execute ("parser.grub", 0, 0);
|
grub_command_execute ("parser.grub", 0, 0);
|
||||||
|
|
||||||
if (config)
|
if (config)
|
||||||
|
|
|
@ -176,10 +176,17 @@ print_message (int nested, int edit, struct grub_term_output *term)
|
||||||
if (edit)
|
if (edit)
|
||||||
{
|
{
|
||||||
grub_putcode ('\n', term);
|
grub_putcode ('\n', term);
|
||||||
|
#ifdef GRUB_MACHINE_EFI
|
||||||
|
grub_print_message_indented (_("Minimum Emacs-like screen editing is \
|
||||||
|
supported. TAB lists completions. Press F1 to boot, F2=Ctrl-a, F3=Ctrl-e, \
|
||||||
|
F4 for a command-line or ESC to discard edits and return to the GRUB menu."),
|
||||||
|
STANDARD_MARGIN, STANDARD_MARGIN, term);
|
||||||
|
#else
|
||||||
grub_print_message_indented (_("Minimum Emacs-like screen editing is \
|
grub_print_message_indented (_("Minimum Emacs-like screen editing is \
|
||||||
supported. TAB lists completions. Press Ctrl-x to boot, Ctrl-c for a \
|
supported. TAB lists completions. Press Ctrl-x to boot, Ctrl-c for a \
|
||||||
command-line or ESC to return menu."), STANDARD_MARGIN, STANDARD_MARGIN,
|
command-line or ESC to discard edits and return to the GRUB menu."),
|
||||||
term);
|
STANDARD_MARGIN, STANDARD_MARGIN, term);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
|
|
@ -167,14 +167,12 @@ grub_terminal_autoload_free (void)
|
||||||
|
|
||||||
/* Read the file terminal.lst for auto-loading. */
|
/* Read the file terminal.lst for auto-loading. */
|
||||||
void
|
void
|
||||||
read_terminal_list (void)
|
read_terminal_list (const char *prefix)
|
||||||
{
|
{
|
||||||
const char *prefix;
|
|
||||||
char *filename;
|
char *filename;
|
||||||
grub_file_t file;
|
grub_file_t file;
|
||||||
char *buf = NULL;
|
char *buf = NULL;
|
||||||
|
|
||||||
prefix = grub_env_get ("prefix");
|
|
||||||
if (!prefix)
|
if (!prefix)
|
||||||
{
|
{
|
||||||
grub_errno = GRUB_ERR_NONE;
|
grub_errno = GRUB_ERR_NONE;
|
||||||
|
|
|
@ -26,13 +26,24 @@
|
||||||
#include <grub/lib/arg.h>
|
#include <grub/lib/arg.h>
|
||||||
#include <grub/normal.h>
|
#include <grub/normal.h>
|
||||||
|
|
||||||
|
/* Max digits for a char is 3 (0xFF is 255), similarly for an int it
|
||||||
|
is sizeof (int) * 3, and one extra for a possible -ve sign. */
|
||||||
|
#define ERRNO_DIGITS_MAX (sizeof (int) * 3 + 1)
|
||||||
|
|
||||||
static grub_err_t
|
static grub_err_t
|
||||||
grub_script_execute_cmd (struct grub_script_cmd *cmd)
|
grub_script_execute_cmd (struct grub_script_cmd *cmd)
|
||||||
{
|
{
|
||||||
|
int ret;
|
||||||
|
char errnobuf[ERRNO_DIGITS_MAX + 1];
|
||||||
|
|
||||||
if (cmd == 0)
|
if (cmd == 0)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
return cmd->exec (cmd);
|
ret = cmd->exec (cmd);
|
||||||
|
|
||||||
|
grub_snprintf (errnobuf, sizeof (errnobuf), "%d", ret);
|
||||||
|
grub_env_set ("?", errnobuf);
|
||||||
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
#define ARG_ALLOCATION_UNIT (32 * sizeof (char))
|
#define ARG_ALLOCATION_UNIT (32 * sizeof (char))
|
||||||
|
@ -260,13 +271,14 @@ grub_script_execute_cmdline (struct grub_script_cmd *cmd)
|
||||||
grub_err_t
|
grub_err_t
|
||||||
grub_script_execute_cmdblock (struct grub_script_cmd *cmd)
|
grub_script_execute_cmdblock (struct grub_script_cmd *cmd)
|
||||||
{
|
{
|
||||||
|
int ret = 0;
|
||||||
struct grub_script_cmdblock *cmdblock = (struct grub_script_cmdblock *) cmd;
|
struct grub_script_cmdblock *cmdblock = (struct grub_script_cmdblock *) cmd;
|
||||||
|
|
||||||
/* Loop over every command and execute it. */
|
/* Loop over every command and execute it. */
|
||||||
for (cmd = cmdblock->cmdlist; cmd; cmd = cmd->next)
|
for (cmd = cmdblock->cmdlist; cmd; cmd = cmd->next)
|
||||||
grub_script_execute_cmd (cmd);
|
ret = grub_script_execute_cmd (cmd);
|
||||||
|
|
||||||
return 0;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Execute an if statement. */
|
/* Execute an if statement. */
|
||||||
|
@ -317,6 +329,26 @@ grub_script_execute_cmdfor (struct grub_script_cmd *cmd)
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Execute a "while" or "until" command. */
|
||||||
|
grub_err_t
|
||||||
|
grub_script_execute_cmdwhile (struct grub_script_cmd *cmd)
|
||||||
|
{
|
||||||
|
int cond;
|
||||||
|
int result;
|
||||||
|
struct grub_script_cmdwhile *cmdwhile = (struct grub_script_cmdwhile *) cmd;
|
||||||
|
|
||||||
|
result = 0;
|
||||||
|
do {
|
||||||
|
cond = grub_script_execute_cmd (cmdwhile->cond);
|
||||||
|
if (cmdwhile->until ? !cond : cond)
|
||||||
|
break;
|
||||||
|
|
||||||
|
result = grub_script_execute_cmd (cmdwhile->list);
|
||||||
|
} while (1); /* XXX Put a check for ^C here */
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
/* Execute the menu entry generate statement. */
|
/* Execute the menu entry generate statement. */
|
||||||
grub_err_t
|
grub_err_t
|
||||||
grub_script_execute_menuentry (struct grub_script_cmd *cmd)
|
grub_script_execute_menuentry (struct grub_script_cmd *cmd)
|
||||||
|
|
|
@ -74,8 +74,10 @@
|
||||||
%token <arg> GRUB_PARSER_TOKEN_WORD "word"
|
%token <arg> GRUB_PARSER_TOKEN_WORD "word"
|
||||||
|
|
||||||
%type <arglist> word argument arguments0 arguments1
|
%type <arglist> word argument arguments0 arguments1
|
||||||
%type <cmd> script_init script grubcmd ifcmd forcmd command
|
|
||||||
%type <cmd> commands1 menuentry statement
|
%type <cmd> script_init script
|
||||||
|
%type <cmd> grubcmd ifclause ifcmd forcmd whilecmd untilcmd
|
||||||
|
%type <cmd> command commands1 menuentry statement
|
||||||
|
|
||||||
%pure-parser
|
%pure-parser
|
||||||
%lex-param { struct grub_parser_param *state };
|
%lex-param { struct grub_parser_param *state };
|
||||||
|
@ -171,9 +173,11 @@ grubcmd: word arguments0
|
||||||
;
|
;
|
||||||
|
|
||||||
/* A single command. */
|
/* A single command. */
|
||||||
command: grubcmd { $$ = $1; }
|
command: grubcmd { $$ = $1; }
|
||||||
| ifcmd { $$ = $1; }
|
| ifcmd { $$ = $1; }
|
||||||
| forcmd { $$ = $1; }
|
| forcmd { $$ = $1; }
|
||||||
|
| whilecmd { $$ = $1; }
|
||||||
|
| untilcmd { $$ = $1; }
|
||||||
;
|
;
|
||||||
|
|
||||||
/* A list of commands. */
|
/* A list of commands. */
|
||||||
|
@ -224,18 +228,28 @@ menuentry: "menuentry"
|
||||||
}
|
}
|
||||||
;
|
;
|
||||||
|
|
||||||
if: "if" { grub_script_lexer_ref (state->lexerstate); }
|
ifcmd: "if"
|
||||||
|
{
|
||||||
|
grub_script_lexer_ref (state->lexerstate);
|
||||||
|
}
|
||||||
|
ifclause "fi"
|
||||||
|
{
|
||||||
|
$$ = $3;
|
||||||
|
grub_script_lexer_deref (state->lexerstate);
|
||||||
|
}
|
||||||
;
|
;
|
||||||
ifcmd: if commands1 delimiters1 "then" commands1 delimiters1 "fi"
|
ifclause: commands1 delimiters1 "then" commands1 delimiters1
|
||||||
{
|
{
|
||||||
$$ = grub_script_create_cmdif (state, $2, $5, 0);
|
$$ = grub_script_create_cmdif (state, $1, $4, 0);
|
||||||
grub_script_lexer_deref (state->lexerstate);
|
}
|
||||||
}
|
| commands1 delimiters1 "then" commands1 delimiters1 "else" commands1 delimiters1
|
||||||
| if commands1 delimiters1 "then" commands1 delimiters1 "else" commands1 delimiters1 "fi"
|
{
|
||||||
{
|
$$ = grub_script_create_cmdif (state, $1, $4, $7);
|
||||||
$$ = grub_script_create_cmdif (state, $2, $5, $8);
|
}
|
||||||
grub_script_lexer_deref (state->lexerstate);
|
| commands1 delimiters1 "then" commands1 delimiters1 "elif" ifclause
|
||||||
}
|
{
|
||||||
|
$$ = grub_script_create_cmdif (state, $1, $4, $7);
|
||||||
|
}
|
||||||
;
|
;
|
||||||
|
|
||||||
forcmd: "for" "name"
|
forcmd: "for" "name"
|
||||||
|
@ -248,3 +262,25 @@ forcmd: "for" "name"
|
||||||
grub_script_lexer_deref (state->lexerstate);
|
grub_script_lexer_deref (state->lexerstate);
|
||||||
}
|
}
|
||||||
;
|
;
|
||||||
|
|
||||||
|
whilecmd: "while"
|
||||||
|
{
|
||||||
|
grub_script_lexer_ref (state->lexerstate);
|
||||||
|
}
|
||||||
|
commands1 delimiters1 "do" commands1 delimiters1 "done"
|
||||||
|
{
|
||||||
|
$$ = grub_script_create_cmdwhile (state, $3, $6, 0);
|
||||||
|
grub_script_lexer_deref (state->lexerstate);
|
||||||
|
}
|
||||||
|
;
|
||||||
|
|
||||||
|
untilcmd: "until"
|
||||||
|
{
|
||||||
|
grub_script_lexer_ref (state->lexerstate);
|
||||||
|
}
|
||||||
|
commands1 delimiters1 "do" commands1 delimiters1 "done"
|
||||||
|
{
|
||||||
|
$$ = grub_script_create_cmdwhile (state, $3, $6, 1);
|
||||||
|
grub_script_lexer_deref (state->lexerstate);
|
||||||
|
}
|
||||||
|
;
|
||||||
|
|
|
@ -245,6 +245,28 @@ grub_script_create_cmdfor (struct grub_parser_param *state,
|
||||||
return (struct grub_script_cmd *) cmd;
|
return (struct grub_script_cmd *) cmd;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Create a "while" or "until" command. */
|
||||||
|
struct grub_script_cmd *
|
||||||
|
grub_script_create_cmdwhile (struct grub_parser_param *state,
|
||||||
|
struct grub_script_cmd *cond,
|
||||||
|
struct grub_script_cmd *list,
|
||||||
|
int is_an_until_loop)
|
||||||
|
{
|
||||||
|
struct grub_script_cmdwhile *cmd;
|
||||||
|
|
||||||
|
cmd = grub_script_malloc (state, sizeof (*cmd));
|
||||||
|
if (! cmd)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
cmd->cmd.exec = grub_script_execute_cmdwhile;
|
||||||
|
cmd->cmd.next = 0;
|
||||||
|
cmd->cond = cond;
|
||||||
|
cmd->list = list;
|
||||||
|
cmd->until = is_an_until_loop;
|
||||||
|
|
||||||
|
return (struct grub_script_cmd *) cmd;
|
||||||
|
}
|
||||||
|
|
||||||
/* Create a command that adds a menu entry to the menu. Title is an
|
/* Create a command that adds a menu entry to the menu. Title is an
|
||||||
argument that is parsed to generate a string that can be used as
|
argument that is parsed to generate a string that can be used as
|
||||||
the title. The sourcecode for this entry is passed in SOURCECODE.
|
the title. The sourcecode for this entry is passed in SOURCECODE.
|
||||||
|
|
|
@ -68,37 +68,23 @@ static void copy_string (struct grub_parser_param *, const char *,
|
||||||
|
|
||||||
%top{
|
%top{
|
||||||
|
|
||||||
|
#include <sys/types.h>
|
||||||
|
|
||||||
|
typedef size_t yy_size_t;
|
||||||
|
#define YY_TYPEDEF_YY_SIZE_T 1
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Some flex hacks for -nostdinc; XXX We need to fix these when libc
|
* Some flex hacks for -nostdinc; XXX We need to fix these when libc
|
||||||
* support becomes availble in GRUB.
|
* support becomes availble in GRUB.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <grub/types.h>
|
#ifndef GRUB_UTIL
|
||||||
|
|
||||||
typedef grub_size_t size_t;
|
|
||||||
typedef grub_size_t yy_size_t;
|
|
||||||
#define YY_TYPEDEF_YY_SIZE_T 1
|
|
||||||
|
|
||||||
#define FILE void
|
|
||||||
#define stdin 0
|
#define stdin 0
|
||||||
#define stdout 0
|
#define stdout 0
|
||||||
#define EOF 0
|
|
||||||
|
|
||||||
#define errno grub_errno
|
|
||||||
#define EINVAL GRUB_ERR_BAD_NUMBER
|
|
||||||
#define ENOMEM GRUB_ERR_OUT_OF_MEMORY
|
|
||||||
|
|
||||||
#define strlen grub_strlen
|
|
||||||
#define memset grub_memset
|
|
||||||
|
|
||||||
#define fprintf(...) 0
|
#define fprintf(...) 0
|
||||||
#define exit(...)
|
#define exit(...)
|
||||||
|
#endif
|
||||||
#pragma GCC diagnostic warning "-Wunused-variable"
|
|
||||||
#pragma GCC diagnostic warning "-Wunused-function"
|
|
||||||
#pragma GCC diagnostic warning "-Wunused-parameter"
|
|
||||||
#pragma GCC diagnostic warning "-Wstrict-prototypes"
|
|
||||||
#pragma GCC diagnostic warning "-Wmissing-prototypes"
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -159,27 +159,27 @@ grub_console_checkkey (void)
|
||||||
read_key = key.unicode_char;
|
read_key = key.unicode_char;
|
||||||
break;
|
break;
|
||||||
case 0x01:
|
case 0x01:
|
||||||
read_key = 16;
|
read_key = GRUB_TERM_UP;
|
||||||
break;
|
break;
|
||||||
case 0x02:
|
case 0x02:
|
||||||
read_key = 14;
|
read_key = GRUB_TERM_DOWN;
|
||||||
break;
|
break;
|
||||||
case 0x03:
|
case 0x03:
|
||||||
read_key = 6;
|
read_key = GRUB_TERM_RIGHT;
|
||||||
break;
|
break;
|
||||||
case 0x04:
|
case 0x04:
|
||||||
read_key = 2;
|
read_key = GRUB_TERM_LEFT;
|
||||||
break;
|
break;
|
||||||
case 0x05:
|
case 0x05:
|
||||||
read_key = 1;
|
read_key = GRUB_TERM_HOME;
|
||||||
break;
|
break;
|
||||||
case 0x06:
|
case 0x06:
|
||||||
read_key = 5;
|
read_key = GRUB_TERM_END;
|
||||||
break;
|
break;
|
||||||
case 0x07:
|
case 0x07:
|
||||||
break;
|
break;
|
||||||
case 0x08:
|
case 0x08:
|
||||||
read_key = 4;
|
read_key = GRUB_TERM_DC;
|
||||||
break;
|
break;
|
||||||
case 0x09:
|
case 0x09:
|
||||||
break;
|
break;
|
||||||
|
@ -194,6 +194,9 @@ grub_console_checkkey (void)
|
||||||
case 0x0d:
|
case 0x0d:
|
||||||
read_key = 5;
|
read_key = 5;
|
||||||
break;
|
break;
|
||||||
|
case 0x0e:
|
||||||
|
read_key = 3;
|
||||||
|
break;
|
||||||
case 0x17:
|
case 0x17:
|
||||||
read_key = '\e';
|
read_key = '\e';
|
||||||
break;
|
break;
|
||||||
|
|
31
tests/grub_script_if.in
Normal file
31
tests/grub_script_if.in
Normal file
|
@ -0,0 +1,31 @@
|
||||||
|
#! @builddir@/grub-shell-tester
|
||||||
|
|
||||||
|
#basic if, execute
|
||||||
|
if true; then echo yes; fi
|
||||||
|
|
||||||
|
#basic if, no execution
|
||||||
|
if false; then echo no; fi
|
||||||
|
|
||||||
|
#if else, execute if path
|
||||||
|
if true; then echo yes; else echo no; fi
|
||||||
|
|
||||||
|
#if else, execute else path
|
||||||
|
if false; then echo no; else echo yes; fi
|
||||||
|
|
||||||
|
#if elif, execute elif
|
||||||
|
if false; then echo no; elif true; then echo yes; fi
|
||||||
|
|
||||||
|
#if elif else, execute else
|
||||||
|
if false; then echo no; elif false; then echo no; else echo yes; fi
|
||||||
|
|
||||||
|
#if elif(1) elif(2), execute elif(2)
|
||||||
|
if false; then echo no; elif false; then echo no; elif true; then echo yes; fi
|
||||||
|
|
||||||
|
#if elif(1) elif(2) else, execute else
|
||||||
|
if false; then echo no; elif false; then echo no; elif false; then echo no; else echo yes; fi
|
||||||
|
|
||||||
|
#if {if elif else}, execute elif
|
||||||
|
if true; then if false; then echo no; elif true; then echo yes; else echo no; fi; fi
|
||||||
|
|
||||||
|
#if {if elif} else, execute elif. ofcourse no dangling-else problem due to "fi"
|
||||||
|
if true; then if false; then echo no; elif true; then echo yes; fi; else echo no; fi
|
32
tests/grub_script_while1.in
Normal file
32
tests/grub_script_while1.in
Normal file
|
@ -0,0 +1,32 @@
|
||||||
|
#! @builddir@/grub-shell-tester
|
||||||
|
|
||||||
|
echo one
|
||||||
|
foo=""
|
||||||
|
while test "$foo" != "1111"; do foo="${foo}1"; echo "$foo"; done
|
||||||
|
|
||||||
|
echo two
|
||||||
|
foo=""
|
||||||
|
while test "$foo" != "aaaa"
|
||||||
|
do
|
||||||
|
foo="${foo}a"
|
||||||
|
echo $foo
|
||||||
|
done
|
||||||
|
|
||||||
|
foo=""
|
||||||
|
until test "$foo" = "1111"; do foo="${foo}1"; echo $foo; done
|
||||||
|
foo=""
|
||||||
|
until test "$foo" = "aaaa"
|
||||||
|
do
|
||||||
|
foo="${foo}a"
|
||||||
|
echo $foo
|
||||||
|
done
|
||||||
|
|
||||||
|
# check "$?" in condition gets its value from while body commands
|
||||||
|
foo=""
|
||||||
|
false
|
||||||
|
while test "$?" != "0"
|
||||||
|
do
|
||||||
|
echo $foo
|
||||||
|
foo="${foo}1"
|
||||||
|
test "$foo" = "111111"
|
||||||
|
done
|
|
@ -264,10 +264,17 @@ find_root_device (const char *dir, dev_t dev)
|
||||||
/* Found! */
|
/* Found! */
|
||||||
char *res;
|
char *res;
|
||||||
char *cwd;
|
char *cwd;
|
||||||
|
#if defined(__NetBSD__)
|
||||||
|
/* Convert this block device to its character (raw) device. */
|
||||||
|
const char *template = "%s/r%s";
|
||||||
|
#else
|
||||||
|
/* Keep the device name as it is. */
|
||||||
|
const char *template = "%s/%s";
|
||||||
|
#endif
|
||||||
|
|
||||||
cwd = xgetcwd ();
|
cwd = xgetcwd ();
|
||||||
res = xmalloc (strlen (cwd) + strlen (ent->d_name) + 2);
|
res = xmalloc (strlen (cwd) + strlen (ent->d_name) + 3);
|
||||||
sprintf (res, "%s/%s", cwd, ent->d_name);
|
sprintf (res, template, cwd, ent->d_name);
|
||||||
strip_extra_slashes (res);
|
strip_extra_slashes (res);
|
||||||
free (cwd);
|
free (cwd);
|
||||||
|
|
||||||
|
|
|
@ -38,8 +38,6 @@
|
||||||
#include <grub/partition.h>
|
#include <grub/partition.h>
|
||||||
#include <grub/i18n.h>
|
#include <grub/i18n.h>
|
||||||
|
|
||||||
#include <grub_emu_init.h>
|
|
||||||
|
|
||||||
#define ENABLE_RELOCATABLE 0
|
#define ENABLE_RELOCATABLE 0
|
||||||
#include "progname.h"
|
#include "progname.h"
|
||||||
|
|
||||||
|
@ -55,6 +53,7 @@ grub_arch_modules_addr (void)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if GRUB_NO_MODULES
|
||||||
grub_err_t
|
grub_err_t
|
||||||
grub_arch_dl_check_header (void *ehdr)
|
grub_arch_dl_check_header (void *ehdr)
|
||||||
{
|
{
|
||||||
|
@ -71,6 +70,7 @@ grub_arch_dl_relocate_symbols (grub_dl_t mod, void *ehdr)
|
||||||
|
|
||||||
return GRUB_ERR_BAD_MODULE;
|
return GRUB_ERR_BAD_MODULE;
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
void
|
void
|
||||||
grub_reboot (void)
|
grub_reboot (void)
|
||||||
|
@ -150,6 +150,10 @@ void grub_hostfs_init (void);
|
||||||
void grub_hostfs_fini (void);
|
void grub_hostfs_fini (void);
|
||||||
void grub_host_init (void);
|
void grub_host_init (void);
|
||||||
void grub_host_fini (void);
|
void grub_host_fini (void);
|
||||||
|
#if GRUB_NO_MODULES
|
||||||
|
void grub_init_all (void);
|
||||||
|
void grub_fini_all (void);
|
||||||
|
#endif
|
||||||
|
|
||||||
int
|
int
|
||||||
main (int argc, char *argv[])
|
main (int argc, char *argv[])
|
||||||
|
@ -215,7 +219,9 @@ main (int argc, char *argv[])
|
||||||
/* XXX: This is a bit unportable. */
|
/* XXX: This is a bit unportable. */
|
||||||
grub_util_biosdisk_init (dev_map);
|
grub_util_biosdisk_init (dev_map);
|
||||||
|
|
||||||
|
#if GRUB_NO_MODULES
|
||||||
grub_init_all ();
|
grub_init_all ();
|
||||||
|
#endif
|
||||||
|
|
||||||
/* Make sure that there is a root device. */
|
/* Make sure that there is a root device. */
|
||||||
if (! root_dev)
|
if (! root_dev)
|
||||||
|
@ -233,7 +239,10 @@ main (int argc, char *argv[])
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
dir = grub_get_prefix (dir);
|
if (strcmp (root_dev, "host") == 0)
|
||||||
|
dir = xstrdup (dir);
|
||||||
|
else
|
||||||
|
dir = grub_get_prefix (dir);
|
||||||
prefix = xmalloc (strlen (root_dev) + 2 + strlen (dir) + 1);
|
prefix = xmalloc (strlen (root_dev) + 2 + strlen (dir) + 1);
|
||||||
sprintf (prefix, "(%s)%s", root_dev, dir);
|
sprintf (prefix, "(%s)%s", root_dev, dir);
|
||||||
free (dir);
|
free (dir);
|
||||||
|
@ -242,7 +251,9 @@ main (int argc, char *argv[])
|
||||||
if (setjmp (main_env) == 0)
|
if (setjmp (main_env) == 0)
|
||||||
grub_main ();
|
grub_main ();
|
||||||
|
|
||||||
|
#if GRUB_NO_MODULES
|
||||||
grub_fini_all ();
|
grub_fini_all ();
|
||||||
|
#endif
|
||||||
grub_hostfs_fini ();
|
grub_hostfs_fini ();
|
||||||
grub_host_fini ();
|
grub_host_fini ();
|
||||||
|
|
||||||
|
|
|
@ -219,8 +219,7 @@ else
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# Create the GRUB directory if it is not present.
|
# Create the GRUB directory if it is not present.
|
||||||
test -d "$bootdir" || mkdir "$bootdir" || exit 1
|
mkdir -p "$grubdir" || exit 1
|
||||||
test -d "$grubdir" || mkdir "$grubdir" || exit 1
|
|
||||||
|
|
||||||
# If --recheck is specified, remove the device map, if present.
|
# If --recheck is specified, remove the device map, if present.
|
||||||
if test $recheck = yes; then
|
if test $recheck = yes; then
|
||||||
|
@ -271,7 +270,7 @@ for dir in ${localedir}/*; do
|
||||||
done
|
done
|
||||||
|
|
||||||
# Write device to a variable so we don't have to traverse /dev every time.
|
# Write device to a variable so we don't have to traverse /dev every time.
|
||||||
grub_device=`$grub_probe --target=device ${grubdir}`
|
grub_device=`$grub_probe --target=device ${grubdir}` || exit 1
|
||||||
|
|
||||||
if ! test -f ${grubdir}/grubenv; then
|
if ! test -f ${grubdir}/grubenv; then
|
||||||
$grub_editenv ${grubdir}/grubenv create
|
$grub_editenv ${grubdir}/grubenv create
|
||||||
|
@ -313,11 +312,11 @@ if [ "x${devabstraction_module}" = "x" ] ; then
|
||||||
if echo "${install_device}" | grep -qx "(.*)" ; then
|
if echo "${install_device}" | grep -qx "(.*)" ; then
|
||||||
install_drive="${install_device}"
|
install_drive="${install_device}"
|
||||||
else
|
else
|
||||||
install_drive="`$grub_probe --target=drive --device ${install_device}`"
|
install_drive="`$grub_probe --target=drive --device ${install_device}`" || exit 1
|
||||||
fi
|
fi
|
||||||
install_drive="`echo ${install_drive} | sed -e s/,[0-9]*[a-z]*//g`"
|
install_drive="`echo ${install_drive} | sed -e s/,[0-9]*[a-z]*//g`"
|
||||||
fi
|
fi
|
||||||
grub_drive="`$grub_probe --target=drive --device ${grub_device}`"
|
grub_drive="`$grub_probe --target=drive --device ${grub_device}`" || exit 1
|
||||||
|
|
||||||
# Strip partition number
|
# Strip partition number
|
||||||
grub_drive="`echo ${grub_drive} | sed -e s/,[0-9]*[a-z]*//g`"
|
grub_drive="`echo ${grub_drive} | sed -e s/,[0-9]*[a-z]*//g`"
|
||||||
|
@ -344,7 +343,7 @@ if [ "x${devabstraction_module}" = "x" ] ; then
|
||||||
modules="$modules search_fs_uuid"
|
modules="$modules search_fs_uuid"
|
||||||
fi
|
fi
|
||||||
else
|
else
|
||||||
prefix_drive=`$grub_probe --target=drive --device ${grub_device}`
|
prefix_drive=`$grub_probe --target=drive --device ${grub_device}` || exit 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if [ "${target_cpu}-${platform}" = "i386-pc" ] || [ "${target_cpu}-${platform}" = "sparc64-ieee1275" ] ; then
|
if [ "${target_cpu}-${platform}" = "i386-pc" ] || [ "${target_cpu}-${platform}" = "sparc64-ieee1275" ] ; then
|
||||||
|
|
|
@ -140,60 +140,73 @@ if [ "x${GRUB_TERMINAL}" != "x" ] ; then
|
||||||
GRUB_TERMINAL_OUTPUT="${GRUB_TERMINAL}"
|
GRUB_TERMINAL_OUTPUT="${GRUB_TERMINAL}"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
case x${GRUB_TERMINAL_OUTPUT} in
|
termoutdefault=0
|
||||||
x | xgfxterm)
|
if [ "x${GRUB_TERMINAL_OUTPUT}" == x ]; then
|
||||||
# If this platform supports gfxterm, try to use it.
|
GRUB_TERMINAL_OUTPUT=gfxterm;
|
||||||
if test -e ${grub_prefix}/gfxterm.mod ; then
|
termoutdefault=1;
|
||||||
# FIXME: this should do something smarter than just loading first
|
fi
|
||||||
# video backend.
|
|
||||||
GRUB_VIDEO_BACKEND=$(head -n 1 ${grub_prefix}/video.lst || true)
|
|
||||||
if [ -n "${GRUB_VIDEO_BACKEND}" ] ; then
|
|
||||||
GRUB_TERMINAL_OUTPUT=gfxterm
|
|
||||||
elif [ "${GRUB_TERMINAL_OUTPUT}" = "gfxterm" ] ; then
|
|
||||||
echo "No suitable backend could be found for gfxterm." >&2 ; exit 1
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
;;
|
|
||||||
xconsole | xserial | xofconsole) ;;
|
|
||||||
*) echo "Invalid output terminal \"${GRUB_TERMINAL_OUTPUT}\"" >&2 ; exit 1 ;;
|
|
||||||
esac
|
|
||||||
|
|
||||||
# check for terminals that require fonts
|
for x in ${GRUB_TERMINAL_OUTPUT}; do
|
||||||
case ${GRUB_TERMINAL_OUTPUT} in
|
if [ x${x} == xgfxterm ]; then
|
||||||
gfxterm)
|
# If this platform supports gfxterm, try to use it.
|
||||||
if [ -n "$GRUB_FONT" ] ; then
|
if ! test -e ${grub_prefix}/gfxterm.mod ; then
|
||||||
if is_path_readable_by_grub ${GRUB_FONT} > /dev/null ; then
|
if [ "x$termoutdefault" != "x1" ]; then
|
||||||
GRUB_FONT_PATH=${GRUB_FONT}
|
echo "gfxterm isn't available on your platform" >&2 ; exit 1
|
||||||
else
|
fi
|
||||||
echo "No such font or not readable by grub: ${GRUB_FONT}" >&2
|
GRUB_TERMINAL_OUTPUT=
|
||||||
exit 1
|
break;
|
||||||
|
fi
|
||||||
|
# FIXME: this should do something smarter than just loading first
|
||||||
|
# video backend.
|
||||||
|
GRUB_VIDEO_BACKEND=$(head -n 1 ${grub_prefix}/video.lst || true)
|
||||||
|
if [ -z "${GRUB_VIDEO_BACKEND}" ] ; then
|
||||||
|
if [ "x$termoutdefault" != "x1" ]; then
|
||||||
|
echo "No suitable backend could be found for gfxterm." >&2 ; exit 1
|
||||||
|
fi
|
||||||
|
GRUB_TERMINAL_OUTPUT=
|
||||||
|
fi
|
||||||
|
if [ -n "$GRUB_FONT" ] ; then
|
||||||
|
if is_path_readable_by_grub ${GRUB_FONT} > /dev/null ; then
|
||||||
|
GRUB_FONT_PATH=${GRUB_FONT}
|
||||||
|
else
|
||||||
|
echo "No such font or not readable by grub: ${GRUB_FONT}" >&2
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
for dir in ${pkgdatadir} /boot/grub /usr/share/grub ; do
|
||||||
|
for basename in unicode unifont ascii; do
|
||||||
|
path="${dir}/${basename}.pf2"
|
||||||
|
if is_path_readable_by_grub ${path} > /dev/null ; then
|
||||||
|
GRUB_FONT_PATH=${path}
|
||||||
|
else
|
||||||
|
continue
|
||||||
|
fi
|
||||||
|
if [ "${basename}" = "ascii" ] ; then
|
||||||
|
# make sure all our children behave in conformance with ascii..
|
||||||
|
export LANG=C
|
||||||
|
fi
|
||||||
|
break 2
|
||||||
|
done
|
||||||
|
done
|
||||||
|
fi
|
||||||
|
if [ -z "${GRUB_FONT_PATH}" ] ; then
|
||||||
|
if [ "x$termoutdefault" != "x1" ]; then
|
||||||
|
echo "No font for gfxterm found." >&2 ; exit 1
|
||||||
|
fi
|
||||||
|
GRUB_TERMINAL_OUTPUT=
|
||||||
fi
|
fi
|
||||||
else
|
|
||||||
for dir in ${pkgdatadir} /boot/grub /usr/share/grub ; do
|
|
||||||
for basename in unicode unifont ascii; do
|
|
||||||
path="${dir}/${basename}.pf2"
|
|
||||||
if is_path_readable_by_grub ${path} > /dev/null ; then
|
|
||||||
GRUB_FONT_PATH=${path}
|
|
||||||
else
|
|
||||||
continue
|
|
||||||
fi
|
|
||||||
if [ "${basename}" = "ascii" ] ; then
|
|
||||||
# make sure all our children behave in conformance with ascii..
|
|
||||||
export LANG=C
|
|
||||||
fi
|
|
||||||
break 2
|
|
||||||
done
|
|
||||||
done
|
|
||||||
fi
|
fi
|
||||||
if [ -z "${GRUB_FONT_PATH}" ] ; then
|
done
|
||||||
# fallback to the native terminal for this platform
|
|
||||||
unset GRUB_TERMINAL_OUTPUT
|
for x in ${GRUB_TERMINAL_OUTPUT}; do
|
||||||
fi
|
case "x${x}" in
|
||||||
;;
|
xgfxterm) ;;
|
||||||
*)
|
xconsole | xserial | xofconsole)
|
||||||
# make sure all our children behave in conformance with ascii..
|
# make sure all our children behave in conformance with ascii..
|
||||||
export LANG=C
|
export LANG=C;;
|
||||||
esac
|
*) echo "Invalid output terminal \"${GRUB_TERMINAL_OUTPUT}\"" >&2 ; exit 1 ;;
|
||||||
|
esac
|
||||||
|
done
|
||||||
|
|
||||||
# These are defined in this script, export them here so that user can
|
# These are defined in this script, export them here so that user can
|
||||||
# override them.
|
# override them.
|
||||||
|
@ -220,6 +233,7 @@ export GRUB_DEFAULT \
|
||||||
GRUB_DISABLE_LINUX_UUID \
|
GRUB_DISABLE_LINUX_UUID \
|
||||||
GRUB_DISABLE_LINUX_RECOVERY \
|
GRUB_DISABLE_LINUX_RECOVERY \
|
||||||
GRUB_GFXMODE \
|
GRUB_GFXMODE \
|
||||||
|
GRUB_BACKGROUND \
|
||||||
GRUB_THEME \
|
GRUB_THEME \
|
||||||
GRUB_GFXPAYLOAD_LINUX \
|
GRUB_GFXPAYLOAD_LINUX \
|
||||||
GRUB_DISABLE_OS_PROBER \
|
GRUB_DISABLE_OS_PROBER \
|
||||||
|
|
|
@ -156,7 +156,7 @@ EOF
|
||||||
echo "insmod $i"
|
echo "insmod $i"
|
||||||
done ; \
|
done ; \
|
||||||
echo "source /boot/grub/grub.cfg") \
|
echo "source /boot/grub/grub.cfg") \
|
||||||
> ${iso9660_dir}/boot/grub/i386-pc/grub.cfg
|
> ${iso9660_dir}/boot/grub/i386-coreboot/grub.cfg
|
||||||
|
|
||||||
tar -C ${memdisk_dir} -cf ${memdisk_img} boot
|
tar -C ${memdisk_dir} -cf ${memdisk_img} boot
|
||||||
rm -rf ${memdisk_dir}
|
rm -rf ${memdisk_dir}
|
||||||
|
@ -187,7 +187,7 @@ if test -e "${pc_dir}" ; then
|
||||||
echo "source /boot/grub/grub.cfg") \
|
echo "source /boot/grub/grub.cfg") \
|
||||||
> ${iso9660_dir}/boot/grub/i386-pc/grub.cfg
|
> ${iso9660_dir}/boot/grub/i386-pc/grub.cfg
|
||||||
|
|
||||||
grub_mkisofs_arguments="${grub_mkisofs_arguments} -b boot/grub/i386-pc/eltorito.img -boot-info-table \
|
grub_mkisofs_arguments="${grub_mkisofs_arguments} -b boot/grub/i386-pc/eltorito.img -no-emul-boot -boot-info-table \
|
||||||
--embedded-boot ${embed_img}"
|
--embedded-boot ${embed_img}"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
|
|
@ -119,7 +119,7 @@ probe (const char *path, char *device_name)
|
||||||
|
|
||||||
if (path == NULL)
|
if (path == NULL)
|
||||||
{
|
{
|
||||||
#if defined(__FreeBSD__) || defined(__FreeBSD_kernel__)
|
#if defined(__FreeBSD__) || defined(__FreeBSD_kernel__) || defined(__NetBSD__)
|
||||||
if (! grub_util_check_char_device (device_name))
|
if (! grub_util_check_char_device (device_name))
|
||||||
grub_util_error ("%s is not a character device", device_name);
|
grub_util_error ("%s is not a character device", device_name);
|
||||||
#else
|
#else
|
||||||
|
|
|
@ -87,6 +87,12 @@ grub_script_execute_cmdfor (struct grub_script_cmd *cmd __attribute__ ((unused))
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
grub_err_t
|
||||||
|
grub_script_execute_cmdwhile (struct grub_script_cmd *cmd __attribute__ ((unused)))
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
grub_err_t
|
grub_err_t
|
||||||
grub_script_execute_menuentry (struct grub_script_cmd *cmd __attribute__ ((unused)))
|
grub_script_execute_menuentry (struct grub_script_cmd *cmd __attribute__ ((unused)))
|
||||||
{
|
{
|
||||||
|
@ -124,7 +130,7 @@ Checks GRUB script configuration file for syntax errors.\n\
|
||||||
\n\
|
\n\
|
||||||
-h, --help display this message and exit\n\
|
-h, --help display this message and exit\n\
|
||||||
-V, --version print version information and exit\n\
|
-V, --version print version information and exit\n\
|
||||||
-v, --verbose print script being processed\n\
|
-v, --verbose print the script as it is being processed\n\
|
||||||
\n\
|
\n\
|
||||||
Report bugs to <%s>.\n\
|
Report bugs to <%s>.\n\
|
||||||
", program_name,
|
", program_name,
|
||||||
|
|
|
@ -59,19 +59,92 @@ function savedefault {
|
||||||
}
|
}
|
||||||
EOF
|
EOF
|
||||||
|
|
||||||
case ${GRUB_TERMINAL_INPUT}:${GRUB_TERMINAL_OUTPUT} in
|
serial=0;
|
||||||
serial:* | *:serial)
|
gfxterm=0;
|
||||||
|
for x in ${GRUB_TERMINAL_INPUT} ${GRUB_TERMINAL_OUTPUT}; do
|
||||||
|
if [ xserial = "x$x" ]; then
|
||||||
|
serial=1;
|
||||||
|
fi
|
||||||
|
if [ xgfxterm = "x$x" ]; then
|
||||||
|
gfxterm=1;
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
|
||||||
|
if [ "x$serial" = x1 ]; then
|
||||||
if ! test -e ${grub_prefix}/serial.mod ; then
|
if ! test -e ${grub_prefix}/serial.mod ; then
|
||||||
echo "Serial terminal not available on this platform." >&2 ; exit 1
|
echo "Serial terminal not available on this platform." >&2 ; exit 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if [ "x${GRUB_SERIAL_COMMAND}" = "x" ] ; then
|
if [ "x${GRUB_SERIAL_COMMAND}" = "x" ] ; then
|
||||||
grub_warn "Requested serial terminal but GRUB_SERIAL_COMMAND is unspecified. Default parameters will be used."
|
grub_warn "Requested serial terminal but GRUB_SERIAL_COMMAND is unspecified. Default parameters will be used."
|
||||||
GRUB_SERIAL_COMMAND=serial
|
GRUB_SERIAL_COMMAND=serial
|
||||||
fi
|
fi
|
||||||
echo "${GRUB_SERIAL_COMMAND}"
|
echo "${GRUB_SERIAL_COMMAND}"
|
||||||
;;
|
fi
|
||||||
esac
|
|
||||||
|
if [ "x$gfxterm" = x1 ]; then
|
||||||
|
# Make the font accessible
|
||||||
|
prepare_grub_to_access_device `${grub_probe} --target=device "${GRUB_FONT_PATH}"`
|
||||||
|
|
||||||
|
cat << EOF
|
||||||
|
if loadfont `make_system_path_relative_to_its_root "${GRUB_FONT_PATH}"` ; then
|
||||||
|
set gfxmode=${GRUB_GFXMODE}
|
||||||
|
insmod gfxterm
|
||||||
|
insmod ${GRUB_VIDEO_BACKEND}
|
||||||
|
EOF
|
||||||
|
if [ "x$GRUB_THEME" != x ] && [ -f "$GRUB_THEME" ] \
|
||||||
|
&& is_path_readable_by_grub "$GRUB_THEME"; then
|
||||||
|
echo "Found theme: $GRUB_THEME" >&2
|
||||||
|
prepare_grub_to_access_device `${grub_probe} --target=device "$GRUB_THEME"` | sed -e "s/^/ /"
|
||||||
|
cat << EOF
|
||||||
|
insmod gfxmenu
|
||||||
|
EOF
|
||||||
|
themedir="`dirname "$GRUB_THEME"`"
|
||||||
|
for x in "$themedir"/*.pf2 "$themedir"/f/*.pf2; do
|
||||||
|
if [ -f "$x" ]; then
|
||||||
|
cat << EOF
|
||||||
|
loadfont (\$root)`make_system_path_relative_to_its_root $x`
|
||||||
|
EOF
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
if [ x"`echo "$themedir"/*.jpg`" != x"$themedir/*.jpg" ] || [ x"`echo "$themedir"/*.jpeg`" != x"$themedir/*.jpeg" ]; then
|
||||||
|
cat << EOF
|
||||||
|
insmod jpeg
|
||||||
|
EOF
|
||||||
|
fi
|
||||||
|
if [ x"`echo "$themedir"/*.png`" != x"$themedir/*.png" ]; then
|
||||||
|
cat << EOF
|
||||||
|
insmod png
|
||||||
|
EOF
|
||||||
|
fi
|
||||||
|
if [ x"`echo "$themedir"/*.tga`" != x"$themedir/*.tga" ]; then
|
||||||
|
cat << EOF
|
||||||
|
insmod tga
|
||||||
|
EOF
|
||||||
|
fi
|
||||||
|
|
||||||
|
cat << EOF
|
||||||
|
set theme=(\$root)`make_system_path_relative_to_its_root $GRUB_THEME`
|
||||||
|
EOF
|
||||||
|
elif [ "x$GRUB_BACKGROUND" != x ] && [ -f "$GRUB_BACKGROUND" ] \
|
||||||
|
&& is_path_readable_by_grub "$GRUB_BACKGROUND"; then
|
||||||
|
echo "Found background: $GRUB_BACKGROUND" >&2
|
||||||
|
case "$GRUB_BACKGROUND" in
|
||||||
|
*.png) reader=png ;;
|
||||||
|
*.tga) reader=tga ;;
|
||||||
|
*.jpg|*.jpeg) reader=jpeg ;;
|
||||||
|
*) echo "Unsupported image format" >&2; exit 1 ;;
|
||||||
|
esac
|
||||||
|
prepare_grub_to_access_device `${grub_probe} --target=device "$GRUB_BACKGROUND"` | sed -e "s/^/ /"
|
||||||
|
cat << EOF
|
||||||
|
insmod $reader
|
||||||
|
background_image -m stretch `make_system_path_relative_to_its_root "$GRUB_BACKGROUND"`
|
||||||
|
EOF
|
||||||
|
fi
|
||||||
|
cat << EOF
|
||||||
|
fi
|
||||||
|
EOF
|
||||||
|
fi
|
||||||
|
|
||||||
case x${GRUB_TERMINAL_INPUT} in
|
case x${GRUB_TERMINAL_INPUT} in
|
||||||
x)
|
x)
|
||||||
|
@ -89,35 +162,6 @@ EOF
|
||||||
esac
|
esac
|
||||||
|
|
||||||
case x${GRUB_TERMINAL_OUTPUT} in
|
case x${GRUB_TERMINAL_OUTPUT} in
|
||||||
xgfxterm)
|
|
||||||
# Make the font accessible
|
|
||||||
prepare_grub_to_access_device `${grub_probe} --target=device ${GRUB_FONT_PATH}`
|
|
||||||
|
|
||||||
cat << EOF
|
|
||||||
if loadfont `make_system_path_relative_to_its_root ${GRUB_FONT_PATH}` ; then
|
|
||||||
set gfxmode=${GRUB_GFXMODE}
|
|
||||||
insmod gfxterm
|
|
||||||
insmod ${GRUB_VIDEO_BACKEND}
|
|
||||||
if terminal_output gfxterm ; then true ; else
|
|
||||||
# For backward compatibility with versions of terminal.mod that don't
|
|
||||||
# understand terminal_output
|
|
||||||
terminal gfxterm
|
|
||||||
fi
|
|
||||||
EOF
|
|
||||||
if [ x$GRUB_THEME != x ] && [ -f $GRUB_THEME ] \
|
|
||||||
&& is_path_readable_by_grub $GRUB_THEME; then
|
|
||||||
echo "Found theme: $GRUB_THEME" >&2
|
|
||||||
prepare_grub_to_access_device `${grub_probe} --target=device $GRUB_THEME` | sed -e "s/^/ /"
|
|
||||||
cat << EOF
|
|
||||||
insmod gfxmenu
|
|
||||||
set theme=(\$root)`make_system_path_relative_to_its_root $GRUB_THEME`
|
|
||||||
set menuviewer=gfxmenu
|
|
||||||
EOF
|
|
||||||
fi
|
|
||||||
cat << EOF
|
|
||||||
fi
|
|
||||||
EOF
|
|
||||||
;;
|
|
||||||
x)
|
x)
|
||||||
# Just use the native terminal
|
# Just use the native terminal
|
||||||
;;
|
;;
|
||||||
|
|
|
@ -27,7 +27,7 @@ if [ "x${GRUB_DISTRIBUTOR}" = "x" ] ; then
|
||||||
OS=GNU
|
OS=GNU
|
||||||
else
|
else
|
||||||
OS="${GRUB_DISTRIBUTOR} GNU/Hurd"
|
OS="${GRUB_DISTRIBUTOR} GNU/Hurd"
|
||||||
CLASS="--class $(echo ${GRUB_DISTRIBUTOR} | tr '[A-Z]' '[a-z]') ${CLASS}"
|
CLASS="--class $(echo ${GRUB_DISTRIBUTOR} | tr '[A-Z]' '[a-z]' | cut -d' ' -f1) ${CLASS}"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
at_least_one=false
|
at_least_one=false
|
||||||
|
|
|
@ -30,7 +30,7 @@ CLASS="--class os"
|
||||||
case "${GRUB_DISTRIBUTOR}" in
|
case "${GRUB_DISTRIBUTOR}" in
|
||||||
Debian)
|
Debian)
|
||||||
OS="${GRUB_DISTRIBUTOR} GNU/kFreeBSD"
|
OS="${GRUB_DISTRIBUTOR} GNU/kFreeBSD"
|
||||||
CLASS="--class $(echo ${GRUB_DISTRIBUTOR} | tr '[A-Z]' '[a-z]') --class gnu-kfreebsd --class gnu ${CLASS}"
|
CLASS="--class $(echo ${GRUB_DISTRIBUTOR} | tr '[A-Z]' '[a-z]' | cut -d' ' -f1) --class gnu-kfreebsd --class gnu ${CLASS}"
|
||||||
;;
|
;;
|
||||||
*)
|
*)
|
||||||
OS="FreeBSD"
|
OS="FreeBSD"
|
||||||
|
|
|
@ -31,7 +31,7 @@ if [ "x${GRUB_DISTRIBUTOR}" = "x" ] ; then
|
||||||
OS=GNU/Linux
|
OS=GNU/Linux
|
||||||
else
|
else
|
||||||
OS="${GRUB_DISTRIBUTOR} GNU/Linux"
|
OS="${GRUB_DISTRIBUTOR} GNU/Linux"
|
||||||
CLASS="--class $(echo ${GRUB_DISTRIBUTOR} | tr '[A-Z]' '[a-z]') ${CLASS}"
|
CLASS="--class $(echo ${GRUB_DISTRIBUTOR} | tr '[A-Z]' '[a-z]' | cut -d' ' -f1) ${CLASS}"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# loop-AES arranges things so that /dev/loop/X can be our root device, but
|
# loop-AES arranges things so that /dev/loop/X can be our root device, but
|
||||||
|
|
154
util/hostdisk.c
154
util/hostdisk.c
|
@ -98,6 +98,18 @@ struct hd_geometry
|
||||||
# include <sys/disk.h>
|
# include <sys/disk.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#if defined(__NetBSD__)
|
||||||
|
# include <sys/ioctl.h>
|
||||||
|
# include <sys/disklabel.h> /* struct disklabel */
|
||||||
|
# ifdef HAVE_GETRAWPARTITION
|
||||||
|
# include <util.h> /* getrawpartition */
|
||||||
|
# endif /* HAVE_GETRAWPARTITION */
|
||||||
|
# include <sys/fdio.h>
|
||||||
|
# ifndef RAW_FLOPPY_MAJOR
|
||||||
|
# define RAW_FLOPPY_MAJOR 9
|
||||||
|
# endif /* ! RAW_FLOPPY_MAJOR */
|
||||||
|
#endif /* defined(__NetBSD__) */
|
||||||
|
|
||||||
struct
|
struct
|
||||||
{
|
{
|
||||||
char *drive;
|
char *drive;
|
||||||
|
@ -129,6 +141,31 @@ have_devfs (void)
|
||||||
}
|
}
|
||||||
#endif /* __linux__ */
|
#endif /* __linux__ */
|
||||||
|
|
||||||
|
#if defined(__NetBSD__)
|
||||||
|
/* Adjust device driver parameters. This function should be called just
|
||||||
|
after successfully opening the device. For now, it simply prevents the
|
||||||
|
floppy driver from retrying operations on failure, as otherwise the
|
||||||
|
driver takes a while to abort when there is no floppy in the drive. */
|
||||||
|
static void
|
||||||
|
configure_device_driver (int fd)
|
||||||
|
{
|
||||||
|
struct stat st;
|
||||||
|
|
||||||
|
if (fstat (fd, &st) < 0 || ! S_ISCHR (st.st_mode))
|
||||||
|
return;
|
||||||
|
if (major(st.st_rdev) == RAW_FLOPPY_MAJOR)
|
||||||
|
{
|
||||||
|
int floppy_opts;
|
||||||
|
|
||||||
|
if (ioctl (fd, FDIOCGETOPTS, &floppy_opts) == -1)
|
||||||
|
return;
|
||||||
|
floppy_opts |= FDOPT_NORETRY;
|
||||||
|
if (ioctl (fd, FDIOCSETOPTS, &floppy_opts) == -1)
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif /* defined(__NetBSD__) */
|
||||||
|
|
||||||
static int
|
static int
|
||||||
find_grub_drive (const char *name)
|
find_grub_drive (const char *name)
|
||||||
{
|
{
|
||||||
|
@ -204,16 +241,20 @@ grub_util_biosdisk_open (const char *name, grub_disk_t disk)
|
||||||
return GRUB_ERR_NONE;
|
return GRUB_ERR_NONE;
|
||||||
}
|
}
|
||||||
#elif defined(__linux__) || defined(__CYGWIN__) || defined(__FreeBSD__) || \
|
#elif defined(__linux__) || defined(__CYGWIN__) || defined(__FreeBSD__) || \
|
||||||
defined(__FreeBSD_kernel__) || defined(__APPLE__)
|
defined(__FreeBSD_kernel__) || defined(__APPLE__) || defined(__NetBSD__)
|
||||||
{
|
{
|
||||||
|
# if defined(__NetBSD__)
|
||||||
|
struct disklabel label;
|
||||||
|
# else
|
||||||
unsigned long long nr;
|
unsigned long long nr;
|
||||||
|
# endif
|
||||||
int fd;
|
int fd;
|
||||||
|
|
||||||
fd = open (map[drive].device, O_RDONLY);
|
fd = open (map[drive].device, O_RDONLY);
|
||||||
if (fd == -1)
|
if (fd == -1)
|
||||||
return grub_error (GRUB_ERR_UNKNOWN_DEVICE, "cannot open `%s' while attempting to get disk size", map[drive].device);
|
return grub_error (GRUB_ERR_UNKNOWN_DEVICE, "cannot open `%s' while attempting to get disk size", map[drive].device);
|
||||||
|
|
||||||
# if defined(__FreeBSD__) || defined(__FreeBSD_kernel__) || defined(__APPLE__)
|
# if defined(__FreeBSD__) || defined(__FreeBSD_kernel__) || defined(__APPLE__) || defined(__NetBSD__)
|
||||||
if (fstat (fd, &st) < 0 || ! S_ISCHR (st.st_mode))
|
if (fstat (fd, &st) < 0 || ! S_ISCHR (st.st_mode))
|
||||||
# else
|
# else
|
||||||
if (fstat (fd, &st) < 0 || ! S_ISBLK (st.st_mode))
|
if (fstat (fd, &st) < 0 || ! S_ISBLK (st.st_mode))
|
||||||
|
@ -227,6 +268,9 @@ grub_util_biosdisk_open (const char *name, grub_disk_t disk)
|
||||||
if (ioctl (fd, DIOCGMEDIASIZE, &nr))
|
if (ioctl (fd, DIOCGMEDIASIZE, &nr))
|
||||||
# elif defined(__APPLE__)
|
# elif defined(__APPLE__)
|
||||||
if (ioctl (fd, DKIOCGETBLOCKCOUNT, &nr))
|
if (ioctl (fd, DKIOCGETBLOCKCOUNT, &nr))
|
||||||
|
# elif defined(__NetBSD__)
|
||||||
|
configure_device_driver (fd);
|
||||||
|
if (ioctl (fd, DIOCGDINFO, &label) == -1)
|
||||||
# else
|
# else
|
||||||
if (ioctl (fd, BLKGETSIZE64, &nr))
|
if (ioctl (fd, BLKGETSIZE64, &nr))
|
||||||
# endif
|
# endif
|
||||||
|
@ -237,14 +281,16 @@ grub_util_biosdisk_open (const char *name, grub_disk_t disk)
|
||||||
|
|
||||||
close (fd);
|
close (fd);
|
||||||
|
|
||||||
#if defined (__APPLE__)
|
# if defined (__APPLE__)
|
||||||
disk->total_sectors = nr;
|
disk->total_sectors = nr;
|
||||||
#else
|
# elif defined(__NetBSD__)
|
||||||
|
disk->total_sectors = label.d_secperunit;
|
||||||
|
# else
|
||||||
disk->total_sectors = nr / 512;
|
disk->total_sectors = nr / 512;
|
||||||
|
|
||||||
if (nr % 512)
|
if (nr % 512)
|
||||||
grub_util_error ("unaligned device size");
|
grub_util_error ("unaligned device size");
|
||||||
#endif
|
# endif
|
||||||
|
|
||||||
grub_util_info ("the size of %s is %llu", name, disk->total_sectors);
|
grub_util_info ("the size of %s is %llu", name, disk->total_sectors);
|
||||||
|
|
||||||
|
@ -483,6 +529,10 @@ open_device (const grub_disk_t disk, grub_disk_addr_t sector, int flags)
|
||||||
}
|
}
|
||||||
#endif /* ! __linux__ */
|
#endif /* ! __linux__ */
|
||||||
|
|
||||||
|
#if defined(__NetBSD__)
|
||||||
|
configure_device_driver (fd);
|
||||||
|
#endif /* defined(__NetBSD__) */
|
||||||
|
|
||||||
#if defined(__linux__) && (!defined(__GLIBC__) || \
|
#if defined(__linux__) && (!defined(__GLIBC__) || \
|
||||||
((__GLIBC__ < 2) || ((__GLIBC__ == 2) && (__GLIBC_MINOR__ < 1))))
|
((__GLIBC__ < 2) || ((__GLIBC__ == 2) && (__GLIBC_MINOR__ < 1))))
|
||||||
/* Maybe libc doesn't have large file support. */
|
/* Maybe libc doesn't have large file support. */
|
||||||
|
@ -811,7 +861,7 @@ make_device_name (int drive, int dos_part, int bsd_part)
|
||||||
dos_part_str = xasprintf (",%d", dos_part + 1);
|
dos_part_str = xasprintf (",%d", dos_part + 1);
|
||||||
|
|
||||||
if (bsd_part >= 0)
|
if (bsd_part >= 0)
|
||||||
bsd_part_str = xasprintf (",%c", dos_part + 'a');
|
bsd_part_str = xasprintf (",%c", bsd_part + 'a');
|
||||||
|
|
||||||
ret = xasprintf ("%s%s%s", map[drive].drive,
|
ret = xasprintf ("%s%s%s", map[drive].drive,
|
||||||
dos_part_str ? : "",
|
dos_part_str ? : "",
|
||||||
|
@ -981,6 +1031,27 @@ convert_system_partition_to_system_disk (const char *os_dev)
|
||||||
}
|
}
|
||||||
return path;
|
return path;
|
||||||
|
|
||||||
|
#elif defined(__NetBSD__)
|
||||||
|
/* NetBSD uses "/dev/r[wsc]d[0-9]+[a-z]". */
|
||||||
|
char *path = xstrdup (os_dev);
|
||||||
|
if (strncmp ("/dev/rwd", path, 8) == 0 ||
|
||||||
|
strncmp ("/dev/rsd", path, 8) == 0 ||
|
||||||
|
strncmp ("/dev/rcd", path, 8) == 0)
|
||||||
|
{
|
||||||
|
char *q;
|
||||||
|
q = path + strlen(path) - 1; /* last character */
|
||||||
|
if (grub_isalpha(*q) && grub_isdigit(*(q-1)))
|
||||||
|
{
|
||||||
|
int rawpart = -1;
|
||||||
|
# ifdef HAVE_GETRAWPARTITION
|
||||||
|
rawpart = getrawpartition();
|
||||||
|
# endif /* HAVE_GETRAWPARTITION */
|
||||||
|
if (rawpart >= 0)
|
||||||
|
*q = 'a' + rawpart;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return path;
|
||||||
|
|
||||||
#else
|
#else
|
||||||
# warning "The function `convert_system_partition_to_system_disk' might not work on your OS correctly."
|
# warning "The function `convert_system_partition_to_system_disk' might not work on your OS correctly."
|
||||||
return xstrdup (os_dev);
|
return xstrdup (os_dev);
|
||||||
|
@ -999,6 +1070,26 @@ device_is_wholedisk (const char *os_dev)
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#if defined(__NetBSD__)
|
||||||
|
/* Try to determine whether a given device name corresponds to a whole disk.
|
||||||
|
This function should give in most cases a definite answer, but it may
|
||||||
|
actually give an approximate one in the following sense: if the return
|
||||||
|
value is 0 then the device name does not correspond to a whole disk. */
|
||||||
|
static int
|
||||||
|
device_is_wholedisk (const char *os_dev)
|
||||||
|
{
|
||||||
|
int len = strlen (os_dev);
|
||||||
|
int rawpart = -1;
|
||||||
|
|
||||||
|
# ifdef HAVE_GETRAWPARTITION
|
||||||
|
rawpart = getrawpartition();
|
||||||
|
# endif /* HAVE_GETRAWPARTITION */
|
||||||
|
if (rawpart < 0)
|
||||||
|
return 1;
|
||||||
|
return (os_dev[len - 1] == ('a' + rawpart));
|
||||||
|
}
|
||||||
|
#endif /* defined(__NetBSD__) */
|
||||||
|
|
||||||
static int
|
static int
|
||||||
find_system_device (const char *os_dev)
|
find_system_device (const char *os_dev)
|
||||||
{
|
{
|
||||||
|
@ -1042,7 +1133,7 @@ grub_util_biosdisk_get_grub_dev (const char *os_dev)
|
||||||
drive = find_system_device (os_dev);
|
drive = find_system_device (os_dev);
|
||||||
if (drive < 0)
|
if (drive < 0)
|
||||||
{
|
{
|
||||||
grub_error (GRUB_ERR_BAD_DEVICE,
|
grub_error (GRUB_ERR_UNKNOWN_DEVICE,
|
||||||
"no mapping exists for `%s'", os_dev);
|
"no mapping exists for `%s'", os_dev);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -1051,14 +1142,14 @@ grub_util_biosdisk_get_grub_dev (const char *os_dev)
|
||||||
== 0)
|
== 0)
|
||||||
return make_device_name (drive, -1, -1);
|
return make_device_name (drive, -1, -1);
|
||||||
|
|
||||||
#if defined(__FreeBSD__) || defined(__FreeBSD_kernel__) || defined(__APPLE__)
|
#if defined(__FreeBSD__) || defined(__FreeBSD_kernel__) || defined(__APPLE__) || defined(__NetBSD__)
|
||||||
if (! S_ISCHR (st.st_mode))
|
if (! S_ISCHR (st.st_mode))
|
||||||
#else
|
#else
|
||||||
if (! S_ISBLK (st.st_mode))
|
if (! S_ISBLK (st.st_mode))
|
||||||
#endif
|
#endif
|
||||||
return make_device_name (drive, -1, -1);
|
return make_device_name (drive, -1, -1);
|
||||||
|
|
||||||
#if defined(__linux__) || defined(__CYGWIN__)
|
#if defined(__linux__) || defined(__CYGWIN__) || defined(__NetBSD__)
|
||||||
/* Linux counts partitions uniformly, whether a BSD partition or a DOS
|
/* Linux counts partitions uniformly, whether a BSD partition or a DOS
|
||||||
partition, so mapping them to GRUB devices is not trivial.
|
partition, so mapping them to GRUB devices is not trivial.
|
||||||
Here, get the start sector of a partition by HDIO_GETGEO, and
|
Here, get the start sector of a partition by HDIO_GETGEO, and
|
||||||
|
@ -1066,12 +1157,22 @@ grub_util_biosdisk_get_grub_dev (const char *os_dev)
|
||||||
|
|
||||||
Cygwin /dev/sdXN emulation uses Windows partition mapping. It
|
Cygwin /dev/sdXN emulation uses Windows partition mapping. It
|
||||||
does not count the extended partition and missing primary
|
does not count the extended partition and missing primary
|
||||||
partitions. Use same method as on Linux here. */
|
partitions. Use same method as on Linux here.
|
||||||
|
|
||||||
|
For NetBSD, proceed as for Linux, except that the start sector is
|
||||||
|
obtained from the disk label. */
|
||||||
{
|
{
|
||||||
char *name;
|
char *name;
|
||||||
grub_disk_t disk;
|
grub_disk_t disk;
|
||||||
int fd;
|
int fd;
|
||||||
|
# if !defined(__NetBSD__)
|
||||||
struct hd_geometry hdg;
|
struct hd_geometry hdg;
|
||||||
|
typeof (hdg.start) p_offset;
|
||||||
|
# else /* defined(__NetBSD__) */
|
||||||
|
struct disklabel label;
|
||||||
|
int index;
|
||||||
|
u_int32_t p_offset;
|
||||||
|
# endif /* !defined(__NetBSD__) */
|
||||||
int dos_part = -1;
|
int dos_part = -1;
|
||||||
int bsd_part = -1;
|
int bsd_part = -1;
|
||||||
auto int find_partition (grub_disk_t dsk,
|
auto int find_partition (grub_disk_t dsk,
|
||||||
|
@ -1086,7 +1187,7 @@ grub_util_biosdisk_get_grub_dev (const char *os_dev)
|
||||||
|
|
||||||
part_start = grub_partition_get_start (partition);
|
part_start = grub_partition_get_start (partition);
|
||||||
|
|
||||||
if (hdg.start == part_start)
|
if (p_offset == part_start)
|
||||||
{
|
{
|
||||||
if (partition->parent)
|
if (partition->parent)
|
||||||
{
|
{
|
||||||
|
@ -1107,8 +1208,15 @@ grub_util_biosdisk_get_grub_dev (const char *os_dev)
|
||||||
|
|
||||||
name = make_device_name (drive, -1, -1);
|
name = make_device_name (drive, -1, -1);
|
||||||
|
|
||||||
|
# if !defined(__NetBSD__)
|
||||||
if (MAJOR (st.st_rdev) == FLOPPY_MAJOR)
|
if (MAJOR (st.st_rdev) == FLOPPY_MAJOR)
|
||||||
return name;
|
return name;
|
||||||
|
# else /* defined(__NetBSD__) */
|
||||||
|
/* Since os_dev and convert_system_partition_to_system_disk (os_dev) are
|
||||||
|
* different, we know that os_dev is of the form /dev/r[wsc]d[0-9]+[a-z]
|
||||||
|
* and in particular it cannot be a floppy device. */
|
||||||
|
index = os_dev[strlen(os_dev) - 1] - 'a';
|
||||||
|
# endif /* !defined(__NetBSD__) */
|
||||||
|
|
||||||
fd = open (os_dev, O_RDONLY);
|
fd = open (os_dev, O_RDONLY);
|
||||||
if (fd == -1)
|
if (fd == -1)
|
||||||
|
@ -1118,10 +1226,15 @@ grub_util_biosdisk_get_grub_dev (const char *os_dev)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
# if !defined(__NetBSD__)
|
||||||
if (ioctl (fd, HDIO_GETGEO, &hdg))
|
if (ioctl (fd, HDIO_GETGEO, &hdg))
|
||||||
|
# else /* defined(__NetBSD__) */
|
||||||
|
configure_device_driver (fd);
|
||||||
|
if (ioctl (fd, DIOCGDINFO, &label) == -1)
|
||||||
|
# endif /* !defined(__NetBSD__) */
|
||||||
{
|
{
|
||||||
grub_error (GRUB_ERR_BAD_DEVICE,
|
grub_error (GRUB_ERR_BAD_DEVICE,
|
||||||
"cannot get geometry of `%s'", os_dev);
|
"cannot get disk geometry of `%s'", os_dev);
|
||||||
close (fd);
|
close (fd);
|
||||||
free (name);
|
free (name);
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -1129,9 +1242,22 @@ grub_util_biosdisk_get_grub_dev (const char *os_dev)
|
||||||
|
|
||||||
close (fd);
|
close (fd);
|
||||||
|
|
||||||
grub_util_info ("%s starts from %lu", os_dev, hdg.start);
|
# if !defined(__NetBSD__)
|
||||||
|
p_offset = hdg.start;
|
||||||
|
# else /* defined(__NetBSD__) */
|
||||||
|
if (index >= label.d_npartitions)
|
||||||
|
{
|
||||||
|
grub_error (GRUB_ERR_BAD_DEVICE,
|
||||||
|
"no disk label entry for `%s'", os_dev);
|
||||||
|
free (name);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
p_offset = label.d_partitions[index].p_offset;
|
||||||
|
# endif /* !defined(__NetBSD__) */
|
||||||
|
|
||||||
if (hdg.start == 0 && device_is_wholedisk (os_dev))
|
grub_util_info ("%s starts from %lu", os_dev, p_offset);
|
||||||
|
|
||||||
|
if (p_offset == 0 && device_is_wholedisk (os_dev))
|
||||||
return name;
|
return name;
|
||||||
|
|
||||||
grub_util_info ("opening the device %s", name);
|
grub_util_info ("opening the device %s", name);
|
||||||
|
|
|
@ -15,7 +15,7 @@
|
||||||
# You should have received a copy of the GNU General Public License
|
# You should have received a copy of the GNU General Public License
|
||||||
# along with GRUB. If not, see <http://www.gnu.org/licenses/>.
|
# along with GRUB. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
if [ x$1 == x ]; then
|
if [ "x$1" = "x" ]; then
|
||||||
echo "Filename required".
|
echo "Filename required".
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
|
|
@ -145,8 +145,7 @@ else
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# Create the GRUB directory if it is not present.
|
# Create the GRUB directory if it is not present.
|
||||||
test -d "$bootdir" || mkdir "$bootdir" || exit 1
|
mkdir -p "$grubdir" || exit 1
|
||||||
test -d "$grubdir" || mkdir "$grubdir" || exit 1
|
|
||||||
|
|
||||||
# If --recheck is specified, remove the device map, if present.
|
# If --recheck is specified, remove the device map, if present.
|
||||||
if test $recheck = yes; then
|
if test $recheck = yes; then
|
||||||
|
|
|
@ -141,8 +141,7 @@ fi
|
||||||
# XXX warn on firmware-unreadable filesystems?
|
# XXX warn on firmware-unreadable filesystems?
|
||||||
|
|
||||||
# Create the GRUB directory if it is not present.
|
# Create the GRUB directory if it is not present.
|
||||||
test -d "$bootdir" || mkdir "$bootdir" || exit 1
|
mkdir -p "$grubdir" || exit 1
|
||||||
test -d "$grubdir" || mkdir "$grubdir" || exit 1
|
|
||||||
|
|
||||||
# Create the device map file if it is not present.
|
# Create the device map file if it is not present.
|
||||||
if test -f "$device_map"; then
|
if test -f "$device_map"; then
|
||||||
|
|
55
util/misc.c
55
util/misc.c
|
@ -35,6 +35,7 @@
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#include <grub/kernel.h>
|
#include <grub/kernel.h>
|
||||||
|
#include <grub/dl.h>
|
||||||
#include <grub/misc.h>
|
#include <grub/misc.h>
|
||||||
#include <grub/cache.h>
|
#include <grub/cache.h>
|
||||||
#include <grub/util/misc.h>
|
#include <grub/util/misc.h>
|
||||||
|
@ -262,56 +263,6 @@ grub_util_write_image (const char *img, size_t size, FILE *out)
|
||||||
grub_util_error ("write failed");
|
grub_util_error ("write failed");
|
||||||
}
|
}
|
||||||
|
|
||||||
void *
|
|
||||||
grub_malloc (grub_size_t size)
|
|
||||||
{
|
|
||||||
return xmalloc (size);
|
|
||||||
}
|
|
||||||
|
|
||||||
void *
|
|
||||||
grub_zalloc (grub_size_t size)
|
|
||||||
{
|
|
||||||
void *ret;
|
|
||||||
|
|
||||||
ret = xmalloc (size);
|
|
||||||
memset (ret, 0, size);
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
grub_free (void *ptr)
|
|
||||||
{
|
|
||||||
free (ptr);
|
|
||||||
}
|
|
||||||
|
|
||||||
void *
|
|
||||||
grub_realloc (void *ptr, grub_size_t size)
|
|
||||||
{
|
|
||||||
return xrealloc (ptr, size);
|
|
||||||
}
|
|
||||||
|
|
||||||
void *
|
|
||||||
grub_memalign (grub_size_t align, grub_size_t size)
|
|
||||||
{
|
|
||||||
void *p;
|
|
||||||
|
|
||||||
#if defined(HAVE_POSIX_MEMALIGN)
|
|
||||||
if (posix_memalign (&p, align, size) != 0)
|
|
||||||
p = 0;
|
|
||||||
#elif defined(HAVE_MEMALIGN)
|
|
||||||
p = memalign (align, size);
|
|
||||||
#else
|
|
||||||
(void) align;
|
|
||||||
(void) size;
|
|
||||||
grub_util_error ("grub_memalign is not supported");
|
|
||||||
#endif
|
|
||||||
|
|
||||||
if (! p)
|
|
||||||
grub_util_error ("out of memory");
|
|
||||||
|
|
||||||
return p;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Some functions that we don't use. */
|
/* Some functions that we don't use. */
|
||||||
void
|
void
|
||||||
grub_mm_init_region (void *addr __attribute__ ((unused)),
|
grub_mm_init_region (void *addr __attribute__ ((unused)),
|
||||||
|
@ -319,10 +270,12 @@ grub_mm_init_region (void *addr __attribute__ ((unused)),
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if GRUB_NO_MODULES
|
||||||
void
|
void
|
||||||
grub_register_exported_symbols (void)
|
grub_register_exported_symbols (void)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
void
|
void
|
||||||
grub_exit (void)
|
grub_exit (void)
|
||||||
|
@ -374,7 +327,7 @@ grub_millisleep (grub_uint32_t ms)
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if !(defined (__i386__) || defined (__x86_64__))
|
#if !(defined (__i386__) || defined (__x86_64__)) && GRUB_NO_MODULES
|
||||||
void
|
void
|
||||||
grub_arch_sync_caches (void *address __attribute__ ((unused)),
|
grub_arch_sync_caches (void *address __attribute__ ((unused)),
|
||||||
grub_size_t len __attribute__ ((unused)))
|
grub_size_t len __attribute__ ((unused)))
|
||||||
|
|
85
util/mm.c
Normal file
85
util/mm.c
Normal file
|
@ -0,0 +1,85 @@
|
||||||
|
/*
|
||||||
|
* GRUB -- GRand Unified Bootloader
|
||||||
|
* Copyright (C) 2002,2003,2005,2006,2007,2008,2009,2010 Free Software Foundation, Inc.
|
||||||
|
*
|
||||||
|
* GRUB 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, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* GRUB is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with GRUB. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <grub/types.h>
|
||||||
|
#include <grub/err.h>
|
||||||
|
#include <grub/mm.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
|
void *
|
||||||
|
grub_malloc (grub_size_t size)
|
||||||
|
{
|
||||||
|
void *ret;
|
||||||
|
ret = malloc (size);
|
||||||
|
if (!ret)
|
||||||
|
grub_error (GRUB_ERR_OUT_OF_MEMORY, "out of memory");
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
void *
|
||||||
|
grub_zalloc (grub_size_t size)
|
||||||
|
{
|
||||||
|
void *ret;
|
||||||
|
|
||||||
|
ret = grub_malloc (size);
|
||||||
|
if (!ret)
|
||||||
|
return NULL;
|
||||||
|
memset (ret, 0, size);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
grub_free (void *ptr)
|
||||||
|
{
|
||||||
|
free (ptr);
|
||||||
|
}
|
||||||
|
|
||||||
|
void *
|
||||||
|
grub_realloc (void *ptr, grub_size_t size)
|
||||||
|
{
|
||||||
|
void *ret;
|
||||||
|
ret = realloc (ptr, size);
|
||||||
|
if (!ret)
|
||||||
|
grub_error (GRUB_ERR_OUT_OF_MEMORY, "out of memory");
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
void *
|
||||||
|
grub_memalign (grub_size_t align, grub_size_t size)
|
||||||
|
{
|
||||||
|
void *p;
|
||||||
|
|
||||||
|
#if defined(HAVE_POSIX_MEMALIGN)
|
||||||
|
if (align < sizeof (void *))
|
||||||
|
align = sizeof (void *);
|
||||||
|
if (posix_memalign (&p, align, size) != 0)
|
||||||
|
p = 0;
|
||||||
|
#elif defined(HAVE_MEMALIGN)
|
||||||
|
p = memalign (align, size);
|
||||||
|
#else
|
||||||
|
(void) align;
|
||||||
|
(void) size;
|
||||||
|
grub_util_error ("grub_memalign is not supported");
|
||||||
|
#endif
|
||||||
|
|
||||||
|
if (!p)
|
||||||
|
grub_error (GRUB_ERR_OUT_OF_MEMORY, "out of memory");
|
||||||
|
|
||||||
|
return p;
|
||||||
|
}
|
Loading…
Reference in a new issue