876 lines
22 KiB
Plaintext
876 lines
22 KiB
Plaintext
|
#!/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@prep.ai.mit.edu.
|
|||
|
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@"
|