OSDN Git Service

Merge "cat builtin: permit interrupt during writing; more: avoid SIGPIPE"
[android-x86/external-mksh.git] / mkshrc
diff --git a/mkshrc b/mkshrc
index 2951595..6c20d1f 100644 (file)
--- a/mkshrc
+++ b/mkshrc
@@ -1,4 +1,4 @@
-# Copyright (c) 2010, 2012, 2013
+# Copyright (c) 2010, 2012, 2013, 2014
 #      Thorsten Glaser <tg@mirbsd.org>
 # This file is provided under the same terms as mksh.
 #-
@@ -9,12 +9,13 @@
 : ${TERM:=vt100} ${HOME:=/data} ${MKSH:=/system/bin/sh} ${HOSTNAME:=$(getprop ro.product.device)}
 : ${SHELL:=$MKSH} ${USER:=$(typeset x=$(id); x=${x#*\(}; print -r -- ${x%%\)*})} ${HOSTNAME:=android}
 if (( USER_ID )); then PS1='$'; else PS1='#'; fi
-function precmd {
-       typeset e=$?
+PS4='[$EPOCHREALTIME] '; PS1='${|
+       local e=$?
 
-       (( e )) && print -n "$e|"
-}
-PS1='$(precmd)$USER@$HOSTNAME:${PWD:-?} '"$PS1 "
+       (( e )) && REPLY+="$e|"
+
+       return $e
+}$USER@$HOSTNAME:${PWD:-?} '"$PS1 "
 export HOME HOSTNAME MKSH SHELL TERM USER
 alias l='ls'
 alias la='l -a'
@@ -22,24 +23,54 @@ alias ll='l -l'
 alias lo='l -a -l'
 
 function hd {
-       cat "$@" | command hd /proc/self/fd/0
+       local -Uui16 -Z11 pos=0
+       local -Uui16 -Z5 hv=2147483647
+       local dasc line i
+
+       cat "$@" | { set +U; if read -arN -1 line; then
+               typeset -i1 line
+               i=0
+               while (( i < ${#line[*]} )); do
+                       hv=${line[i++]}
+                       if (( (pos & 15) == 0 )); then
+                               (( pos )) && print -r -- "$dasc|"
+                               print -n "${pos#16#}  "
+                               dasc=' |'
+                       fi
+                       print -n "${hv#16#} "
+                       if (( (hv < 32) || (hv > 126) )); then
+                               dasc+=.
+                       else
+                               dasc+=${line[i-1]#1#}
+                       fi
+                       (( (pos++ & 15) == 7 )) && print -n -- '- '
+               done
+               while (( pos & 15 )); do
+                       print -n '   '
+                       (( (pos++ & 15) == 7 )) && print -n -- '- '
+               done
+               (( hv == 2147483647 )) || print -r -- "$dasc|"
+       fi; }
 }
 
 function more {
-       local dummy line llen curlin=0
-
-       cat "$@" | while IFS= read -r line; do
-               llen=${%line}
-               (( llen == -1 )) && llen=${#line}
-               (( llen = llen ? (llen + COLUMNS - 1) / COLUMNS : 1 ))
-               if (( (curlin += llen) >= LINES )); then
-                       print -n -- '\033[7m--more--\033[0m'
-                       read -u1 dummy
-                       [[ $dummy = [Qq]* ]] && return 0
-                       curlin=$llen
-               fi
-               print -r -- "$line"
-       done
+       (
+               set +m
+               cat "$@" |&
+               trap "rv=\$?; kill $! >/dev/null 2>&1; exit \$rv" EXIT
+               while IFS= read -pr line; do
+                       llen=${%line}
+                       (( llen == -1 )) && llen=${#line}
+                       (( llen = llen ? (llen + COLUMNS - 1) / COLUMNS : 1 ))
+                       if (( (curlin += llen) >= LINES )); then
+                               print -n -- '\033[7m--more--\033[0m'
+                               read -u1 || exit $?
+                               [[ $REPLY = [Qq]* ]] && exit 0
+                               curlin=$llen
+                       fi
+                       print -r -- "$line"
+               done
+       )
 }
 
 function setenv {