#!/bin/sh
#
# Written by Christofer Edvardsen <ce@earthling.net>, Feb 1998
#
# This script makes it possible to view and copy files to/from a hp48
# (tested with a HP48G and the emulator x48)
#
# To use the hp48 external filesystem:
#      - read the relevant parts of your HP48 manual
#      - install kermit
#      - connect the HP48 to your computer or start x48
#      - below change the line which reflects the serial device you use
#      - configure your HP48 (<left shift> - i/o - iopar): 
#        port: wire
#        baud: 9600 
#        transfer format: binary (fast transfers) or
#                         ascii (editable on the pc)
#      - start the server on the HP48: <left shift> - i/o - srvr - serve
#        or the shortcut <right shift> - <right arrow>
#      - on MC's commandline enter "cd hp48:"
#
# Make sure you have kermit installed and that it's using the right serial
# device by changing /dev/ttyXX on the next line
AWK=awk
KERMIT="kermit -l /dev/ttyS1 -b 9600"

hp48_cmd()
{
$KERMIT -C "SET EXIT WARNING OFF,REMOTE $*,QUIT"
}

hp48_cd()
{
(echo SET EXIT WARNING OFF;echo REMOTE HOST HOME
for HP48_DIR in `echo $*|tr '/' ' '`;do
 if [ "$HP48_DIR" != "." ];then echo REMOTE HOST $HP48_DIR;fi
done
echo QUIT)| $KERMIT -B >/dev/null
}

hp48_retdir()
{
echo $1
}

hp48_retsize()
{
printf "%d" $2 2>/dev/null
}

hp48_parser()
{
HP48_DIRS=
read INPUT
while [ "$INPUT" != "EOF" ]
do
    case `echo $INPUT | @AWK@ '{if (int($2)) if ($3=="Directory") print "dir";else print "file"}'` in
    dir) HP48_DIRS="$HP48_DIRS `hp48_retdir $INPUT`"
    printf "drwxr-xr-x   1 %-8d %-8d %8d %s %s\n" 0 0 `hp48_retsize $INPUT` "`date +\"%b %d %Y %k:%M"`" "$HP48_CDIR/`hp48_retdir $INPUT`";;
    file) printf "-rw-r--r--   1 %-8d %-8d %8d %s %s\n" 0 0 `hp48_retsize $INPUT` "`date +"%b %d %Y %k:%M"`" "$HP48_CDIR/`hp48_retdir $INPUT`";;
    esac
    read INPUT
done
for HP48_DIR in $HP48_DIRS;do 
 HP48_PDIR=$HP48_CDIR
 HP48_CDIR=$HP48_CDIR/$HP48_DIR; hp48_cmd HOST $HP48_DIR >/dev/null
 hp48_list
 HP48_CDIR=$HP48_PDIR; hp48_cmd HOST UPDIR >/dev/null
done
}

hp48_list()
{
(hp48_cmd DIRECTORY;echo;echo EOF)|hp48_parser
}

# override any locale for dates
LC_ALL=C
export LC_ALL

case $1 in
list) HP48_CDIR=
    hp48_cmd HOST HOME >/dev/null
    hp48_list
    exit 0;;
copyout)
    cd `dirname $4`
    hp48_cd `dirname $3`
    $KERMIT -B -g `basename $3` -a $4 >/dev/null
    exit 0;;
copyin) 
    cd `dirname $4`
    hp48_cd `dirname $3`
    $KERMIT -B -s $4 -a `basename $3` >/dev/null
    exit 0;;
esac
exit 1
