summaryrefslogtreecommitdiffstats
path: root/src/vfs/extfs/helpers/hp48+.in
blob: 17c03abca48cf16e64c68de8a53f6281b518ca1f (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
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