| #!/bin/sh |
| # update-info -- update dir file from all extant info pages. |
| # |
| # 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, you can either send email to this |
| # program's maintainer or write to: The Free Software Foundation, |
| # Inc.; 59 Temple Place, Suite 330; Boston, MA 02111-1307, USA. |
| # |
| # Author: rhawes@dmapub.dma.org. Please report bugs to him. |
| # |
| # run this program to install update-info |
| # ###SECTION 0### install script |
| # These constants set the version numbers for both files: |
| PROGRAM_VERSION="1.4" |
| PACKAGE_VERSION="4.0" |
| |
| # ENVIRONMENT |
| if test -z "$TMPDIR"; then |
| TMPDIR="/usr/tmp" |
| fi |
| |
| TMP_SED="$TMPDIR/uss$$.info" |
| TMP_F_ADD_SECTION="$TMPDIR/ufa$$.info" |
| TMP_F_DELETE_INVALID="$TMPDIR/ufd$$.info" |
| TMP_F_INSERT_MISSING="$TMPDIR/ufi$$.info" |
| TMP_FILES="$TMP_SED $TMP_F_ADD_SECTION $TMP_F_DELETE_INVALID\ |
| $TMP_F_INSERT_MISSING" |
| |
| trap 'rm -f $TMP_FILES' 0 |
| |
| # file boundaries |
| UPDATE_INFO="/^# _file: 'update-info'_/" |
| UPDATE_INFO_F="/^# _file: 'update-info.f'_/" |
| |
| # @F_ADD_SECTION@ |
| echo 'Item_Num=`expr "$Item_Num" + "1"` |
| echo "$1">>"$TMP_SECTIONS" |
| if test "$Item_Status"; then |
| Item_Status=`echo "${Item_Status} |
| X"` |
| else |
| Item_Status="X" |
| fi '>$TMP_F_ADD_SECTION |
| |
| # @F_INSERT_MISSING@ |
| echo 'if test -z "$Create_Node"; then |
| rm -f ${Info_Node}.old |
| cp $Info_Node ${Info_Node}.old |
| echo "$BACKUP_MSG" |
| fi |
| echo "/$MENU_BEGIN/ |
| +,$ d |
| r $TMP_MENU |
| w |
| q"|ed -s $Info_Node>/dev/null'>$TMP_F_INSERT_MISSING |
| |
| # @F_DELETE_INVALID@ |
| echo ' |
| rm -f ${Info_Node}.old |
| cp $Info_Node ${Info_Node}.old |
| echo "$BACKUP_MSG" |
| echo "/$MENU_BEGIN/ |
| +,$ d |
| w |
| q"|ed -s $Info_Node>/dev/null |
| sed -f "$TMP_SED" "$TMP_MENU">>"$Info_Node"'>$TMP_F_DELETE_INVALID |
| |
| cat<<Sed_Script_EOF>$TMP_SED |
| s/@UPDATE_INFO_VERSION@/$PROGRAM_VERSION/g |
| s/@TEXINFO_VERSION@/$PACKAGE_VERSION/g |
| s/@SET_ITEM@/Item_Status=\`echo "\$Item_Status"|sed -e "\${1}s%^.*%\${2}%"\`/ |
| /@F_ADD_SECTION@/r $TMP_F_ADD_SECTION |
| /@F_ADD_SECTION@/d |
| /@F_DELETE_INVALID@/r $TMP_F_DELETE_INVALID |
| /@F_DELETE_INVALID@/d |
| /@F_INSERT_MISSING@/r $TMP_F_INSERT_MISSING |
| /@F_INSERT_MISSING@/d |
| Sed_Script_EOF |
| |
| sed -e "1,${UPDATE_INFO}d" -e "$UPDATE_INFO_F,\$d" -f $TMP_SED $0>update-info |
| sed -e "1,${UPDATE_INFO_F}d" -f $TMP_SED $0>update-info.f |
| chmod +x update-info update-info.f |
| echo "installed update-info, and update-info.f into `pwd`" |
| rm -f $TMP_FILES |
| exit |
| |
| # _file: 'update-info'_ |
| #!/bin/sh |
| #update-info (GNU texinfo @TEXINFO_VERSION@) @UPDATE_INFO_VERSION@ |
| #Copyright (C) 1997 Free Software Foundation, Inc. |
| #update-info comes with NO WARRANTY, to the extent permitted by law. |
| #You may redistribute copies of update-info |
| #under the terms of the GNU General Public License. |
| #For more information about these matters, see the files named COPYING." |
| #Author: Richard L. Hawes |
| |
| # ###SECTION 1### Constants |
| set -h 2>/dev/null |
| # ENVIRONMENT |
| if test -z "$TMPDIR"; then |
| TMPDIR="/usr/tmp" |
| fi |
| if test -z "$LINES"; then |
| LINES=24 |
| fi |
| if test -z "$COLUMNS"; then |
| COLUMNS=80 |
| fi |
| if test -z "$EDITOR"; then |
| EDITOR=vi |
| fi |
| if test -z "$LINENO"; then |
| LINENO="0" |
| fi |
| # constants redefined by update-info.f |
| PROMPT1="(y=yes, Y=yes to all, n=no, N=No to all):" |
| FUNCTIONS="" |
| # |
| ARGUMENTS="$*" |
| DISPLAY_NUM=`expr "$LINES" - 4` |
| CONTROL_D="{Ctrl-D}" |
| DIR_SECTION="^INFO-DIR-SECTION" |
| ENTRY_END="^END-INFO-DIR-ENTRY" |
| ENTRY_START="^START-INFO-DIR-ENTRY" |
| MENU_BEGIN='^\*\([ ]\)\{1,\}Menu:' |
| MENU_ITEM='^\* ([^ ]).*:([ ])+\(' |
| SECTION_TITLE="^[A-Za-z0-9]" |
| MENU_FILTER1='s/^\*\([ ]\)\{1,\}/* /' |
| MENU_FILTER2='s/\([ ]\)\{1,\}$//g' |
| TMP_ITEM="${TMPDIR}/ui${$}.info" |
| TMP_LIST="${TMPDIR}/ul${$}.info" |
| TMP_MENU="${TMPDIR}/um${$}.info" |
| TMP_SECTIONS="${TMPDIR}/us${$}.info" # used only in Detect_Missing |
| TMP_SED="$TMP_SECTIONS" # used only in Detect_Invalid routines |
| TMP_FILE1="${TMPDIR}/ux${$}.info" |
| TMP_FILE2="${TMPDIR}/uy${$}.info" |
| TMP_COUNT="$TMP_FILE2" |
| TMP_FILE_LIST="$TMP_LIST $TMP_MENU $TMP_SECTIONS $TMP_FILE1 $TMP_FILE2\ |
| $TMP_ITEM" |
| TRY_HELP_MSG="Try --help for more information" |
| if zcat --version 2>/dev/null>/dev/null; then |
| CAT_COMMAND="zcat -f" |
| else |
| echo "$0:$LINENO: GNU zcat not found">&2 |
| CAT_COMMAND="cat" |
| fi |
| |
| # ###SECTION 100### main program |
| #variables set by options |
| Create_Node="" |
| Debug=":" |
| Interactive="" |
| Load_Functions="y" |
| Mode="" |
| # |
| Inserts="0" |
| Inserts_Total="0" |
| Invalid="0" |
| Invalid_Total="0" |
| Changed="" |
| |
| while test "$*" |
| do |
| case "$1" in |
| -c) Create_Node="y";; |
| -ci|-ic) Create_Node="y"; Interactive="y";; |
| -cif|-cfi|-ifc|-icf|-fci|-fic) Create_Node="y" |
| Interactive="y"; Load_Functions="";; |
| --debug) set -eux; Debug="set>&2";; |
| -d|--delete) Mode="Detect_Invalid";; |
| -f) Load_Functions="";; |
| -i|--interactive) Interactive="y";; |
| -fi|-if) Load_Functions=""; Interactive="y";; |
| -id|-di) Mode="Detect_Invalid"; Interactive="y";; |
| +i|+d|+f);; |
| --version) |
| cat<<VersionEOF |
| update-info (GNU texinfo @TEXINFO_VERSION@) @UPDATE_INFO_VERSION@ |
| Copyright (C) 1997 Free Software Foundation, Inc. |
| update-info comes with NO WARRANTY, to the extent permitted by law. |
| You may redistribute copies of update-info |
| under the terms of the GNU General Public License. |
| For more information about these matters, see the files named COPYING. |
| Author: Richard L. Hawes |
| VersionEOF |
| exit;; |
| |
| --help) |
| cat<<HelpEndOfFile |
| Usage: update-info [OPTION]... INFO_PATH/INFO_DIR_FILE |
| |
| It detects and inserts missing menu items into the info node file. |
| |
| Options: |
| -c create a new info node |
| --debug print debug information to standard error path |
| -d, --delete delete invalid menu items (ignore missing menu items) |
| -f do not load functions (file update-info.f) |
| --help print this help message and exit |
| -i, --interactive interactive mode prompts before inserting or removing |
| menu items |
| --version print current version and exit |
| Backup of the info node has a '.old' suffix added. This is a shell script. |
| Files: update-info.f -- contains functions (optional). |
| Environment Variables: COLUMNS, EDITOR, LINES, TMPDIR |
| Email bug reports to bug-texinfo@gnu.org. |
| HelpEndOfFile |
| exit;; |
| |
| [-+]*) echo "$0:$LINENO: \"$1\" is not a valid option">&2 |
| echo "$TRY_HELP_MSG">&2 |
| exit 2;; |
| *) break;; |
| esac |
| shift |
| done |
| |
| if test "$#" -lt "1"; then |
| echo "$0:$LINENO: Too few parameters">&2 |
| echo "$TRY_HELP_MSG">&2 |
| exit 2 |
| elif test "$#" -gt "1"; then |
| echo "$0:$LINENO: Too many parameters">&2 |
| echo "$TRY_HELP_MSG">&2 |
| exit 2 |
| fi |
| Info_Path="$1" |
| Info_Node=`basename "$Info_Path"` |
| if echo "$Info_Node"|grep ".*dir$">/dev/null; then |
| : |
| else |
| echo "$0:$LINENO: $Info_Node is not a valid info node name">&2 |
| exit 2 |
| fi |
| Info_Pathname=`dirname "$Info_Path"` |
| cd "$Info_Pathname"||exit |
| |
| BACKUP_MSG="Backed up $Info_Node to ${Info_Node}.old." |
| HANGUP_MSG="Hang up on \"update-info $ARGUMENTS\"" |
| INSERT_MSG="menu item(s) were inserted (not counting duplicates)." |
| INSERT_MSG2="total menu item(s) were inserted into `pwd`/$Info_Node" |
| DELETE_MSG="invalid menu item(s) were removed (not counting duplicates)." |
| DELETE_MSG2="total invalid menu item(s) were removed from `pwd`/$Info_Node" |
| |
| if test "$Create_Node"; then |
| if test "$Mode"; then |
| echo "$0:$LINENO: ERROR: Illogical option combination: -d -c">&2 |
| echo "$TRY_HELP_MSG">&2 |
| exit 2 |
| fi |
| if test -f "$Info_Node"; then |
| rm -f ${Info_Node}.old |
| mv "$Info_Node" "${Info_Node}.old" |
| echo "$BACKUP_MSG" |
| fi |
| echo "Creating new Info Node: `pwd`/$Info_Node" |
| cat>$Info_Node<<NodeEndOfFile||exit |
| |
| This is the file .../info/dir, which contains the topmost node of the |
| Info hierarchy. The first time you invoke Info you start off |
| looking at that node, which is (dir)Top. |
| |
| File: dir Node: Top This is the top of the INFO tree |
| This (the Directory node) gives a menu of major topics. |
| Typing "d" returns here, "q" exits, "?" lists all INFO commands, "h" |
| gives a primer for first-timers, "mTexinfo<Return>" visits Texinfo topic, |
| etc. |
| Or click mouse button 2 on a menu item or cross reference to select it. |
| --- PLEASE ADD DOCUMENTATION TO THIS TREE. (See INFO topic first.) --- |
| |
| * Menu: The list of major topics begins on the next line. |
| |
| NodeEndOfFile |
| else |
| if test ! -f "$Info_Node"; then |
| echo "$0:$LINENO: $Info_Node is irregular or nonexistant">&2 |
| exit 2 |
| elif test ! -r "$Info_Node"; then |
| echo "$0:$LINENO: $Info_Node is not readable">&2 |
| exit 2 |
| elif test ! -w "$Info_Node"; then |
| echo "$0:$LINENO: $Info_Node is not writeable">&2 |
| exit 2 |
| fi |
| fi |
| |
| if test "$Load_Functions" -a "$Interactive" -a -z "$Mode"; then |
| if FUNCTIONS_VERSION=`( update-info.f )`; then |
| if test `echo "$FUNCTIONS_VERSION"\ |
| |cut -d' ' -f5` = "@UPDATE_INFO_VERSION@"; then |
| echo "Loading functions..." |
| . update-info.f |
| else |
| echo "$0:$LINENO: wrong version of update-info.f">&2 |
| echo "(functions were not loaded)">&2 |
| fi |
| else |
| echo "(functions were not loaded)">&2 |
| fi |
| fi |
| |
| |
| trap ' eval "$Debug"; rm -f $TMP_FILE_LIST; exit ' 0 |
| if test "$Interactive"; then |
| if test ! -t "1"; then |
| echo "$0:$LINENO: Cannot run in interactive mode "\ |
| "standard out is redirected">&2 |
| exit 2 |
| fi |
| trap ' ' 2 3 |
| else |
| trap ' rm -f $TMP_FILE_LIST |
| echo "$0:$LINENO: received INT signal. All edits are canceled.">&2 |
| exit ' 2 |
| trap ' rm -f $TMP_FILE_LIST |
| echo "$0:$LINENO: received QUIT signal. All edits are canceled.">&2 |
| exit ' 3 |
| fi |
| if test -z "$Mode"; then |
| trap ' |
| if test "$Changed"; then |
| { |
| echo $HANGUP_MSG |
| @F_INSERT_MISSING@ |
| Inserts_Total=`wc -c<"$TMP_COUNT"` |
| echo $Inserts_Total $INSERT_MSG2 |
| }|mail "$LOGNAME" |
| fi |
| rm -f $TMP_FILE_LIST |
| exit ' 1 |
| else |
| trap ' |
| if test "$Changed"; then |
| { |
| echo $HANGUP_MSG |
| @F_DELETE_INVALID@ |
| Invalid_Total=`wc -l<"$TMP_SED"` |
| echo $Invalid_Total $DELETE_MSG2 |
| }|mail $LOGNAME |
| fi |
| rm -f $TMP_FILE_LIST |
| exit ' 1 |
| fi |
| |
| sed -e "1,/$MENU_BEGIN/d" -e "$MENU_FILTER1" -e "$MENU_FILTER2"<$Info_Node\ |
| |tee $TMP_MENU\ |
| |sed -n -e '/\* /{ |
| s/).*$//g |
| s/\.gz$// |
| s/\.info$// |
| s/^.*(//p |
| }'|sort -u>$TMP_FILE1 |
| ls -F|sed -e '/\/$/d' -e '/[-.][0-9]/d'\ |
| -e '/:$/d' -e '/^$/d' -e "/^${Info_Node}~\$/d"\ |
| -e "/^${Info_Node}\$/d" -e "/^${Info_Node}.old\$/d"\ |
| -e 's/\.gz$//' -e 's/\.info$//'|sort>$TMP_FILE2 |
| |
| if test -z "$Mode"; then |
| #Detect Missing |
| comm -13 $TMP_FILE1 $TMP_FILE2>$TMP_LIST |
| cat</dev/null>$TMP_COUNT |
| #get sections, initialize variables |
| sed -n -e "/$SECTION_TITLE/p" "$TMP_MENU">"$TMP_SECTIONS" |
| Item_Num=`wc -l<"$TMP_SECTIONS"|tr -d ' '` |
| Item_Status=`echo\ |
| |awk "BEGIN{for(i=1;i<=${Item_Num};i++)printf(\"_\n\")}"` |
| Item_Dir="$Item_Num" |
| for Info_Name in `cat $TMP_LIST` |
| do |
| if test -r "$Info_Name"; then |
| Info_File="$Info_Name" |
| elif test -r "${Info_Name}.info"; then |
| Info_File="${Info_Name}.info" |
| elif test -r "${Info_Name}.gz"; then |
| Info_File="${Info_Name}.gz" |
| elif test -r "${Info_Name}.info.gz"; then |
| Info_File="${Info_Name}.info.gz" |
| else |
| echo "$0:$LINENO: can't find info file for ${Info_Name}?">&2 |
| fi |
| #generate menu item |
| echo|tr -d '\012'>$TMP_FILE1 |
| eval $CAT_COMMAND "$Info_File"\ |
| |sed -n -e "/$DIR_SECTION/w $TMP_FILE1"\ |
| -e "/$ENTRY_START/,/$ENTRY_END/{ |
| $MENU_FILTER1 |
| p |
| }"|awk "BEGIN{Mode=0} |
| /^$/{if(Mode==1)exit} |
| /^([ ])+([^ ])+/{if(Mode==1)print} |
| /^[^ ]/{if(Mode==1)exit} |
| /${MENU_ITEM}${Info_Name}\)\./{if(Mode==0){Mode++ |
| print} |
| else |
| exit}">"$TMP_ITEM" |
| if test ! -s "$TMP_ITEM"; then |
| echo "* $Info_Name: ($Info_Name).">"$TMP_ITEM" |
| fi |
| Item_Status=`echo "$Item_Status"|sed -e '1,$s/^./_/'` |
| if test -s "$TMP_FILE1"; then |
| Item_Section=`sed -e "s/$DIR_SECTION[ ]*//"\ |
| <$TMP_FILE1` |
| else |
| Item_Section=`echo "Miscellaneous"` |
| fi |
| Size=`echo "$Item_Section"|wc -l|tr -d ' '` |
| # initialize variables, check for new sections |
| Num1=1 |
| while test "$Num1" -le "$Size" |
| do |
| Item=`echo "$Item_Section"|sed -n -e "${Num1}p"` |
| if Num=`grep -in "^$Item$" "$TMP_SECTIONS"`; then |
| Num=`echo "$Num"|sed -e 's/:.*$//g'` |
| ##F#Set_Item |
| set "$Num" "X" |
| @SET_ITEM@ |
| else |
| set "$Item" |
| @F_ADD_SECTION@ |
| fi |
| Num1=`expr "$Num1" + "1"` |
| done |
| if test "$Interactive"; then |
| echo "$Item_Section" |
| cat "$TMP_ITEM" |
| echo "add menu item for $Info_File? " |
| while true |
| do |
| echo "$PROMPT1"|tr -d '\012' |
| read Answer |
| case $Answer in |
| y) break;; |
| e) |
| if test "$FUNCTIONS"; then |
| Select_Sections |
| break |
| else |
| echo "Can't edit. "\ |
| "Functions are not loaded.">&2 |
| fi;; |
| Y) Interactive=""; break;; |
| n) continue 2;; |
| N) break 2;; |
| *) echo "\"$Answer\" "\ |
| "is an invalid response">&2;; |
| esac |
| done |
| fi |
| if echo "$Item_Status"|grep '^X'>/dev/null; then |
| # edit $TMP_MENU |
| |
| Changed="y" |
| ( |
| trap ' ' 1 2 3 |
| Tmp_Var=`echo "$Item_Status"|tr -d '\012'` |
| Key=`awk -F':' ' FNR==1{ print $1}' $TMP_ITEM` |
| # add new sections to 'dir' file |
| if test "$Item_Num" -gt "$Item_Dir"; then |
| if test "$Item_Dir" -ne "0"; then |
| sed -e "1,${Item_Dir}d" -e 'i\ |
| |
| ' "$TMP_SECTIONS">>"$TMP_MENU" |
| else |
| sed -e 'i\ |
| |
| ' "$TMP_SECTIONS">>"$TMP_MENU" |
| fi |
| fi |
| # awk determines the insertion points for each section |
| awk -F":" "function Insert(Line){ |
| if(Mode==2){ |
| Mode=1;if(substr(\"$Tmp_Var\",Item++,1)==\"X\") |
| print Line |
| } |
| } |
| BEGIN{Mode=1;Item=1} |
| /$SECTION_TITLE/{Insert(FNR-1);if(Mode>=1)Mode=2} |
| /${MENU_ITEM}.*\)\./{if(\$1>Item_Name)Insert(FNR-1)} |
| /^$/{Insert(FNR-1)} |
| END{Insert(FNR)}" Item_Name="$Key" "$TMP_MENU"\ |
| |sort -nr|sed -e "s%\$% r $TMP_ITEM%"|sed -e '$a\ |
| w |
| ' -e '$a\ |
| q |
| '|ed -s "$TMP_MENU" |
| echo "$Item_Status"|tr -cd "X">>$TMP_COUNT |
| ) |
| |
| Inserts=`expr "$Inserts" + "1"` |
| echo "$Info_File installed into section(s):"\ |
| |tr -d '\012' |
| echo "$Item_Status"|awk '/X/{printf(" %d", FNR)}' |
| echo |
| Item_Dir="$Item_Num" |
| else |
| echo "$Info_File not installed (no section selected)" |
| fi |
| done |
| # print summary |
| trap ' ' 1 2 3 |
| if test "$Changed"; then |
| @F_INSERT_MISSING@ |
| Inserts_Total=`wc -c<"$TMP_COUNT"|tr -d " "` |
| if test "$Inserts" -ne "$Inserts_Total"; then |
| echo "$Inserts $INSERT_MSG" |
| fi |
| echo "$Inserts_Total $INSERT_MSG2" |
| fi |
| else |
| # Detect Invalid |
| cat</dev/null>"$TMP_SED" |
| comm -23 $TMP_FILE1 $TMP_FILE2>$TMP_LIST |
| for Info_Name in `cat $TMP_LIST` |
| do |
| if test "$Interactive"; then |
| # display invalid menu item(s) |
| awk "BEGIN{Mode=1} |
| /^([ ])+([^ ])+/{if(Mode==2)print} |
| /^$/{if(Mode==2)Mode=1} |
| /$SECTION_TITLE/{Section=\$0} |
| /^[^ ]/{if(Mode==2)Mode=1} |
| /${MENU_ITEM}${Info_Name}\)\./{if(Mode==1){Mode++ |
| print Section |
| print}}" $TMP_MENU |
| echo "delete menu item for $Info_Name? " |
| while true |
| do |
| echo\ |
| "(y=yes, n=no, Y=yes to all, N=No to all):"\ |
| |tr -d '\012' |
| read Answer |
| case "$Answer" in |
| y) break;; |
| Y) Interactive=""; break;; |
| n) continue 2;; |
| N) break 2;; |
| *) echo "\"$Answer\" "\ |
| "is an invalid reponse">&2;; |
| esac |
| done |
| fi |
| # remove menu item from $TMP_MENU |
| Invalid=`expr "$Invalid" + "1"` |
| Changed="y" |
| ( |
| trap ' ' 1 2 3 |
| echo\ |
| "invalid menu item for $Info_Name removed from section(s):"\ |
| |tr -d '\012' |
| awk "function Delete(Last){ |
| printf(\"%d,%dd\n\",First,Last-1)>>\"$TMP_SED\"} |
| BEGIN{Mode=1;Section=0} |
| /^$/{if(Mode==2){Delete(FNR);Mode=1}} |
| /$SECTION_TITLE/{Section++} |
| /^[^ ]/{if(Mode==2){Delete(FNR);Mode=1}} |
| /${MENU_ITEM}${Info_Name}\)\./{if(Mode==1){ |
| First=FNR;printf(\" %d\",Section);Mode=2}} |
| END{if(Mode==2)Delete(FNR+1)}" $TMP_MENU |
| echo |
| ) |
| done |
| |
| # display a summary |
| trap ' ' 1 2 3 |
| if test "$Changed"; then |
| Invalid_Total=`wc -l<"$TMP_SED"|tr -d ' '` |
| @F_DELETE_INVALID@ |
| if test "$Invalid" -ne "$Invalid_Total"; then |
| echo "$Invalid $DELETE_MSG" |
| fi |
| echo "$Invalid_Total $DELETE_MSG2" |
| fi |
| fi |
| if test -z "$Changed"; then |
| echo "Nothing to do" |
| fi |
| rm -f $TMP_FILE_LIST |
| eval "$Debug" |
| exit 0 |
| # _file: 'update-info.f'_ |
| #update-info.f (GNU texinfo @TEXINFO_VERSION@) @UPDATE_INFO_VERSION@ |
| #Copyright (C) 1997 Free Software Foundation, Inc. |
| #update-info comes with NO WARRANTY, to the extent permitted by law. |
| #You may redistribute copies of update-info |
| #under the terms of the GNU General Public License. |
| #For more information about these matters, see the files named COPYING." |
| #Author: Richard L. Hawes |
| |
| # update-info.f functions for update-info |
| |
| # ###SECTION 1### functions used to insert missing menu items |
| |
| Set_Item (){ |
| # set item status |
| @SET_ITEM@ |
| } |
| |
| Add_Section (){ |
| # add a section |
| @F_ADD_SECTION@ |
| } |
| |
| # ###SECTION 2### functions for menu selection of sections |
| |
| Print (){ |
| # print a line without a linefeed |
| echo "$*"|tr -d '\012' |
| } |
| |
| Get_Answer (){ |
| # get an answer to question |
| _gs_Valid="$1" |
| _gs_Prompt="$2" |
| set -f |
| Answer="" |
| while test -z "$Answer" |
| do |
| Print "$_gs_Prompt" |
| if read Answer; then |
| : |
| else |
| Answer="$CONTROL_D" |
| echo |
| fi |
| if expr "$Answer" : "[$_gs_Valid]$">/dev/null; then |
| : |
| else |
| Print "\"$Answer\" is not a valid response! --">&2 |
| Answer="" |
| fi |
| done |
| set +f |
| } |
| |
| Do_Previous (){ |
| # go to previous screen |
| if test "$Previous"; then |
| Next="$Top_Item" |
| Top_Item="$Previous" |
| if Previous=`expr "$Top_Item" - "$DISPLAY_NUM"`; then |
| if test "$Previous" -le "0"; then |
| Previous="" |
| fi |
| else |
| Previous="" |
| fi |
| elif test "$Next"; then |
| Last_Page |
| else |
| Print "There is no previous page. ">&2 |
| fi |
| } |
| |
| Do_Next (){ |
| # process go to next |
| if test "$Next"; then |
| Previous="$Top_Item" |
| Top_Item="$Next" |
| Set_Next |
| elif test "$Previous"; then |
| Top_Item="1" |
| Previous="" |
| Set_Next |
| else |
| Print "There is no next page. ">&2 |
| fi |
| } |
| |
| Do_Add_Section (){ |
| # process add section command |
| echo |
| echo "Please enter the name of the new section:" |
| if read Answer; then |
| Answer=`echo "$Answer"\ |
| |sed -e 's/^\([ ]\)\{1,\}//g' -e "$MENU_FILTER2"` |
| if test "$Answer"; then |
| Add_Section "$Answer" |
| Last_Page |
| clear |
| fi |
| else |
| Answer="" |
| fi |
| if test -z "$Answer"; then |
| clear |
| Print "no section added. " |
| fi |
| } |
| |
| Do_Edit (){ |
| # process edit item command |
| if test -t "2"; then |
| _de_Done="" |
| cp "$TMP_ITEM" "$TMP_FILE1" |
| while test -z "$_de_Done" |
| do |
| eval $EDITOR "$TMP_FILE1" |
| clear |
| _de_Done="t" |
| if sed -n -e "$MENU_FILTER1" -e '1p' "$TMP_FILE1"\ |
| |egrep "${MENU_ITEM}${Info_Name}\)\.">/dev/null; then |
| : |
| else |
| sed -n -e '1p' "$TMP_FILE1" |
| echo "Pattern mismatch: `echo\ |
| "/${MENU_ITEM}${Info_Name}\)\./"\ |
| |tr -d "\011"`">&2 |
| echo |
| _de_Done="" |
| fi |
| if sed -n -e '2,$p' "$TMP_FILE1"|grep '^[^ ]'>&2; then |
| echo "These lines must have leading spaces">&2 |
| echo |
| _de_Done="" |
| fi |
| if test -z "$_de_Done"; then |
| Get_Answer "yn" "Invalid entry, cancel edits? (y or n):" |
| if test "y" = "$Answer"; then |
| clear |
| Print "Canceling edits -- invalid entry ">&2 |
| _de_Done="t" |
| fi |
| else |
| sed -e "$MENU_FILTER1" -e "$MENU_FILTER2" -e '/^$/d'\ |
| <"$TMP_FILE1">"$TMP_ITEM" |
| fi |
| done |
| else |
| Print "editor cannot run with error path redirected " |
| fi |
| } |
| |
| Do_Number (){ |
| # process number |
| _dn_Num="$1" |
| if test "$_dn_Num" -ge 1 -a "$_dn_Num" -le "$Item_Num"; then |
| if test `echo "$Item_Status"|sed -n -e "${_dn_Num}p"` = "_"; then |
| Set_Item "$_dn_Num" "X" |
| else |
| Set_Item "$_dn_Num" "_" |
| fi |
| else |
| Print "\"$_dn_Num\" is an invalid section number. ">&2 |
| fi |
| } |
| |
| Do_Help (){ |
| # process menu help |
| echo |
| echo "\ |
| Enter the following commands seperated |
| by spaces and terminated by<ENTER>: |
| # : (section number) toggle section |
| a : add a new section |
| e : edit item -- changes will not be |
| accepted if you change the |
| '(info_file_name).' or delete |
| the key parts: '*' 'Menu Name' ':' |
| h : get this help screen |
| n : next page |
| p : previous page |
| q : quit and do not put into menu |
| s : save and put into menu" |
| Print "Press enter to continue:" |
| read junk |
| clear |
| } |
| |
| Set_Next (){ |
| # determine value of Next |
| Next=`expr "$DISPLAY_NUM" + "$Top_Item"` |
| if test "$Next" -gt "$Item_Num"; then |
| Next="" |
| fi |
| } |
| |
| Last_Page (){ |
| # go to last page of menu |
| Top_Item=`echo|awk "BEGIN{printf(\"%d\", |
| int((${Item_Num}-1)/${DISPLAY_NUM})*${DISPLAY_NUM}+1)}"` |
| if test "$Top_Item" -gt "$DISPLAY_NUM"; then |
| Previous=`expr "$Top_Item" '-' "$DISPLAY_NUM"` |
| else |
| Previous="" |
| fi |
| Set_Next |
| } |
| |
| Select_Sections (){ |
| # prompt user for which sections |
| set -f |
| Top_Item="1" |
| Previous="" |
| Set_Next |
| clear |
| echo "Default sections are selected." |
| Done="" |
| while test -z "$Done" |
| do |
| awk "FNR==1{printf(\"%s\n\", substr(\$0,1,${COLUMNS}))}" $TMP_ITEM |
| Tmp_Var=`echo "$Item_Status"|tr -d '\012'` |
| awk "BEGIN{Max=$Top_Item+$DISPLAY_NUM} |
| FNR>=$Top_Item{if(FNR>=Max)exit |
| printf(\"%2d:%s %s\n\",FNR,substr(\"$Tmp_Var\",FNR,1), |
| substr(\$0,1,${COLUMNS}-5))}" "$TMP_SECTIONS" |
| echo "Enter 1-${Item_Num}, add, edit, help," |
| if test "$Previous" -o "$Next"; then |
| Print "next, previous, " |
| fi |
| Print "quit, save :" |
| read Command_List||Command_List="$CONTROL_D" |
| Command_List=`echo "$Command_List"\ |
| |tr '\011' ' '|tr ' ' '\012'|sed -e "/^$/d"` |
| clear |
| if test -z "$Command_List"; then |
| Help="y" |
| else |
| Help="" |
| fi |
| while test "$Command_List" |
| do |
| Command=`echo "$Command_List"|sed -n -e '1p'` |
| Command_List=`echo "$Command_List"|sed -e '1d'` |
| case "$Command" in |
| [0-9]|[0-9][0-9]) Do_Number "$Command";; |
| n*) Do_Next;; |
| p*) Do_Previous;; |
| a*) Do_Add_Section;; |
| e*) Do_Edit; break;; |
| h*) Help="y";; |
| s*) Done="s"; break;; |
| q*) Done="q" |
| Item_Status=`echo "$Item_Status"|sed -e '1,$s/^./_/'` |
| break;; |
| *) Print "$Command is not a valid command. ">&2 |
| Help="y";; |
| esac |
| done |
| if test "$Help"; then |
| Do_Help |
| fi |
| echo |
| done |
| set +f |
| # if new sections added, remove unused ones |
| if test "$Item_Num" -gt "$Item_Dir"; then |
| Tmp_Var=`echo "$Item_Status"|awk "FNR>$Item_Dir{ |
| if(\\$0==\"_\")printf(\"%d\n\", FNR)}"` |
| if test "$Tmp_Var"; then |
| Tmp_Var1=`echo "$Tmp_Var"|sed -e 's/$/d/'` |
| sed -e "$Tmp_Var1" "$TMP_SECTIONS">$TMP_FILE1 |
| cp $TMP_FILE1 "$TMP_SECTIONS" |
| Item_Status=`echo "$Item_Status"|sed -e "$Tmp_Var1"` |
| Tmp_Var="" |
| Tmp_Var1="" |
| Item_Num=`wc -l<"$TMP_SECTIONS"|tr -d ' '` |
| fi |
| fi |
| } |
| |
| # ###SECTION 100### Constants that redefine |
| PROMPT1="(y=yes, e=edit, Y=yes to all, n=no, N=No to all):" |
| FUNCTIONS="y" |
| # |
| echo "update-info.f (GNU texinfo @TEXINFO_VERSION@) @UPDATE_INFO_VERSION@" |