use internal functions to speed up, not too effective in reading tho…
[shellsnippets/shellsnippets.git] / mksh / verscmp
1 #!/bin/mksh
2 # $MirOS: contrib/hosted/tg/verscmp,v 1.2 2014/06/20 22:50:56 tg Exp $
3 #-
4 # Copyright © 2013, 2014
5 #       Thorsten Glaser <tg@mirbsd.org>
6 #
7 # Provided that these terms and disclaimer and all copyright notices
8 # are retained or reproduced in an accompanying document, permission
9 # is granted to deal in this work without restriction, including un‐
10 # limited rights to use, publicly perform, distribute, sell, modify,
11 # merge, give away, or sublicence.
12 #
13 # This work is provided “AS IS” and WITHOUT WARRANTY of any kind, to
14 # the utmost extent permitted by applicable law, neither express nor
15 # implied; without malicious intent or gross negligence. In no event
16 # may a licensor, author or contributor be held liable for indirect,
17 # direct, other damage, loss, or other issues arising in any way out
18 # of dealing in the work, even if advised of the possibility of such
19 # damage or existence of a defect, except proven that it results out
20 # of said person’s immediate fault when using the work as intended.
21 #-
22 # Compare versions. Syntax: verscmp filea fileb
23 # Files contain IFS-separated: name, version, ignored
24
25 fa=$1; fb=$2
26 [[ -n $fa && -s $fa && -n $fb && -s $fb ]] || exit 1
27
28 py='# coding: utf-8'
29 nl=$'\n'
30
31 function str2python {
32         [[ -o utf8-mode ]]; local u=$?
33         set +U
34
35         local s="$*" t=\"
36         local -i i=0 n=${#s}
37         local -Uui16 -Z5 hv
38
39         while (( i < n )); do
40                 hv=1#${s:(i++):1}
41                 t+=\\x${hv#16#}
42         done
43         t+=\"
44         print -nr -- "$t"
45
46         (( u )) || set -U
47 }
48
49 function pyadd {
50         local field=$1 file=$2 cola colb rest
51
52         py+=$nl"$field = {"
53         while read cola colb rest; do
54                 py+=$nl"$(str2python "$cola"): $(str2python "$colb"),"
55         done <"$file"
56         py+=$nl"}"
57 }
58
59 pyadd sidea "$fa"
60 pyadd sideb "$fb"
61
62 py+=$nl"q = '\"'"
63 py+='
64 comb = {}
65 ckeys = sidea.keys()
66 ckeys.extend(sideb.keys())
67 ckeys = set(ckeys)
68 for k in ckeys:
69         comb[k] = [None, None]
70 for k, v in sidea.iteritems():
71         comb[k][0] = v
72 for k, v in sideb.iteritems():
73         comb[k][1] = v
74 ckeys = list(ckeys)
75 ckeys.sort()
76 for k in ckeys:
77         va = comb[k][0]
78         vb = comb[k][1]
79         if va <> vb:
80                 if va is None:
81                         da = "None"
82                 else:
83                         da = q + va + q
84                 if vb is None:
85                         db = "None"
86                 else:
87                         db = q + vb + q
88                 print k, da, db
89 '
90 python <<<"$py"