git: 9front

ref: 2f4e6dd1a8b367044948f75f62b51aae2a944dd2
dir: /sys/src/9/boot/menu.rc/

View raw version
#!/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)
			}
		}
	}
}