Import the remaining utilities.
[utils/utils.git] / ftx
diff --git a/ftx b/ftx
new file mode 100755 (executable)
index 0000000..7442776
--- /dev/null
+++ b/ftx
@@ -0,0 +1,50 @@
+#!/bin/bash
+# ftx <file>: file tree extract
+set -e
+
+function skip {
+       read -n $1 trash
+}
+
+function ftx_sub {
+       if [ -h "$1" ] || [ -a "$1" ]; then
+               echo "File already exists!" 1>&2
+               return 1
+       fi
+       read -n 1 type
+       case $type in
+       f|x)
+               skip 1 # space
+               read length
+               head -c "$length" >"$1"
+               if [ $type == x ]; then
+                       setexec + "$1"
+               fi
+               skip 1 # newline
+               ;;
+       {)
+               skip 1 # newline
+               mkdir -- "$1"
+               (
+               cd -- "$1"
+               while read -n 1 what && [ $what == '+' ]; do
+                       skip 1 # space
+                       read -d ' ' length
+                       read -d '' -n $length name
+                       skip 1 # space
+                       ftx_sub "$name"
+               done
+               skip 1 # newline
+               )
+               ;;
+       l)
+               skip 1 # space
+               read -d ' ' length
+               read -d '' -n $length target
+               skip 1 # newline
+               ln -s -- "$target" "$1"
+               ;;
+       esac
+}
+
+ftx_sub "$1"