#! /bin/bash
#
# Copyright 2000 Peter Ganten
#
# This library is free software; you can redistribute it and/or
# modify it under the terms of the GNU Lesser General Public
# License as published by the Free Software Foundation; either
# version 2.1 of the License, or (at your option) any later version.
#
# This library 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
# Lesser General Public License for more details.
#
# You should have received a copy of the GNU Lesser General Public
# License along with this library; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
#

# default settings
TMPDIR=/tmp/fconv.$$;
if [ -f `which mktemp` ]; then
  TFILE=`mktemp -q /tmp/fconv.XXXXXX`
else
  TFILE=`tempfile`;
fi

# Where the fnt2bdf utility resides
FC=`which fnt2bdf`;
if [ -z "$FC" ]; then FC=$HOME""/wine/tools/fnt2bdf; fi;

# which OEM_CHARSET to use
CHARSET="winsys";
TARGET=/usr/X11R6/lib/X11/fonts/misc;
BDFTOPCF=/usr/X11R6/bin/bdftopcf;
PAT="*.fon";
Q="";
OLDPWD=`pwd`;

usage () {
    echo "usage: "`basename $0`" [-q] [-c charset] [-t fontdir] [-b bdftopcf] [-f fnt2bdf]"
    echo "       [-p pattern] windir"
    echo
    echo "this utility scans a directory and its subdirectories for bitmap-fonts"
    echo "in Windows format, converts them to PCF-fons and installs them. If X"
    echo "is running, the X fontpath is re-adjusted."
    echo
    echo "options:"
    echo " -q          quit operation."
    echo " -c charset  charset name for OEM_CHARSET fonts, default: $CHARSET"
    echo " -t fontdir  directory to install the converted fonts in. This"
    echo "             directory should be a known fontdirectory to X, default:"
    echo "             $TARGET";
    echo " -b bdftopcf name of the program to call for bdf to pcf conversion,"
    echo "             default: $BDFTOPCF";
    echo " -f fnt2bdf  name of the program to call for winfont to bdf conversion,"
    echo "             default: $FC"
    echo " -p pattern  Shell-Pattern of the filenames to look for. By default, the"
    echo "             utility will look for the pattern "$PAT" (case insensitive)."
    echo " windir      base directory to search."
    exit 1;
}


while [ "$1" ]; do
    case $1 in
	-c ) shift; if [ "$1" ]; then CHARSET=$1; shift; else usage; fi; ;;
	-t ) shift; if [ "$1" ]; then TARGET=$1; shift; else usage; fi; ;;
	-b ) shift; if [ "$1" ]; then BDFTOPCF=$1; shift; else usage; fi; ;;
	-f ) shift; if [ "$1" ]; then FC=$1; shift; else usage; fi; ;;
	-p ) shift; if [ "$1" ]; then PAT=$1; shift; else usage; fi; ;;
        -q ) shift; Q=":"; ;;
	-* ) usage; ;;
	* ) if [ "$WIND" ]; then usage; else WIND=$1; shift; fi; ;;
    esac;
done;

if [ ! "$WIND" ]; then usage; fi;
if [ ! -d "$WIND" ]; then $Q echo "$WIND is not a directory"; exit 1; fi;
if [ ! -d "$TARGET" ]; then $Q echo "$TARGET is not a directory"; exit 1; fi;
type -p $BDFTOPCF 1>/dev/null || { $Q echo "Can 't execute $BDFTOPCF"; exit 1; }
type -p $FC 1>/dev/null || { $Q echo "Can't execute $FC"; exit 1; }

$Q echo -n "looking for bitmap fonts (\"$PAT\") in directory \"$WIND\"... ";
FONTS=`find $WIND -iname "$PAT" 1>$TFILE 2>/dev/null`;
if [ $? -ne 0 ]; then
    $Q echo "$PAT is a invalid search expression"; exit 1;
fi;
i=0;

{ while read dummy; do FONTS[$i]="$dummy"; i=$[$i+1]; done; } < $TFILE
rm $TFILE;
$Q echo "done."

if [ -z "$FONTS" ]; then $Q echo "Can't find any fonts in $WIND"; exit 1; fi;

mkdir "$TMPDIR"
for i in "${FONTS[@]}"; do cp $i $TMPDIR; done
cd "$TMPDIR"

for i in "${FONTS[@]}"; do
    FNT=`basename "$i"`; FNT=${FNT%.???};
    $Q echo "converting $i";
    if [ "$Q" ]; then
	$FC -c $CHARSET -f $FNT "$i" 2>/dev/null;
    else
	$FC -c $CHARSET -f $FNT "$i";
    fi;
done;

for i in *.bdf; do
    if [ "$i" = "*.bdf" ]; then
       echo "No fonts extracted"; rm -rf "$TMPDIR"; exit 0; 
    fi;
    bdftopcf "$i" | gzip -c > ${i%.???}.pcf.gz;
    $Q echo "installing ${i%.???}.pcfi.gz";
    mv "${i%.???}.pcf.gz" $TARGET 2>/dev/null
    if [ $? -ne 0 ]; then
	$Q echo "Can't install fonts to $TARGET. Try again as the root user.";
        $Q echo "Cleaning up..."; cd "$OLDPWD"; rm -rf "$TMPDIR"; exit 1;
    fi;
    rm "$i";
done;

cd $TARGET;
$Q echo "running mkfontdir";
if [ "$Q" ]; then
    mkfontdir 1>/dev/null 2>/dev/null;
else
    mkfontdir
fi;
rm -rf "$TMPDIR"

if [ "$DISPLAY" ]; then $Q echo "adjusting X font database"; xset fp rehash; fi;
