summaryrefslogtreecommitdiffstats
path: root/src/vfs/extfs/helpers/hp48+.in
diff options
context:
space:
mode:
Diffstat (limited to 'src/vfs/extfs/helpers/hp48+.in')
-rw-r--r--src/vfs/extfs/helpers/hp48+.in132
1 files changed, 132 insertions, 0 deletions
diff --git a/src/vfs/extfs/helpers/hp48+.in b/src/vfs/extfs/helpers/hp48+.in
new file mode 100644
index 0000000..17c03ab
--- /dev/null
+++ b/src/vfs/extfs/helpers/hp48+.in
@@ -0,0 +1,132 @@
+#!/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=${MC_TEST_EXTFS_LIST_CMD:-"kermit -l /dev/ttyS1 -b 9600"}
+
+NOW=`date +"%m-%d-%Y %H:%M"`
+
+hp48_cmd()
+{
+$KERMIT -C "SET EXIT WARNING OFF,REMOTE $1,QUIT"
+}
+
+hp48_cd()
+{
+(echo SET EXIT WARNING OFF;echo REMOTE HOST HOME
+for HP48_DIR in `echo "$1" | tr '/' ' '`;do
+ if [ "x$HP48_DIR" != "x." ];then echo REMOTE HOST "$HP48_DIR"; fi
+done
+echo QUIT)| $KERMIT -B >/dev/null
+}
+
+#
+# Parses the reply to the DIRECTORY command.
+#
+# Here's an example reply (taken from [1][2]):
+#
+# { HOME } 105617
+# STRAY 185.5 Directory 29225
+# YEN 30.5 Program 53391
+# JYTLIGHT 21848.5 String 62692
+# IOPAR 37.5 List 61074
+#
+# The meaning of the fields (according to [3][4]):
+#
+# { Current_directory } Free_space
+# Object_name Object_size_bytes Object_type Object_CRC
+# ...
+#
+# [1] http://newarea48.tripod.com/kermit.html
+# [2] http://www.hpmuseum.org/forum/thread-4684.html
+# [3] https://groups.google.com/d/msg/comp.sys.hp48/bYTCu9K3k20/YWQfF--W3EEJ
+# [4] http://www.columbia.edu/kermit/hp48.html (also has a link to the HP's user manual).
+#
+hp48_parser()
+{
+HP48_DIRS=
+
+read -r INPUT
+while [ "x$INPUT" != "xEOF" ]
+do
+ set -- $INPUT
+
+ obj_name=$1
+ obj_size=$2
+ obj_type=$3
+
+ obj_size=`echo $obj_size | $AWK '{ print int($0) }'` # Truncates floats to ints; anything else to "0".
+
+ if [ "$obj_size" != "0" ]; then # Skips the 1st reply line (purportedly there aren't zero-size files b/c, according to resource [4], the size is "including name").
+ case "$obj_type" in
+ Directory)
+ HP48_DIRS="$HP48_DIRS $obj_name"
+ printf "%crwxr-xr-x 1 %-8d %-8d %8d %s %s\n" 'd' \
+ 0 0 $obj_size "$NOW" "$HP48_CDIR/$obj_name"
+ ;;
+ *)
+ printf "%crw-r--r-- 1 %-8d %-8d %8d %s %s\n" '-' \
+ 0 0 $obj_size "$NOW" "$HP48_CDIR/$obj_name"
+ ;;
+ esac
+ fi
+
+ read -r 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()
+{
+# It's hard to see why this "EOF" thing is needed. The loop above can be changed to "while read -r obj_name ...". @TODO.
+{ 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