updates from MirBSD CVS
authorThorsten Glaser <tg@mirbsd.org>
Sun, 19 May 2013 21:26:28 +0000 (21:26 +0000)
committerThorsten Glaser <tg@mirbsd.org>
Sun, 19 May 2013 21:26:28 +0000 (21:26 +0000)
22 files changed:
ksh/permute [new file with mode: 0644]
mksh/_remfor [new file with mode: 0644]
mksh/bdfctool.1
mksh/bdfctool.sh
mksh/cvs-switchroot [new file with mode: 0644]
mksh/cvs-switchroot.1 [new file with mode: 0644]
mksh/debian-dev/dot.quiltrc [new file with mode: 0644]
mksh/debian-dev/mkdebidx.sh
mksh/debian-dev/quinn-ls.sh
mksh/dumpargs [new file with mode: 0644]
mksh/getarticle
mksh/hexpad.sh [new file with mode: 0644]
mksh/mpcabber [new file with mode: 0644]
mksh/ps2pdfmir [new file with mode: 0644]
mksh/roff2htm
mksh/tpmrx [new file with mode: 0644]
mksh/uhr
mksh/uhr-preR41 [new file with mode: 0644]
mksh/verscmp [new file with mode: 0644]
mksh/wtf [new file with mode: 0644]
posix/pbuilder-hooks/C80shell-joe
posix/pbuilder-hooks/C80shell-jupp

diff --git a/ksh/permute b/ksh/permute
new file mode 100644 (file)
index 0000000..b5b18ea
--- /dev/null
@@ -0,0 +1,58 @@
+#!/bin/mksh
+# $MirOS: contrib/code/Snippets/permute,v 1.4 2008/05/03 01:09:24 tg Exp $
+#-
+# Copyright (c) 2006
+#      Thorsten Glaser <tg@mirbsd.de>
+#
+# Provided that these terms and disclaimer and all copyright notices
+# are retained or reproduced in an accompanying document, permission
+# is granted to deal in this work without restriction, including un-
+# limited rights to use, publicly perform, distribute, sell, modify,
+# merge, give away, or sublicence.
+#
+# This work is provided "AS IS" and WITHOUT WARRANTY of any kind, to
+# the utmost extent permitted by applicable law, neither express nor
+# implied; without malicious intent or gross negligence. In no event
+# may a licensor, author or contributor be held liable for indirect,
+# direct, other damage, loss, or other issues arising in any way out
+# of dealing in the work, even if advised of the possibility of such
+# damage or existence of a defect, except proven that it results out
+# of said person's immediate fault when using the work as intended.
+#-
+# Achtung: dieses Skript gibt n! Zeilen (n = $#) aus! (n-Fakultät)
+
+function permute
+{
+       integer i=0
+       integer num
+
+       set -A all $*
+       num=${#all[*]}
+       if (( num == 2 )); then
+               print $1 $2
+               print $2 $1
+               return 0
+       fi
+       if (( num == 1 )); then
+               print $1
+               return 0
+       fi
+       while (( i < num )); do
+               local x= y sp=
+               integer j=0
+               while (( j < num )); do
+                       if (( j == i )); then
+                               y=${all[j]}
+                       else
+                               x=$x$sp${all[j]}
+                               sp=" "
+                       fi
+                       let j++
+               done
+               permute $x | sed "s\ 1^\ 1$y \ 1"
+               let i++
+       done
+}
+
+(( $# > 0 )) || return 0
+permute $*
diff --git a/mksh/_remfor b/mksh/_remfor
new file mode 100644 (file)
index 0000000..72b83c0
--- /dev/null
@@ -0,0 +1,11 @@
+#!/bin/mksh
+
+local _i _fm=$2 _h=$1
+shift; shift
+
+trap "" INT
+ssh "$_h" find "${_fm@Q}" -type f -print0 | sort -R "" | \
+    while IFS= read -r -d "" _i; do
+       print -r "◖${_i}◗"
+       ssh -n "$_h" cat "${_i@Q}" | "$@"
+done
index 6bceeeb..8e4552f 100644 (file)
@@ -1,6 +1,6 @@
-.\" $MirOS: X11/extras/bdfctool/bdfctool.1,v 1.9 2012/09/01 21:15:29 tg Exp $
+.\" $MirOS: X11/extras/bdfctool/bdfctool.1,v 1.10 2013/05/17 21:51:40 tg Exp $
 .\"-
-.\" Copyright © 2012
+.\" Copyright © 2012, 2013
 .\"    Thorsten “mirabilos” Glaser <tg@mirbsd.org>
 .\"-
 .\" Try to make GNU groff and AT&T nroff more compatible
@@ -57,7 +57,7 @@
 .\" with -mandoc, it might implement .Mx itself, but we want to
 .\" use our own definition. And .Dd must come *first*, always.
 .\"
-.Dd $Mdocdate: September 1 2012 $
+.Dd $Mdocdate: May 17 2013 $
 .\"
 .\" Check which macro package we use, and do other -mdoc setup.
 .\"
 .Nm
 .Fl e
 .Op Fl a
+.Nm
+.Ic +e
 .Sh DESCRIPTION
 The
 .Nm
@@ -182,6 +184,9 @@ which uses U+3000 and U+4DC0 to represent unset and set bits,
 respectively, so they can be visually edited.
 This mode operates on glyphs and does not need to be passed the
 whole file, e.g. using \*(haK/ in the jupp text editor.
+.It Ic +e
+Revert selected glyphs from edit form back to compressed form
+.Pq without whole-file validation .
 .It Fl F
 Do a fast decompression with no error checking.
 Run this on files passed through
index d134ef2..28fdd35 100644 (file)
@@ -1,7 +1,7 @@
 #!/bin/mksh
-# $MirOS: X11/extras/bdfctool/bdfctool.sh,v 1.11 2012/09/01 19:00:01 tg Exp $
+# $MirOS: X11/extras/bdfctool/bdfctool.sh,v 1.12 2013/05/17 21:51:40 tg Exp $
 #-
-# Copyright © 2012
+# Copyright © 2012, 2013
 #      Thorsten Glaser <tg@mirbsd.org>
 #
 # Provided that these terms and disclaimer and all copyright notices
@@ -27,7 +27,7 @@ while getopts "acdeFh" ch; do
        case $ch {
        (a) uascii=1 ;;
        (+a) uascii=0 ;;
-       (c|d|e) mode=$ch ;;
+       (c|d|e|+e) mode=$ch ;;
        (F) ufast=1 ;;
        (+F) ufast=0 ;;
        (h) mode=$ch ;;
@@ -39,7 +39,7 @@ shift $((OPTIND - 1))
 
 if [[ $mode = ?(h) ]] || [[ $mode != e && $uascii != -1 ]] || \
     [[ $mode != d && $ufast != 0 ]]; then
-       print -ru2 "Usage: ${0##*/} -c | -d [-F] | -e [-a]"
+       print -ru2 "Usage: ${0##*/} -c | -d [-F] | -e [-a] | +e"
        [[ $mode = h ]]; exit $?
 fi
 
@@ -529,6 +529,56 @@ if [[ $mode = c ]]; then
        exit 0
 fi
 
+if [[ $mode = +e ]]; then
+       while IFS= read -r line; do
+               (( ++lno ))
+               if [[ $line = \' || $line = "' "* ]]; then
+                       print -r -- "$line"
+                       continue
+               fi
+               set -A f -- $line
+               if [[ ${f[0]} != [ce] ]]; then
+                       print -ru2 "E: invalid line #$lno: '$line'"
+                       exit 2
+               fi
+               if [[ ${f[1]} != [0-9A-F][0-9A-F][0-9A-F][0-9A-F] ]]; then
+                       print -ru2 "E: invalid encoding '${f[1]}' at line $lno"
+                       exit 2
+               fi
+               typeset -Uui16 -Z7 ch=16#${f[1]}
+               if (( ${#f[*]} < 4 || ${#f[*]} > 5 )); then
+                       print -ru2 "E: invalid number of fields on line $lno" \
+                           "at U+${ch#16#}: ${#f[*]}: '$line'"
+                       exit 2
+               fi
+               if (( f[2] < 1 || f[2] > 32 )); then
+                       print -ru2 "E: width ${f[2]} not in 1‥32 at line $lno"
+                       exit 2
+               fi
+               [[ ${f[4]} = "uni${ch#16#}" ]] && unset f[4]
+               if [[ ${f[0]} = e ]]; then
+                       parse_bdfc_edit
+               else
+                       if (( f[2] <= 8 )); then
+                               x='+([0-9A-F][0-9A-F]:)'
+                       elif (( f[2] <= 16 )); then
+                               x='+([0-9A-F][0-9A-F][0-9A-F][0-9A-F]:)'
+                       elif (( f[2] <= 24 )); then
+                               x='+([0-9A-F][0-9A-F][0-9A-F][0-9A-F][0-9A-F][0-9A-F]:)'
+                       else
+                               x='+([0-9A-F][0-9A-F][0-9A-F][0-9A-F][0-9A-F][0-9A-F][0-9A-F][0-9A-F]:)'
+                       fi
+                       if eval [[ '${f[3]}:' != "$x" ]]; then
+                               print -ru2 "E: invalid hex encoding for" \
+                                   "U+${ch#16#}, line $lno: '${f[3]}'"
+                               exit 2
+                       fi
+               fi
+               print -r -- "${f[@]}"
+       done
+       exit 0
+fi
+
 if [[ $mode != d ]]; then
        print -ru2 "E: cannot happen (control flow issue in ${0##*/}:$LINENO)"
        exit 255
diff --git a/mksh/cvs-switchroot b/mksh/cvs-switchroot
new file mode 100644 (file)
index 0000000..934845e
--- /dev/null
@@ -0,0 +1,99 @@
+#!/bin/mksh
+# $MirOS: contrib/hosted/tg/deb/cvs/debian/cvs-switchroot,v 1.1 2011/06/10 23:44:12 tg Exp $
+#-
+# Copyright © 2005, 2008, 2011
+#      Thorsten “mirabilos” Glaser <tg@mirbsd.org>
+#
+# Provided that these terms and disclaimer and all copyright notices
+# are retained or reproduced in an accompanying document, permission
+# is granted to deal in this work without restriction, including un‐
+# limited rights to use, publicly perform, distribute, sell, modify,
+# merge, give away, or sublicence.
+#
+# This work is provided “AS IS” and WITHOUT WARRANTY of any kind, to
+# the utmost extent permitted by applicable law, neither express nor
+# implied; without malicious intent or gross negligence. In no event
+# may a licensor, author or contributor be held liable for indirect,
+# direct, other damage, loss, or other issues arising in any way out
+# of dealing in the work, even if advised of the possibility of such
+# damage or existence of a defect, except proven that it results out
+# of said person’s immediate fault when using the work as intended.
+#-
+# Change CVSROOT of a checked out tree (and save space with it)
+# With option -T: change Tag instead of Root
+
+me=${0##*/}
+if [[ $1 = -T ]]; then
+       tagmode=-T
+       fn=Tag
+       shift
+else
+       tagmode=
+       fn=Root
+fi
+newroot=$1
+useroot=0
+if [[ $newroot = - ]]; then
+       shift
+       newroot=$(realpath "$1")
+       [[ -d $newroot ]] && if [[ -d $newroot/CVS ]]; then
+               newroot=$newroot/CVS/$fn
+       else
+               newroot=$newroot/$fn
+       fi
+       useroot=1
+fi
+if [[ -z $newroot || $newroot = -? ]]; then
+       print -u2 "Syntax: $me newroot [dir [...]]"
+       print -u2 "\t$me - .../CVS/Root [dir [...]]"
+       print -u2 "\t$me -T - .../CVS/Tag [dir [...]]"
+       exit 1
+fi
+shift
+
+[[ -z $1 ]] && set -- .
+
+# realpath(2)ise arguments
+set -A arg
+let i=0
+for name in "$@"; do
+       arg[i++]=$(realpath "$name")
+done
+
+if ! T="$(mktemp ${arg[0]}/$me.XXXXXXXXXX)"; then
+       print -u2 "$me: fatal: cannot mktemp"
+       exit 1
+fi
+
+if (( useroot )); then
+       rm -f "$T"
+       ln "$newroot" "$T" || cp "$newroot" "$T"
+fi
+
+trap 'rm -f "$T"; exit 0' 0
+trap 'rm -f "$T"; trap - EXIT; exit 1' 1 2 3 5 13 15
+
+if (( !useroot )); then
+       chmod 664 "$T"
+       print -r -- "$newroot" >"$T"
+fi
+
+let rv=0
+find "${arg[@]}" -path \*/CVS/$fn -print0 |&
+while IFS= read -d '' -pr name; do
+       if ! rm "$name"; then
+               print -u2 "$me: error: cannot rm <$name>"
+               exit 1
+       fi
+       ln -f "$T" "$name" || if ! U="$(mktemp ${arg[0]}/$me.XXXXXXXXXX)"; then
+               cp "$T" "$name"
+       elif cat "$T" >"$U" && ln -f "$U" "$name"; then
+               rm -f "$T"
+               T="$U"
+       else
+               rm -f "$U"
+               cp "$T" "$name"
+       fi
+done
+
+exit 0
diff --git a/mksh/cvs-switchroot.1 b/mksh/cvs-switchroot.1
new file mode 100644 (file)
index 0000000..1ffe5b6
--- /dev/null
@@ -0,0 +1,78 @@
+.\" $MirOS: contrib/hosted/tg/deb/cvs/debian/cvs-switchroot.1,v 1.2 2011/06/24 16:16:06 tg Exp $
+.\"
+.Dd June 10, 2011
+.Dt CVS\-SWITCHROOT 1
+.Os
+.Sh NAME
+.Nm cvs\-switchroot
+.Nd change repository or tag in a cvs working copy
+.Sh SYNOPSIS
+.Nm
+.Op Fl T
+.Ar newroot
+.Op Ar
+.Pp
+.Nm
+.Op Fl T
+\-\&
+.Ar srcpath
+.Op Ar
+.Sh DESCRIPTION
+The
+.Nm
+utility manipulates a CVS working copy directly,
+modifying the information stored in the administrative
+subdirectory and saving space by hardlinking if possible.
+.Pp
+If the
+.Fl T
+option is given, the sticky tag is operated on,
+otherwise, the repository path
+.Pq Ev CVSROOT .
+.Pp
+The information (Tag or Root) is set to the same as in
+.Ar srcpath
+if the first non-option argument
+.Ar newroot
+is a sole dash
+.Pq Sq \-\& ,
+the literal value
+.Ar newroot
+otherwise.
+.Sh EXAMPLES
+Change all
+.Pa Root
+information in the current sandbox to 
+.Pa /cvs :
+.Bd -literal -offset ident
+$ cvs-switchroot /cvs .
+.Ed
+.Pp
+Set all roots in the current working directory and all
+its subdirectories to the
+.Pa Root
+of the parent directory:
+.Bd -literal -offset ident
+$ cvs-switchroot \- .. .
+.Ed
+.Pp
+Hardlink the
+.Pa Tag
+information in the current working directory, for example
+.Pa /usr/src ,
+and
+.Pa /usr/ports
+with each other:
+.Bd -literal -offset ident
+$ cvs-switchroot \-T \- . . /usr/ports
+.Ed
+.Sh SEE ALSO
+.Xr cvs 1
+.Sh HISTORY
+.Nm
+has existed in the MirBSD source tree since 2005.
+It was added to Debian's cvs package in 2011.
+.Sh CAVEATS
+.Nm
+depends on
+.Nm mksh .
diff --git a/mksh/debian-dev/dot.quiltrc b/mksh/debian-dev/dot.quiltrc
new file mode 100644 (file)
index 0000000..1fef496
--- /dev/null
@@ -0,0 +1,29 @@
+# $MirOS: contrib/hosted/tg/deb/dot.quiltrc,v 1.3 2012/12/01 14:08:31 tg Exp $
+
+while test -z "$QUILT_PATCHES" || test x"$QUILT_PATCHES" = x"-"; do
+       d=.
+       while :; do
+               test -d $d/debian && test -x $d/debian/rules && break
+               test x"$(/bin/readlink -e $d)" = x"/" && break
+               d=$d/..
+       done
+       test -x $d/debian/rules || break
+
+       # now in Debian packaging tree with unset $QUILT_PATCHES
+
+       QUILT_PATCHES="debian/patches"
+       QUILT_PATCH_OPTS="--reject-format=unified"
+       QUILT_DIFF_OPTS=""
+       test -n "$QUILTRC_NO_DIFF_P" || \
+           QUILT_DIFF_OPTS="$QUILT_DIFF_OPTS --show-c-function"
+       QUILT_DIFF_ARGS="-p ab --no-timestamps --no-index --color=auto"
+       QUILT_REFRESH_ARGS="-p ab --no-timestamps --no-index"
+       QUILT_PUSH_ARGS="--color=auto"
+       QUILT_COLORS="diff_hdr=1;32:diff_add=1;34:diff_rem=1;31:diff_hunk=1;33:diff_ctx=35:diff_cctx=33"
+       test -d $d/debian/patches || mkdir $d/debian/patches
+
+       # this is not a real loop, exit it always
+       break
+done
+test x"$QUILT_PATCHES" = x"-" && QUILT_PATCHES=patches
+:
index af9631b..3c3a813 100644 (file)
@@ -1,7 +1,7 @@
 #!/bin/mksh
-rcsid='$MirOS: contrib/hosted/tg/deb/mkdebidx.sh,v 1.56 2012/08/02 21:01:39 tg Exp $'
+rcsid='$MirOS: contrib/hosted/tg/deb/mkdebidx.sh,v 1.58 2013/03/18 16:55:37 tg Exp $'
 #-
-# Copyright (c) 2008, 2009, 2010, 2011, 2012
+# Copyright (c) 2008, 2009, 2010, 2011, 2012, 2013
 #      Thorsten Glaser <tg@mirbsd.org>
 #
 # Provided that these terms and disclaimer and all copyright notices
@@ -33,9 +33,9 @@ function repo_description {
 }
 
 
-set -A dpkgarchs -- alpha amd64 arm armel armhf avr32 hppa hurd-i386 i386 \
+set -A dpkgarchs -- alpha amd64 arm arm64 armel armhf hppa hurd-i386 i386 \
     ia64 kfreebsd-amd64 kfreebsd-i386 m68k mips mipsel powerpc powerpcspe \
-    ppc64 s390 s390x sh4 sparc sparc64
+    ppc64 s390 s390x sh4 sparc sparc64 x32
 
 function remsign {
        target=$1; shift
@@ -228,6 +228,11 @@ for suite in dists/*; do
        [[ $release_sign_detached = [01] ]] || \
            (( release_sign_detached = release_sign_inline ? 0 : 1 ))
 
+       # Debian's fix for CVE-2013-1051 consists of disabling
+       # support for InRelease files altogether (WTF!)
+       release_sign_detached=1
+       release_sign_inline=0
+
        (( release_sign_detached )) && $gpg_remote gpg -u $repo_keyid \
            -sab <$suite/Release-tmp >$suite/Release-sig
        (( release_sign_inline )) && $gpg_remote gpg -u $repo_keyid \
@@ -443,7 +448,7 @@ done
 EOF
 print -r -- " <title>${repo_title} Index</title>"
 cat <<'EOF'
- <meta name="generator" content="$MirOS: contrib/hosted/tg/deb/mkdebidx.sh,v 1.56 2012/08/02 21:01:39 tg Exp $" />
+ <meta name="generator" content="$MirOS: contrib/hosted/tg/deb/mkdebidx.sh,v 1.58 2013/03/18 16:55:37 tg Exp $" />
  <style type="text/css">
   table {
    border: 1px solid black;
index 2e8d3dc..ac95229 100644 (file)
@@ -1,7 +1,7 @@
 #!/bin/mksh
-rcsid='$MirOS: contrib/hosted/tg/deb/quinn-ls.sh,v 1.6 2011/11/11 20:24:02 tg Exp $'
+rcsid='$MirOS: contrib/hosted/tg/deb/quinn-ls.sh,v 1.12 2013/01/14 22:16:42 tg Exp $'
 #-
-# Copyright © 2011
+# Copyright © 2011, 2012, 2013
 #      Thorsten Glaser <tg@debian.org>
 #
 # Provided that these terms and disclaimer and all copyright notices
@@ -19,13 +19,14 @@ rcsid='$MirOS: contrib/hosted/tg/deb/quinn-ls.sh,v 1.6 2011/11/11 20:24:02 tg Ex
 # damage or existence of a defect, except proven that it results out
 # of said person’s immediate fault when using the work as intended.
 
-gather=cwd
+gather=cwd fromfile=
 mydir=$(realpath "$(dirname "$0")")
 PATH="$mydir:$mydir/..:$PATH" . assockit.ksh
 
-while getopts "l" ch; do
+while getopts "L:l" ch; do
        case $ch {
-       (l)     gather=installed ;;
+       (L)     gather=installed fromfile=$OPTARG ;;
+       (l)     gather=installed fromfile= ;;
        (*)     exit 1 ;;
        }
 done
@@ -64,6 +65,30 @@ function isdebver {
        eval [[ \$1 = $epochglob$uvglob$dvglob ]]
 }
 
+# packages to never ask rmadison for
+asso_setv 1 nomadison arngc
+asso_setv 1 nomadison atari-bootstrap
+asso_setv 1 nomadison atari-fdisk
+asso_setv 1 nomadison ca-bundle
+asso_setv 1 nomadison defoma
+asso_setv 1 nomadison evolvis-anonsvnsh
+asso_setv 1 nomadison evolvis-meta
+asso_setv 1 nomadison m68k-gcc-defaults
+asso_setv 1 nomadison m68k-vme-tftplilo
+asso_setv 1 nomadison m68kboot
+asso_setv 1 nomadison mircpio
+asso_setv 1 nomadison mirhost
+asso_setv 1 nomadison mirmake
+asso_setv 1 nomadison mirsirc
+asso_setv 1 nomadison pbuilder-satisfydepends-dummy
+asso_setv 1 nomadison sbuild-build-depends-core-dummy
+asso_setv 1 nomadison ssfe
+asso_setv 1 nomadison vmelilo
+asso_setv 1 nomadison vmelilo-installer
+asso_setv 1 nomadison wtf
+asso_setv 1 nomadison wtf-debian-keyring
+asso_setv 1 nomadison xfree86
+
 i=0
 function do_gather {
        if ! isdebpkg "$Source"; then
@@ -110,7 +135,19 @@ if [[ $gather = cwd ]]; then
                do_gather
        done
 elif [[ $gather = installed ]]; then
-       dpkg-query -Wf '${Package} ${Version} ${Source} ${Package}\n' |&
+       if [[ -n $fromfile ]]; then
+               # e.g. from running the following command:
+               # chroot --userspec=65534:65534 /var/cache/pbuilder/build/cow.27937 \
+               #     /usr/bin/dpkg-query -Wf '${Package} ${Version} ${Source} ${Package}\n' \
+               #     >thefile
+               if [[ ! -s $fromfile ]]; then
+                       print -u2 "Cannot read $fromfile."
+                       exit 1
+               fi
+               cat "$fromfile"
+       else
+               dpkg-query -Wf '${Package} ${Version} ${Source} ${Package}\n'
+       fi |&
        while read -p name Version Source x rest; do
                if [[ $Source = *'('*')' ]]; then
                        # this is not customary…
@@ -131,6 +168,10 @@ fi
 
 print -u2 '\nrunning rmadison…'
 asso_loadk pkgs
+i=${#asso_y[*]}
+while (( i-- )); do
+       asso_isset nomadison "${asso_y[i]}" && unset asso_y[i]
+done
 rmadison -s sid "${asso_y[@]}" |&
 while read -pr pkg pipe vsn pipe sid pipe arches; do
        #print -u2 "D: pkg<$pkg> vsn<$vsn> sid<$sid> arches<$arches>"
@@ -162,6 +203,11 @@ for type in bad bld ign; do
        [[ -s $mydir/quinn-ls.$type ]] || continue
        while read pkg vsn; do
                [[ $pkg = '#'* ]] && continue
+               if [[ $pkg = *_* && -z $vsn ]]; then
+                       # buildd syntax
+                       vsn=${pkg#*_}
+                       pkg=${pkg%%_*}
+               fi
                if ! isdebpkg "$pkg"; then
                        print -ru2 "skipping invalid package '$pkg'," \
                            override $type
diff --git a/mksh/dumpargs b/mksh/dumpargs
new file mode 100644 (file)
index 0000000..0c15530
--- /dev/null
@@ -0,0 +1,38 @@
+#!/bin/mksh
+# $MirOS: contrib/hosted/tg/dumpargs,v 1.2 2013/05/18 15:34:34 tg Exp $
+#-
+# Copyright © 2013
+#      Thorsten Glaser <tg@mirbsd.org>
+#
+# Provided that these terms and disclaimer and all copyright notices
+# are retained or reproduced in an accompanying document, permission
+# is granted to deal in this work without restriction, including un‐
+# limited rights to use, publicly perform, distribute, sell, modify,
+# merge, give away, or sublicence.
+#
+# This work is provided “AS IS” and WITHOUT WARRANTY of any kind, to
+# the utmost extent permitted by applicable law, neither express nor
+# implied; without malicious intent or gross negligence. In no event
+# may a licensor, author or contributor be held liable for indirect,
+# direct, other damage, loss, or other issues arising in any way out
+# of dealing in the work, even if advised of the possibility of such
+# damage or existence of a defect, except proven that it results out
+# of said person’s immediate fault when using the work as intended.
+#-
+# Dump process environment to syslog.
+
+{
+       {
+               typeset -p
+               print -n "args($#)"
+               i=-1
+               for x in "$0" "$@"; do
+                       print -nr -- " $((++i)):${x@Q}"
+               done
+               print
+       } | /usr/bin/tee /dev/stderr | \
+           /usr/bin/logger -p user.debug -t "dumpargs[$$]"
+} 2>&1 | {
+       print "=== dumpargs[$$] ==="
+       cat
+}
index 819c4ea..088a40b 100644 (file)
@@ -1,5 +1,5 @@
 #!/bin/mksh
-# $MirOS: contrib/hosted/tg/getarticle,v 1.2 2012/04/06 23:59:21 tg Exp $
+# $MirOS: contrib/hosted/tg/getarticle,v 1.3 2012/11/20 19:52:38 tg Exp $
 #-
 # Copyright © 2012
 #      Thorsten Glaser <tg@mirbsd.org>
@@ -26,6 +26,8 @@
 
 if (( $# == 2 )); then
        printf 'mode reader\r\ngroup %s\r\narticle %d\r\nquit\r\n' "$1" "$2"
+elif [[ $1 = */+([0-9]) ]]; then
+       printf 'mode reader\r\ngroup %s\r\narticle %d\r\nquit\r\n' "${1%/*}" "${1##*/}"
 else
        printf 'mode reader\r\narticle <%s>\r\nquit\r\n' "$1"
 fi | \
diff --git a/mksh/hexpad.sh b/mksh/hexpad.sh
new file mode 100644 (file)
index 0000000..5dc5f32
--- /dev/null
@@ -0,0 +1,167 @@
+#!/bin/mksh
+# $MirOS: contrib/fonts/unifont/hexpad.sh,v 1.4 2012/09/01 20:57:15 tg Exp $
+#-
+# Copyright © 2012
+#      Thorsten Glaser <tg@mirbsd.org>
+#
+# Provided that these terms and disclaimer and all copyright notices
+# are retained or reproduced in an accompanying document, permission
+# is granted to deal in this work without restriction, including un‐
+# limited rights to use, publicly perform, distribute, sell, modify,
+# merge, give away, or sublicence.
+#
+# This work is provided “AS IS” and WITHOUT WARRANTY of any kind, to
+# the utmost extent permitted by applicable law, neither express nor
+# implied; without malicious intent or gross negligence. In no event
+# may a licensor, author or contributor be held liable for indirect,
+# direct, other damage, loss, or other issues arising in any way out
+# of dealing in the work, even if advised of the possibility of such
+# damage or existence of a defect, except proven that it results out
+# of said person’s immediate fault when using the work as intended.
+#-
+# Read unifont.hex and remove glyphs from blanks.hex and rc-priv.hex
+# then pad 8x16 to 9x18 and 16x16 to 18x18 and output them into bdfc
+# stub files, separate by glyph width if character width matches it.
+# (Theoretically, we should allow ${%s} == -1 for halfwidth, but all
+# occurrences in GNU Unifont are fullwidth.)
+
+set -U
+
+set -A skip
+integer skip
+# pure awkwardness later
+skip[0]=1
+# invalid codepoints
+skip[0xFFFE]=1
+skip[0xFFFF]=1
+# surrogates
+c=0xD800
+while (( c <= 0xDFFF )); do
+       skip[c++]=1
+done
+while IFS=: read i data rest; do
+       if [[ $data = 00542A542A542A542A542A542A542A00 ]]; then
+               skip[0x$i]=1
+       else
+               print -ru2 E: unknown blanks line "$i:$data:$rest"
+               exit 1
+       fi
+done <blanks.hex
+while IFS=: read i data rest; do
+       if [[ $data = FFB9C5EDD5D5D5D5D5D5D5D5EDB991FF ]]; then
+               skip[0x$i]=1
+       else
+               print -ru2 E: unknown rc-priv line "$i:$data:$rest"
+               exit 1
+       fi
+done <rc-priv.hex
+
+function check_hw {
+       typeset -Uui16 -Z5 q
+
+       q=0x${data: 30:2}
+       (( top = (q != 0) ))
+}
+
+function check_fw {
+       typeset -Uui16 -Z5 q r
+
+       q=0x${data: 0:4}
+       r=0x${data: 60:4}
+       (( top = (q || r) ))
+       if [[ $data = @(AAAA00018000*5555|555580000001*AAAA) ]]; then
+               top=0
+               odd=0
+       fi
+}
+
+function merge_hw {
+       typeset -Uui16 -Z5 q
+
+       q=0x${data: j*2:2}
+       (( odd |= (q & 1) ))
+       l+=${q#16#}00:
+}
+
+function merge_fw {
+       typeset -Uui16 -Z9 q
+
+       q=0x${data: j*4:4}
+       (( odd |= (q & 1) ))
+       (( q <<= 7 ))
+       l+=${q#16#}:
+}
+
+exec 4>unihalf9x18.bdfc 5>unihalf18x18.bdfc
+
+print -ru4 -- =bdfc 1
+print -ru4 -- C
+print -ru4 -- d 540 0 9 0 0 -4
+
+print -ru5 -- =bdfc 1
+print -ru5 -- C
+print -ru5 -- d 1080 0 18 0 0 -3
+
+typeset -i1 ch
+while IFS=: read i data rest; do
+       if (( skip[(ch = 0x$i)] )); then
+               print SKIP $i
+               continue
+       fi
+       s=${ch#1#}
+       if (( ${#data} == 32 )); then
+               if (( ${%s} != 1 && ${%s} != 0 )); then
+                       print NOTH $i
+                       continue
+               fi
+               ofd=4
+               nulls=0000
+               sz=hw
+               l="c $i 9 "
+       elif (( ${#data} == 64 )); then
+               if (( ${%s} != 2 && ${%s} != 0 )); then
+                       print NOTF $i
+                       continue
+               fi
+               ofd=5
+               nulls=000000
+               sz=fw
+               l="c $i 18 $nulls:"
+       else
+               print E:UW $i ${#data}
+               continue
+       fi
+       odd=0 top=0
+       j=-1
+       while (( ++j < 16 )); do
+               eval merge_$sz
+       done
+       if [[ $sz = fw ]]; then
+               l+=$nulls
+       else
+               l+=$nulls:$nulls
+       fi
+       print -ru$ofd -- $l
+       eval check_$sz
+       (( odd )) && print HORZ $i
+       (( top )) && print VERT $i
+done <unifont.hex | tee hexpad.log
+
+print -u4 .
+print -u5 .
+exec 4>&- 5>&-
+
+if [[ -s ../9x18.lst && -s ../18x18ko.lst ]]; then
+       set -A known
+       for x in $(<../9x18.lst) $(<../18x18ko.lst); do
+               known[0x$x]=1
+       done
+
+       while read a b; do
+               [[ $a = HORZ || $a = VERT ]] || continue
+               (( known[0x$b] )) && continue
+               print $a $b
+       done <hexpad.log >hexpad.chk
+fi
+
+print DONE
diff --git a/mksh/mpcabber b/mksh/mpcabber
new file mode 100644 (file)
index 0000000..fd374f9
--- /dev/null
@@ -0,0 +1,194 @@
+#!/usr/bin/env mksh
+# $MirOS: contrib/code/Snippets/mpcabber,v 1.16 2009/12/01 19:28:45 tg Exp $
+#-
+# Copyright (c) 2008, 2009
+#      Thorsten Glaser <tg@mirbsd.org>
+#
+# Provided that these terms and disclaimer and all copyright notices
+# are retained or reproduced in an accompanying document, permission
+# is granted to deal in this work without restriction, including un-
+# limited rights to use, publicly perform, distribute, sell, modify,
+# merge, give away, or sublicence.
+#
+# This work is provided “AS IS” and WITHOUT WARRANTY of any kind, to
+# the utmost extent permitted by applicable law, neither express nor
+# implied; without malicious intent or gross negligence. In no event
+# may a licensor, author or contributor be held liable for indirect,
+# direct, other damage, loss, or other issues arising in any way out
+# of dealing in the work, even if advised of the possibility of such
+# damage or existence of a defect, except proven that it results out
+# of said person’s immediate fault when using the work as intended.
+#-
+# mpg123-0.59r-MirPorts-6 to mcabber-0.9.7 FIFO gateway
+# mplayer and mppdec-static SV7 1.95e also work
+# Requires mksh R34 or above
+#
+# User Tunes strings are courtesy of Jonathan Schleifer (my personal
+# XEP to German gateway ☺)
+
+# Configuration
+integer usestate=1     # use Away Status
+integer usetunes=1     # use User Tunes (XEP #0118)
+
+
+x=0
+if [[ $KSH_VERSION = @(\@\(#\)MIRBSD KSH R)+([0-9])\ +([0-9])/+([0-9])/+([0-9])?(\ *) ]]; then
+       set -A x -- ${KSH_VERSION#* R}
+       (( x[0] < 39 )) && x=0
+       (( x[0] == 39 )) && [[ ${x[1]} < "2009/12/01" ]] && x=0
+fi
+(( x )) || { echo mksh too old; exit 1; }
+
+set -U
+set -A vistable -- [0xEF7F]=-1 \
+    0x20AC 0x278A 0x201A 0x0192 0x201E 0x2026 0x2020 0x2021 \
+    0x02C6 0x2030 0x0160 0x2039 0x0152 0x278B 0x017D 0x278C \
+    0x278D 0x2018 0x2019 0x201C 0x201D 0x2022 0x2013 0x2014 \
+    0x02DC 0x2122 0x0161 0x203A 0x0153 0x278E 0x017E 0x0178 \
+    0x00A0 0x00A1 0x00A2 0x00A3 0x00A4 0x00A5 0x00A6 0x00A7 \
+    0x00A8 0x00A9 0x00AA 0x00AB 0x00AC 0x00AD 0x00AE 0x00AF \
+    0x00B0 0x00B1 0x00B2 0x00B3 0x00B4 0x00B5 0x00B6 0x00B7 \
+    0x00B8 0x00B9 0x00BA 0x00BB 0x00BC 0x00BD 0x00BE 0x00BF \
+    0x00C0 0x00C1 0x00C2 0x00C3 0x00C4 0x00C5 0x00C6 0x00C7 \
+    0x00C8 0x00C9 0x00CA 0x00CB 0x00CC 0x00CD 0x00CE 0x00CF \
+    0x00D0 0x00D1 0x00D2 0x00D3 0x00D4 0x00D5 0x00D6 0x00D7 \
+    0x00D8 0x00D9 0x00DA 0x00DB 0x00DC 0x00DD 0x00DE 0x00DF \
+    0x00E0 0x00E1 0x00E2 0x00E3 0x00E4 0x00E5 0x00E6 0x00E7 \
+    0x00E8 0x00E9 0x00EA 0x00EB 0x00EC 0x00ED 0x00EE 0x00EF \
+    0x00F0 0x00F1 0x00F2 0x00F3 0x00F4 0x00F5 0x00F6 0x00F7 \
+    0x00F8 0x00F9 0x00FA 0x00FB 0x00FC 0x00FD 0x00FE 0x00FF
+typeset -i1 vistable
+function toutf8 {
+       local intext="$*" outtext=''
+       typeset -i i=0 n=${#intext}
+       typeset -i1 c
+       typeset -Uui16 -Z5 x
+
+       while (( i < n )); do
+               c=1#${intext:(i++):1}
+               if (( (c & 0xFF80) == 0xEF80 )); then
+                       outtext=${outtext}${vistable[c]#1#}
+               elif (( c < 32 || c == 1#% )); then
+                       let x=c
+                       outtext=${outtext}%${x#16#}
+               elif (( c > 0x7E && c < 0xA0 )); then
+                       outtext=${outtext}�
+               else
+                       outtext=${outtext}${c#1#}
+               fi
+       done
+
+       print -nr -- "$outtext"
+}
+
+function settitle {
+       typeset title=$(toutf8 "$*")
+
+       # Debugging
+       #print -ru2 -- "setting title: $title"
+
+       if [[ -n $title ]]; then
+               titlemsg="♫ $title"
+               titlexml="<title>$(sed \
+                   -e "s/&/\&#38;/g" \
+                   -e "s/</\&#60;/g" \
+                   -e "s/>/\&#62;/g" \
+                   -e "s/'/\&#39;/g" \
+                   <<<"$title")</title>"
+       else
+               titlemsg=∅
+               titlexml=
+       fi
+
+       # Is mcabber running and listening on the FIFO?
+       [[ -p ~/.etc/mcabber/mcabber.fifo ]] || return
+
+       # Away Status
+       (( usestate )) && print -r -- "/status message $titlemsg" \
+           >~/.etc/mcabber/mcabber.fifo
+
+       # Give the mcabber FIFO some rest, will ya?
+       if (( usestate && usetunes )); then
+               sleep 1
+               # Is mcabber _still_ running and listening on the FIFO?
+               [[ -p ~/.etc/mcabber/mcabber.fifo ]] || return
+       fi
+
+       # User Tunes
+       (( usetunes )) && print -r -- '/rawxml send <iq type="set"><pubsub' \
+           'xmlns="http://jabber.org/protocol/pubsub"><publish' \
+           'node="http://jabber.org/protocol/tune"><item id="0"><tune' \
+           'xmlns="http://jabber.org/protocol/tune">'"${titlexml}</tune></item></publish></pubsub></iq>" \
+           >~/.etc/mcabber/mcabber.fifo
+}
+
+
+integer rv gotintr=0
+curdir=
+
+trap 'gotintr=1' INT
+
+exec 3>&1
+exec 0>&3
+if [[ $1 = - ]]; then
+       shift
+       "$@" <&3 |&
+else
+       "$@" <&3 2>&1 |&
+fi
+subpid=$!
+
+while :; do
+       IFS= read -pr line
+       rv=$?
+       if (( gotintr )); then
+               gotintr=0
+               kill -INT $subpid
+               continue
+       fi
+       (( rv )) && break
+       print -r -- "$line"
+       case $line {
+       (@(ICY metadata:)*)
+               curdir=
+               title=${line/*StreamTitle=\'}
+               title=${title/@(\';StreamUrl=)*}
+               title=${title%%?(\');}
+               ;;
+       (@(Directory: http://)*)
+               curdir=${line#Directory: }
+               continue
+               ;;
+       (@(Playing MPEG stream from )*)
+               title=$(sed -e 's/^Playing MPEG stream from \(.*\) ...$/\1/' \
+                   <<<"$line")
+               [[ $title = $line ]] && continue        # sanity
+               [[ -n $curdir ]] && title=$curdir$title
+               curdir=
+               ;;
+       (@(decoding of file )*)
+               title=${line##decoding of file ?(\')}
+               title=${title%\'}
+               curdir=
+               ;;
+       (@(Playing )*.)
+               title=${line#Playing }
+               title=${title%.}
+               curdir=
+               ;;
+       (*)
+               continue
+               ;;
+       }
+       title=${title##+([       ])}
+       title=${title##[Nn]?(ow )[Pp]?(laying):}
+       title=${title##+([       ])}
+       title=${title%%+([       ])}
+       [[ $title = *://* ]] || title=${title%%.@([Mm][Pp][234CcPp]|[Mm]4[Aa]|[Aa][Vv][Ii]|[Mm][Kk][Vv]|[Ff][Ll][Aa][Cc]|[Ff][Ll][Vv]|[Oo][Gg][Gg]|[Ww][Aa][Vv])}
+       title=${title%%+([       ])}
+       [[ -n $title ]] || continue
+       settitle "$title" &
+done
+
+settitle # empty
+exit 0
diff --git a/mksh/ps2pdfmir b/mksh/ps2pdfmir
new file mode 100644 (file)
index 0000000..9255568
--- /dev/null
@@ -0,0 +1,121 @@
+#!/bin/mksh
+# $MirOS: contrib/hosted/tg/ps2pdfmir,v 1.7 2010/07/31 23:11:15 tg Exp $
+#-
+# Copyright (c) 2009, 2010
+#      Thorsten Glaser <tg@mirbsd.org>
+#
+# Provided that these terms and disclaimer and all copyright notices
+# are retained or reproduced in an accompanying document, permission
+# is granted to deal in this work without restriction, including un-
+# limited rights to use, publicly perform, distribute, sell, modify,
+# merge, give away, or sublicence.
+#
+# This work is provided "AS IS" and WITHOUT WARRANTY of any kind, to
+# the utmost extent permitted by applicable law, neither express nor
+# implied; without malicious intent or gross negligence. In no event
+# may a licensor, author or contributor be held liable for indirect,
+# direct, other damage, loss, or other issues arising in any way out
+# of dealing in the work, even if advised of the possibility of such
+# damage or existence of a defect, except proven that it results out
+# of said person's immediate fault when using the work as intended.
+#-
+# Convert PostScript or PDF to PDF 1.3 (Acrobat 4-and-later compatible),
+# or, if the -a option is given, to something resembling PDF/A (PDF 1.4,
+# Acrobat 5-and-later compatible, ISO standardised).
+
+set -A args
+function addargs {
+       typeset _i
+
+       for _i in "$@"; do
+               args[${#args[*]}]=$_i
+       done
+}
+
+function usage {
+       print -u2 "Syntax:"
+       print -ru2 "    $0 [-a] [-p papersize] [-t title] infile [outfile]"
+       print -ru2 "    $0 [-a] [-p p.] [-t t.] -o outfile infile [...]"
+       print -ru2 "    $0 [-a] [-p p.] [-t t.] -c -o outfile pscommand [... -f infile ...]"
+       exit 1
+}
+
+pdfa=0
+icmd=0
+outfile=
+papersize=
+overtitle=
+while getopts "aco:p:t:" c; do
+       case $c {
+       (a)     pdfa=1 ;;
+       (c)     icmd=1 ;;
+       (o)     outfile=$OPTARG ;;
+       (p)     papersize=$OPTARG ;;
+       (t)     overtitle=$OPTARG ;;
+       (*)     usage ;;
+       }
+done
+shift $((OPTIND - 1))
+
+#XXX
+if [[ $overtitle = *@(\(|\))* ]]; then
+       print -u2 Cannot deal with parentheses in title.
+       exit 1
+fi
+
+if [[ -n $outfile ]]; then
+       (( $# )) || usage
+       infile=
+else
+       case $# {
+       (1)     infile=$1
+               if [[ -z $infile ]]; then
+                       usage
+               elif [[ $infile = - ]]; then
+                       outfile=-
+               else
+                       outfile=${infile%.?(e)ps}.pdf
+               fi
+               ;;
+       (2)     infile=$1
+               outfile=$2
+               [[ -z $infile || -z $outfile ]] && usage
+               ;;
+       (*)     usage
+               ;;
+       }
+fi
+
+r=${0%/*}
+[[ $r = $0 ]] && r=.
+r=$(realpath "$r")
+(( pdfa )) && addargs -I"$r"
+
+addargs -q -dNOPAUSE -dBATCH -sDEVICE=pdfwrite -sOutputFile="$outfile" \
+    -dSAFER -dCompatibilityLevel=1.3 -dSubsetFonts=true -dEmbedAllFonts=true
+[[ -n $papersize ]] && addargs -sPAPERSIZE="$papersize"
+
+if (( pdfa )); then
+       p=$r/sRGB_IEC61966-2-1_black_scaled.icc
+       d=$r/ps2pdfa.ps
+       if [[ ! -s $p || ! -s $d ]]; then
+               print -u2 "Cannot find definition and profile files:"
+               print -ru2 -- "- $d"
+               print -ru2 -- "- $p"
+               exit 1
+       fi
+       addargs -dNOOUTERSAVE -dPDFA -sProcessColorModel=DeviceCMYK \
+           -c /ICCProfile "($p)" def -f "$d"
+fi
+
+addargs -c .setpdfwrite
+[[ -n $overtitle ]] && addargs '[' /Title "($overtitle)" /DOCINFO pdfmark
+
+if [[ -n $infile ]]; then
+       addargs -f "$infile"
+elif (( icmd )); then
+       addargs "$@"
+else
+       addargs -f "$@"
+fi
+exec gs "${args[@]}"
index b61d251..8d1e8e0 100644 (file)
@@ -1,4 +1,4 @@
-# $MirOS: src/scripts/roff2htm,v 1.74 2012/09/27 18:03:10 tg Exp $
+# $MirOS: src/scripts/roff2htm,v 1.77 2013/01/01 20:49:09 tg Exp $
 # $ekkoBSD: catman2html.sh,v 1.2 2004/03/07 03:02:53 stephen Exp $
 #-
 # Copyright (c) 2004, 2005, 2006, 2007, 2011, 2012
@@ -74,6 +74,14 @@ function set_conversion_paper {
 }
 set_conversion_man
 
+function set_target_absolute {
+       roff2htm_rel=https://www.mirbsd.org/
+}
+function set_target_relative {
+       roff2htm_rel=../
+}
+set_target_relative
+
 function do_convert_man {
        local -i _nl=0
        col -x | sed                                                    \
@@ -90,7 +98,7 @@ s/\([0-9A-z][-.,0-9A-z:]*\)-\n\(  *\)\([0-9A-z][-.,0-9A-z:]*([1-9][A-z]*)\)\([^
            -e 's#+\b_#±#g'                                             \
                                                                        \
            -e 's#^[A-z][\b 0-9A-z]*$#</pre><h2>&</h2><pre>#'            \
-           -e 's#^  \([A-z][\b ,0-9A-z]*\)$#</pre><h3>\1</h3><pre>#'    \
+           -e 's#^  \([A-z][\b -%'\''-;=?-~]*\)$#</pre><h3>\1</h3><pre>#'       \
                                                                        \
            -e 's#\([^~<>\80-¿][\80-¿]*\)\b~#\1Ì\85#g'                         \
            -e 's#\([^\b]\)~\b_#\1_̅\b #g'                                        \
@@ -107,11 +115,11 @@ s/\([0-9A-z][-.,0-9A-z:]*\)-\n\(  *\)\([0-9A-z][-.,0-9A-z:]*([1-9][A-z]*)\)\([^
            -e 's#\([\ 1- 0-9A-z]\)\([$/_-]*\)\(<[biG]>\)#\1\3\2#g'       \
            -e 's#\(</[biG]>\)\([)$/_-]*\)\([\ 1- 0-9A-z]\)#\2\1\3#g'     \
                                                                        \
-           -e '/^ /s#\([0-9A-z][-.,0-9A-z:]*\)(\(3p\))#<a href="../man\2/\1.htm">&</a>#g' \
-           -e '/^ /s#\([0-9A-z][-.,0-9A-z:]*\)(\([1-9]\)\(/[/0-9A-Za-z]*\)*)#<a href="../man\2/\1.htm">&</a>#g' \
-           -e '/^ /s#\([0-9A-z][-.,0-9A-z:]*\)(\([PSU][MS][DM]\))#<a href="../man\2/\1.htm">&</a>#g' \
-           -e '/^ /s#\([0-9A-z][-.,0-9A-z:]*\)(\(PAPERS\))#<a href="../man\2/\1.htm">&</a>#g' \
-           -e '/^ /s#\([0-9A-z][-.,0-9A-z:]*\)(GNU)#<a href="../manINFO/\1.html">&</a>#g' \
+           -e '/^ /s#\([0-9A-z][-.,0-9A-z:]*\)(\(3p\))#<a href="'$roff2htm_rel'man\2/\1.htm">&</a>#g' \
+           -e '/^ /s#\([0-9A-z][-.,0-9A-z:]*\)(\([1-9]\)\(/[/0-9A-Za-z]*\)*)#<a href="'$roff2htm_rel'man\2/\1.htm">&</a>#g' \
+           -e '/^ /s#\([0-9A-z][-.,0-9A-z:]*\)(\([PSU][MS][DM]\))#<a href="'$roff2htm_rel'man\2/\1.htm">&</a>#g' \
+           -e '/^ /s#\([0-9A-z][-.,0-9A-z:]*\)(\(PAPERS\))#<a href="'$roff2htm_rel'man\2/\1.htm">&</a>#g' \
+           -e '/^ /s#\([0-9A-z][-.,0-9A-z:]*\)(GNU)#<a href="'$roff2htm_rel'manINFO/\1.html">&</a>#g' \
            -e 's#)\(</[biG]>\)\([\ 1- 0-9A-z]\)#\1)\2#g'                 \
                                                                        \
            -e 's/Á/\&#38;/g'                                           \
@@ -165,10 +173,10 @@ s/\([0-9A-z][-.,0-9A-z:]*\)-\n\(  *\)\([0-9A-z][-.,0-9A-z:]*([1-9][A-z]*)\)\([^
            -e 's#\([\ 1- 0-9A-z]\)\([$/_-]*\)\(<[biG]>\)#\1\3\2#g'       \
            -e 's#\(</[biG]>\)\([)$/_-]*\)\([\ 1- 0-9A-z]\)#\2\1\3#g'     \
                                                                        \
-           -e '/^ /s#\([0-9A-z][-.,0-9A-z:]*\)(\([1-9]\)[/0-9A-Za-z]*)#<a href="../man\2/\1.htm">&</a>#g' \
-           -e '/^ /s#\([0-9A-z][-.,0-9A-z:]*\)(\([PSU][MS][DM]\))#<a href="../man\2/\1.htm">&</a>#g' \
-           -e '/^ /s#\([0-9A-z][-.,0-9A-z:]*\)(\(PAPERS\))#<a href="../man\2/\1.htm">&</a>#g' \
-           -e '/^ /s#\([0-9A-z][-.,0-9A-z:]*\)(GNU)#<a href="../manINFO/\1.html">&</a>#g' \
+           -e '/^ /s#\([0-9A-z][-.,0-9A-z:]*\)(\([1-9]\)[/0-9A-Za-z]*)#<a href="'$roff2htm_rel'man\2/\1.htm">&</a>#g' \
+           -e '/^ /s#\([0-9A-z][-.,0-9A-z:]*\)(\([PSU][MS][DM]\))#<a href="'$roff2htm_rel'man\2/\1.htm">&</a>#g' \
+           -e '/^ /s#\([0-9A-z][-.,0-9A-z:]*\)(\(PAPERS\))#<a href="'$roff2htm_rel'man\2/\1.htm">&</a>#g' \
+           -e '/^ /s#\([0-9A-z][-.,0-9A-z:]*\)(GNU)#<a href="'$roff2htm_rel'manINFO/\1.html">&</a>#g' \
            -e 's#)\(</[biG]>\)\([\ 1- 0-9A-z]\)#\1)\2#g'                 \
                                                                        \
            -e 's/Á/\&#38;/g'                                           \
@@ -257,17 +265,17 @@ function output_header {
        /* ]]> */
  </style>
 </head><body>
-<h1>MirOS Manual: <a href="../man'$2/$1'.htm">'$1\($2')</a></h1>'
+<h1>MirOS Manual: <a href="'$roff2htm_rel'man'$2/$1'.htm">'$1\($2')</a></h1>'
 }
 
 function output_footer {
        print '
 <hr /><p style="font-size:xx-small;">Generated on' $roff2htm_gendate 'by
- <tt>$MirOS: src/scripts/roff2htm,v 1.74 2012/09/27 18:03:10 tg Exp $</tt></p>
+ <tt>$MirOS: src/scripts/roff2htm,v 1.77 2013/01/01 20:49:09 tg Exp $</tt></p>
 <p>These manual pages and other documentation are <a
- href="../man7/BSD-Licence.htm">copyrighted</a> by their respective writers;
+ href="'$roff2htm_rel'man7/BSD-Licence.htm">copyrighted</a> by their respective writers;
  their source is available at our <a href="http://cvs.mirbsd.de/">CVSweb</a>,
- AnonCVS, and other mirrors. The rest is Copyright © 2002‒2011 <a
+ AnonCVS, and other mirrors. The rest is Copyright © 2002‒2013 <a
  href="https://www.mirbsd.org/">The MirOS Project</a>, Germany.<br /><span
  style="font-size:3pt; font-style:italic;">This product includes material
  provided by Thorsten Glaser.</span></p>
@@ -308,7 +316,7 @@ function convert_page {
                # patch in the additional name(s)
                ed -s $2/$tn <<-EOF
                        /<title>/s#</title>#, $page($sect)&#
-                       /<h1>/s#</h1>#, <a href="../$tn">$page($sect)</a>&#
+                       /<h1>/s#</h1>#, <a href="$roff2htm_rel$tn">$page($sect)</a>&#
                        wq
                EOF
        else
diff --git a/mksh/tpmrx b/mksh/tpmrx
new file mode 100644 (file)
index 0000000..5af78b4
--- /dev/null
@@ -0,0 +1,79 @@
+#!/bin/mksh
+# $MirOS: contrib/hosted/tg/tpmrx,v 1.4 2010/02/16 13:35:45 tg Exp $
+#-
+# Copyright (c) 2009, 2010
+#      Thorsten Glaser <tg@mirbsd.org>
+#
+# Provided that these terms and disclaimer and all copyright notices
+# are retained or reproduced in an accompanying document, permission
+# is granted to deal in this work without restriction, including un-
+# limited rights to use, publicly perform, distribute, sell, modify,
+# merge, give away, or sublicence.
+#
+# This work is provided "AS IS" and WITHOUT WARRANTY of any kind, to
+# the utmost extent permitted by applicable law, neither express nor
+# implied; without malicious intent or gross negligence. In no event
+# may a licensor, author or contributor be held liable for indirect,
+# direct, other damage, loss, or other issues arising in any way out
+# of dealing in the work, even if advised of the possibility of such
+# damage or existence of a defect, except proven that it results out
+# of said person's immediate fault when using the work as intended.
+
+function c_dump {
+       if [[ $dfd = - ]]; then
+               cat >"${1:-/dev/null}"
+       elif [[ -n $1 ]]; then
+               tee "$1" | hd >&$dfd
+       else
+               hd >&$dfd
+       fi
+}
+
+function do_read {
+       print -n '\x0\xc1\x0\x0\x0\xe\x0\x0\x0\x46\x0\x0\x1\x0' >/dev/tpm
+       dd if=/dev/tpm bs=4096 count=1 2>/dev/null
+}
+
+function do_seed {
+       (print -n '\x0\xc1\x0\x0\x1\xd\x0\x0\x0\x47\x0\x0\x0\xff'; \
+           dd if=/dev/arandom count=1 bs=255 2>/dev/null) | \
+           dd of=/dev/tpm obs=4096 2>/dev/null
+       dd if=/dev/tpm bs=4096 count=1 2>/dev/null | c_dump
+}
+
+if [[ $1 = -v ]]; then
+       dfd=2
+       shift
+else
+       dfd=-
+fi
+
+if [[ $1 = auto ]]; then
+       shift
+       n=0
+       while :; do
+               if (( !n-- )); then
+                       do_seed
+                       (( n = 39 + (RANDOM & 31) ))
+                       print
+               fi
+               sleep $((16 + (RANDOM & 7)))
+               do_read | c_dump /dev/wrandom
+               print -n .
+       done
+       exit 0
+fi
+
+if [[ $1 = seed ]]; then
+       shift
+       do_seed
+fi
+
+do_read | if [[ $1 = - ]]; then
+       dd bs=1 skip=14 2>/dev/null
+elif [[ $dfd = - ]]; then
+       dd bs=1 skip=14 of=/dev/wrandom 2>/dev/null
+       print -n .
+else
+       c_dump /dev/wrandom
+fi
index 1b6ad19..4ad4c99 100644 (file)
--- a/mksh/uhr
+++ b/mksh/uhr
@@ -1,7 +1,7 @@
 #!/bin/mksh
-# $MirOS: contrib/hosted/tg/uhr,v 1.5 2012/05/28 00:30:00 tg Exp $
+# $MirOS: contrib/hosted/tg/uhr,v 1.14 2013/02/19 18:07:46 tg Exp $
 #-
-# Copyright © 2012
+# Copyright © 2012, 2013
 #      Thorsten Glaser <tg@mirbsd.org>
 #
 # Provided that these terms and disclaimer and all copyright notices
 # of said person’s immediate fault when using the work as intended.
 #-
 # Analoguhr mit Digitalanzeige. Grundlegende Annahme: schnelles Ter‐
-# minal, d.h. keine Voroptimierung der Darstellung durch Shellcode.
+# minal, d.h. keine Voroptimierung der Darstellung durch das Skript;
+# Font im Seitenverhältnis 1:2 (z.B. 9x18 aus XFree86® fixed-misc).
+
+if [[ $KSH_VERSION != @(\@\(#\)MIRBSD KSH R)@(4[1-9]|[5-9][0-9]|[1-9][0-9]+([0-9]))\ +([0-9])/+([0-9])/+([0-9])?(\ *) ]]; then
+       print -u2 Uhr requires mksh R41 or newer.
+       exit 1
+fi
+typeset -Z6 tosleep
 
 # stupid GNU idiots breaking everything by default… grml…
 bcopt=
 bc --help >/dev/null 2>&1 && bcopt=-q
 
+function graceful {
+       print -n '\033[;H\033[J'
+       exit 0
+}
+trap graceful INT TERM HUP
+
 trap got_sigwinch=1 WINCH
 while :; do
 got_sigwinch=0
 
 print "\e[0m\nPregenerating arrays, please wait..."
-set -A dt -- $(stty size)
-LINES=${dt[0]} COLUMNS=${dt[1]}
 (( r = LINES * 2 ))
 (( r = (r > COLUMNS ? COLUMNS : r) / 2 - 1))
 (( n = 2 * r + 1 ))
@@ -186,7 +197,50 @@ while (( ++i < 12 )); do
        read -p S; [[ $S = ?(-).* ]] && S=0
        mky[i]=${S%%.*}
 done
-print -p quit
+exec 3>&p; exec 3>&-
+
+(( L = LINES >= (COLUMNS / 2) ? (COLUMNS / 2) : LINES ))
+# fine-tuning of roman numeral position via screen size
+(( ++mkx[7] ))
+(( ++mkx[8] ))
+case $L {
+(22|23)        (( ++mkx[6] )) ;|
+(23)
+       (( mky[1] += 2 ))
+       (( mky[2] += 2 ))
+       (( mky[10] += 2 ))
+       (( mky[11] += 2 ))
+       ;;
+(24|25|29|30|31|34)
+       (( mky[4] += 2 ))
+       (( mky[8] += 2 ))
+       ;|
+(27|28|29)
+       (( ++mkx[10] ))
+       (( mky[8] += 2 ))
+       (( mky[9] += 2 ))
+       (( mky[10] += 2 ))
+       ;|
+(27|29|31)
+       (( mky[0] -= 2 ))
+       ;|
+(27)
+       (( --mkx[4] ))
+       (( --mkx[5] ))
+       (( ++mkx[6] ))
+       (( mkx[7] += 2 ))
+       (( ++mkx[8] ))
+       (( ++mkx[10] ))
+       ;;
+(29)
+       (( mky[5] += 2 ))
+       (( mky[7] += 2 ))
+       ;;
+(30)
+       (( mky[11] -= 2 ))
+       ;;
+}
+(( mky[0] += 2 * (L & 1) ))
 
 # clear framebuffer and screen
 set -A fb
@@ -196,8 +250,8 @@ print -n -- '\e[H\e[J'
 # draw hour markers
 set -A lb
 integer e f=-1 k
-(( LINES > 21 )) && while (( ++f < 12 )); do
-       i=mkx[f]
+(( L > 21 )) && while (( ++f < 12 )); do
+       (( i=mkx[f] ))
        (( j = mky[f] & ~1 ))
        case $f {
        (0) e=7 S='# # # # #  # ## # # #' ;;
@@ -213,9 +267,17 @@ integer e f=-1 k
        (10) e=3 S='# # # # #' ;;
        (11) e=5 S='# # # #  ## # #' ;;
        }
+       Y='0 1 2'
+       if (( L > 26 )); then
+               d='###########'
+               S="${d::e+2} ${S::e}  ${S: e:e}  ${S:2*e} ${d::e+2}"
+               (( e += 2 ))
+               Y+=' 3 4'
+               (( j += 2 ))
+       fi
        (( i -= e / 2 ))
        k=0
-       for y in 0 1 2; do
+       for y in $Y; do
                (( y = j - y * 2 + 1 + (r & 1) ))
                (( dy = y + 1 ))
                (( x = i - 1 ))
@@ -253,16 +315,34 @@ retrace lc M_CC F_CC
 refresh "${px[@]}"; set -A px
 
 set -A do -- -1 -1 -1
+isfirst=1
 while (( !got_sigwinch )); do
+       if (( isfirst )); then
+               isfirst=0
+       else
+               (( tosleep = 1000000 - ${EPOCHREALTIME#*.} ))
+               if (( tosleep > 999999 )); then
+                       sleep 0.2
+                       (( tosleep = 1000000 - ${EPOCHREALTIME#*.} ))
+               fi
+               if (( tosleep > 999999 )); then
+                       # huh… maybe no gettimeofday(2) here
+                       while :; do
+                               d=$(date +'%H %M %S,%d %b %Y')
+                               set -A dt $d
+                               (( dt[2] == do[2] )) || break
+                               sleep 0.1
+                       done
+               else
+                       sleep 0.$tosleep
+               fi
+       fi
+
        d=$(date +'%H %M %S,%d %b %Y')
        S=${d#*,}
        d=${d%,*}
        set -A dt $d
 
-       if (( dt[2] == do[2] )); then
-               sleep 0.1
-               continue
-       fi
        (( dt[0] = (dt[0] % 12) * 5 + (dt[1] / 12) ))
        if (( do[2] != -1 )); then
                retrace lms$((do[2])) M_SP F_NO
diff --git a/mksh/uhr-preR41 b/mksh/uhr-preR41
new file mode 100644 (file)
index 0000000..1b6ad19
--- /dev/null
@@ -0,0 +1,280 @@
+#!/bin/mksh
+# $MirOS: contrib/hosted/tg/uhr,v 1.5 2012/05/28 00:30:00 tg Exp $
+#-
+# Copyright © 2012
+#      Thorsten Glaser <tg@mirbsd.org>
+#
+# Provided that these terms and disclaimer and all copyright notices
+# are retained or reproduced in an accompanying document, permission
+# is granted to deal in this work without restriction, including un‐
+# limited rights to use, publicly perform, distribute, sell, modify,
+# merge, give away, or sublicence.
+#
+# This work is provided “AS IS” and WITHOUT WARRANTY of any kind, to
+# the utmost extent permitted by applicable law, neither express nor
+# implied; without malicious intent or gross negligence. In no event
+# may a licensor, author or contributor be held liable for indirect,
+# direct, other damage, loss, or other issues arising in any way out
+# of dealing in the work, even if advised of the possibility of such
+# damage or existence of a defect, except proven that it results out
+# of said person’s immediate fault when using the work as intended.
+#-
+# Analoguhr mit Digitalanzeige. Grundlegende Annahme: schnelles Ter‐
+# minal, d.h. keine Voroptimierung der Darstellung durch Shellcode.
+
+# stupid GNU idiots breaking everything by default… grml…
+bcopt=
+bc --help >/dev/null 2>&1 && bcopt=-q
+
+trap got_sigwinch=1 WINCH
+while :; do
+got_sigwinch=0
+
+print "\e[0m\nPregenerating arrays, please wait..."
+set -A dt -- $(stty size)
+LINES=${dt[0]} COLUMNS=${dt[1]}
+(( r = LINES * 2 ))
+(( r = (r > COLUMNS ? COLUMNS : r) / 2 - 1))
+(( n = 2 * r + 1 ))
+set -A fb
+integer fb
+
+integer F_NO=0x00 M_NO=0x1F
+integer F_BG=0x01 M_BG=0x1E
+integer F_CC=0x02 M_CC=0x1D
+integer F_HP=0x04 M_HP=0x1B
+integer F_MP=0x08 M_MP=0x17
+integer F_SP=0x10 M_SP=0x0F
+integer B_BG=0x01 B_BLK=0x02 B_NB=0x0C B_DOT=0x10
+
+set -U
+#      -       BLK     BG      NB      DOT     NB|DOT
+set -A m2c \
+       0x20    1#▀   1#*     1#▀   1#·    1#░   \
+       1#▄   1#█   1#█   1#█   1#▆   1#█   \
+       1#*     1#█   1##     1#◘   1#⁂   1#◙   \
+       1#▄   1#█   1#▆   1#█   1#▒   1#▓   \
+       1#.     1#▛   1#☿   1#▛   1#:     1#▒   \
+       1#▄   1#█   1#◙   1#█   1#▆   1#▓
+typeset -i1 m2c[*]
+
+set -A m2m
+integer m2m
+
+integer i=-1 j
+while (( ++i <= 0x1F )); do
+       (( m2m[i] = !i ? 0 : (i & B_BLK) ? 1 :
+           (i & B_NB) ? ((i & B_DOT) ? 5 : 3) : (i & B_DOT) ? 4 : 2 ))
+done
+
+function refresh {
+       local -i10 i j z s c
+       local t
+
+       for i in "$@"; do
+               (( z = (i / n) & 0xFFFE ))
+               (( s = i % n ))
+               (( i = m2m[fb[z * n + s]] ))
+               (( j = m2m[fb[(z + 1) * n + s]] ))
+               print -n "\e[$((z / 2 + 1));$((s + 1))H${m2c[j * 6 + i]#1#}"
+       done
+       print -n "\e[$((r / 2 + 1));$((r + 1))H\e[7mⓄ\e[0m"
+}
+
+# put arrayname x y
+function put {
+       local _x=$(($2)) _y=$(($3)) _i
+       nameref _c=$4 _px=$1
+
+       (( _i = (r - _y) * n + _x + r ))
+       _px+=($_i)
+}
+
+# retrace arrayname maskname colourname
+set -A px
+function retrace {
+       nameref _px=$1 _m=$2 _c=$3
+       local _i
+
+       for _i in "${_px[@]}"; do
+               (( fb[_i] = (fb[_i] & _m) | _c ))
+       done
+       px+=("${_px[@]}")
+}
+
+# precalculate all lines’ endpoints with bc and paths with Bresenham
+integer x y dx sx dy sy e f
+bc -l $bcopt |&
+print -p scale=20
+print -p r=$r
+print -p o=r
+print -p 'define p(t) {
+       auto d
+       d = 90 - t
+       if (d < 0) d = 360 + d
+       return (d * 3.1415926535897932 / 180)
+}'
+# minutes and seconds – full length, 60 items
+i=-1
+while (( ++i < 60 )); do
+       eval set -A lms$i
+       print -p "r * c(p($i * 6))"
+       read -p S; [[ $S = ?(-).* ]] && S=0
+       x=${S%%.*}
+       print -p "r * s(p($i * 6))"
+       read -p S; [[ $S = ?(-).* ]] && S=0
+       y=${S%%.*}
+       (( dx = x < 0 ? -x : x ))
+       (( sx = x < 0 ? 1 : -1 ))
+       (( dy = y < 0 ? y : -y ))
+       (( sy = y < 0 ? 1 : -1 ))
+       (( e = dx + dy ))
+       while :; do
+               put lms$i x y
+               (( !x && !y )) && break
+               (( f = 2 * e ))
+               if (( f > dy )); then
+                       (( e += dy ))
+                       (( x += sx ))
+               fi
+               if (( f < dx )); then
+                       (( e += dx ))
+                       (( y += sy ))
+               fi
+       done
+done
+# hours – 2/3 length, 60 items (5 per hour)
+print -p 'r = o * 2 / 3'
+i=-1
+while (( ++i < 60 )); do
+       eval set -A lh$i
+       print -p "r * c(p($i * 6))"
+       read -p S; [[ $S = ?(-).* ]] && S=0
+       x=${S%%.*}
+       print -p "r * s(p($i * 6))"
+       read -p S; [[ $S = ?(-).* ]] && S=0
+       y=${S%%.*}
+       (( dx = x < 0 ? -x : x ))
+       (( sx = x < 0 ? 1 : -1 ))
+       (( dy = y < 0 ? y : -y ))
+       (( sy = y < 0 ? 1 : -1 ))
+       (( e = dx + dy ))
+       while :; do
+               put lh$i x y
+               (( !x && !y )) && break
+               (( f = 2 * e ))
+               if (( f > dy )); then
+                       (( e += dy ))
+                       (( x += sx ))
+               fi
+               if (( f < dx )); then
+                       (( e += dx ))
+                       (( y += sy ))
+               fi
+       done
+done
+# hour markers – 80% length, 12 items
+print -p 'r = o * 8 / 10'
+i=-1
+set -A mkx
+set -A mky
+while (( ++i < 12 )); do
+       print -p "r * c(p($i * 30))"
+       read -p S; [[ $S = ?(-).* ]] && S=0
+       mkx[i]=${S%%.*}
+       print -p "r * s(p($i * 30))"
+       read -p S; [[ $S = ?(-).* ]] && S=0
+       mky[i]=${S%%.*}
+done
+print -p quit
+
+# clear framebuffer and screen
+set -A fb
+integer fb
+print -n -- '\e[H\e[J'
+
+# draw hour markers
+set -A lb
+integer e f=-1 k
+(( LINES > 21 )) && while (( ++f < 12 )); do
+       i=mkx[f]
+       (( j = mky[f] & ~1 ))
+       case $f {
+       (0) e=7 S='# # # # #  # ## # # #' ;;
+       (1) e=1 S='###' ;;
+       (2) e=3 S='# ## ## #' ;;
+       (3) e=5 S='# # ## # ## # #' ;;
+       (4) e=5 S='# # ## # ##  # ' ;;
+       (5) e=3 S='# ## # # ' ;;
+       (6) e=5 S='# # ## # # #  #' ;;
+       (7) e=7 S='# # # ## # # # #  # #' ;;
+       (8) e=9 S='# # # # ## # # # # #  # # #' ;;
+       (9) e=5 S='# # ##  # # # #' ;;
+       (10) e=3 S='# # # # #' ;;
+       (11) e=5 S='# # # #  ## # #' ;;
+       }
+       (( i -= e / 2 ))
+       k=0
+       for y in 0 1 2; do
+               (( y = j - y * 2 + 1 + (r & 1) ))
+               (( dy = y + 1 ))
+               (( x = i - 1 ))
+               while (( ++x < (i + e) )); do
+                       [[ ${S: k++:1} = ' ' ]] && continue
+                       put lb x y
+                       put lb x dy
+               done
+       done
+done
+retrace lb M_BG F_BG
+
+# draw outer circle with Bresenham
+set -A lc
+integer x=r y=-1 f=r dx dy
+while (( y < x )); do
+       (( dy = y++ * 2 + 1 ))
+       if (( y )); then
+               (( f -= dy ))
+               if (( f < 0 )); then
+                       (( dx = 1 - x-- * 2 ))
+                       (( f -= dx ))
+               fi
+       fi
+       put lc x y
+       put lc -x y
+       put lc -x -y
+       put lc x -y
+       put lc y x
+       put lc -y x
+       put lc -y -x
+       put lc y -x
+done
+retrace lc M_CC F_CC
+refresh "${px[@]}"; set -A px
+
+set -A do -- -1 -1 -1
+while (( !got_sigwinch )); do
+       d=$(date +'%H %M %S,%d %b %Y')
+       S=${d#*,}
+       d=${d%,*}
+       set -A dt $d
+
+       if (( dt[2] == do[2] )); then
+               sleep 0.1
+               continue
+       fi
+       (( dt[0] = (dt[0] % 12) * 5 + (dt[1] / 12) ))
+       if (( do[2] != -1 )); then
+               retrace lms$((do[2])) M_SP F_NO
+               (( do[1] == dt[1] )) || retrace lms$((do[1])) M_MP F_NO
+               (( do[0] == dt[0] )) || retrace lh$((do[0])) M_HP F_NO
+       fi
+       (( do[0] == dt[0] )) || retrace lh$((dt[0])) M_HP F_HP
+       (( do[1] == dt[1] )) || retrace lms$((dt[1])) M_MP F_MP
+       retrace lms$((dt[2])) M_SP F_SP
+       refresh "${px[@]}"; set -A px
+       set -A do -- "${dt[@]}"
+
+       print -n "\e[1;$((n - ${%S} + 1))H$S\e[1;1H${d// /:}"
+done
+done
diff --git a/mksh/verscmp b/mksh/verscmp
new file mode 100644 (file)
index 0000000..b1fa29a
--- /dev/null
@@ -0,0 +1,72 @@
+#!/bin/mksh
+# $MirOS: contrib/hosted/tg/verscmp,v 1.1 2013/01/03 22:15:00 tg Exp $
+#-
+# Copyright © 2013
+#      Thorsten Glaser <tg@mirbsd.org>
+#
+# Provided that these terms and disclaimer and all copyright notices
+# are retained or reproduced in an accompanying document, permission
+# is granted to deal in this work without restriction, including un‐
+# limited rights to use, publicly perform, distribute, sell, modify,
+# merge, give away, or sublicence.
+#
+# This work is provided “AS IS” and WITHOUT WARRANTY of any kind, to
+# the utmost extent permitted by applicable law, neither express nor
+# implied; without malicious intent or gross negligence. In no event
+# may a licensor, author or contributor be held liable for indirect,
+# direct, other damage, loss, or other issues arising in any way out
+# of dealing in the work, even if advised of the possibility of such
+# damage or existence of a defect, except proven that it results out
+# of said person’s immediate fault when using the work as intended.
+#-
+# Compare versions. Syntax: verscmp filea fileb
+# Files contain IFS-separated: name, version, ignored
+
+fa=$1; fb=$2
+[[ -n $fa && -s $fa && -n $fb && -s $fb ]] || exit 1
+
+py='# coding: utf-8'
+nl=$'\n'
+
+function pyadd {
+       local field=$1 file=$2 cola colb rest
+
+       py+=$nl"$field = {"
+       while read cola colb rest; do
+               py+=$nl"'''${cola//\\/\\\\}''': '''${colb//\\/\\\\}''',"
+       done <"$file"
+       py+=$nl"}"
+}
+
+pyadd sidea "$fa"
+pyadd sideb "$fb"
+
+py+=$nl"q = '\"'"
+py+='
+comb = {}
+ckeys = sidea.keys()
+ckeys.extend(sideb.keys())
+ckeys = set(ckeys)
+for k in ckeys:
+       comb[k] = [None, None]
+for k, v in sidea.iteritems():
+       comb[k][0] = v
+for k, v in sideb.iteritems():
+       comb[k][1] = v
+ckeys = list(ckeys)
+ckeys.sort()
+for k in ckeys:
+       va = comb[k][0]
+       vb = comb[k][1]
+       if va <> vb:
+               if va is None:
+                       da = "None"
+               else:
+                       da = q + va + q
+               if vb is None:
+                       db = "None"
+               else:
+                       db = q + vb + q
+               print k, da, db
+'
+python <<<"$py"
diff --git a/mksh/wtf b/mksh/wtf
new file mode 100644 (file)
index 0000000..56452c9
--- /dev/null
+++ b/mksh/wtf
@@ -0,0 +1,154 @@
+#!/bin/mksh
+# $MirOS: src/usr.bin/wtf/wtf,v 1.20 2012/08/18 04:48:46 tg Exp $
+# $NetBSD: wtf,v 1.7 2000/11/21 00:18:52 soren Exp $
+#-
+# Copyright © 2002, 2003, 2004, 2006, 2007, 2008, 2010, 2011, 2012
+#      Thorsten “mirabilos” Glaser <tg@mirbsd.org>
+#
+# Provided that these terms and disclaimer and all copyright notices
+# are retained or reproduced in an accompanying document, permission
+# is granted to deal in this work without restriction, including un‐
+# limited rights to use, publicly perform, distribute, sell, modify,
+# merge, give away, or sublicence.
+#
+# This work is provided “AS IS” and WITHOUT WARRANTY of any kind, to
+# the utmost extent permitted by applicable law, neither express nor
+# implied; without malicious intent or gross negligence. In no event
+# may a licensor, author or contributor be held liable for indirect,
+# direct, other damage, loss, or other issues arising in any way out
+# of dealing in the work, even if advised of the possibility of such
+# damage or existence of a defect, except proven that it results out
+# of said person’s immediate fault when using the work as intended.
+
+acronyms=${ACRONYMDB:-/usr/share/misc/acronyms}
+
+function usage {
+       print -u2 "usage: ${0##*/} [±adPpw] [-f dbfile] [is[t]] <acronym> [...]"
+       exit 1
+}
+
+use_acronyms=1
+use_dict=0
+use_ports=0
+use_whatis=1
+while getopts "adf:Ppt:w" ch; do
+       case $ch {
+       (+a)    use_acronyms=0 ;;
+       (a)     use_acronyms=1 ;;
+       (+d)    use_dict=0 ;;
+       (d)     use_dict=1 ;;
+       (f)     acronyms=$OPTARG ;;
+       (+P)    use_ports=0 ;;
+       (P)     use_ports=2 ;;
+       (+p)    use_ports=0 ;;
+       (p)     use_ports=1 ;;
+       (t)     ;;
+       (+w)    use_whatis=0 ;;
+       (w)     use_whatis=1 ;;
+       (*)     usage ;;
+       }
+done
+shift $((OPTIND - 1))
+
+[[ $1 = is || $1 = ist ]] && shift
+(( $# < 1 )) && usage
+
+if (( use_ports )); then
+       if [[ -s /usr/ports/INDEX ]]; then
+               # MirPorts Framework, OpenBSD ports tree
+               binpkgs=ports
+               function ports_acquire_filtered {
+                       while IFS='|' read a b c d e; do
+                               [[ $a = *"$1"* ]] && \
+                                   print -r -- "$a|${d%% \(uses*}"
+                       done </usr/ports/INDEX
+               }
+               function ports_acquire_unfiltered {
+                       while IFS='|' read a b c d e; do
+                               [[ $a$d = *"$1"* ]] && \
+                                   print -r -- "$a|${d%% \(uses*}"
+                       done </usr/ports/INDEX
+               }
+       elif [[ -x $(whence -p yum) ]]; then
+               # Red Hat Yellowdog Updater Modified
+               binpkgs=RPMs
+               function ports_acquire_filtered {
+                       yum search -q -- "$1" | \
+                           tr '\n' '\ 1' | sed 's/\ 1 *: / /g' | tr '\ 1' '\n' | \
+                           while read a b c; do
+                               [[ $a = *"$1"* ]] && print -r -- "$a|$c"
+                       done
+               }
+               function ports_acquire_unfiltered {
+                       yum search -q -- "$1" | \
+                           tr '\n' '\ 1' | sed 's/\ 1 *: / /g' | tr '\ 1' '\n' | \
+                           while read a b c; do
+                               print -r -- "$a|$c"
+                       done
+               }
+       elif [[ -x $(whence -p apt-cache) ]]; then
+               # Debian Advanced Packaging Tool
+               binpkgs=packages
+               function ports_acquire_filtered {
+                       apt-cache search -- "$1" | while read a b c; do
+                               [[ $a = *"$1"* ]] && print -r -- "$a|$c"
+                       done
+               }
+               function ports_acquire_unfiltered {
+                       apt-cache search -- "$1" | while read a b c; do
+                               print -r -- "$a|$c"
+                       done
+               }
+       else
+               use_ports=0
+       fi
+       case $use_ports {
+       (1)     alias ports_acquire=ports_acquire_filtered ;;
+       (2)     alias ports_acquire=ports_acquire_unfiltered ;;
+       (*)     use_ports=0 ;;
+       }
+fi
+
+rv=0
+for target in "$@"; do
+       typeset -u tgsrch=$target
+       tgsrch=${tgsrch//ä/Ä}
+       tgsrch=${tgsrch//ö/Ö}
+       tgsrch=${tgsrch//ü/Ü}
+
+       if (( use_ports )); then
+               p=$(ports_acquire "$target")
+               if [[ -n $p ]]; then
+                       print -r "  - $binpkgs matching “$target”:"
+                       print -r -- "$p" | sort -u | column -ts'|'
+               fi
+       fi
+
+       if (( use_acronyms )); then
+               found=0
+               while IFS= read -r line; do
+                       [[ $line = "$tgsrch     "* ]] || continue
+                       (( found++ )) || print -r "   $tgsrch:"
+                       print -r -- "${line#*   }"
+               done <"$acronyms"
+               if (( !found )); then
+                       print -ru2 Gee… I don’t know what “"$tgsrch"” means…
+                       (( rv |= 1 ))
+               fi
+       fi
+
+       (( use_dict || use_whatis )) && print "  - other information sources"
+
+       (( use_dict )) && if whence -p dict >&-; then
+               dict "$target" || (( rv |= 2 ))
+       else
+               (( rv |= 4 ))
+       fi
+
+       if (( use_whatis )); then
+               w=$(whatis "$target") || \
+                   w="Sorry, no entry for a “$target” manual page"
+               print -r -- "$w"
+       fi
+done
+exit $rv
index 6ef6d5a..38b4048 100644 (file)
@@ -1,11 +1,12 @@
 #!/bin/sh
-# $MirOS: contrib/hosted/tg/deb/hookdir/C80shell-joe,v 1.2 2012/01/03 16:57:18 tg Exp $
+# $MirOS: contrib/hosted/tg/deb/hookdir/C80shell-joe,v 1.3 2013/02/06 18:27:04 tg Exp $
 #-
 # Not complicated enough for copyright.
 
 unset LANGUAGE
 LC_ALL=C; export LC_ALL
 
+echo "I: Current time: $(date)"
 echo
 echo Build failed. Trying to invoke a shell.
 echo
index 62cd06b..8c5764b 100644 (file)
@@ -1,11 +1,12 @@
 #!/bin/sh
-# $MirOS: contrib/hosted/tg/deb/hookdir/C80shell-jupp,v 1.2 2012/01/03 16:57:19 tg Exp $
+# $MirOS: contrib/hosted/tg/deb/hookdir/C80shell-jupp,v 1.3 2013/02/06 18:27:04 tg Exp $
 #-
 # Not complicated enough for copyright.
 
 unset LANGUAGE
 LC_ALL=C; export LC_ALL
 
+echo "I: Current time: $(date)"
 echo
 echo Build failed. Trying to invoke a shell.
 echo