replace with NUL-safe variants; document limitation
authorThorsten Glaser <tg@mirbsd.org>
Thu, 9 Jun 2011 21:34:57 +0000 (23:34 +0200)
committerThorsten Glaser <tg@mirbsd.org>
Thu, 9 Jun 2011 21:34:57 +0000 (23:34 +0200)
essentially equivalent commands (for most of ASCII) are:
hexdump -e '"%08.8_ax  " 8/1 "%02X " " - " 8/1 "%02X "' -e '"  |" "%_p"' -e '"|\n"' "$@"
hexdump -e '"%08.8_ax  " 4/1 "%04X " " - " 4/1 "%04X "' -e '"  |" "%_p"' -e '"|\n"' "$@"

mksh/hexdump
mksh/hexnump
mksh/hexudump
mksh/hexunump

index f3873b0..8a05392 100644 (file)
 # of said person’s immediate fault when using the work as intended.
 #-
 # hexdump, not NUL byte safe
+# needs input terminated with a trailing newline, as per POSIX files
 
 typeset -Uui16 -Z11 pos=0
 typeset -Uui16 -Z5 hv
-typeset -i1 wc=0x0A
 dasc=
-nl=${wc#1#}
-while IFS= read -r line; do
-       line=$line$nl
-       while [[ -n $line ]]; do
-               hv=1#${line::1}
+while read -ar line; do
+       typeset -i1 line
+       line[${#line[*]}]=10
+       i=0
+       while (( i < ${#line[*]} )); do
+               hv=${line[i++]}
                if (( (pos & 15) == 0 )); then
                        (( pos )) && print "$dasc|"
                        print -n "${pos#16#}  "
@@ -38,10 +39,9 @@ while IFS= read -r line; do
                if (( (hv < 32) || (hv > 126) )); then
                        dasc=$dasc.
                else
-                       dasc=$dasc${line::1}
+                       dasc=$dasc${line[i-1]#1#}
                fi
                (( (pos++ & 15) == 7 )) && print -n -- '- '
-               line=${line:1}
        done
 done
 while (( pos & 15 )); do
index f3873b0..4290562 100644 (file)
@@ -19,6 +19,7 @@
 # of said person’s immediate fault when using the work as intended.
 #-
 # hexdump, not NUL byte safe
+# needs input terminated with a trailing newline, as per POSIX files
 
 typeset -Uui16 -Z11 pos=0
 typeset -Uui16 -Z5 hv
index 8f64956..6526029 100644 (file)
 # of said person’s immediate fault when using the work as intended.
 #-
 # hexdump, not NUL byte safe, Unicode (UCS-2, OPTU-16) output
+# needs input terminated with a trailing newline, as per POSIX files
 
 typeset -Uui16 -Z11 pos=0
 typeset -Uui16 -Z7 hv
-typeset -i1 wc=0x0A
-typeset -i lpos
 dasc=
-nl=${wc#1#}
-while IFS= read -r line; do
-       line=$line$nl
-       lpos=0
-       while (( lpos < ${#line} )); do
-               wc=1#${line:(lpos++):1}
-               if (( (wc < 32) || \
-                   ((wc > 126) && (wc < 160)) )); then
+while read -ar line; do
+       typeset -i1 line
+       line[${#line[*]}]=10
+       i=0
+       while (( i < ${#line[*]} )); do
+               hv=${line[i++]}
+               if (( (hv < 32) || \
+                   ((hv > 126) && (hv < 160)) )); then
                        dch=.
-               elif (( (wc & 0xFF80) == 0xEF80 )); then
+               elif (( (hv & 0xFF80) == 0xEF80 )); then
                        dch=�
                else
-                       dch=${wc#1#}
+                       dch=${line[i-1]#1#}
                fi
                if (( (pos & 7) == 7 )); then
                        dasc=$dasc$dch
@@ -47,7 +46,6 @@ while IFS= read -r line; do
                        print -n "${pos#16#}  "
                        dasc=' |'
                fi
-               let hv=wc
                print -n "${hv#16#} "
                (( (pos++ & 7) == 3 )) && \
                    print -n -- '- '
index 8f64956..5f58067 100644 (file)
@@ -19,6 +19,7 @@
 # of said person’s immediate fault when using the work as intended.
 #-
 # hexdump, not NUL byte safe, Unicode (UCS-2, OPTU-16) output
+# needs input terminated with a trailing newline, as per POSIX files
 
 typeset -Uui16 -Z11 pos=0
 typeset -Uui16 -Z7 hv