experimental old/new eatmydata support switch
[shellsnippets/shellsnippets.git] / mksh / hd
1 # $MirOS: src/bin/mksh/dot.mkshrc,v 1.88 2014/01/11 18:09:39 tg Exp $
2 #-
3 # Copyright (c) 2002, 2003, 2004, 2006, 2007, 2008, 2009, 2010,
4 #               2011, 2012, 2013, 2014
5 #       Thorsten Glaser <tg@mirbsd.org>
6 #
7 # Provided that these terms and disclaimer and all copyright notices
8 # are retained or reproduced in an accompanying document, permission
9 # is granted to deal in this work without restriction, including un-
10 # limited rights to use, publicly perform, distribute, sell, modify,
11 # merge, give away, or sublicence.
12 #
13 # This work is provided "AS IS" and WITHOUT WARRANTY of any kind, to
14 # the utmost extent permitted by applicable law, neither express nor
15 # implied; without malicious intent or gross negligence. In no event
16 # may a licensor, author or contributor be held liable for indirect,
17 # direct, other damage, loss, or other issues arising in any way out
18 # of dealing in the work, even if advised of the possibility of such
19 # damage or existence of a defect, except proven that it results out
20 # of said person's immediate fault when using the work as intended.
21
22 function hd {
23         local -Uui16 -Z11 pos=0
24         local -Uui16 -Z5 hv=2147483647
25         local dasc line i
26
27         cat "$@" | { set +U; if read -arN -1 line; then
28                 typeset -i1 line
29                 i=0
30                 while (( i < ${#line[*]} )); do
31                         hv=${line[i++]}
32                         if (( (pos & 15) == 0 )); then
33                                 (( pos )) && print -r -- "$dasc|"
34                                 print -n "${pos#16#}  "
35                                 dasc=' |'
36                         fi
37                         print -n "${hv#16#} "
38                         if (( (hv < 32) || (hv > 126) )); then
39                                 dasc+=.
40                         else
41                                 dasc+=${line[i-1]#1#}
42                         fi
43                         (( (pos++ & 15) == 7 )) && print -n -- '- '
44                 done
45                 while (( pos & 15 )); do
46                         print -n '   '
47                         (( (pos++ & 15) == 7 )) && print -n -- '- '
48                 done
49                 (( hv == 2147483647 )) || print -r -- "$dasc|"
50         fi; }
51 }