You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

261 lines
7.7 KiB

#!@l_prefix@/bin/bash
##
## mkcatalog - script for managing SGML catalog file
## Created: 20001015 Shigeyuki Fukushima <shige@FreeBSD.org>.
## Modified: 20001019 Hiroki Sato <hrs@FreeBSD.org>.
##
sh_basename () {
l_value=$1
IFS_old=${IFS}; IFS=" /"; set -- ${l_value}; IFS=${IFS_old}
case $# in
0) ;;
*) echo `eval echo \\$$#` ;;
esac
}
sh_dirname () {
l_value=$1
IFS_old=${IFS}; IFS=" /"; set -- ${l_value}; IFS=${IFS_old}
l_dirname=$1
shift
while
case $# in
0) break ;;
1) echo ${l_dirname}; break ;;
*) ;;
esac
do
l_dirname="${l_dirname}/$1";
shift;
done
}
norm_dir () {
[ -d "$1" ] && echo `exec 2>/dev/null; cd $1; echo ${PWD}`
}
verbose_msg () {
case ${F_VERBOSE} in
1) echo " ===> $*" ;;
*) ;;
esac
}
PREFIX=@l_prefix@
TMPDIR=/tmp
ARGV0=`sh_basename $0`
CAT_DIR=${PREFIX}/share/sgml
CAT_FILE=catalog
F_PRESERVE_OLD=""
F_VERBOSE=""
args=`getopt pqvc: $*` ; set -- $args
for i
do
case "$i" in
-c) CAT_DIR=`sh_dirname $2`; CAT_FILE=`sh_basename $2`; shift; shift ;;
-p) F_PRESERVE_OLD=1; shift ;;
-q) exec 1>/dev/null 2>&1; shift ;;
-v) F_VERBOSE=1; shift ;;
--) shift; break ;;
esac
done
dtd_act=$1
dtd_dir=$2
dtd_catalog=`sh_basename "$3"`
# option check and normalize ${dtd_dir}
case "${dtd_act}" in
add|install|delete|deinstall|enable|disable)
if [ ! -d "${CAT_DIR}" ]; then
echo "${ARGV0}: top-level catalog dir \"${CAT_DIR}\" not found."
exit 1
elif [ ! -n "${dtd_dir}" ]; then
echo "${ARGV0}: DTD directory is not specified."
exit 1
elif [ ! -d "${CAT_DIR}/${dtd_dir}"\
-a ! -d "${dtd_dir}" ]; then
echo "${ARGV0}: DTD directory \"${dtd_dir}\" not found."
exit 1
elif [ ! -f "${CAT_DIR}/${dtd_dir}/${dtd_catalog:-catalog}"\
-a ! -f "${dtd_dir}/${dtd_catalog:-catalog}" ]; then
echo "${ARGV0}: DTD catalog \"${dtd_dir}/${dtd_catalog:-catalog}\" not found."
exit 1
fi
verbose_msg "top-level catalog dir (specified): ${CAT_DIR}"
CAT_DIR=`norm_dir ${CAT_DIR}`
verbose_msg "top-level catalog dir (normalized): ${CAT_DIR}"
verbose_msg "target catalog dir (specified): ${dtd_dir}"
dtd_dir=`norm_dir ${CAT_DIR}/${dtd_dir} || norm_dir ${dtd_dir}`
verbose_msg "target catalog dir (normalized): ${dtd_dir}"
case "${dtd_dir}" in
${CAT_DIR}/*) ;;
*) echo "${ARGV0}: DTD directory \"${dtd_dir}\" is invalid."
exit 1 ;;
esac
# keep dtd_dir relative
dtd_dir=${dtd_dir#"${CAT_DIR}/"}
;;
*)
echo "${ARGV0}: missing options."
cat <<EOF
Usage: ${ARGV0} [-c toplv-catalog-filename] [-pqv]
[install|add|deinstall|delete|enable|disable]
dtd-directory-name [catalog-filename]
-c filename specifies top-level catalog file
(default: ${PREFIX}/share/sgml/catalog)
-p preserve old catalog file (as .old)
-q quiet mode
-v verbose mode (for debug)
ex.) mkcatalog install html/4.0
mkcatalog -c /home/foo/sgml/catalog install html/4.0/my_ext html_catalog
EOF
exit 1
;;
esac
echo "* top-level catalog: ${CAT_DIR}/${CAT_FILE}"
verbose_msg "action: ${dtd_act}"
verbose_msg "target catalog dir: ${dtd_dir}"
verbose_msg "target catalog file: ${dtd_catalog:-catalog}"
echo "* attempt to ${dtd_act} catalog in ${dtd_dir}"
TMPCAT=/tmp/catalog.$$
proc_catalog () {
l_bottom_p=$1 # allow to delete upper catalog?
l_upper=$2 # dirname of upper catalog
l_lower=$3 # dirname of lower catalog
case ${first_p} in
[Yy][Ee][Ss]) catalog=${dtd_catalog:-"catalog"} ;;
*) catalog=${CAT_FILE} ;;
esac
# l_upper_cat -> relative path from ${CAT_DIR}
# l_lower_cat -> relative path from l_upper
l_upper_cat="${l_upper}/${CAT_FILE}"
l_lower_cat="`sh_basename ${l_lower}`/${catalog}"
# l_*_abs_* -> absolute path respectively
l_upper_abs="${CAT_DIR}/${l_upper}"
l_lower_abs="${CAT_DIR}/${l_lower}"
l_upper_abs_cat="${CAT_DIR}/${l_upper}/${CAT_FILE}"
l_lower_abs_cat="${CAT_DIR}/${l_lower}/${catalog}"
l_cat_line="CATALOG \"${l_lower_cat}\""
l_abs_path_head=`cd ${l_upper_abs}; echo ${PWD}`
# first, create temporary catalog from l_upper_cat
# not including CATALOG line of l_lower_cat (if no catalog,
# create empty one).
#
# NOTE: file manipulations require absolute path, but
# CATALOG line do relative from upper's one.
#
touch ${l_upper_abs_cat} || exit 1
grep -v "\( *-- *\)\?CATALOG *\"\(${l_abs_path_head}/\)\?${l_lower_cat}\"\( *-- *\)\?" \
${l_upper_abs_cat} >${TMPCAT}
# preserve old catalog as necessary
if [ "x${F_PRESERVE_OLD}" != "x" ]; then
cp ${l_upper_abs_cat} ${l_upper_abs_cat}.old || exit 1
fi
case "${dtd_act}" in
add|install|enable)
# if "install or add or enable",
# create "the temporary catalog + l_cat_line" and install it.
echo " - ${dtd_act} ${l_cat_line} line in ${l_upper_cat}"
echo "${l_cat_line}" >>${TMPCAT}
cp ${TMPCAT} ${l_upper_abs_cat} || exit 1
;;
disable)
# if "disable", install the same above but l_cat_line is
# commented out.
case ${first_p} in
[Yy][Ee][Ss])
echo " - ${dtd_act} ${l_cat_line} line in ${l_upper_cat}"
echo "-- ${l_cat_line} --" >>${TMPCAT}
cp ${TMPCAT} ${l_upper_abs_cat} || exit 1
;;
*) rm -f ${TMPCAT}
exit 0
;;
esac
;;
delete|deinstall)
# if "deinstall or delete" install the temporary catalog
# ${l_bottom_p}=YES means that
# ${l_upper_cat} can be deleted safely, otherwise not.
case ${l_bottom_p} in
[Yy][Ee][Ss])
echo " - ${dtd_act} ${l_cat_line} line from ${l_upper_cat}"
cp ${TMPCAT} ${l_upper_abs_cat} || exit 1
;;
*) rm -f ${TMPCAT}
exit 0
;;
esac
;;
esac
# when flag "preserve old" is specified but
# there is no difference between new file and old one,
# preservation is silently denied.
if [ "x${F_PRESERVE_OLD}" != "x" ] && \
cmp -s ${l_upper_abs_cat}.old ${l_upper_abs_cat}; then
rm -f ${l_upper_abs_cat}.old
fi
rm -f ${TMPCAT}
}
compose_dir_list () {
l_dir=$1
# Creates dirlist such as the following.
# input: docbook/4.1/my_extension
# return: docbook/4.1/my_extension docbook/4.1 docbook
IFS_old=${IFS}; IFS=" /"; set -- ${l_dir}
l_dir_top=$1
shift
l_dir_rest="$*"
IFS=${IFS_old}
l_dir_item=${l_dir_top}
l_dir_list=${l_dir_top}
for i in ${l_dir_rest}; do
l_dir_item="${l_dir_item}/${i}"
l_dir_list="${l_dir_item} ${l_dir_list}"
done
echo ${l_dir_list}
}
bottom_p=YES
first_p=YES
set -- `compose_dir_list ${dtd_dir}` .
verbose_msg "process catalog (relative to top one): $*"
while
case $# in
1) break ;;
*) ;;
esac
do
lower=$1
upper=$2
proc_catalog "${bottom_p}" "${upper}" "${lower}"
first_p=NO
if [ -f ${CAT_DIR}/${upper}/${CAT_FILE} ]; then
bottom_p=NO
fi
shift
done
exit 0