diff options
Diffstat (limited to 'usr.sbin/bsdconfig/timezone/share/menus.subr')
| -rw-r--r-- | usr.sbin/bsdconfig/timezone/share/menus.subr | 224 |
1 files changed, 224 insertions, 0 deletions
diff --git a/usr.sbin/bsdconfig/timezone/share/menus.subr b/usr.sbin/bsdconfig/timezone/share/menus.subr new file mode 100644 index 000000000000..268945a73a59 --- /dev/null +++ b/usr.sbin/bsdconfig/timezone/share/menus.subr @@ -0,0 +1,224 @@ +if [ ! "$_TIMEZONE_MENUS_SUBR" ]; then _TIMEZONE_MENUS_SUBR=1 +# +# Copyright (c) 2011-2012 Devin Teske +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# 2. Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in the +# documentation and/or other materials provided with the distribution. +# +# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND +# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE +# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +# SUCH DAMAGE. +# +# +############################################################ INCLUDES + +BSDCFG_SHARE="/usr/share/bsdconfig" +. $BSDCFG_SHARE/common.subr || exit 1 +f_dprintf "%s: loading includes..." timezone/menus.subr +f_include $BSDCFG_SHARE/dialog.subr + +############################################################ GLOBALS + +# +# Export special included variables required by awk(1) for `ENVIRON' visibility +# +export DIALOG_MENU_TAGS + +############################################################ FUNCTIONS + +# f_make_menus +# +# Creates the tag/item ordered-pair list environment variables for the +# continent and country menus. +# +# Required variables [from continents.subr]: +# +# CONTINENTS +# Space-separated list of continents. +# continent_*_title +# Desired menu text for the continent represented by *. +# +# Required variables [created by f_read_iso3166_table from iso3166.subr]: +# +# COUNTRIES +# Space-separated list of 2-character country codes. +# country_*_name :: when country_*_nzones < 0 +# Desired menu text for the country-zone represented by *, the 2- +# character country code. +# +# Required variables [created by f_read_zones from zones.subr]: +# +# country_*_nzones +# Number of zones for the country represented by *, the 2- +# character country code. Should be -1 if the country has only +# one single zone, otherwise 1 or greater to indicate how many +# zones the country has. +# country_*_cont :: when country_*_nzones < 0 +# Principal continent (or ocean) in which the country-zone +# represented by *, the 2-character country code, resides. +# country_*_cont_N :: when country_*_nzones > 0 +# Principal continent (or ocean) in which zone-N of the country +# represented by * resides, the 2-character country code. +# country_*_descr_N :: when country_*_nzones > 0 +# Desired submenu text for zone-N of the country represented by +# *, the 2-character country code. +# +# Variables created by this function: +# +# continent_menu_list +# Menu-list of continents. +# continent_*_nitems +# Number of items associated with the continent represented by *, +# the continent identifier. +# continent_*_tlc_N +# 2-character country code of the Nth item in the continent menu +# for the continent represented by *, the continent identifier. +# continent_*_menu_list +# Menu-list of countries/zones for each continent represented by +# *, the continent identifier. +# country_*_menu_list +# For countries that have multiple zones, this is the submenu- +# list of zones for said country represented by *, the 2- +# character country code. +# +# This function is a two-parter. Below is the awk(1) portion of the function, +# afterward is the sh(1) function which utilizes the below awk script. +# +f_make_menus_awk=' +function add_zone_n_to_country_menu(tlc, n) +{ + zone_title = ENVIRON["country_" tlc "_descr_" n] + gsub(/'\''/, "'\''\\'\'\''", zone_title) + country_menu_list[tlc] = country_menu_list[tlc] \ + ( length(country_menu_list[tlc]) > 0 ? "\n" : "" ) \ + n " '\''" zone_title "'\''" +} +BEGIN { + # + # First, count up all the countries in each continent/ocean. + # Be careful to count those countries which have multiple zones + # only once for each. NB: some countries are in multiple + # continents/oceans. + # + i = split(ENVIRON["COUNTRIES"], countries, /[[:space:]]+/) + for (cp = 1; cp <= i; cp++) + { + tlc = countries[cp] + title = ENVIRON["country_" tlc "_name"] + gsub(/'\''/, "'\''\\'\'\''", title) + nzones = ENVIRON["country_" tlc "_nzones"] + if (!nzones) + { + # Country has no zones + continue + } + else if (nzones < 0) + { + # Country has only one zone + cont = ENVIRON["country_" tlc "_cont"] + nitems = ++continent_nitems[cont] + continent_tlc[cont,nitems] = tlc + continent_title[cont,nitems] = title + } + else + { + # Country has one or more zones + for (n = 1; n <= nzones; n++) + { + add_zone_n_to_country_menu(tlc, n) + cont = ENVIRON["country_" tlc "_cont_" n] + for (x = 1; x < n; x++) + { + contx = ENVIRON["country_"tlc"_cont_"x] + if (cont == contx) break + } + if (x == n) + { + nitems = ++continent_nitems[cont] + continent_tlc[cont,nitems] = tlc + continent_title[cont,nitems] = title + } + } + } + } +} +END { + tags = ENVIRON["DIALOG_MENU_TAGS"] + cont_menu_list = "" + tagn = 0 + + # + # Assemble the menu items in the menu list for each continent/ocean. + # + i = split(ENVIRON["CONTINENTS"], array, /[[:space:]]+/) + for (item = 1; item <= i; item++) + { + cont = array[item] + if (!cont) continue + + if (++tagn >= length(tags)) break + tag = substr(tags, tagn, 1) + cont_menu_list = cont_menu_list \ + ( length(cont_menu_list) > 0 ? "\n" : "" ) \ + "'\''" tag "'\'' '\''" \ + ENVIRON["continent_" cont "_title"] "'\''" + + nitems = continent_nitems[cont] + printf "continent_%s_nitems=%d\n", cont, nitems + + menu_list = "" + for (n = 1; n <= nitems; n++) + { + printf "continent_%s_tlc_%d=%s\n", + cont, n, continent_tlc[cont,n] + + title = continent_title[cont,n] + menu_list = menu_list \ + ( length(menu_list) > 0 ? "\n" : "" ) \ + n " '\''" title "'\''" + } + + gsub(/"/, "\\\"", menu_list) + printf "continent_%s_menu_list=\"%s\"\n", cont, menu_list + } + + gsub(/"/, "\\\"", continent_menu_list) + printf "continent_menu_list=\"%s\"\n", cont_menu_list + print "export continent_menu_list" + + # + # Dump the submenus of countries with multiple zones + # + for (tlc in country_menu_list) + { + menu_list = country_menu_list[tlc] + gsub(/"/, "\\\"", menu_list) + printf "country_%s_menu_list=\"%s\"\n", tlc, menu_list + } +} +' +f_make_menus() +{ + eval $( :| awk "$f_make_menus_awk" ) +} + +############################################################ MAIN + +f_dprintf "%s: Successfully loaded." timezone/menus.subr + +fi # ! $_TIMEZONE_MENUS_SUBR |
