d8b5c7ed06
This has big improvements to the .info file utility support and much recent OSS requires its features.
876 lines
22 KiB
Bash
Executable File
876 lines
22 KiB
Bash
Executable File
#!/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@"
|