ref: 2f4e6dd1a8b367044948f75f62b51aae2a944dd2
dir: /sys/src/9/boot/menu.rc/
#!/bin/rc
conffile=/mnt/conf/plan9.ini
items=()
fn menuitems{
oifs=$ifs
ifs='
'
# get menu items and save them in the form 'item\tstring'
x=(`{awk -F'\n' '
$0 ~ /\[menu\]/ {
FS="[= ]"
for(nitem=1;;nitem++){
getline
if(match($0, /\[/)) # if we entered a block, we are done
break
sub(/\,/, "") # remove comma
if(match($0, /^#/)) # comments
continue
if(match($0, /^$/)) # empty line
continue
printf("%s\t\" %d. ", $2, nitem)
for(i=3; i <= NF; i++)
printf("%s ", $i)
printf("\"\t\n")
}
}
' $conffile})
ifs=' '
for(itemline in $x){
# separate item from string
item=`{echo $itemline(1)}
# $menuitemtext holds the string for the item
$item(1)^text=$item(2)
items=($items $item(1))
}
if(! ~ $#items 0){
echo 'Plan 9 Startup Menu:'
echo '--------------------'
}
ifs=$oifs
}
# load block definitions
fn menublock{
for(i in `{
awk -F'\n' -v item'='`{echo '['$1']' | sed 's/ //g'} '
{
# find menuitem block
if(index($0, item)){
for(;;){
if(getline <= 0)
break
if(match($0, /\[/)) # entered a block, we are done
break
if(match($0, /^$/))
continue
# skip comments, quote kernel devices
if(index($0, "#") == 1)
continue
else
gsub("#", "''#''")
printf("%s\n", $1)
}
}
}' $conffile}){
name=`{echo $i | awk -F'=' '{print $1}'}
val=`{echo $i | awk -F'=' '{print $2}'}
# a name beginning with * denotes
# a kernel variable, save to #ec
v0=`{echo $i | sed 's/(\*).*/\1/'}
if(~ $v0 '*'){
bind -bc '#ec' /env
eval $name'='$val
unmount '#ec' /env
}
if not
eval $name'='$val
}
}
fn freevars{
for(i in `{
awk -F'\n' '{
if(match($0, /\[/)) # entered a block, we are done
exit
if(match($0, /^$/))
exit
# skip comments, quote kernel devices
if(index($0, "#") == 1)
exit
else
gsub("#", "''#''")
printf("%s\n", $1)
}' $conffile}){
# a name beginning with * denotes
# a kernel variable, save to #ec
val=`{echo $i | sed 's/(\*).*/\1/'}
if(~ $val '*'){
bind -bc '#ec' /env
eval $i
unmount '#ec' /env
}
if not eval $i
}
}
fn parseconf{
opt=0
if(test -f $conffile){
freevars
menuitems
menublock 'common'
if(! ~ $#items 0){
while(test $opt -lt 1 || test $opt -gt $#items){
for(item in $items)
echo -n $`{echo $item^text} | sed 's/"//g'
echo -n ' Selection: '
opt=`{read}
if(test $opt -ge 1 && test $opt -le $#items)
menublock $items($opt)
}
}
}
}