1*7c356e86SAndroid Build Coastguard Worker# $Id$ 2*7c356e86SAndroid Build Coastguard Worker# $MirOS: src/bin/mksh/dot.mkshrc,v 1.128 2020/04/13 18:39:03 tg Exp $ 3*7c356e86SAndroid Build Coastguard Worker#- 4*7c356e86SAndroid Build Coastguard Worker# Copyright (c) 2002, 2003, 2004, 2006, 2007, 2008, 2009, 2010, 5*7c356e86SAndroid Build Coastguard Worker# 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2019, 6*7c356e86SAndroid Build Coastguard Worker# 2020 7*7c356e86SAndroid Build Coastguard Worker# mirabilos <[email protected]> 8*7c356e86SAndroid Build Coastguard Worker# 9*7c356e86SAndroid Build Coastguard Worker# Provided that these terms and disclaimer and all copyright notices 10*7c356e86SAndroid Build Coastguard Worker# are retained or reproduced in an accompanying document, permission 11*7c356e86SAndroid Build Coastguard Worker# is granted to deal in this work without restriction, including un- 12*7c356e86SAndroid Build Coastguard Worker# limited rights to use, publicly perform, distribute, sell, modify, 13*7c356e86SAndroid Build Coastguard Worker# merge, give away, or sublicence. 14*7c356e86SAndroid Build Coastguard Worker# 15*7c356e86SAndroid Build Coastguard Worker# This work is provided "AS IS" and WITHOUT WARRANTY of any kind, to 16*7c356e86SAndroid Build Coastguard Worker# the utmost extent permitted by applicable law, neither express nor 17*7c356e86SAndroid Build Coastguard Worker# implied; without malicious intent or gross negligence. In no event 18*7c356e86SAndroid Build Coastguard Worker# may a licensor, author or contributor be held liable for indirect, 19*7c356e86SAndroid Build Coastguard Worker# direct, other damage, loss, or other issues arising in any way out 20*7c356e86SAndroid Build Coastguard Worker# of dealing in the work, even if advised of the possibility of such 21*7c356e86SAndroid Build Coastguard Worker# damage or existence of a defect, except proven that it results out 22*7c356e86SAndroid Build Coastguard Worker# of said person's immediate fault when using the work as intended. 23*7c356e86SAndroid Build Coastguard Worker#- 24*7c356e86SAndroid Build Coastguard Worker# ${ENV:-~/.mkshrc}: mksh initialisation file for interactive shells 25*7c356e86SAndroid Build Coastguard Worker 26*7c356e86SAndroid Build Coastguard Worker# catch non-mksh, non-lksh, trying to run this file 27*7c356e86SAndroid Build Coastguard Workercase ${KSH_VERSION:-} in 28*7c356e86SAndroid Build Coastguard Worker*LEGACY\ KSH*|*MIRBSD\ KSH*) ;; 29*7c356e86SAndroid Build Coastguard Worker*) \return 0 ;; 30*7c356e86SAndroid Build Coastguard Workeresac 31*7c356e86SAndroid Build Coastguard Worker 32*7c356e86SAndroid Build Coastguard Worker# give MidnightBSD's laffer1 a bit of csh feeling 33*7c356e86SAndroid Build Coastguard Workerfunction setenv { 34*7c356e86SAndroid Build Coastguard Worker if (( $# )); then 35*7c356e86SAndroid Build Coastguard Worker \\builtin eval '\\builtin export "$1"="${2:-}"' 36*7c356e86SAndroid Build Coastguard Worker else 37*7c356e86SAndroid Build Coastguard Worker \\builtin typeset -x 38*7c356e86SAndroid Build Coastguard Worker fi 39*7c356e86SAndroid Build Coastguard Worker} 40*7c356e86SAndroid Build Coastguard Worker 41*7c356e86SAndroid Build Coastguard Worker# pager (not control character safe) 42*7c356e86SAndroid Build Coastguard Workersmores() ( 43*7c356e86SAndroid Build Coastguard Worker \\builtin set +m 44*7c356e86SAndroid Build Coastguard Worker \\builtin cat "$@" |& 45*7c356e86SAndroid Build Coastguard Worker \\builtin trap "rv=\$?; \\\\builtin kill $! >/dev/null 2>&1; \\\\builtin exit \$rv" EXIT 46*7c356e86SAndroid Build Coastguard Worker while IFS= \\builtin read -pr line; do 47*7c356e86SAndroid Build Coastguard Worker llen=${%line} 48*7c356e86SAndroid Build Coastguard Worker (( llen == -1 )) && llen=${#line} 49*7c356e86SAndroid Build Coastguard Worker (( llen = llen ? (llen + COLUMNS - 1) / COLUMNS : 1 )) 50*7c356e86SAndroid Build Coastguard Worker if (( (curlin += llen) >= LINES )); then 51*7c356e86SAndroid Build Coastguard Worker \\builtin print -nr -- $'\e[7m--more--\e[0m' 52*7c356e86SAndroid Build Coastguard Worker \\builtin read -u1 || \\builtin exit $? 53*7c356e86SAndroid Build Coastguard Worker [[ $REPLY = [Qq]* ]] && \\builtin exit 0 54*7c356e86SAndroid Build Coastguard Worker curlin=$llen 55*7c356e86SAndroid Build Coastguard Worker fi 56*7c356e86SAndroid Build Coastguard Worker \\builtin print -r -- "$line" 57*7c356e86SAndroid Build Coastguard Worker done 58*7c356e86SAndroid Build Coastguard Worker) 59*7c356e86SAndroid Build Coastguard Worker 60*7c356e86SAndroid Build Coastguard Worker# customise your favourite editor here; the first one found is used 61*7c356e86SAndroid Build Coastguard Workerfor EDITOR in "${EDITOR:-}" jupp jstar mcedit ed vi; do 62*7c356e86SAndroid Build Coastguard Worker EDITOR=$(\\builtin whence -p "$EDITOR") || EDITOR= 63*7c356e86SAndroid Build Coastguard Worker [[ -n $EDITOR && -x $EDITOR ]] && break 64*7c356e86SAndroid Build Coastguard Worker EDITOR= 65*7c356e86SAndroid Build Coastguard Workerdone 66*7c356e86SAndroid Build Coastguard Worker 67*7c356e86SAndroid Build Coastguard Worker\\builtin alias ls=ls l='ls -F' la='l -a' ll='l -l' lo='l -alo' 68*7c356e86SAndroid Build Coastguard Worker\: "${EDITOR:=/bin/ed}${TERM:=vt100}${USER:=$(\\builtin ulimit -c 0; id -un \ 69*7c356e86SAndroid Build Coastguard Worker 2>/dev/null)}${HOSTNAME:=$(\\builtin ulimit -c 0; hostname 2>/dev/null)}" 70*7c356e86SAndroid Build Coastguard Worker[[ $HOSTNAME = ?(?(ip6-)localhost?(6)) ]] && HOSTNAME=nil; \\builtin unalias ls 71*7c356e86SAndroid Build Coastguard Worker\\builtin export EDITOR HOSTNAME TERM USER="${USER:-?}" 72*7c356e86SAndroid Build Coastguard Worker 73*7c356e86SAndroid Build Coastguard Worker# minimal support for lksh users 74*7c356e86SAndroid Build Coastguard Workerif [[ $KSH_VERSION = *LEGACY\ KSH* ]]; then 75*7c356e86SAndroid Build Coastguard Worker PS1='$USER@${HOSTNAME%%.*}:$PWD>' 76*7c356e86SAndroid Build Coastguard Worker \\builtin return 0 77*7c356e86SAndroid Build Coastguard Workerfi 78*7c356e86SAndroid Build Coastguard Worker 79*7c356e86SAndroid Build Coastguard Worker# mksh-specific from here 80*7c356e86SAndroid Build Coastguard Worker\: "${MKSH:=$(\\builtin whence -p mksh)}${MKSH:=/bin/mksh}" 81*7c356e86SAndroid Build Coastguard Worker\\builtin export MKSH 82*7c356e86SAndroid Build Coastguard Worker 83*7c356e86SAndroid Build Coastguard Worker# prompts 84*7c356e86SAndroid Build Coastguard WorkerPS4='[$EPOCHREALTIME] '; PS1='#'; (( USER_ID )) && PS1='$'; PS1=$'\001\r''${| 85*7c356e86SAndroid Build Coastguard Worker \\builtin typeset e=$? 86*7c356e86SAndroid Build Coastguard Worker 87*7c356e86SAndroid Build Coastguard Worker (( e )) && REPLY+="$e|" 88*7c356e86SAndroid Build Coastguard Worker REPLY+=${USER}@${HOSTNAME%%.*}: 89*7c356e86SAndroid Build Coastguard Worker 90*7c356e86SAndroid Build Coastguard Worker \\builtin typeset d=${PWD:-?}/ p=~; [[ $p = ?(*/) ]] || d=${d/#$p\//\~/} 91*7c356e86SAndroid Build Coastguard Worker d=${d%/}; \\builtin typeset m=${%d} n p=...; (( m > 0 )) || m=${#d} 92*7c356e86SAndroid Build Coastguard Worker (( m > (n = (COLUMNS/3 < 7 ? 7 : COLUMNS/3)) )) && d=${d:(-n)} || p= 93*7c356e86SAndroid Build Coastguard Worker REPLY+=$p$d 94*7c356e86SAndroid Build Coastguard Worker 95*7c356e86SAndroid Build Coastguard Worker \\builtin return $e 96*7c356e86SAndroid Build Coastguard Worker} '"$PS1 " 97*7c356e86SAndroid Build Coastguard Worker 98*7c356e86SAndroid Build Coastguard Worker# utilities 99*7c356e86SAndroid Build Coastguard Worker\\builtin alias doch='sudo mksh -c "$(\\builtin fc -ln -1)"' 100*7c356e86SAndroid Build Coastguard Worker\\builtin command -v rot13 >/dev/null || \\builtin alias rot13='tr \ 101*7c356e86SAndroid Build Coastguard Worker abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ \ 102*7c356e86SAndroid Build Coastguard Worker nopqrstuvwxyzabcdefghijklmNOPQRSTUVWXYZABCDEFGHIJKLM' 103*7c356e86SAndroid Build Coastguard Workerif \\builtin command -v hd >/dev/null; then 104*7c356e86SAndroid Build Coastguard Worker \: 105*7c356e86SAndroid Build Coastguard Workerelif \\builtin command -v hexdump >/dev/null; then 106*7c356e86SAndroid Build Coastguard Worker function hd { 107*7c356e86SAndroid Build Coastguard Worker hexdump -e '"%08.8_ax " 8/1 "%02X " " - " 8/1 "%02X "' \ 108*7c356e86SAndroid Build Coastguard Worker -e '" |" "%_p"' -e '"|\n"' "$@" 109*7c356e86SAndroid Build Coastguard Worker } 110*7c356e86SAndroid Build Coastguard Workerelse 111*7c356e86SAndroid Build Coastguard Worker function hd { 112*7c356e86SAndroid Build Coastguard Worker \\builtin cat "$@" | hd_mksh 113*7c356e86SAndroid Build Coastguard Worker } 114*7c356e86SAndroid Build Coastguard Workerfi 115*7c356e86SAndroid Build Coastguard Worker 116*7c356e86SAndroid Build Coastguard Worker# NUL-safe and EBCDIC-safe hexdump (from stdin) 117*7c356e86SAndroid Build Coastguard Workerfunction hd_mksh { 118*7c356e86SAndroid Build Coastguard Worker \\builtin typeset -Uui16 -Z11 pos=0 119*7c356e86SAndroid Build Coastguard Worker \\builtin typeset -Uui16 -Z5 hv=2147483647 120*7c356e86SAndroid Build Coastguard Worker \\builtin typeset dasc dn line i 121*7c356e86SAndroid Build Coastguard Worker \\builtin set +U 122*7c356e86SAndroid Build Coastguard Worker 123*7c356e86SAndroid Build Coastguard Worker while \\builtin read -arn 512 line; do 124*7c356e86SAndroid Build Coastguard Worker \\builtin typeset -i1 'line[*]' 125*7c356e86SAndroid Build Coastguard Worker i=0 126*7c356e86SAndroid Build Coastguard Worker while (( i < ${#line[*]} )); do 127*7c356e86SAndroid Build Coastguard Worker dn= 128*7c356e86SAndroid Build Coastguard Worker (( (hv = line[i++]) != 0 )) && dn=${line[i-1]#1#} 129*7c356e86SAndroid Build Coastguard Worker if (( (pos & 15) == 0 )); then 130*7c356e86SAndroid Build Coastguard Worker (( pos )) && \ 131*7c356e86SAndroid Build Coastguard Worker \\builtin print -r -- "$dasc|" 132*7c356e86SAndroid Build Coastguard Worker \\builtin print -nr "${pos#16#} " 133*7c356e86SAndroid Build Coastguard Worker dasc=' |' 134*7c356e86SAndroid Build Coastguard Worker fi 135*7c356e86SAndroid Build Coastguard Worker \\builtin print -nr "${hv#16#} " 136*7c356e86SAndroid Build Coastguard Worker if [[ $dn = [[:print:]] ]]; then 137*7c356e86SAndroid Build Coastguard Worker dasc+=$dn 138*7c356e86SAndroid Build Coastguard Worker else 139*7c356e86SAndroid Build Coastguard Worker dasc+=. 140*7c356e86SAndroid Build Coastguard Worker fi 141*7c356e86SAndroid Build Coastguard Worker (( (pos++ & 15) == 7 )) && \ 142*7c356e86SAndroid Build Coastguard Worker \\builtin print -nr -- '- ' 143*7c356e86SAndroid Build Coastguard Worker done 144*7c356e86SAndroid Build Coastguard Worker done 145*7c356e86SAndroid Build Coastguard Worker while (( pos & 15 )); do 146*7c356e86SAndroid Build Coastguard Worker \\builtin print -nr ' ' 147*7c356e86SAndroid Build Coastguard Worker (( (pos++ & 15) == 7 )) && \ 148*7c356e86SAndroid Build Coastguard Worker \\builtin print -nr -- '- ' 149*7c356e86SAndroid Build Coastguard Worker done 150*7c356e86SAndroid Build Coastguard Worker (( hv == 2147483647 )) || \\builtin print -r -- "$dasc|" 151*7c356e86SAndroid Build Coastguard Worker} 152*7c356e86SAndroid Build Coastguard Worker 153*7c356e86SAndroid Build Coastguard Workerfunction which { 154*7c356e86SAndroid Build Coastguard Worker \\builtin typeset p x c 155*7c356e86SAndroid Build Coastguard Worker \\builtin typeset -i a=0 rv=2 e 156*7c356e86SAndroid Build Coastguard Worker \\builtin set +e 157*7c356e86SAndroid Build Coastguard Worker \\builtin set -o noglob 158*7c356e86SAndroid Build Coastguard Worker 159*7c356e86SAndroid Build Coastguard Worker while \\builtin getopts "a" x; do 160*7c356e86SAndroid Build Coastguard Worker case $x { 161*7c356e86SAndroid Build Coastguard Worker (a) a=1 ;; 162*7c356e86SAndroid Build Coastguard Worker (+a) a=0 ;; 163*7c356e86SAndroid Build Coastguard Worker (*) \\builtin print -ru2 'Usage: which [-a] name [...]' 164*7c356e86SAndroid Build Coastguard Worker \\builtin return 255 ;; 165*7c356e86SAndroid Build Coastguard Worker } 166*7c356e86SAndroid Build Coastguard Worker done 167*7c356e86SAndroid Build Coastguard Worker \\builtin shift $((OPTIND - 1)) 168*7c356e86SAndroid Build Coastguard Worker 169*7c356e86SAndroid Build Coastguard Worker # vvvvvvvvvvvvvvvvvvvv should be def_path 170*7c356e86SAndroid Build Coastguard Worker p=${PATH-/usr/bin$PATHSEP/bin} 171*7c356e86SAndroid Build Coastguard Worker # ^ no colon! 172*7c356e86SAndroid Build Coastguard Worker 173*7c356e86SAndroid Build Coastguard Worker # trailing PATHSEP vs field splitting 174*7c356e86SAndroid Build Coastguard Worker [[ $p = *"$PATHSEP" ]] && p+=. 175*7c356e86SAndroid Build Coastguard Worker 176*7c356e86SAndroid Build Coastguard Worker IFS=$PATHSEP 177*7c356e86SAndroid Build Coastguard Worker \\builtin set -A p -- ${p:-.} 178*7c356e86SAndroid Build Coastguard Worker IFS=$' \t\n' 179*7c356e86SAndroid Build Coastguard Worker 180*7c356e86SAndroid Build Coastguard Worker for x in "$@"; do 181*7c356e86SAndroid Build Coastguard Worker if (( !a )) || [[ $x = */* ]]; then 182*7c356e86SAndroid Build Coastguard Worker \\builtin whence -p -- "$x" 183*7c356e86SAndroid Build Coastguard Worker e=$? 184*7c356e86SAndroid Build Coastguard Worker else 185*7c356e86SAndroid Build Coastguard Worker e=1 186*7c356e86SAndroid Build Coastguard Worker for c in "${p[@]}"; do 187*7c356e86SAndroid Build Coastguard Worker PATH=${c:-.} \\builtin whence -p -- "$x" && e=0 188*7c356e86SAndroid Build Coastguard Worker done 189*7c356e86SAndroid Build Coastguard Worker fi 190*7c356e86SAndroid Build Coastguard Worker (( rv = (e == 0) ? (rv & ~2) : (rv == 2 ? 2 : 1) )) 191*7c356e86SAndroid Build Coastguard Worker done 192*7c356e86SAndroid Build Coastguard Worker \\builtin return $rv 193*7c356e86SAndroid Build Coastguard Worker} 194*7c356e86SAndroid Build Coastguard Worker 195*7c356e86SAndroid Build Coastguard Worker# Berkeley C shell compatible dirs, popd, and pushd functions 196*7c356e86SAndroid Build Coastguard Worker# Z shell compatible chpwd() hook, used to update DIRSTACK[0] 197*7c356e86SAndroid Build Coastguard WorkerDIRSTACKBASE=$(\\builtin realpath ~/. 2>/dev/null || \ 198*7c356e86SAndroid Build Coastguard Worker \\builtin print -nr -- "${HOME:-/}") 199*7c356e86SAndroid Build Coastguard Worker\\builtin set -A DIRSTACK 200*7c356e86SAndroid Build Coastguard Workerfunction chpwd { 201*7c356e86SAndroid Build Coastguard Worker DIRSTACK[0]=$(\\builtin realpath . 2>/dev/null || \ 202*7c356e86SAndroid Build Coastguard Worker \\builtin print -nr -- "$PWD") 203*7c356e86SAndroid Build Coastguard Worker [[ $DIRSTACKBASE = ?(*/) ]] || \ 204*7c356e86SAndroid Build Coastguard Worker DIRSTACK[0]=${DIRSTACK[0]/#$DIRSTACKBASE/\~} 205*7c356e86SAndroid Build Coastguard Worker \: 206*7c356e86SAndroid Build Coastguard Worker} 207*7c356e86SAndroid Build Coastguard Worker\chpwd . 208*7c356e86SAndroid Build Coastguard Workercd() { 209*7c356e86SAndroid Build Coastguard Worker \\builtin cd "$@" || \\builtin return $? 210*7c356e86SAndroid Build Coastguard Worker \chpwd "$@" 211*7c356e86SAndroid Build Coastguard Worker} 212*7c356e86SAndroid Build Coastguard Workerfunction cd_csh { 213*7c356e86SAndroid Build Coastguard Worker \\builtin typeset d t=${1/#\~/$DIRSTACKBASE} 214*7c356e86SAndroid Build Coastguard Worker 215*7c356e86SAndroid Build Coastguard Worker if ! d=$(\\builtin cd "$t" 2>&1); then 216*7c356e86SAndroid Build Coastguard Worker \\builtin print -ru2 "${1}: ${d##*cd: $t: }." 217*7c356e86SAndroid Build Coastguard Worker \\builtin return 1 218*7c356e86SAndroid Build Coastguard Worker fi 219*7c356e86SAndroid Build Coastguard Worker \cd "$t" 220*7c356e86SAndroid Build Coastguard Worker} 221*7c356e86SAndroid Build Coastguard Workerfunction dirs { 222*7c356e86SAndroid Build Coastguard Worker \\builtin typeset d dwidth 223*7c356e86SAndroid Build Coastguard Worker \\builtin typeset -i fl=0 fv=0 fn=0 cpos=0 224*7c356e86SAndroid Build Coastguard Worker 225*7c356e86SAndroid Build Coastguard Worker while \\builtin getopts ":lvn" d; do 226*7c356e86SAndroid Build Coastguard Worker case $d { 227*7c356e86SAndroid Build Coastguard Worker (l) fl=1 ;; 228*7c356e86SAndroid Build Coastguard Worker (v) fv=1 ;; 229*7c356e86SAndroid Build Coastguard Worker (n) fn=1 ;; 230*7c356e86SAndroid Build Coastguard Worker (*) \\builtin print -ru2 'Usage: dirs [-lvn].' 231*7c356e86SAndroid Build Coastguard Worker \\builtin return 1 ;; 232*7c356e86SAndroid Build Coastguard Worker } 233*7c356e86SAndroid Build Coastguard Worker done 234*7c356e86SAndroid Build Coastguard Worker \\builtin shift $((OPTIND - 1)) 235*7c356e86SAndroid Build Coastguard Worker if (( $# > 0 )); then 236*7c356e86SAndroid Build Coastguard Worker \\builtin print -ru2 'Usage: dirs [-lvn].' 237*7c356e86SAndroid Build Coastguard Worker \\builtin return 1 238*7c356e86SAndroid Build Coastguard Worker fi 239*7c356e86SAndroid Build Coastguard Worker if (( fv )); then 240*7c356e86SAndroid Build Coastguard Worker fv=0 241*7c356e86SAndroid Build Coastguard Worker while (( fv < ${#DIRSTACK[*]} )); do 242*7c356e86SAndroid Build Coastguard Worker d=${DIRSTACK[fv]} 243*7c356e86SAndroid Build Coastguard Worker (( fl )) && d=${d/#\~/$DIRSTACKBASE} 244*7c356e86SAndroid Build Coastguard Worker \\builtin print -r -- "$fv $d" 245*7c356e86SAndroid Build Coastguard Worker (( ++fv )) 246*7c356e86SAndroid Build Coastguard Worker done 247*7c356e86SAndroid Build Coastguard Worker else 248*7c356e86SAndroid Build Coastguard Worker fv=0 249*7c356e86SAndroid Build Coastguard Worker while (( fv < ${#DIRSTACK[*]} )); do 250*7c356e86SAndroid Build Coastguard Worker d=${DIRSTACK[fv]} 251*7c356e86SAndroid Build Coastguard Worker (( fl )) && d=${d/#\~/$DIRSTACKBASE} 252*7c356e86SAndroid Build Coastguard Worker (( dwidth = (${%d} > 0 ? ${%d} : ${#d}) )) 253*7c356e86SAndroid Build Coastguard Worker if (( fn && (cpos += dwidth + 1) >= 79 && \ 254*7c356e86SAndroid Build Coastguard Worker dwidth < 80 )); then 255*7c356e86SAndroid Build Coastguard Worker \\builtin print 256*7c356e86SAndroid Build Coastguard Worker (( cpos = dwidth + 1 )) 257*7c356e86SAndroid Build Coastguard Worker fi 258*7c356e86SAndroid Build Coastguard Worker \\builtin print -nr -- "$d " 259*7c356e86SAndroid Build Coastguard Worker (( ++fv )) 260*7c356e86SAndroid Build Coastguard Worker done 261*7c356e86SAndroid Build Coastguard Worker \\builtin print 262*7c356e86SAndroid Build Coastguard Worker fi 263*7c356e86SAndroid Build Coastguard Worker \\builtin return 0 264*7c356e86SAndroid Build Coastguard Worker} 265*7c356e86SAndroid Build Coastguard Workerfunction popd { 266*7c356e86SAndroid Build Coastguard Worker \\builtin typeset d fa 267*7c356e86SAndroid Build Coastguard Worker \\builtin typeset -i n=1 268*7c356e86SAndroid Build Coastguard Worker 269*7c356e86SAndroid Build Coastguard Worker while \\builtin getopts ":0123456789lvn" d; do 270*7c356e86SAndroid Build Coastguard Worker case $d { 271*7c356e86SAndroid Build Coastguard Worker (l|v|n) fa+=" -$d" ;; 272*7c356e86SAndroid Build Coastguard Worker (+*) n=2 273*7c356e86SAndroid Build Coastguard Worker \\builtin break ;; 274*7c356e86SAndroid Build Coastguard Worker (*) \\builtin print -ru2 'Usage: popd [-lvn] [+<n>].' 275*7c356e86SAndroid Build Coastguard Worker \\builtin return 1 ;; 276*7c356e86SAndroid Build Coastguard Worker } 277*7c356e86SAndroid Build Coastguard Worker done 278*7c356e86SAndroid Build Coastguard Worker \\builtin shift $((OPTIND - n)) 279*7c356e86SAndroid Build Coastguard Worker n=0 280*7c356e86SAndroid Build Coastguard Worker if (( $# > 1 )); then 281*7c356e86SAndroid Build Coastguard Worker \\builtin print -ru2 popd: Too many arguments. 282*7c356e86SAndroid Build Coastguard Worker \\builtin return 1 283*7c356e86SAndroid Build Coastguard Worker elif [[ $1 = ++([0-9]) && $1 != +0 ]]; then 284*7c356e86SAndroid Build Coastguard Worker if (( (n = ${1#+}) >= ${#DIRSTACK[*]} )); then 285*7c356e86SAndroid Build Coastguard Worker \\builtin print -ru2 popd: Directory stack not that deep. 286*7c356e86SAndroid Build Coastguard Worker \\builtin return 1 287*7c356e86SAndroid Build Coastguard Worker fi 288*7c356e86SAndroid Build Coastguard Worker elif [[ -n $1 ]]; then 289*7c356e86SAndroid Build Coastguard Worker \\builtin print -ru2 popd: Bad directory. 290*7c356e86SAndroid Build Coastguard Worker \\builtin return 1 291*7c356e86SAndroid Build Coastguard Worker fi 292*7c356e86SAndroid Build Coastguard Worker if (( ${#DIRSTACK[*]} < 2 )); then 293*7c356e86SAndroid Build Coastguard Worker \\builtin print -ru2 popd: Directory stack empty. 294*7c356e86SAndroid Build Coastguard Worker \\builtin return 1 295*7c356e86SAndroid Build Coastguard Worker fi 296*7c356e86SAndroid Build Coastguard Worker \\builtin unset DIRSTACK[n] 297*7c356e86SAndroid Build Coastguard Worker \\builtin set -A DIRSTACK -- "${DIRSTACK[@]}" 298*7c356e86SAndroid Build Coastguard Worker \cd_csh "${DIRSTACK[0]}" || \\builtin return 1 299*7c356e86SAndroid Build Coastguard Worker \dirs $fa 300*7c356e86SAndroid Build Coastguard Worker} 301*7c356e86SAndroid Build Coastguard Workerfunction pushd { 302*7c356e86SAndroid Build Coastguard Worker \\builtin typeset d fa 303*7c356e86SAndroid Build Coastguard Worker \\builtin typeset -i n=1 304*7c356e86SAndroid Build Coastguard Worker 305*7c356e86SAndroid Build Coastguard Worker while \\builtin getopts ":0123456789lvn" d; do 306*7c356e86SAndroid Build Coastguard Worker case $d { 307*7c356e86SAndroid Build Coastguard Worker (l|v|n) fa+=" -$d" ;; 308*7c356e86SAndroid Build Coastguard Worker (+*) n=2 309*7c356e86SAndroid Build Coastguard Worker \\builtin break ;; 310*7c356e86SAndroid Build Coastguard Worker (*) \\builtin print -ru2 'Usage: pushd [-lvn] [<dir>|+<n>].' 311*7c356e86SAndroid Build Coastguard Worker \\builtin return 1 ;; 312*7c356e86SAndroid Build Coastguard Worker } 313*7c356e86SAndroid Build Coastguard Worker done 314*7c356e86SAndroid Build Coastguard Worker \\builtin shift $((OPTIND - n)) 315*7c356e86SAndroid Build Coastguard Worker if (( $# == 0 )); then 316*7c356e86SAndroid Build Coastguard Worker if (( ${#DIRSTACK[*]} < 2 )); then 317*7c356e86SAndroid Build Coastguard Worker \\builtin print -ru2 pushd: No other directory. 318*7c356e86SAndroid Build Coastguard Worker \\builtin return 1 319*7c356e86SAndroid Build Coastguard Worker fi 320*7c356e86SAndroid Build Coastguard Worker d=${DIRSTACK[1]} 321*7c356e86SAndroid Build Coastguard Worker DIRSTACK[1]=${DIRSTACK[0]} 322*7c356e86SAndroid Build Coastguard Worker \cd_csh "$d" || \\builtin return 1 323*7c356e86SAndroid Build Coastguard Worker elif (( $# > 1 )); then 324*7c356e86SAndroid Build Coastguard Worker \\builtin print -ru2 pushd: Too many arguments. 325*7c356e86SAndroid Build Coastguard Worker \\builtin return 1 326*7c356e86SAndroid Build Coastguard Worker elif [[ $1 = ++([0-9]) && $1 != +0 ]]; then 327*7c356e86SAndroid Build Coastguard Worker if (( (n = ${1#+}) >= ${#DIRSTACK[*]} )); then 328*7c356e86SAndroid Build Coastguard Worker \\builtin print -ru2 pushd: Directory stack not that deep. 329*7c356e86SAndroid Build Coastguard Worker \\builtin return 1 330*7c356e86SAndroid Build Coastguard Worker fi 331*7c356e86SAndroid Build Coastguard Worker while (( n-- )); do 332*7c356e86SAndroid Build Coastguard Worker d=${DIRSTACK[0]} 333*7c356e86SAndroid Build Coastguard Worker \\builtin unset DIRSTACK[0] 334*7c356e86SAndroid Build Coastguard Worker \\builtin set -A DIRSTACK -- "${DIRSTACK[@]}" "$d" 335*7c356e86SAndroid Build Coastguard Worker done 336*7c356e86SAndroid Build Coastguard Worker \cd_csh "${DIRSTACK[0]}" || \\builtin return 1 337*7c356e86SAndroid Build Coastguard Worker else 338*7c356e86SAndroid Build Coastguard Worker \\builtin set -A DIRSTACK -- placeholder "${DIRSTACK[@]}" 339*7c356e86SAndroid Build Coastguard Worker \cd_csh "$1" || \\builtin return 1 340*7c356e86SAndroid Build Coastguard Worker fi 341*7c356e86SAndroid Build Coastguard Worker \dirs $fa 342*7c356e86SAndroid Build Coastguard Worker} 343*7c356e86SAndroid Build Coastguard Worker 344*7c356e86SAndroid Build Coastguard Worker# base64 encoder and decoder, RFC compliant, NUL safe, not EBCDIC safe 345*7c356e86SAndroid Build Coastguard Workerfunction Lb64decode { 346*7c356e86SAndroid Build Coastguard Worker \\builtin set +U 347*7c356e86SAndroid Build Coastguard Worker \\builtin typeset c s="$*" t 348*7c356e86SAndroid Build Coastguard Worker [[ -n $s ]] || { s=$(\\builtin cat; \\builtin print x); s=${s%x}; } 349*7c356e86SAndroid Build Coastguard Worker \\builtin typeset -i i=0 j=0 n=${#s} p=0 v x 350*7c356e86SAndroid Build Coastguard Worker \\builtin typeset -i16 o 351*7c356e86SAndroid Build Coastguard Worker 352*7c356e86SAndroid Build Coastguard Worker while (( i < n )); do 353*7c356e86SAndroid Build Coastguard Worker c=${s:(i++):1} 354*7c356e86SAndroid Build Coastguard Worker case $c { 355*7c356e86SAndroid Build Coastguard Worker (=) \\builtin break ;; 356*7c356e86SAndroid Build Coastguard Worker ([A-Z]) (( v = 1#$c - 65 )) ;; 357*7c356e86SAndroid Build Coastguard Worker ([a-z]) (( v = 1#$c - 71 )) ;; 358*7c356e86SAndroid Build Coastguard Worker ([0-9]) (( v = 1#$c + 4 )) ;; 359*7c356e86SAndroid Build Coastguard Worker (+) v=62 ;; 360*7c356e86SAndroid Build Coastguard Worker (/) v=63 ;; 361*7c356e86SAndroid Build Coastguard Worker (*) \\builtin continue ;; 362*7c356e86SAndroid Build Coastguard Worker } 363*7c356e86SAndroid Build Coastguard Worker (( x = (x << 6) | v )) 364*7c356e86SAndroid Build Coastguard Worker case $((p++)) { 365*7c356e86SAndroid Build Coastguard Worker (0) \\builtin continue ;; 366*7c356e86SAndroid Build Coastguard Worker (1) (( o = (x >> 4) & 255 )) ;; 367*7c356e86SAndroid Build Coastguard Worker (2) (( o = (x >> 2) & 255 )) ;; 368*7c356e86SAndroid Build Coastguard Worker (3) (( o = x & 255 )) 369*7c356e86SAndroid Build Coastguard Worker p=0 370*7c356e86SAndroid Build Coastguard Worker ;; 371*7c356e86SAndroid Build Coastguard Worker } 372*7c356e86SAndroid Build Coastguard Worker t+=\\x${o#16#} 373*7c356e86SAndroid Build Coastguard Worker (( ++j & 4095 )) && \\builtin continue 374*7c356e86SAndroid Build Coastguard Worker \\builtin print -n $t 375*7c356e86SAndroid Build Coastguard Worker t= 376*7c356e86SAndroid Build Coastguard Worker done 377*7c356e86SAndroid Build Coastguard Worker \\builtin print -n $t 378*7c356e86SAndroid Build Coastguard Worker} 379*7c356e86SAndroid Build Coastguard Workerfunction Lb64encode { 380*7c356e86SAndroid Build Coastguard Worker \\builtin set +U 381*7c356e86SAndroid Build Coastguard Worker \\builtin typeset c s t table 382*7c356e86SAndroid Build Coastguard Worker \\builtin set -A table -- A B C D E F G H I J K L M N O P Q R S T U V W X Y Z \ 383*7c356e86SAndroid Build Coastguard Worker a b c d e f g h i j k l m n o p q r s t u v w x y z 0 1 2 3 4 5 6 7 8 9 + / 384*7c356e86SAndroid Build Coastguard Worker if (( $# )); then 385*7c356e86SAndroid Build Coastguard Worker \\builtin read -raN-1 s <<<"$*" 386*7c356e86SAndroid Build Coastguard Worker \\builtin unset s[${#s[*]}-1] 387*7c356e86SAndroid Build Coastguard Worker else 388*7c356e86SAndroid Build Coastguard Worker \\builtin read -raN-1 s 389*7c356e86SAndroid Build Coastguard Worker fi 390*7c356e86SAndroid Build Coastguard Worker \\builtin typeset -i i=0 n=${#s[*]} v 391*7c356e86SAndroid Build Coastguard Worker 392*7c356e86SAndroid Build Coastguard Worker while (( i < n )); do 393*7c356e86SAndroid Build Coastguard Worker (( v = s[i++] << 16 )) 394*7c356e86SAndroid Build Coastguard Worker (( v |= s[i++] << 8 )) 395*7c356e86SAndroid Build Coastguard Worker (( v |= s[i++] )) 396*7c356e86SAndroid Build Coastguard Worker t+=${table[v >> 18]}${table[v >> 12 & 63]} 397*7c356e86SAndroid Build Coastguard Worker c=${table[v >> 6 & 63]} 398*7c356e86SAndroid Build Coastguard Worker if (( i <= n )); then 399*7c356e86SAndroid Build Coastguard Worker t+=$c${table[v & 63]} 400*7c356e86SAndroid Build Coastguard Worker elif (( i == n + 1 )); then 401*7c356e86SAndroid Build Coastguard Worker t+=$c= 402*7c356e86SAndroid Build Coastguard Worker else 403*7c356e86SAndroid Build Coastguard Worker t+=== 404*7c356e86SAndroid Build Coastguard Worker fi 405*7c356e86SAndroid Build Coastguard Worker if (( ${#t} == 76 || i >= n )); then 406*7c356e86SAndroid Build Coastguard Worker \\builtin print -r $t 407*7c356e86SAndroid Build Coastguard Worker t= 408*7c356e86SAndroid Build Coastguard Worker fi 409*7c356e86SAndroid Build Coastguard Worker done 410*7c356e86SAndroid Build Coastguard Worker} 411*7c356e86SAndroid Build Coastguard Worker 412*7c356e86SAndroid Build Coastguard Worker# Better Avalanche for the Jenkins Hash 413*7c356e86SAndroid Build Coastguard Worker\\builtin typeset -Z11 -Uui16 Lbafh_v 414*7c356e86SAndroid Build Coastguard Workerfunction Lbafh_init { 415*7c356e86SAndroid Build Coastguard Worker Lbafh_v=0 416*7c356e86SAndroid Build Coastguard Worker} 417*7c356e86SAndroid Build Coastguard Workerfunction Lbafh_add { 418*7c356e86SAndroid Build Coastguard Worker \\builtin set +U 419*7c356e86SAndroid Build Coastguard Worker \\builtin typeset s 420*7c356e86SAndroid Build Coastguard Worker if (( $# )); then 421*7c356e86SAndroid Build Coastguard Worker \\builtin read -raN-1 s <<<"$*" 422*7c356e86SAndroid Build Coastguard Worker \\builtin unset s[${#s[*]}-1] 423*7c356e86SAndroid Build Coastguard Worker else 424*7c356e86SAndroid Build Coastguard Worker \\builtin read -raN-1 s 425*7c356e86SAndroid Build Coastguard Worker fi 426*7c356e86SAndroid Build Coastguard Worker \\builtin typeset -i i=0 n=${#s[*]} 427*7c356e86SAndroid Build Coastguard Worker 428*7c356e86SAndroid Build Coastguard Worker while (( i < n )); do 429*7c356e86SAndroid Build Coastguard Worker ((# Lbafh_v = (Lbafh_v + s[i++] + 1) * 1025 )) 430*7c356e86SAndroid Build Coastguard Worker ((# Lbafh_v ^= Lbafh_v >> 6 )) 431*7c356e86SAndroid Build Coastguard Worker done 432*7c356e86SAndroid Build Coastguard Worker} 433*7c356e86SAndroid Build Coastguard Workerfunction Lbafh_finish { 434*7c356e86SAndroid Build Coastguard Worker \\builtin typeset -Ui t 435*7c356e86SAndroid Build Coastguard Worker 436*7c356e86SAndroid Build Coastguard Worker ((# t = (((Lbafh_v >> 7) & 0x01010101) * 0x1B) ^ \ 437*7c356e86SAndroid Build Coastguard Worker ((Lbafh_v << 1) & 0xFEFEFEFE) )) 438*7c356e86SAndroid Build Coastguard Worker ((# Lbafh_v = t ^ (t ^> 8) ^ (Lbafh_v ^> 8) ^ \ 439*7c356e86SAndroid Build Coastguard Worker (Lbafh_v ^> 16) ^ (Lbafh_v ^> 24) )) 440*7c356e86SAndroid Build Coastguard Worker \: 441*7c356e86SAndroid Build Coastguard Worker} 442*7c356e86SAndroid Build Coastguard Worker 443*7c356e86SAndroid Build Coastguard Worker# strip comments (and leading/trailing whitespace if IFS is set) from 444*7c356e86SAndroid Build Coastguard Worker# any file(s) given as argument, or stdin if none, and spew to stdout 445*7c356e86SAndroid Build Coastguard Workerfunction Lstripcom { 446*7c356e86SAndroid Build Coastguard Worker \\builtin set -o noglob 447*7c356e86SAndroid Build Coastguard Worker \\builtin cat "$@" | while \\builtin read _line; do 448*7c356e86SAndroid Build Coastguard Worker _line=${_line%%#*} 449*7c356e86SAndroid Build Coastguard Worker [[ -n $_line ]] && \\builtin print -r -- $_line 450*7c356e86SAndroid Build Coastguard Worker done 451*7c356e86SAndroid Build Coastguard Worker} 452*7c356e86SAndroid Build Coastguard Worker 453*7c356e86SAndroid Build Coastguard Worker# toggle built-in aliases and utilities, and aliases and functions from mkshrc 454*7c356e86SAndroid Build Coastguard Workerfunction enable { 455*7c356e86SAndroid Build Coastguard Worker \\builtin typeset doprnt=0 mode=1 x y z rv=0 456*7c356e86SAndroid Build Coastguard Worker \\builtin typeset b_alias i_alias i_func nalias=0 nfunc=0 i_all 457*7c356e86SAndroid Build Coastguard Worker \\builtin set -A b_alias 458*7c356e86SAndroid Build Coastguard Worker \\builtin set -A i_alias 459*7c356e86SAndroid Build Coastguard Worker \\builtin set -A i_func 460*7c356e86SAndroid Build Coastguard Worker 461*7c356e86SAndroid Build Coastguard Worker # accumulate mksh built-in aliases, in ASCIIbetical order 462*7c356e86SAndroid Build Coastguard Worker i_alias[nalias]=autoload; b_alias[nalias++]='\\builtin typeset -fu' 463*7c356e86SAndroid Build Coastguard Worker i_alias[nalias]=functions; b_alias[nalias++]='\\builtin typeset -f' 464*7c356e86SAndroid Build Coastguard Worker i_alias[nalias]=hash; b_alias[nalias++]='\\builtin alias -t' 465*7c356e86SAndroid Build Coastguard Worker i_alias[nalias]=history; b_alias[nalias++]='\\builtin fc -l' 466*7c356e86SAndroid Build Coastguard Worker i_alias[nalias]=integer; b_alias[nalias++]='\\builtin typeset -i' 467*7c356e86SAndroid Build Coastguard Worker i_alias[nalias]=local; b_alias[nalias++]='\\builtin typeset' 468*7c356e86SAndroid Build Coastguard Worker i_alias[nalias]=login; b_alias[nalias++]='\\builtin exec login' 469*7c356e86SAndroid Build Coastguard Worker i_alias[nalias]=nameref; b_alias[nalias++]='\\builtin typeset -n' 470*7c356e86SAndroid Build Coastguard Worker i_alias[nalias]=nohup; b_alias[nalias++]='nohup ' 471*7c356e86SAndroid Build Coastguard Worker i_alias[nalias]=r; b_alias[nalias++]='\\builtin fc -e -' 472*7c356e86SAndroid Build Coastguard Worker i_alias[nalias]=type; b_alias[nalias++]='\\builtin whence -v' 473*7c356e86SAndroid Build Coastguard Worker 474*7c356e86SAndroid Build Coastguard Worker # accumulate mksh built-in utilities, in definition order, even ifndef 475*7c356e86SAndroid Build Coastguard Worker i_func[nfunc++]=. 476*7c356e86SAndroid Build Coastguard Worker i_func[nfunc++]=: 477*7c356e86SAndroid Build Coastguard Worker i_func[nfunc++]='[' 478*7c356e86SAndroid Build Coastguard Worker i_func[nfunc++]=alias 479*7c356e86SAndroid Build Coastguard Worker i_func[nfunc++]=break 480*7c356e86SAndroid Build Coastguard Worker # \\builtin cannot, by design, be overridden 481*7c356e86SAndroid Build Coastguard Worker i_func[nfunc++]=builtin 482*7c356e86SAndroid Build Coastguard Worker i_func[nfunc++]=cat 483*7c356e86SAndroid Build Coastguard Worker i_func[nfunc++]=cd 484*7c356e86SAndroid Build Coastguard Worker i_func[nfunc++]=chdir 485*7c356e86SAndroid Build Coastguard Worker i_func[nfunc++]=command 486*7c356e86SAndroid Build Coastguard Worker i_func[nfunc++]=continue 487*7c356e86SAndroid Build Coastguard Worker i_func[nfunc++]=echo 488*7c356e86SAndroid Build Coastguard Worker i_func[nfunc++]=eval 489*7c356e86SAndroid Build Coastguard Worker i_func[nfunc++]=exec 490*7c356e86SAndroid Build Coastguard Worker i_func[nfunc++]=exit 491*7c356e86SAndroid Build Coastguard Worker i_func[nfunc++]=export 492*7c356e86SAndroid Build Coastguard Worker i_func[nfunc++]=false 493*7c356e86SAndroid Build Coastguard Worker i_func[nfunc++]=fc 494*7c356e86SAndroid Build Coastguard Worker i_func[nfunc++]=getopts 495*7c356e86SAndroid Build Coastguard Worker i_func[nfunc++]=jobs 496*7c356e86SAndroid Build Coastguard Worker i_func[nfunc++]=kill 497*7c356e86SAndroid Build Coastguard Worker i_func[nfunc++]=let 498*7c356e86SAndroid Build Coastguard Worker i_func[nfunc++]=print 499*7c356e86SAndroid Build Coastguard Worker i_func[nfunc++]=pwd 500*7c356e86SAndroid Build Coastguard Worker i_func[nfunc++]=read 501*7c356e86SAndroid Build Coastguard Worker i_func[nfunc++]=readonly 502*7c356e86SAndroid Build Coastguard Worker i_func[nfunc++]=realpath 503*7c356e86SAndroid Build Coastguard Worker i_func[nfunc++]=rename 504*7c356e86SAndroid Build Coastguard Worker i_func[nfunc++]=return 505*7c356e86SAndroid Build Coastguard Worker i_func[nfunc++]=set 506*7c356e86SAndroid Build Coastguard Worker i_func[nfunc++]=shift 507*7c356e86SAndroid Build Coastguard Worker i_func[nfunc++]=source 508*7c356e86SAndroid Build Coastguard Worker i_func[nfunc++]=suspend 509*7c356e86SAndroid Build Coastguard Worker i_func[nfunc++]=test 510*7c356e86SAndroid Build Coastguard Worker i_func[nfunc++]=times 511*7c356e86SAndroid Build Coastguard Worker i_func[nfunc++]=trap 512*7c356e86SAndroid Build Coastguard Worker i_func[nfunc++]=true 513*7c356e86SAndroid Build Coastguard Worker i_func[nfunc++]=typeset 514*7c356e86SAndroid Build Coastguard Worker i_func[nfunc++]=ulimit 515*7c356e86SAndroid Build Coastguard Worker i_func[nfunc++]=umask 516*7c356e86SAndroid Build Coastguard Worker i_func[nfunc++]=unalias 517*7c356e86SAndroid Build Coastguard Worker i_func[nfunc++]=unset 518*7c356e86SAndroid Build Coastguard Worker i_func[nfunc++]=wait 519*7c356e86SAndroid Build Coastguard Worker i_func[nfunc++]=whence 520*7c356e86SAndroid Build Coastguard Worker i_func[nfunc++]=bg 521*7c356e86SAndroid Build Coastguard Worker i_func[nfunc++]=fg 522*7c356e86SAndroid Build Coastguard Worker i_func[nfunc++]=bind 523*7c356e86SAndroid Build Coastguard Worker i_func[nfunc++]=mknod 524*7c356e86SAndroid Build Coastguard Worker i_func[nfunc++]=printf 525*7c356e86SAndroid Build Coastguard Worker i_func[nfunc++]=sleep 526*7c356e86SAndroid Build Coastguard Worker i_func[nfunc++]=domainname 527*7c356e86SAndroid Build Coastguard Worker i_func[nfunc++]=extproc 528*7c356e86SAndroid Build Coastguard Worker 529*7c356e86SAndroid Build Coastguard Worker # accumulate aliases from dot.mkshrc, in definition order 530*7c356e86SAndroid Build Coastguard Worker i_alias[nalias]=l; b_alias[nalias++]='ls -F' 531*7c356e86SAndroid Build Coastguard Worker i_alias[nalias]=la; b_alias[nalias++]='l -a' 532*7c356e86SAndroid Build Coastguard Worker i_alias[nalias]=ll; b_alias[nalias++]='l -l' 533*7c356e86SAndroid Build Coastguard Worker i_alias[nalias]=lo; b_alias[nalias++]='l -alo' 534*7c356e86SAndroid Build Coastguard Worker i_alias[nalias]=doch; b_alias[nalias++]='sudo mksh -c "$(\\builtin fc -ln -1)"' 535*7c356e86SAndroid Build Coastguard Worker i_alias[nalias]=rot13; b_alias[nalias++]='tr abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ nopqrstuvwxyzabcdefghijklmNOPQRSTUVWXYZABCDEFGHIJKLM' 536*7c356e86SAndroid Build Coastguard Worker i_alias[nalias]=cls; b_alias[nalias++]='\\builtin print -n \\ec' 537*7c356e86SAndroid Build Coastguard Worker 538*7c356e86SAndroid Build Coastguard Worker # accumulate functions from dot.mkshrc, in definition order 539*7c356e86SAndroid Build Coastguard Worker i_func[nfunc++]=setenv 540*7c356e86SAndroid Build Coastguard Worker i_func[nfunc++]=smores 541*7c356e86SAndroid Build Coastguard Worker i_func[nfunc++]=hd 542*7c356e86SAndroid Build Coastguard Worker i_func[nfunc++]=hd_mksh 543*7c356e86SAndroid Build Coastguard Worker i_func[nfunc++]=which 544*7c356e86SAndroid Build Coastguard Worker i_func[nfunc++]=chpwd 545*7c356e86SAndroid Build Coastguard Worker i_func[nfunc++]=cd 546*7c356e86SAndroid Build Coastguard Worker i_func[nfunc++]=cd_csh 547*7c356e86SAndroid Build Coastguard Worker i_func[nfunc++]=dirs 548*7c356e86SAndroid Build Coastguard Worker i_func[nfunc++]=popd 549*7c356e86SAndroid Build Coastguard Worker i_func[nfunc++]=pushd 550*7c356e86SAndroid Build Coastguard Worker i_func[nfunc++]=Lb64decode 551*7c356e86SAndroid Build Coastguard Worker i_func[nfunc++]=Lb64encode 552*7c356e86SAndroid Build Coastguard Worker i_func[nfunc++]=Lbafh_init 553*7c356e86SAndroid Build Coastguard Worker i_func[nfunc++]=Lbafh_add 554*7c356e86SAndroid Build Coastguard Worker i_func[nfunc++]=Lbafh_finish 555*7c356e86SAndroid Build Coastguard Worker i_func[nfunc++]=Lstripcom 556*7c356e86SAndroid Build Coastguard Worker i_func[nfunc++]=enable 557*7c356e86SAndroid Build Coastguard Worker 558*7c356e86SAndroid Build Coastguard Worker # collect all identifiers, sorted ASCIIbetically 559*7c356e86SAndroid Build Coastguard Worker \\builtin set -sA i_all -- "${i_alias[@]}" "${i_func[@]}" 560*7c356e86SAndroid Build Coastguard Worker 561*7c356e86SAndroid Build Coastguard Worker # handle options, we don't do dynamic loading 562*7c356e86SAndroid Build Coastguard Worker while \\builtin getopts "adf:nps" x; do 563*7c356e86SAndroid Build Coastguard Worker case $x { 564*7c356e86SAndroid Build Coastguard Worker (a) 565*7c356e86SAndroid Build Coastguard Worker mode=-1 566*7c356e86SAndroid Build Coastguard Worker ;; 567*7c356e86SAndroid Build Coastguard Worker (d) 568*7c356e86SAndroid Build Coastguard Worker # deliberately causing an error, like bash-static 569*7c356e86SAndroid Build Coastguard Worker ;| 570*7c356e86SAndroid Build Coastguard Worker (f) 571*7c356e86SAndroid Build Coastguard Worker \\builtin print -ru2 enable: dynamic loading not available 572*7c356e86SAndroid Build Coastguard Worker \\builtin return 2 573*7c356e86SAndroid Build Coastguard Worker ;; 574*7c356e86SAndroid Build Coastguard Worker (n) 575*7c356e86SAndroid Build Coastguard Worker mode=0 576*7c356e86SAndroid Build Coastguard Worker ;; 577*7c356e86SAndroid Build Coastguard Worker (p) 578*7c356e86SAndroid Build Coastguard Worker doprnt=1 579*7c356e86SAndroid Build Coastguard Worker ;; 580*7c356e86SAndroid Build Coastguard Worker (s) 581*7c356e86SAndroid Build Coastguard Worker \\builtin set -sA i_all -- . : break continue eval \ 582*7c356e86SAndroid Build Coastguard Worker exec exit export readonly return set shift times \ 583*7c356e86SAndroid Build Coastguard Worker trap unset 584*7c356e86SAndroid Build Coastguard Worker ;; 585*7c356e86SAndroid Build Coastguard Worker (*) 586*7c356e86SAndroid Build Coastguard Worker \\builtin print -ru2 enable: usage: \ 587*7c356e86SAndroid Build Coastguard Worker "enable [-adnps] [-f filename] [name ...]" 588*7c356e86SAndroid Build Coastguard Worker return 2 589*7c356e86SAndroid Build Coastguard Worker ;; 590*7c356e86SAndroid Build Coastguard Worker } 591*7c356e86SAndroid Build Coastguard Worker done 592*7c356e86SAndroid Build Coastguard Worker \\builtin shift $((OPTIND - 1)) 593*7c356e86SAndroid Build Coastguard Worker 594*7c356e86SAndroid Build Coastguard Worker # display builtins enabled/disabled/all/special? 595*7c356e86SAndroid Build Coastguard Worker if (( doprnt || ($# == 0) )); then 596*7c356e86SAndroid Build Coastguard Worker for x in "${i_all[@]}"; do 597*7c356e86SAndroid Build Coastguard Worker y=$(\\builtin alias "$x") || y= 598*7c356e86SAndroid Build Coastguard Worker [[ $y = "$x='\\\\builtin whence -p $x >/dev/null || (\\\\builtin print -r mksh: $x: not found; \\\\builtin exit 127) && \$(\\\\builtin whence -p $x)'" ]]; z=$? 599*7c356e86SAndroid Build Coastguard Worker case $mode:$z { 600*7c356e86SAndroid Build Coastguard Worker (-1:0|0:0) 601*7c356e86SAndroid Build Coastguard Worker \\builtin print -r -- "enable -n $x" 602*7c356e86SAndroid Build Coastguard Worker ;; 603*7c356e86SAndroid Build Coastguard Worker (-1:1|1:1) 604*7c356e86SAndroid Build Coastguard Worker \\builtin print -r -- "enable $x" 605*7c356e86SAndroid Build Coastguard Worker ;; 606*7c356e86SAndroid Build Coastguard Worker } 607*7c356e86SAndroid Build Coastguard Worker done 608*7c356e86SAndroid Build Coastguard Worker \\builtin return 0 609*7c356e86SAndroid Build Coastguard Worker fi 610*7c356e86SAndroid Build Coastguard Worker 611*7c356e86SAndroid Build Coastguard Worker for x in "$@"; do 612*7c356e86SAndroid Build Coastguard Worker z=0 613*7c356e86SAndroid Build Coastguard Worker for y in "${i_alias[@]}" "${i_func[@]}"; do 614*7c356e86SAndroid Build Coastguard Worker [[ $x = "$y" ]] || \\builtin continue 615*7c356e86SAndroid Build Coastguard Worker z=1 616*7c356e86SAndroid Build Coastguard Worker \\builtin break 617*7c356e86SAndroid Build Coastguard Worker done 618*7c356e86SAndroid Build Coastguard Worker if (( !z )); then 619*7c356e86SAndroid Build Coastguard Worker \\builtin print -ru2 enable: "$x": not a shell builtin 620*7c356e86SAndroid Build Coastguard Worker rv=1 621*7c356e86SAndroid Build Coastguard Worker \\builtin continue 622*7c356e86SAndroid Build Coastguard Worker fi 623*7c356e86SAndroid Build Coastguard Worker if (( !mode )); then 624*7c356e86SAndroid Build Coastguard Worker # disable this 625*7c356e86SAndroid Build Coastguard Worker \\builtin alias "$x=\\\\builtin whence -p $x >/dev/null || (\\\\builtin print -r mksh: $x: not found; \\\\builtin exit 127) && \$(\\\\builtin whence -p $x)" 626*7c356e86SAndroid Build Coastguard Worker else 627*7c356e86SAndroid Build Coastguard Worker # find out if this is an alias or not, first 628*7c356e86SAndroid Build Coastguard Worker z=0 629*7c356e86SAndroid Build Coastguard Worker y=-1 630*7c356e86SAndroid Build Coastguard Worker while (( ++y < nalias )); do 631*7c356e86SAndroid Build Coastguard Worker [[ $x = "${i_alias[y]}" ]] || \\builtin continue 632*7c356e86SAndroid Build Coastguard Worker z=1 633*7c356e86SAndroid Build Coastguard Worker \\builtin break 634*7c356e86SAndroid Build Coastguard Worker done 635*7c356e86SAndroid Build Coastguard Worker if (( z )); then 636*7c356e86SAndroid Build Coastguard Worker # re-enable the original alias body 637*7c356e86SAndroid Build Coastguard Worker \\builtin alias "$x=${b_alias[y]}" 638*7c356e86SAndroid Build Coastguard Worker else 639*7c356e86SAndroid Build Coastguard Worker # re-enable the original utility/function 640*7c356e86SAndroid Build Coastguard Worker \\builtin unalias "$x" 641*7c356e86SAndroid Build Coastguard Worker fi 642*7c356e86SAndroid Build Coastguard Worker fi 643*7c356e86SAndroid Build Coastguard Worker done 644*7c356e86SAndroid Build Coastguard Worker \\builtin return $rv 645*7c356e86SAndroid Build Coastguard Worker} 646*7c356e86SAndroid Build Coastguard Worker 647*7c356e86SAndroid Build Coastguard Worker\: place customisations below this line 648*7c356e86SAndroid Build Coastguard Worker 649*7c356e86SAndroid Build Coastguard Worker# some defaults / samples which you are supposed to adjust to your 650*7c356e86SAndroid Build Coastguard Worker# liking; by default we add ~/.etc/bin and ~/bin (whichever exist) 651*7c356e86SAndroid Build Coastguard Worker# to $PATH, set $SHELL to mksh, set some defaults for man and less 652*7c356e86SAndroid Build Coastguard Worker# and show a few more possible things for users to begin moving in 653*7c356e86SAndroid Build Coastguard Worker 654*7c356e86SAndroid Build Coastguard Workerfor p in ~/.etc/bin ~/bin; do 655*7c356e86SAndroid Build Coastguard Worker [[ -d $p/. ]] || \\builtin continue 656*7c356e86SAndroid Build Coastguard Worker [[ $PATHSEP$PATH$PATHSEP = *"$PATHSEP$p$PATHSEP"* ]] || \ 657*7c356e86SAndroid Build Coastguard Worker PATH=$p$PATHSEP$PATH 658*7c356e86SAndroid Build Coastguard Workerdone 659*7c356e86SAndroid Build Coastguard Worker 660*7c356e86SAndroid Build Coastguard Worker\\builtin export SHELL=$MKSH MANWIDTH=80 LESSHISTFILE=- 661*7c356e86SAndroid Build Coastguard Worker\\builtin alias cls='\\builtin print -n \\ec' 662*7c356e86SAndroid Build Coastguard Worker 663*7c356e86SAndroid Build Coastguard Worker#\\builtin unset LC_ADDRESS LC_COLLATE LC_CTYPE LC_IDENTIFICATION \ 664*7c356e86SAndroid Build Coastguard Worker# LC_MEASUREMENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER \ 665*7c356e86SAndroid Build Coastguard Worker# LC_TELEPHONE LC_TIME LANGUAGE LANG LC_ALL 666*7c356e86SAndroid Build Coastguard Worker#p=en_GB.UTF-8 667*7c356e86SAndroid Build Coastguard Worker#\\builtin export LANG=C LC_CTYPE=$p LC_MEASUREMENT=$p LC_MESSAGES=$p LC_PAPER=$p 668*7c356e86SAndroid Build Coastguard Worker#\\builtin export LANG=C.UTF-8 LC_CTYPE=C.UTF-8 669*7c356e86SAndroid Build Coastguard Worker#\\builtin export LC_ALL=C.UTF-8 670*7c356e86SAndroid Build Coastguard Worker#\\builtin set -U 671*7c356e86SAndroid Build Coastguard Worker#[[ ${LC_ALL:-${LC_CTYPE:-${LANG:-}}} = *[Uu][Tt][Ff]?(-)8* ]] || \\builtin set +U 672*7c356e86SAndroid Build Coastguard Worker 673*7c356e86SAndroid Build Coastguard Worker\\builtin unset p 674*7c356e86SAndroid Build Coastguard Worker 675*7c356e86SAndroid Build Coastguard Worker\: place customisations above this line 676