From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mailman by lists.gnu.org with archive (Exim 4.43) id 1E7rry-0006aa-8x for mharc-grub-devel@gnu.org; Wed, 24 Aug 2005 05:48:30 -0400 Received: from mailman by lists.gnu.org with tmda-scanned (Exim 4.43) id 1E7rru-0006Zf-DY for grub-devel@gnu.org; Wed, 24 Aug 2005 05:48:26 -0400 Received: from exim by lists.gnu.org with spam-scanned (Exim 4.43) id 1E7rri-0006Tv-9E for grub-devel@gnu.org; Wed, 24 Aug 2005 05:48:25 -0400 Received: from [199.232.76.173] (helo=monty-python.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1E7rrh-0006Ji-81 for grub-devel@gnu.org; Wed, 24 Aug 2005 05:48:13 -0400 Received: from [64.233.184.193] (helo=wproxy.gmail.com) by monty-python.gnu.org with esmtp (Exim 4.34) id 1E7rhh-0002iH-3R for grub-devel@gnu.org; Wed, 24 Aug 2005 05:37:55 -0400 Received: by wproxy.gmail.com with SMTP id i23so82015wra for ; Wed, 24 Aug 2005 02:36:48 -0700 (PDT) DomainKey-Signature: a=rsa-sha1; q=dns; c=nofws; s=beta; d=gmail.com; h=received:message-id:disposition-notification-to:date:from:user-agent:x-accept-language:mime-version:to:subject:references:in-reply-to:content-type; b=C7MDO9rWakMzVmyWayAU6dOgo3MLGIGeTtofd9VHm2eBx8zRXe2hYdXdz+vlbbHEGZyNBc1/T4JzUtKE5v5c8MBOByZLZTgvkepOkRnXNVe+Skf2J96yPkZWUr+qEMdICXQHh67uNcZKw6aUjWVFW64r9A736munNa8qESSRtMs= Received: by 10.54.144.7 with SMTP id r7mr386274wrd; Wed, 24 Aug 2005 02:36:48 -0700 (PDT) Received: from ?192.168.1.100? ( [81.62.9.252]) by mx.gmail.com with ESMTP id d74sm412847wra.2005.08.24.02.36.41; Wed, 24 Aug 2005 02:36:48 -0700 (PDT) Message-ID: <430C3FA4.308@gmail.com> Date: Wed, 24 Aug 2005 11:36:36 +0200 From: Vladimir Serbinenko User-Agent: Mozilla Thunderbird 1.0.2-1.3.2 (X11/20050324) X-Accept-Language: en-us, en MIME-Version: 1.0 To: The development of GRUB 2 References: <42FF0C53.1070601@gmail.com> <200508141635.29675.okuji@enbug.org> <42FF6B6D.4050403@gmail.com> <200508142001.25893.okuji@enbug.org> <42FF8DB7.10700@gmail.com> <87vf27xfsq.fsf@student.han.nl> In-Reply-To: <87vf27xfsq.fsf@student.han.nl> Content-Type: multipart/mixed; boundary="------------050504080306060805050603" Subject: [Patch] Scripting engine X-BeenThere: grub-devel@gnu.org X-Mailman-Version: 2.1.5 Precedence: list Reply-To: The development of GRUB 2 List-Id: The development of GRUB 2 List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 24 Aug 2005 09:48:27 -0000 This is a multi-part message in MIME format. --------------050504080306060805050603 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit I wrote the preciew version of scripting engine. I'll add some comments soonly. Parser parses everytime one command because the commands could be entered from commandline. Bison converts in kind of pseudocode. Arithmethic support will be done by separate parser because arithmetic parse is very different form bash one. Patch is attached. The next thing I'll do is adding entry handling and changing menu parser to the call of scripting engine. It would be good if then it could be incorporated to CVS because it would be easy to developpe and debug. Vladimir --------------050504080306060805050603 Content-Type: text/x-patch; name="script.diff" Content-Transfer-Encoding: quoted-printable Content-Disposition: inline; filename="script.diff" diff -urN ./grub2_3/conf/i386-pc.mk ./grub2_4/conf/i386-pc.mk --- ./grub2_3/conf/i386-pc.mk 2005-08-24 11:25:39.000000000 +0200 +++ ./grub2_4/conf/i386-pc.mk 2005-08-24 11:23:42.000000000 +0200 @@ -686,11 +686,11 @@ partmap/amiga.c partmap/apple.c partmap/pc.c partmap/sun.c \ util/console.c util/grub-emu.c util/misc.c \ util/i386/pc/biosdisk.c util/i386/pc/getroot.c \ - util/i386/pc/misc.c -CLEANFILES +=3D grub-emu grub_emu-commands_boot.o grub_emu-commands_cat.= o grub_emu-commands_hexcat.o grub_emu-commands_cmp.o grub_emu-commands_co= nfigfile.o grub_emu-commands_default.o grub_emu-commands_help.o grub_emu-= commands_terminal.o grub_emu-commands_ls.o grub_emu-commands_timeout.o gr= ub_emu-commands_i386_pc_halt.o grub_emu-commands_i386_pc_reboot.o grub_em= u-disk_loopback.o grub_emu-fs_ext2.o grub_emu-fs_fat.o grub_emu-fs_fshelp= =2Eo grub_emu-fs_hfs.o grub_emu-fs_iso9660.o grub_emu-fs_jfs.o grub_emu-f= s_minix.o grub_emu-fs_ufs.o grub_emu-kern_device.o grub_emu-kern_disk.o g= rub_emu-kern_dl.o grub_emu-kern_env.o grub_emu-kern_err.o grub_emu-kern_f= ile.o grub_emu-kern_fs.o grub_emu-kern_loader.o grub_emu-kern_main.o grub= _emu-kern_misc.o grub_emu-kern_partition.o grub_emu-kern_rescue.o grub_em= u-kern_term.o grub_emu-normal_arg.o grub_emu-normal_cmdline.o grub_emu-no= rmal_command.o grub_emu-normal_context.o grub_emu-normal_main.o grub_emu-= normal_menu.o grub_emu-normal_menu_entry.o grub_emu-partmap_amiga.o grub_= emu-partmap_apple.o grub_emu-partmap_pc.o grub_emu-partmap_sun.o grub_emu= -util_console.o grub_emu-util_grub_emu.o grub_emu-util_misc.o grub_emu-ut= il_i386_pc_biosdisk.o grub_emu-util_i386_pc_getroot.o grub_emu-util_i386_= pc_misc.o -MOSTLYCLEANFILES +=3D grub_emu-commands_boot.d grub_emu-commands_cat.d g= rub_emu-commands_hexcat.d grub_emu-commands_cmp.d grub_emu-commands_confi= gfile.d grub_emu-commands_default.d grub_emu-commands_help.d grub_emu-com= mands_terminal.d grub_emu-commands_ls.d grub_emu-commands_timeout.d grub_= emu-commands_i386_pc_halt.d grub_emu-commands_i386_pc_reboot.d grub_emu-d= isk_loopback.d grub_emu-fs_ext2.d grub_emu-fs_fat.d grub_emu-fs_fshelp.d = grub_emu-fs_hfs.d grub_emu-fs_iso9660.d grub_emu-fs_jfs.d grub_emu-fs_min= ix.d grub_emu-fs_ufs.d grub_emu-kern_device.d grub_emu-kern_disk.d grub_e= mu-kern_dl.d grub_emu-kern_env.d grub_emu-kern_err.d grub_emu-kern_file.d= grub_emu-kern_fs.d grub_emu-kern_loader.d grub_emu-kern_main.d grub_emu-= kern_misc.d grub_emu-kern_partition.d grub_emu-kern_rescue.d grub_emu-ker= n_term.d grub_emu-normal_arg.d grub_emu-normal_cmdline.d grub_emu-normal_= command.d grub_emu-normal_context.d grub_emu-normal_main.d grub_emu-norma= l_menu.d grub_emu-normal_menu_entry.d grub_emu-partmap_amiga.d grub_emu-p= artmap_apple.d grub_emu-partmap_pc.d grub_emu-partmap_sun.d grub_emu-util= _console.d grub_emu-util_grub_emu.d grub_emu-util_misc.d grub_emu-util_i3= 86_pc_biosdisk.d grub_emu-util_i386_pc_getroot.d grub_emu-util_i386_pc_mi= sc.d + util/i386/pc/misc.c normal/parser.c +CLEANFILES +=3D grub-emu grub_emu-commands_boot.o grub_emu-commands_cat.= o grub_emu-commands_hexcat.o grub_emu-commands_cmp.o grub_emu-commands_co= nfigfile.o grub_emu-commands_default.o grub_emu-commands_help.o grub_emu-= commands_terminal.o grub_emu-commands_ls.o grub_emu-commands_timeout.o gr= ub_emu-commands_i386_pc_halt.o grub_emu-commands_i386_pc_reboot.o grub_em= u-disk_loopback.o grub_emu-fs_ext2.o grub_emu-fs_fat.o grub_emu-fs_fshelp= =2Eo grub_emu-fs_hfs.o grub_emu-fs_iso9660.o grub_emu-fs_jfs.o grub_emu-f= s_minix.o grub_emu-fs_ufs.o grub_emu-kern_device.o grub_emu-kern_disk.o g= rub_emu-kern_dl.o grub_emu-kern_env.o grub_emu-kern_err.o grub_emu-kern_f= ile.o grub_emu-kern_fs.o grub_emu-kern_loader.o grub_emu-kern_main.o grub= _emu-kern_misc.o grub_emu-kern_partition.o grub_emu-kern_rescue.o grub_em= u-kern_term.o grub_emu-normal_arg.o grub_emu-normal_cmdline.o grub_emu-no= rmal_command.o grub_emu-normal_context.o grub_emu-normal_main.o grub_emu-= normal_menu.o grub_emu-normal_menu_entry.o grub_emu-partmap_amiga.o grub_= emu-partmap_apple.o grub_emu-partmap_pc.o grub_emu-partmap_sun.o grub_emu= -util_console.o grub_emu-util_grub_emu.o grub_emu-util_misc.o grub_emu-ut= il_i386_pc_biosdisk.o grub_emu-util_i386_pc_getroot.o grub_emu-util_i386_= pc_misc.o grub_emu-normal_parser.o +MOSTLYCLEANFILES +=3D grub_emu-commands_boot.d grub_emu-commands_cat.d g= rub_emu-commands_hexcat.d grub_emu-commands_cmp.d grub_emu-commands_confi= gfile.d grub_emu-commands_default.d grub_emu-commands_help.d grub_emu-com= mands_terminal.d grub_emu-commands_ls.d grub_emu-commands_timeout.d grub_= emu-commands_i386_pc_halt.d grub_emu-commands_i386_pc_reboot.d grub_emu-d= isk_loopback.d grub_emu-fs_ext2.d grub_emu-fs_fat.d grub_emu-fs_fshelp.d = grub_emu-fs_hfs.d grub_emu-fs_iso9660.d grub_emu-fs_jfs.d grub_emu-fs_min= ix.d grub_emu-fs_ufs.d grub_emu-kern_device.d grub_emu-kern_disk.d grub_e= mu-kern_dl.d grub_emu-kern_env.d grub_emu-kern_err.d grub_emu-kern_file.d= grub_emu-kern_fs.d grub_emu-kern_loader.d grub_emu-kern_main.d grub_emu-= kern_misc.d grub_emu-kern_partition.d grub_emu-kern_rescue.d grub_emu-ker= n_term.d grub_emu-normal_arg.d grub_emu-normal_cmdline.d grub_emu-normal_= command.d grub_emu-normal_context.d grub_emu-normal_main.d grub_emu-norma= l_menu.d grub_emu-normal_menu_entry.d grub_emu-partmap_amiga.d grub_emu-p= artmap_apple.d grub_emu-partmap_pc.d grub_emu-partmap_sun.d grub_emu-util= _console.d grub_emu-util_grub_emu.d grub_emu-util_misc.d grub_emu-util_i3= 86_pc_biosdisk.d grub_emu-util_i386_pc_getroot.d grub_emu-util_i386_pc_mi= sc.d grub_emu-normal_parser.d =20 -grub-emu: grub_emu-commands_boot.o grub_emu-commands_cat.o grub_emu-comm= ands_hexcat.o grub_emu-commands_cmp.o grub_emu-commands_configfile.o grub= _emu-commands_default.o grub_emu-commands_help.o grub_emu-commands_termin= al.o grub_emu-commands_ls.o grub_emu-commands_timeout.o grub_emu-commands= _i386_pc_halt.o grub_emu-commands_i386_pc_reboot.o grub_emu-disk_loopback= =2Eo grub_emu-fs_ext2.o grub_emu-fs_fat.o grub_emu-fs_fshelp.o grub_emu-f= s_hfs.o grub_emu-fs_iso9660.o grub_emu-fs_jfs.o grub_emu-fs_minix.o grub_= emu-fs_ufs.o grub_emu-kern_device.o grub_emu-kern_disk.o grub_emu-kern_dl= =2Eo grub_emu-kern_env.o grub_emu-kern_err.o grub_emu-kern_file.o grub_em= u-kern_fs.o grub_emu-kern_loader.o grub_emu-kern_main.o grub_emu-kern_mis= c.o grub_emu-kern_partition.o grub_emu-kern_rescue.o grub_emu-kern_term.o= grub_emu-normal_arg.o grub_emu-normal_cmdline.o grub_emu-normal_command.= o grub_emu-normal_context.o grub_emu-normal_main.o grub_emu-normal_menu.o= grub_emu-normal_menu_entry.o grub_emu-partmap_amiga.o grub_emu-partmap_a= pple.o grub_emu-partmap_pc.o grub_emu-partmap_sun.o grub_emu-util_console= =2Eo grub_emu-util_grub_emu.o grub_emu-util_misc.o grub_emu-util_i386_pc_= biosdisk.o grub_emu-util_i386_pc_getroot.o grub_emu-util_i386_pc_misc.o +grub-emu: grub_emu-commands_boot.o grub_emu-commands_cat.o grub_emu-comm= ands_hexcat.o grub_emu-commands_cmp.o grub_emu-commands_configfile.o grub= _emu-commands_default.o grub_emu-commands_help.o grub_emu-commands_termin= al.o grub_emu-commands_ls.o grub_emu-commands_timeout.o grub_emu-commands= _i386_pc_halt.o grub_emu-commands_i386_pc_reboot.o grub_emu-disk_loopback= =2Eo grub_emu-fs_ext2.o grub_emu-fs_fat.o grub_emu-fs_fshelp.o grub_emu-f= s_hfs.o grub_emu-fs_iso9660.o grub_emu-fs_jfs.o grub_emu-fs_minix.o grub_= emu-fs_ufs.o grub_emu-kern_device.o grub_emu-kern_disk.o grub_emu-kern_dl= =2Eo grub_emu-kern_env.o grub_emu-kern_err.o grub_emu-kern_file.o grub_em= u-kern_fs.o grub_emu-kern_loader.o grub_emu-kern_main.o grub_emu-kern_mis= c.o grub_emu-kern_partition.o grub_emu-kern_rescue.o grub_emu-kern_term.o= grub_emu-normal_arg.o grub_emu-normal_cmdline.o grub_emu-normal_command.= o grub_emu-normal_context.o grub_emu-normal_main.o grub_emu-normal_menu.o= grub_emu-normal_menu_entry.o grub_emu-partmap_amiga.o grub_emu-partmap_a= pple.o grub_emu-partmap_pc.o grub_emu-partmap_sun.o grub_emu-util_console= =2Eo grub_emu-util_grub_emu.o grub_emu-util_misc.o grub_emu-util_i386_pc_= biosdisk.o grub_emu-util_i386_pc_getroot.o grub_emu-util_i386_pc_misc.o g= rub_emu-normal_parser.o $(BUILD_CC) -o $@ $^ $(BUILD_LDFLAGS) $(grub_emu_LDFLAGS) =20 grub_emu-commands_boot.o: commands/boot.c @@ -1101,6 +1101,14 @@ =20 -include grub_emu-util_i386_pc_misc.d =20 +grub_emu-normal_parser.o: normal/parser.c + $(BUILD_CC) -Inormal -I$(srcdir)/normal $(BUILD_CPPFLAGS) $(BUILD_CFLAG= S) -DGRUB_UTIL=3D1 $(grub_emu_CFLAGS) -c -o $@ $< + +grub_emu-normal_parser.d: normal/parser.c + set -e; $(BUILD_CC) -Inormal -I$(srcdir)/normal $(BUILD_CPPFLAGS) $(= BUILD_CFLAGS) -DGRUB_UTIL=3D1 $(grub_emu_CFLAGS) -M $< | sed 's,parser= \.o[ :]*,grub_emu-normal_parser.o $@ : ,g' > $@; [ -s $@ ] || rm -f $@= + +-include grub_emu-normal_parser.d + =20 grub_emu_LDFLAGS =3D $(LIBCURSES) =20 @@ -1699,9 +1707,9 @@ # For normal.mod. normal_mod_SOURCES =3D normal/arg.c normal/cmdline.c normal/command.c \ normal/context.c normal/main.c normal/menu.c \ - normal/menu_entry.c normal/i386/setjmp.S -CLEANFILES +=3D normal.mod mod-normal.o mod-normal.c pre-normal.o normal= _mod-normal_arg.o normal_mod-normal_cmdline.o normal_mod-normal_command.o= normal_mod-normal_context.o normal_mod-normal_main.o normal_mod-normal_m= enu.o normal_mod-normal_menu_entry.o normal_mod-normal_i386_setjmp.o def-= normal.lst und-normal.lst -MOSTLYCLEANFILES +=3D normal_mod-normal_arg.d normal_mod-normal_cmdline.= d normal_mod-normal_command.d normal_mod-normal_context.d normal_mod-norm= al_main.d normal_mod-normal_menu.d normal_mod-normal_menu_entry.d normal_= mod-normal_i386_setjmp.d + normal/menu_entry.c normal/i386/setjmp.S normal/parser.c +CLEANFILES +=3D normal.mod mod-normal.o mod-normal.c pre-normal.o normal= _mod-normal_arg.o normal_mod-normal_cmdline.o normal_mod-normal_command.o= normal_mod-normal_context.o normal_mod-normal_main.o normal_mod-normal_m= enu.o normal_mod-normal_menu_entry.o normal_mod-normal_i386_setjmp.o norm= al_mod-normal_parser.o def-normal.lst und-normal.lst +MOSTLYCLEANFILES +=3D normal_mod-normal_arg.d normal_mod-normal_cmdline.= d normal_mod-normal_command.d normal_mod-normal_context.d normal_mod-norm= al_main.d normal_mod-normal_menu.d normal_mod-normal_menu_entry.d normal_= mod-normal_i386_setjmp.d normal_mod-normal_parser.d DEFSYMFILES +=3D def-normal.lst UNDSYMFILES +=3D und-normal.lst =20 @@ -1710,7 +1718,7 @@ $(LD) -r -d -o $@ $^ $(STRIP) --strip-unneeded -K grub_mod_init -K grub_mod_fini -R .note -R= .comment $@ =20 -pre-normal.o: normal_mod-normal_arg.o normal_mod-normal_cmdline.o normal= _mod-normal_command.o normal_mod-normal_context.o normal_mod-normal_main.= o normal_mod-normal_menu.o normal_mod-normal_menu_entry.o normal_mod-norm= al_i386_setjmp.o +pre-normal.o: normal_mod-normal_arg.o normal_mod-normal_cmdline.o normal= _mod-normal_command.o normal_mod-normal_context.o normal_mod-normal_main.= o normal_mod-normal_menu.o normal_mod-normal_menu_entry.o normal_mod-norm= al_i386_setjmp.o normal_mod-normal_parser.o -rm -f $@ $(LD) -r -d -o $@ $^ =20 @@ -1879,6 +1887,25 @@ set -e; $(CC) -Inormal/i386 -I$(srcdir)/normal/i386 $(CPPFLAGS) $(AS= FLAGS) $(normal_mod_ASFLAGS) -E $< | sh $(srcdir)/genfslist.sh normal = > $@ || (rm -f $@; exit 1) =20 =20 +normal_mod-normal_parser.o: normal/parser.c + $(CC) -Inormal -I$(srcdir)/normal $(CPPFLAGS) $(CFLAGS) $(normal_mod_CF= LAGS) -c -o $@ $< + +normal_mod-normal_parser.d: normal/parser.c + set -e; $(CC) -Inormal -I$(srcdir)/normal $(CPPFLAGS) $(CFLAGS) $(no= rmal_mod_CFLAGS) -M $< | sed 's,parser\.o[ :]*,normal_mod-normal_parse= r.o $@ : ,g' > $@; [ -s $@ ] || rm -f $@ + +-include normal_mod-normal_parser.d + +CLEANFILES +=3D cmd-parser.lst fs-parser.lst +COMMANDFILES +=3D cmd-parser.lst +FSFILES +=3D fs-parser.lst + +cmd-parser.lst: normal/parser.c gencmdlist.sh + set -e; $(CC) -Inormal -I$(srcdir)/normal $(CPPFLAGS) $(CFLAGS) $(no= rmal_mod_CFLAGS) -E $< | sh $(srcdir)/gencmdlist.sh normal > $@ || (rm= -f $@; exit 1) + +fs-parser.lst: normal/parser.c genfslist.sh + set -e; $(CC) -Inormal -I$(srcdir)/normal $(CPPFLAGS) $(CFLAGS) $(no= rmal_mod_CFLAGS) -E $< | sh $(srcdir)/genfslist.sh normal > $@ || (rm = -f $@; exit 1) + + normal_mod_CFLAGS =3D $(COMMON_CFLAGS) normal_mod_ASFLAGS =3D $(COMMON_ASFLAGS) =20 diff -urN ./grub2_3/conf/i386-pc.rmk ./grub2_4/conf/i386-pc.rmk --- ./grub2_3/conf/i386-pc.rmk 2005-08-08 15:08:59.000000000 +0200 +++ ./grub2_4/conf/i386-pc.rmk 2005-08-20 16:37:09.000000000 +0200 @@ -90,7 +90,7 @@ partmap/amiga.c partmap/apple.c partmap/pc.c partmap/sun.c \ util/console.c util/grub-emu.c util/misc.c \ util/i386/pc/biosdisk.c util/i386/pc/getroot.c \ - util/i386/pc/misc.c + util/i386/pc/misc.c normal/parser.c =20 grub_emu_LDFLAGS =3D $(LIBCURSES) =20 @@ -163,7 +163,7 @@ # For normal.mod. normal_mod_SOURCES =3D normal/arg.c normal/cmdline.c normal/command.c \ normal/context.c normal/main.c normal/menu.c \ - normal/menu_entry.c normal/i386/setjmp.S + normal/menu_entry.c normal/i386/setjmp.S normal/parser.c normal_mod_CFLAGS =3D $(COMMON_CFLAGS) normal_mod_ASFLAGS =3D $(COMMON_ASFLAGS) =20 diff -urN ./grub2_3/conf/powerpc-ieee1275.mk ./grub2_4/conf/powerpc-ieee1= 275.mk --- ./grub2_3/conf/powerpc-ieee1275.mk 2005-08-24 11:25:39.000000000 +020= 0 +++ ./grub2_4/conf/powerpc-ieee1275.mk 2005-08-24 11:23:42.000000000 +020= 0 @@ -78,11 +78,11 @@ partmap/amiga.c partmap/apple.c partmap/pc.c partmap/sun.c \ util/console.c util/grub-emu.c util/misc.c \ util/i386/pc/biosdisk.c util/i386/pc/getroot.c \ - util/powerpc/ieee1275/misc.c -CLEANFILES +=3D grub-emu grub_emu-commands_boot.o grub_emu-commands_cat.= o grub_emu-commands_cmp.o grub_emu-commands_configfile.o grub_emu-command= s_default.o grub_emu-commands_help.o grub_emu-commands_terminal.o grub_em= u-commands_ls.o grub_emu-commands_timeout.o grub_emu-commands_ieee1275_ha= lt.o grub_emu-commands_ieee1275_reboot.o grub_emu-disk_loopback.o grub_em= u-commands_hexcat.o grub_emu-fs_ext2.o grub_emu-fs_fat.o grub_emu-fs_fshe= lp.o grub_emu-fs_hfs.o grub_emu-fs_iso9660.o grub_emu-fs_jfs.o grub_emu-f= s_minix.o grub_emu-fs_ufs.o grub_emu-kern_device.o grub_emu-kern_disk.o g= rub_emu-kern_dl.o grub_emu-kern_env.o grub_emu-kern_err.o grub_emu-kern_f= ile.o grub_emu-kern_fs.o grub_emu-kern_loader.o grub_emu-kern_main.o grub= _emu-kern_misc.o grub_emu-kern_partition.o grub_emu-kern_rescue.o grub_em= u-kern_term.o grub_emu-normal_arg.o grub_emu-normal_cmdline.o grub_emu-no= rmal_command.o grub_emu-normal_context.o grub_emu-normal_main.o grub_emu-= normal_menu.o grub_emu-normal_menu_entry.o grub_emu-partmap_amiga.o grub_= emu-partmap_apple.o grub_emu-partmap_pc.o grub_emu-partmap_sun.o grub_emu= -util_console.o grub_emu-util_grub_emu.o grub_emu-util_misc.o grub_emu-ut= il_i386_pc_biosdisk.o grub_emu-util_i386_pc_getroot.o grub_emu-util_power= pc_ieee1275_misc.o -MOSTLYCLEANFILES +=3D grub_emu-commands_boot.d grub_emu-commands_cat.d g= rub_emu-commands_cmp.d grub_emu-commands_configfile.d grub_emu-commands_d= efault.d grub_emu-commands_help.d grub_emu-commands_terminal.d grub_emu-c= ommands_ls.d grub_emu-commands_timeout.d grub_emu-commands_ieee1275_halt.= d grub_emu-commands_ieee1275_reboot.d grub_emu-disk_loopback.d grub_emu-c= ommands_hexcat.d grub_emu-fs_ext2.d grub_emu-fs_fat.d grub_emu-fs_fshelp.= d grub_emu-fs_hfs.d grub_emu-fs_iso9660.d grub_emu-fs_jfs.d grub_emu-fs_m= inix.d grub_emu-fs_ufs.d grub_emu-kern_device.d grub_emu-kern_disk.d grub= _emu-kern_dl.d grub_emu-kern_env.d grub_emu-kern_err.d grub_emu-kern_file= =2Ed grub_emu-kern_fs.d grub_emu-kern_loader.d grub_emu-kern_main.d grub_= emu-kern_misc.d grub_emu-kern_partition.d grub_emu-kern_rescue.d grub_emu= -kern_term.d grub_emu-normal_arg.d grub_emu-normal_cmdline.d grub_emu-nor= mal_command.d grub_emu-normal_context.d grub_emu-normal_main.d grub_emu-n= ormal_menu.d grub_emu-normal_menu_entry.d grub_emu-partmap_amiga.d grub_e= mu-partmap_apple.d grub_emu-partmap_pc.d grub_emu-partmap_sun.d grub_emu-= util_console.d grub_emu-util_grub_emu.d grub_emu-util_misc.d grub_emu-uti= l_i386_pc_biosdisk.d grub_emu-util_i386_pc_getroot.d grub_emu-util_powerp= c_ieee1275_misc.d + util/powerpc/ieee1275/misc.c normal/parser.c +CLEANFILES +=3D grub-emu grub_emu-commands_boot.o grub_emu-commands_cat.= o grub_emu-commands_cmp.o grub_emu-commands_configfile.o grub_emu-command= s_default.o grub_emu-commands_help.o grub_emu-commands_terminal.o grub_em= u-commands_ls.o grub_emu-commands_timeout.o grub_emu-commands_ieee1275_ha= lt.o grub_emu-commands_ieee1275_reboot.o grub_emu-disk_loopback.o grub_em= u-commands_hexcat.o grub_emu-fs_ext2.o grub_emu-fs_fat.o grub_emu-fs_fshe= lp.o grub_emu-fs_hfs.o grub_emu-fs_iso9660.o grub_emu-fs_jfs.o grub_emu-f= s_minix.o grub_emu-fs_ufs.o grub_emu-kern_device.o grub_emu-kern_disk.o g= rub_emu-kern_dl.o grub_emu-kern_env.o grub_emu-kern_err.o grub_emu-kern_f= ile.o grub_emu-kern_fs.o grub_emu-kern_loader.o grub_emu-kern_main.o grub= _emu-kern_misc.o grub_emu-kern_partition.o grub_emu-kern_rescue.o grub_em= u-kern_term.o grub_emu-normal_arg.o grub_emu-normal_cmdline.o grub_emu-no= rmal_command.o grub_emu-normal_context.o grub_emu-normal_main.o grub_emu-= normal_menu.o grub_emu-normal_menu_entry.o grub_emu-partmap_amiga.o grub_= emu-partmap_apple.o grub_emu-partmap_pc.o grub_emu-partmap_sun.o grub_emu= -util_console.o grub_emu-util_grub_emu.o grub_emu-util_misc.o grub_emu-ut= il_i386_pc_biosdisk.o grub_emu-util_i386_pc_getroot.o grub_emu-util_power= pc_ieee1275_misc.o grub_emu-normal_parser.o +MOSTLYCLEANFILES +=3D grub_emu-commands_boot.d grub_emu-commands_cat.d g= rub_emu-commands_cmp.d grub_emu-commands_configfile.d grub_emu-commands_d= efault.d grub_emu-commands_help.d grub_emu-commands_terminal.d grub_emu-c= ommands_ls.d grub_emu-commands_timeout.d grub_emu-commands_ieee1275_halt.= d grub_emu-commands_ieee1275_reboot.d grub_emu-disk_loopback.d grub_emu-c= ommands_hexcat.d grub_emu-fs_ext2.d grub_emu-fs_fat.d grub_emu-fs_fshelp.= d grub_emu-fs_hfs.d grub_emu-fs_iso9660.d grub_emu-fs_jfs.d grub_emu-fs_m= inix.d grub_emu-fs_ufs.d grub_emu-kern_device.d grub_emu-kern_disk.d grub= _emu-kern_dl.d grub_emu-kern_env.d grub_emu-kern_err.d grub_emu-kern_file= =2Ed grub_emu-kern_fs.d grub_emu-kern_loader.d grub_emu-kern_main.d grub_= emu-kern_misc.d grub_emu-kern_partition.d grub_emu-kern_rescue.d grub_emu= -kern_term.d grub_emu-normal_arg.d grub_emu-normal_cmdline.d grub_emu-nor= mal_command.d grub_emu-normal_context.d grub_emu-normal_main.d grub_emu-n= ormal_menu.d grub_emu-normal_menu_entry.d grub_emu-partmap_amiga.d grub_e= mu-partmap_apple.d grub_emu-partmap_pc.d grub_emu-partmap_sun.d grub_emu-= util_console.d grub_emu-util_grub_emu.d grub_emu-util_misc.d grub_emu-uti= l_i386_pc_biosdisk.d grub_emu-util_i386_pc_getroot.d grub_emu-util_powerp= c_ieee1275_misc.d grub_emu-normal_parser.d =20 -grub-emu: grub_emu-commands_boot.o grub_emu-commands_cat.o grub_emu-comm= ands_cmp.o grub_emu-commands_configfile.o grub_emu-commands_default.o gru= b_emu-commands_help.o grub_emu-commands_terminal.o grub_emu-commands_ls.o= grub_emu-commands_timeout.o grub_emu-commands_ieee1275_halt.o grub_emu-c= ommands_ieee1275_reboot.o grub_emu-disk_loopback.o grub_emu-commands_hexc= at.o grub_emu-fs_ext2.o grub_emu-fs_fat.o grub_emu-fs_fshelp.o grub_emu-f= s_hfs.o grub_emu-fs_iso9660.o grub_emu-fs_jfs.o grub_emu-fs_minix.o grub_= emu-fs_ufs.o grub_emu-kern_device.o grub_emu-kern_disk.o grub_emu-kern_dl= =2Eo grub_emu-kern_env.o grub_emu-kern_err.o grub_emu-kern_file.o grub_em= u-kern_fs.o grub_emu-kern_loader.o grub_emu-kern_main.o grub_emu-kern_mis= c.o grub_emu-kern_partition.o grub_emu-kern_rescue.o grub_emu-kern_term.o= grub_emu-normal_arg.o grub_emu-normal_cmdline.o grub_emu-normal_command.= o grub_emu-normal_context.o grub_emu-normal_main.o grub_emu-normal_menu.o= grub_emu-normal_menu_entry.o grub_emu-partmap_amiga.o grub_emu-partmap_a= pple.o grub_emu-partmap_pc.o grub_emu-partmap_sun.o grub_emu-util_console= =2Eo grub_emu-util_grub_emu.o grub_emu-util_misc.o grub_emu-util_i386_pc_= biosdisk.o grub_emu-util_i386_pc_getroot.o grub_emu-util_powerpc_ieee1275= _misc.o +grub-emu: grub_emu-commands_boot.o grub_emu-commands_cat.o grub_emu-comm= ands_cmp.o grub_emu-commands_configfile.o grub_emu-commands_default.o gru= b_emu-commands_help.o grub_emu-commands_terminal.o grub_emu-commands_ls.o= grub_emu-commands_timeout.o grub_emu-commands_ieee1275_halt.o grub_emu-c= ommands_ieee1275_reboot.o grub_emu-disk_loopback.o grub_emu-commands_hexc= at.o grub_emu-fs_ext2.o grub_emu-fs_fat.o grub_emu-fs_fshelp.o grub_emu-f= s_hfs.o grub_emu-fs_iso9660.o grub_emu-fs_jfs.o grub_emu-fs_minix.o grub_= emu-fs_ufs.o grub_emu-kern_device.o grub_emu-kern_disk.o grub_emu-kern_dl= =2Eo grub_emu-kern_env.o grub_emu-kern_err.o grub_emu-kern_file.o grub_em= u-kern_fs.o grub_emu-kern_loader.o grub_emu-kern_main.o grub_emu-kern_mis= c.o grub_emu-kern_partition.o grub_emu-kern_rescue.o grub_emu-kern_term.o= grub_emu-normal_arg.o grub_emu-normal_cmdline.o grub_emu-normal_command.= o grub_emu-normal_context.o grub_emu-normal_main.o grub_emu-normal_menu.o= grub_emu-normal_menu_entry.o grub_emu-partmap_amiga.o grub_emu-partmap_a= pple.o grub_emu-partmap_pc.o grub_emu-partmap_sun.o grub_emu-util_console= =2Eo grub_emu-util_grub_emu.o grub_emu-util_misc.o grub_emu-util_i386_pc_= biosdisk.o grub_emu-util_i386_pc_getroot.o grub_emu-util_powerpc_ieee1275= _misc.o grub_emu-normal_parser.o $(BUILD_CC) -o $@ $^ $(BUILD_LDFLAGS) $(grub_emu_LDFLAGS) =20 grub_emu-commands_boot.o: commands/boot.c @@ -493,6 +493,14 @@ =20 -include grub_emu-util_powerpc_ieee1275_misc.d =20 +grub_emu-normal_parser.o: normal/parser.c + $(BUILD_CC) -Inormal -I$(srcdir)/normal $(BUILD_CPPFLAGS) $(BUILD_CFLAG= S) -DGRUB_UTIL=3D1 $(grub_emu_CFLAGS) -c -o $@ $< + +grub_emu-normal_parser.d: normal/parser.c + set -e; $(BUILD_CC) -Inormal -I$(srcdir)/normal $(BUILD_CPPFLAGS) $(= BUILD_CFLAGS) -DGRUB_UTIL=3D1 $(grub_emu_CFLAGS) -M $< | sed 's,parser= \.o[ :]*,grub_emu-normal_parser.o $@ : ,g' > $@; [ -s $@ ] || rm -f $@= + +-include grub_emu-normal_parser.d + =20 grub_emu_LDFLAGS =3D $(LIBCURSES) =20 @@ -1189,9 +1197,9 @@ normal_mod_SOURCES =3D normal/arg.c normal/cmdline.c normal/command.c \ normal/context.c normal/main.c normal/menu.c \ normal/menu_entry.c \ - normal/powerpc/setjmp.S -CLEANFILES +=3D normal.mod mod-normal.o mod-normal.c pre-normal.o normal= _mod-normal_arg.o normal_mod-normal_cmdline.o normal_mod-normal_command.o= normal_mod-normal_context.o normal_mod-normal_main.o normal_mod-normal_m= enu.o normal_mod-normal_menu_entry.o normal_mod-normal_powerpc_setjmp.o d= ef-normal.lst und-normal.lst -MOSTLYCLEANFILES +=3D normal_mod-normal_arg.d normal_mod-normal_cmdline.= d normal_mod-normal_command.d normal_mod-normal_context.d normal_mod-norm= al_main.d normal_mod-normal_menu.d normal_mod-normal_menu_entry.d normal_= mod-normal_powerpc_setjmp.d + normal/powerpc/setjmp.S normal/parser.c +CLEANFILES +=3D normal.mod mod-normal.o mod-normal.c pre-normal.o normal= _mod-normal_arg.o normal_mod-normal_cmdline.o normal_mod-normal_command.o= normal_mod-normal_context.o normal_mod-normal_main.o normal_mod-normal_m= enu.o normal_mod-normal_menu_entry.o normal_mod-normal_powerpc_setjmp.o n= ormal_mod-normal_parser.o def-normal.lst und-normal.lst +MOSTLYCLEANFILES +=3D normal_mod-normal_arg.d normal_mod-normal_cmdline.= d normal_mod-normal_command.d normal_mod-normal_context.d normal_mod-norm= al_main.d normal_mod-normal_menu.d normal_mod-normal_menu_entry.d normal_= mod-normal_powerpc_setjmp.d normal_mod-normal_parser.d DEFSYMFILES +=3D def-normal.lst UNDSYMFILES +=3D und-normal.lst =20 @@ -1200,7 +1208,7 @@ $(LD) -r -d -o $@ $^ $(STRIP) --strip-unneeded -K grub_mod_init -K grub_mod_fini -R .note -R= .comment $@ =20 -pre-normal.o: normal_mod-normal_arg.o normal_mod-normal_cmdline.o normal= _mod-normal_command.o normal_mod-normal_context.o normal_mod-normal_main.= o normal_mod-normal_menu.o normal_mod-normal_menu_entry.o normal_mod-norm= al_powerpc_setjmp.o +pre-normal.o: normal_mod-normal_arg.o normal_mod-normal_cmdline.o normal= _mod-normal_command.o normal_mod-normal_context.o normal_mod-normal_main.= o normal_mod-normal_menu.o normal_mod-normal_menu_entry.o normal_mod-norm= al_powerpc_setjmp.o normal_mod-normal_parser.o -rm -f $@ $(LD) -r -d -o $@ $^ =20 @@ -1369,6 +1377,25 @@ set -e; $(CC) -Inormal/powerpc -I$(srcdir)/normal/powerpc $(CPPFLAGS= ) $(ASFLAGS) $(normal_mod_ASFLAGS) -E $< | sh $(srcdir)/genfslist.sh n= ormal > $@ || (rm -f $@; exit 1) =20 =20 +normal_mod-normal_parser.o: normal/parser.c + $(CC) -Inormal -I$(srcdir)/normal $(CPPFLAGS) $(CFLAGS) $(normal_mod_CF= LAGS) -c -o $@ $< + +normal_mod-normal_parser.d: normal/parser.c + set -e; $(CC) -Inormal -I$(srcdir)/normal $(CPPFLAGS) $(CFLAGS) $(no= rmal_mod_CFLAGS) -M $< | sed 's,parser\.o[ :]*,normal_mod-normal_parse= r.o $@ : ,g' > $@; [ -s $@ ] || rm -f $@ + +-include normal_mod-normal_parser.d + +CLEANFILES +=3D cmd-parser.lst fs-parser.lst +COMMANDFILES +=3D cmd-parser.lst +FSFILES +=3D fs-parser.lst + +cmd-parser.lst: normal/parser.c gencmdlist.sh + set -e; $(CC) -Inormal -I$(srcdir)/normal $(CPPFLAGS) $(CFLAGS) $(no= rmal_mod_CFLAGS) -E $< | sh $(srcdir)/gencmdlist.sh normal > $@ || (rm= -f $@; exit 1) + +fs-parser.lst: normal/parser.c genfslist.sh + set -e; $(CC) -Inormal -I$(srcdir)/normal $(CPPFLAGS) $(CFLAGS) $(no= rmal_mod_CFLAGS) -E $< | sh $(srcdir)/genfslist.sh normal > $@ || (rm = -f $@; exit 1) + + normal_mod_CFLAGS =3D $(COMMON_CFLAGS) normal_mod_ASFLAGS =3D $(COMMON_ASFLAGS) =20 diff -urN ./grub2_3/conf/powerpc-ieee1275.rmk ./grub2_4/conf/powerpc-ieee= 1275.rmk --- ./grub2_3/conf/powerpc-ieee1275.rmk 2005-08-08 15:10:12.000000000 +02= 00 +++ ./grub2_4/conf/powerpc-ieee1275.rmk 2005-08-24 11:23:25.000000000 +02= 00 @@ -48,7 +48,7 @@ partmap/amiga.c partmap/apple.c partmap/pc.c partmap/sun.c \ util/console.c util/grub-emu.c util/misc.c \ util/i386/pc/biosdisk.c util/i386/pc/getroot.c \ - util/powerpc/ieee1275/misc.c + util/powerpc/ieee1275/misc.c normal/parser.c =20 grub_emu_LDFLAGS =3D $(LIBCURSES) =20 @@ -119,7 +119,7 @@ normal_mod_SOURCES =3D normal/arg.c normal/cmdline.c normal/command.c \ normal/context.c normal/main.c normal/menu.c \ normal/menu_entry.c \ - normal/powerpc/setjmp.S + normal/powerpc/setjmp.S normal/parser.c normal_mod_CFLAGS =3D $(COMMON_CFLAGS) normal_mod_ASFLAGS =3D $(COMMON_ASFLAGS) =20 diff -urN ./grub2_3/include/grub/err.h ./grub2_4/include/grub/err.h --- ./grub2_3/include/grub/err.h 2005-08-08 12:05:38.000000000 +0200 +++ ./grub2_4/include/grub/err.h 2005-08-22 16:11:44.000000000 +0200 @@ -49,7 +49,9 @@ GRUB_ERR_NO_KERNEL, GRUB_ERR_BAD_FONT, GRUB_ERR_NOT_IMPLEMENTED_YET, - GRUB_ERR_SYMLINK_LOOP + GRUB_ERR_SYMLINK_LOOP, + GRUB_ERR_PARSE, + GRUB_ERR_FALSE } grub_err_t; =20 diff -urN ./grub2_3/include/grub/script.h ./grub2_4/include/grub/script.h= --- ./grub2_3/include/grub/script.h 1970-01-01 01:00:00.000000000 +0100 +++ ./grub2_4/include/grub/script.h 2005-08-24 11:03:59.000000000 +0200 @@ -0,0 +1,92 @@ +#include + +#define GRUB_SCRIPT_SPECIALCHARS ";\n \t\r" +#define WORDCUTS "|&;<> \t()" + +#define GRUB_SCRIPT_COMMAND_FLAG_NOT 0x1 + +enum grub_script_superchar_type + { + GRUB_SCRIPT_SUPERCHAR_PLAIN, /* Just a normal string*/ + GRUB_SCRIPT_SUPERCHAR_VARIABLE, /* $var */ + GRUB_SCRIPT_SUPERCHAR_COMMAND, + GRUB_SCRIPT_SUPERCHAR_ARITHMETIC + }; + +/* Character string is represented like connected list=20 + by parts of type grub_script_superchar */ +struct grub_script_superchar +{ + enum grub_script_superchar_type type; + union + { + char *plain; + char *var_name; + char *cmd; + char *expr; + }; + struct grub_script_superchar *next; +}; + +/* Argument list*/ +struct grub_script_superchars +{ + struct grub_script_superchar str; + struct grub_script_superchars *next; +}; + +enum grub_script_command_type + { + GRUB_SCRIPT_COMMAND_NORMAL, /* Command without scripting*/ + GRUB_SCRIPT_COMMAND_FORIN, /* for ... in ... */ + GRUB_SCRIPT_COMMAND_STACK_LOOKUP /* done, fi, ...*/ + }; + +enum grub_script_command_chain + { + GRUB_SCRIPT_CHAIN_NORMAL, /* Normal*/ + GRUB_SCRIPT_CHAIN_OR, /* after || */ + GRUB_SCRIPT_CHAIN_AND /* after &&*/ + }; + +struct grub_script_command +{ + enum grub_script_command_type type; + enum grub_script_command_chain chain; + int flags; + union + { + struct grub_script_superchars *normal; + struct + { + struct grub_script_superchars *var; + struct grub_script_superchars *vals; + struct grub_script_commandlist *lookup; + }; + }; +}; + +struct grub_script_commandlist +{ + struct grub_script_command cmd; + struct grub_script_commandlist *next; +}; + +enum grub_script_stackitemtype {GRUB_SCRIPT_STACKITEM_FORIN}; + +struct grub_script_stackitem +{ + enum grub_script_stackitemtype type; + struct grub_script_commandlist *cmd; + union=20 + { + struct + { + char **list, *var; + int num, cur; + }; + }; +}; + +grub_err_t +grub_script_command_execute (char *cmd, char * (*nextline) (void)); diff -urN ./grub2_3/normal/command.c ./grub2_4/normal/command.c --- ./grub2_3/normal/command.c 2005-08-08 12:05:42.000000000 +0200 +++ ./grub2_4/normal/command.c 2005-08-22 16:18:33.000000000 +0200 @@ -24,6 +24,7 @@ #include #include #include +#include =20 static grub_command_t grub_command_list; =20 @@ -181,68 +182,28 @@ int grub_command_execute (char *cmdline) { - auto grub_err_t cmdline_get (char **s); - grub_err_t cmdline_get (char **s) + auto char *cmdline_get (void); + char *cmdline_get (void) { - *s =3D grub_malloc (GRUB_MAX_CMDLINE); - *s[0] =3D '\0'; - return grub_cmdline_get (">", *s, GRUB_MAX_CMDLINE, 0, 1); + char *s; + s =3D grub_malloc (GRUB_MAX_CMDLINE); + s[0] =3D '\0'; + grub_cmdline_get (">", s, GRUB_MAX_CMDLINE, 0, 1); + return s; } =20 - grub_command_t cmd; - grub_err_t ret =3D 0; char *pager; - int num; - char **args; - struct grub_arg_list *state; - struct grub_arg_option *parser; - int maxargs =3D 0; - char **arglist; - int numargs; - - if (grub_split_cmdline (cmdline, cmdline_get, &num, &args)) - return 0; - =20 - /* In case of an assignment set the environment accordingly instead - of calling a function. */ - if (num =3D=3D 0 && grub_strchr (args[0], '=3D')) - { - char *val =3D grub_strchr (args[0], '=3D'); - val[0] =3D 0; - grub_env_set (args[0], val + 1); - val[0] =3D '=3D'; - return 0; - } - =20 - cmd =3D grub_command_find (args[0]); - if (! cmd) - return -1; + grub_err_t ret; =20 /* Enable the pager if the environment pager is set to 1. */ pager =3D grub_env_get ("pager"); if (pager && (! grub_strcmp (pager, "1"))) grub_set_more (1); - =20 - parser =3D (struct grub_arg_option *) cmd->options; - while (parser && (parser++)->doc) - maxargs++; - - state =3D grub_malloc (sizeof (struct grub_arg_list) * maxargs); - grub_memset (state, 0, sizeof (struct grub_arg_list) * maxargs); - if (! (cmd->flags & GRUB_COMMAND_FLAG_NO_ARG_PARSE)) - { - if (grub_arg_parse (cmd, num, &args[1], state, &arglist, &numargs)= ) - ret =3D (cmd->func) (state, numargs, arglist); - } - else - ret =3D (cmd->func) (state, num, &args[1]); - =20 - grub_free (state); =20 + ret =3D grub_script_command_execute (grub_strdup (cmdline), cmdline_ge= t); if (pager && (! grub_strcmp (pager, "1"))) - grub_set_more (0); - =20 - grub_free (args); + grub_set_more (0);=20 + return ret; } =20 @@ -375,6 +336,40 @@ return 0; } =20 +static grub_err_t +echo_command (struct grub_arg_list *state __attribute__ ((unused)), + int argc, + char **args) +{ + int i; + =20 + for (i =3D 0; i < argc; i++) + { + grub_printf (args[i]); + grub_printf (" "); + } + + grub_printf ("\n"); + + return 0; +} + +static grub_err_t +true_command (struct grub_arg_list *state __attribute__ ((unused)), + int argc __attribute__ ((unused)), + char **args __attribute__ ((unused))) +{ + return 0; +} + +static grub_err_t +false_command (struct grub_arg_list *state __attribute__ ((unused)), + int argc __attribute__ ((unused)), + char **args __attribute__ ((unused))) +{ + return GRUB_ERR_FALSE; +} + void grub_command_init (void) { @@ -401,4 +396,13 @@ =20 grub_register_command ("lsmod", lsmod_command, GRUB_COMMAND_FLAG_BOTH,= "lsmod", "Show loaded modules.", 0); + + grub_register_command ("echo", echo_command, GRUB_COMMAND_FLAG_BOTH, + "echo TEXT", "Print TEXT.", 0); + + grub_register_command ("true", true_command, GRUB_COMMAND_FLAG_BOTH, + "true", "Return non-error.", 0); + + grub_register_command ("false", false_command, GRUB_COMMAND_FLAG_BOTH,= + "false", "Return error.", 0); } diff -urN ./grub2_3/normal/parser.y ./grub2_4/normal/parser.y --- ./grub2_3/normal/parser.y 1970-01-01 01:00:00.000000000 +0100 +++ ./grub2_4/normal/parser.y 2005-08-24 11:18:21.000000000 +0200 @@ -0,0 +1,717 @@ +%{ +#include +#include +#include +#include +#include + +#define PUTLNBUF 100 +#define malloc grub_malloc +#define free grub_free + +static struct grub_script_commandlist *curexec; +static int yylex (void); +static void yyerror (const char *s); +static int generate_end =3D 0; +static int nopnum =3D 0; + +/* NOT DONE: brace expansion, vars like ${.../../..}, $*, ..., command e= xpansion, arithmetic expansion, + arithmetic, logic, pipe, redirecting, heredoc, herestring, case esac , = + if then elif else fi, + for (()), function, entry, until, while, time, arrays, ~, special varia= bles, pathname expansion, + aliases, builtin commands, prompting */ + + +%} + +%union=20 +{ + struct grub_script_commandlist *lst; + struct grub_script_superchars *str; +}; + +%token ENTER +%token FOR +%token SEMICOLON +%token IN +%token DO +%token DONE +%token NOP +%token WORD +%token OR +%token AND +%token NOT + +%type commandlist +%type command +%type pre_command +%type execlist +%type arglist + +%error-verbose + +%% + +out:/* command + {=20 + curexec =3D $1;=20 + } + |*/ command =20 + { + generate_end =3D 1; + nopnum=3D0; + curexec =3D $1;=20 + } + +commandlist : command + | commandlist command + { + if (!$1) + $$ =3D $2; + else + { + $$ =3D $1; + if ($2) + { + struct grub_script_commandlist *cur; + cur =3D $2; + while (cur->next) + cur =3D cur->next; + cur->next =3D $2; + } + } + }; + +arglist : WORD + | arglist WORD + { + struct grub_script_superchars *cur; + $$ =3D $1; + cur =3D $1; + while (cur->next) + cur =3D cur->next; + cur->next =3D $2; + }; + +command : cmdend + { + $$ =3D 0; + } + | NOP NOP NOP NOP=20 + { + $$ =3D 0; + } + | execlist cmdend + ; + +execlist : pre_command + | NOT pre_command + { + $$ =3D $2; + $$->cmd.flags |=3D GRUB_SCRIPT_COMMAND_FLAG_NOT; + } + | execlist AND pre_command + { + struct grub_script_commandlist *cur; + $$ =3D $1; + cur =3D $1; + while (cur->next) + cur =3D cur->next; + cur->next =3D $3; =20 + $3->cmd.chain =3D GRUB_SCRIPT_CHAIN_AND; + } + | execlist OR pre_command + { + struct grub_script_commandlist *cur; + $$ =3D $1; + cur =3D $1; + while (cur->next) + cur =3D cur->next; + cur->next =3D $3; + $3->cmd.chain =3D GRUB_SCRIPT_CHAIN_OR; + } + ; + + +pre_command : + arglist /* Normal command */ + { + $$ =3D grub_malloc (sizeof (struct grub_script_commandlist)); + $$->cmd.type =3D GRUB_SCRIPT_CHAIN_NORMAL; + $$->cmd.chain =3D GRUB_SCRIPT_COMMAND_NORMAL; + $$->cmd.normal =3D $1; + $$->cmd.flags =3D 0; + $$->next =3D 0; + } + | FOR WORD IN arglist cmdend DO commandlist DONE + { + $$ =3D grub_malloc (sizeof (struct grub_script_commandlist)); + $$->cmd.type =3D GRUB_SCRIPT_COMMAND_FORIN; + $$->cmd.var =3D $2; + $$->cmd.vals =3D $4; + $$->cmd.flags =3D 0; + $$->cmd.chain =3D GRUB_SCRIPT_CHAIN_NORMAL; + $$->next =3D $7; + struct grub_script_commandlist *cur; + cur =3D $7; + while (cur->next) + cur =3D cur->next; =20 + cur->next =3D (struct grub_script_commandlist *)=20 + grub_malloc (sizeof (struct grub_script_commandlist)); + cur->next->next =3D 0; + cur->next->cmd.type =3D GRUB_SCRIPT_COMMAND_STACK_LOOKUP; + cur->next->cmd.chain =3D GRUB_SCRIPT_COMMAND_NORMAL; + cur->next->cmd.flags =3D 0; + $$->cmd.lookup =3D cur->next; + } + ; + + +cmdend: ENTER + | SEMICOLON + ; + +%% + +static char *curcmd, *curptr; +static char * (*nl) (void); + +static int +yylex (void) +{ + char *putstr =3D 0, putln =3D 0, curch; + int putptr =3D 0; + /*Lexic analyzer mode: 0 - normal, 1 - between ", 2 - between ' */ + int mode =3D 0; + =20 + auto void cur_putchar (char ch); + void cur_putchar (char ch) + { + if (!(putptr % PUTLNBUF)) + { + putln +=3D PUTLNBUF; + putstr =3D grub_realloc (putstr, putln); + } + putstr[putptr++] =3D ch; + } + + /* Check if next token is a KEYWORD. Set SEPARATOR to 1 if KEYWORD is = a token separator like || */ + auto int check_for_keyword (char *keyword, int separator); + int check_for_keyword (char *keyword, int separator) + { + unsigned keylen =3D grub_strlen (keyword); + if (!curcmd) + curptr =3D curcmd =3D nl (); =20 + if (mode =3D=3D 0 && grub_strlen (curptr) >=3D keylen=20 + && !grub_memcmp (curptr, keyword, keylen)=20 + && (!curptr[keylen] || grub_strchr (WORDCUTS, curptr[keylen]) || sepa= rator)) + { + curptr +=3D keylen; + return 1; + } + + return 0; + } + + auto void add_wordpart (enum grub_script_superchar_type type); + void add_wordpart (enum grub_script_superchar_type type) + { + struct grub_script_superchar *cur; + if (!putstr) + return; + if (!yylval.str) + { + yylval.str =3D (struct grub_script_superchars *)=20 + grub_malloc (sizeof (struct grub_script_superchars)); + cur =3D &(yylval.str->str); + yylval.str->next =3D 0; + } + else + { + cur =3D &(yylval.str->str); + while (cur->next) + cur =3D cur->next; =20 + cur->next =3D (struct grub_script_superchar *)=20 + grub_malloc (sizeof (struct grub_script_superchar)); + cur =3D cur->next; =20 + } + cur->type =3D type; + cur->next =3D 0; + switch (type) + { + case GRUB_SCRIPT_SUPERCHAR_PLAIN: + cur->plain =3D putstr; + break; + + case GRUB_SCRIPT_SUPERCHAR_VARIABLE: + cur->var_name =3D putstr; + break; + + case GRUB_SCRIPT_SUPERCHAR_COMMAND: + cur->cmd =3D putstr; + break; + + case GRUB_SCRIPT_SUPERCHAR_ARITHMETIC: + cur->expr =3D putstr; + break; + } + putstr =3D 0; =20 + putln =3D 0; + putptr =3D 0; + } + + auto void script_ungetchar (void); + void script_ungetchar (void) + { + if (curptr) + curptr--; + else + { + curcmd =3D grub_malloc (sizeof (char)); + curptr =3D curcmd; + curptr[0] =3D 0; + } + } + + auto int script_getchar (void); + int script_getchar (void) + { + if (curptr && !*curptr) + { + free (curcmd); + curptr =3D curcmd =3D 0; + return '\n'; + } + + if (!curcmd) + curptr =3D curcmd =3D nl (); + =20 + return *(curptr++); + } + + if (nopnum) + { + nopnum--; + return NOP; + } + + if (generate_end) + { + generate_end =3D 0; + return 0; + } + + while (*curptr && grub_isspace (*curptr)) + curptr++; + + if (*curptr && *curptr =3D=3D '#') + { + free (curcmd); + curptr =3D curcmd =3D 0; + return ENTER; + } + + if (check_for_keyword ("for", 0)) + return FOR; + + if (check_for_keyword ("in", 0)) + return IN; + + if (check_for_keyword ("do", 0)) + return DO; + + if (check_for_keyword ("done", 0)) + return DONE; + + if (check_for_keyword ("!", 0)) + return NOT; + + if (check_for_keyword ("||", 1)) + return OR; + + if (check_for_keyword ("&&", 1)) + return AND; + + if (check_for_keyword (";", 1)) + return SEMICOLON; + + curch =3D script_getchar (); + =20 + + /* Normal word */ + /* FIXME: brace expansion*/ + /* FIXME: filename expansion*/ + if (!grub_strchr (GRUB_SCRIPT_SPECIALCHARS, curch) || mode) + { + yylval.str =3D 0; + while (!grub_strchr (GRUB_SCRIPT_SPECIALCHARS, curch) || mode) + { + switch (curch) + { + case '\\': + /* Inside ' */ + if (mode =3D=3D 2) + { + cur_putchar ('\\'); + break; + } + curch =3D script_getchar (); + /* Escaped newline */ + if (curch =3D=3D '\n') + { + break; + } + cur_putchar (curch); + curch =3D script_getchar (); + break; + + case '"': + if (mode =3D=3D 0) + { + mode =3D 1; + curch =3D script_getchar (); + break; + } + if (mode =3D=3D 1) + { + mode =3D 0; + curch =3D script_getchar (); + break; + } + cur_putchar (curch); + curch =3D script_getchar (); + break; + + case '\'': + if (mode =3D=3D 0) + { + mode =3D 2; + curch =3D script_getchar (); + break; + } + if (mode =3D=3D 2) + { + mode =3D 0; + curch =3D script_getchar (); + break; + } + cur_putchar (curch); + curch =3D script_getchar (); + break; + + case '$': + if (mode =3D=3D 2) + { + cur_putchar ('$'); + break; + } + add_wordpart (GRUB_SCRIPT_SUPERCHAR_PLAIN); + switch (curch =3D script_getchar ()) + { + case '{': + while ((curch =3D script_getchar ()) !=3D '}') + cur_putchar (curch); + add_wordpart (GRUB_SCRIPT_SUPERCHAR_VARIABLE); + curch =3D script_getchar (); + break; + + case '(': + if ((curch =3D script_getchar ()) =3D=3D '(') + { + int parcnt =3D 2; + while (parcnt) + { + curch =3D script_getchar (); + if (curch =3D=3D '\\') + { + cur_putchar (curch); + cur_putchar (script_getchar ()); + continue; + } + if (curch =3D=3D '(') + parcnt++; + if (curch =3D=3D ')') + parcnt--; + =20 + cur_putchar (curch); + } + add_wordpart (GRUB_SCRIPT_SUPERCHAR_ARITHMETIC); + curch =3D script_getchar (); + break; + } + { + int parcnt =3D 1; + while (parcnt) + { + if (curch =3D=3D '\\') + { + cur_putchar (curch); + cur_putchar (script_getchar ()); + curch =3D script_getchar (); + continue; + } + if (curch =3D=3D '(') + parcnt++; + if (curch =3D=3D ')') + parcnt--; + =09 + cur_putchar (curch); + curch =3D script_getchar (); + } + add_wordpart (GRUB_SCRIPT_SUPERCHAR_COMMAND); + curch =3D script_getchar (); + break; + } + default: + { + int made =3D 0; + while (grub_isalpha (curch) || grub_isdigit (curch)) + { + cur_putchar (curch); + made =3D 1; + curch =3D script_getchar (); + } + if (made) + add_wordpart (GRUB_SCRIPT_SUPERCHAR_VARIABLE); + else + { + cur_putchar ('$'); + add_wordpart (GRUB_SCRIPT_SUPERCHAR_PLAIN); + } + } + break; + } + break; + =20 + case '`': + if (mode =3D=3D 2) + { + cur_putchar ('`'); + break; + } + add_wordpart (GRUB_SCRIPT_SUPERCHAR_PLAIN); + curch =3D script_getchar (); + while (curch !=3D '`') + { + if (curch =3D=3D '\\') + { + cur_putchar (curch); + curch =3D script_getchar (); + } + =20 + cur_putchar (curch); + curch =3D script_getchar (); + } + curch =3D script_getchar (); + add_wordpart (GRUB_SCRIPT_SUPERCHAR_COMMAND); + break; + + default: + cur_putchar (curch); + curch =3D script_getchar (); + break; + } + } + script_ungetchar (); + add_wordpart (GRUB_SCRIPT_SUPERCHAR_PLAIN); + return WORD; + } + + if (curch =3D=3D '\n') + return ENTER; + =20 +} + +static char * +superchartostring (struct grub_script_superchar *in) +{ + char *retstr =3D 0; + int curret =3D 0, old; + struct grub_script_superchar *cur =3D in; + while (cur) + { + switch (cur->type) + { + case GRUB_SCRIPT_SUPERCHAR_PLAIN: + old =3D curret; + curret +=3D grub_strlen (cur->plain); + retstr =3D grub_realloc (retstr, curret + 1); + grub_memcpy (retstr + old, cur->plain, sizeof (char) * grub_strlen (c= ur->plain)); + break; + + /* FIXME variables like ${...:...}*/ + case GRUB_SCRIPT_SUPERCHAR_VARIABLE: + { + char *tmp; + old =3D curret; + tmp =3D grub_env_get (cur->var_name); + if (!tmp) + break; + curret +=3D grub_strlen (tmp); + retstr =3D grub_realloc (retstr, curret + 1); + grub_memcpy (retstr + old, tmp, sizeof (char) * grub_strlen (tmp));= + break; + } + } + cur =3D cur->next; + } + retstr[curret] =3D 0; + return retstr; +} + +static void +supercharstostrings (struct grub_script_superchars *in, int *num, char *= **out) +{ + struct grub_script_superchars *cur =3D in; + *num =3D 0; + *out =3D 0; + while (cur) + { + *out =3D (char **) grub_realloc (*out, (*num + 1) * sizeof (char *= *)); + (*out)[*num] =3D superchartostring (&(cur->str)); + if (!(*out)[*num]) + continue; + (*num)++; + cur =3D cur->next; + } +} + +static void +yyerror (const char *s) +{ + grub_error (GRUB_ERR_PARSE, s); +} + +static grub_err_t +grub_script_command_execute_real (void) +{ + grub_err_t ret =3D 0; + grub_command_t cmd; + struct grub_script_stackitem *stack =3D 0; + int stackcnt =3D 0; + nopnum =3D 0; + generate_end =3D 0; + + auto void exec_forin (void); + void exec_forin (void) + { + if (stack[stackcnt - 1].cur >=3D stack[stackcnt - 1].num) + { + curexec =3D curexec->cmd.lookup; + stack =3D (struct grub_script_stackitem *)=20 + grub_realloc (stack, sizeof (struct grub_script_stackitem) * (--sta= ckcnt)); + return; + } + grub_env_set (stack[stackcnt - 1].var, stack[stackcnt - 1].list[st= ack[stackcnt - 1].cur++]); + } + + yyparse (); + + while (curexec) + { + if (curexec->cmd.chain =3D=3D GRUB_SCRIPT_CHAIN_AND && ret) + { + curexec =3D curexec->next; + continue; + } + if (curexec->cmd.chain =3D=3D GRUB_SCRIPT_CHAIN_OR && !ret) + { + curexec =3D curexec->next; + continue; + } + switch (curexec->cmd.type) + { + case GRUB_SCRIPT_COMMAND_NORMAL: + { + int num; + char **args =3D 0; + struct grub_arg_list *state; + struct grub_arg_option *parser; + int maxargs =3D 0; + char **arglist; + int numargs; + supercharstostrings (curexec->cmd.normal, &num, &args); + /* In case of an assignment set the environment accordingly instead= + of calling a function. */ + if (num =3D=3D 1 && grub_strchr (args[0], '=3D')) + { + char *val =3D grub_strchr (args[0], '=3D'); + val[0] =3D 0; + grub_env_set (args[0], val + 1); + val[0] =3D '=3D'; + ret =3D 0; + break; + } + cmd =3D grub_command_find (args[0]); + if (! cmd) + { + ret =3D grub_error (GRUB_ERR_UNKNOWN_COMMAND, "Command not found"); + break; + } + + parser =3D (struct grub_arg_option *) cmd->options; + while (parser && (parser++)->doc) + maxargs++; + + state =3D grub_malloc (sizeof (struct grub_arg_list) * maxargs); + grub_memset (state, 0, sizeof (struct grub_arg_list) * maxargs); + if (! (cmd->flags & GRUB_COMMAND_FLAG_NO_ARG_PARSE)) + { + if (grub_arg_parse (cmd, num - 1, &args[1], state, &arglist, &numarg= s)) + ret =3D (cmd->func) (state, numargs, arglist); + } + else + ret =3D (cmd->func) (state, num - 1, &args[1]); + =20 + grub_free (state); + =20 + grub_free (args); + break; + } + =20 + case GRUB_SCRIPT_COMMAND_FORIN: + { + stack =3D (struct grub_script_stackitem *)=20 + grub_realloc (stack, sizeof (struct grub_script_stackitem) * (sta= ckcnt + 1)); + stack[stackcnt].type =3D GRUB_SCRIPT_STACKITEM_FORIN; + stack[stackcnt].var =3D superchartostring (&curexec->cmd.var->str);= + stack[stackcnt].list =3D 0; + supercharstostrings (curexec->cmd.vals, &stack[stackcnt].num, &stac= k[stackcnt].list); + stack[stackcnt].cmd =3D curexec; + stack[stackcnt].cur =3D 0; + stackcnt++; + exec_forin (); + break; + } + case GRUB_SCRIPT_COMMAND_STACK_LOOKUP: + { + switch (stack[stackcnt - 1].type) + { + case GRUB_SCRIPT_STACKITEM_FORIN: + curexec =3D stack[stackcnt - 1].cmd; + exec_forin (); + break; + } + break; + } + } + if (curexec->cmd.flags & GRUB_SCRIPT_COMMAND_FLAG_NOT) + ret =3D ret ? 0 : GRUB_ERR_FALSE; + curexec =3D curexec->next; + } + + return ret;=20 +} + +grub_err_t=20 +grub_script_command_execute (char *in, char * (*nextline) (void)) +{ + grub_err_t ret =3D 0; + curptr =3D curcmd =3D in; + nl =3D nextline; + while (curptr && grub_errno !=3D GRUB_ERR_PARSE) + ret =3D grub_script_command_execute_real (); + return ret; +} + + --------------050504080306060805050603--