]> git.plutz.net Git - confetti/blob - ledgers/iban_assign.awk
date time helper
[confetti] / ledgers / iban_assign.awk
1 #!/bin/awk -f
2
3 function dbg( text ) { print text >>"/dev/stderr"; }
4
5 function STRING( inp ) {
6   gsub(/\\/, "\\\\", inp);
7   gsub(/\n/, "\\n",  inp);
8   gsub(/\r/, "\\r",  inp);
9   gsub(/\t/, "\\t",  inp);
10   gsub(/\+/, "\\+",  inp);
11   gsub(/ /,  "+",    inp);
12   return inp ? inp : "\\";
13 }
14
15 function UNSTRING( inp,    out, tmp ) {
16   while ( inp ) {
17          if ( inp ~ /^\\\\/) { out = out "\\"; sub(/^\\\\/, "", inp); }
18     else if ( inp ~ /^\\n/)  { out = out "\n"; sub(/^\\n/,  "", inp); }
19     else if ( inp ~ /^\\r/)  { out = out "\r"; sub(/^\\r/,  "", inp); }
20     else if ( inp ~ /^\\t/)  { out = out "\t"; sub(/^\\t/,  "", inp); }
21     else if ( inp ~ /^\\+/)  { out = out "+";  sub(/^\\+/,  "", inp); }
22     else if ( inp ~ /^\+/)   { out = out " ";  sub(/^\+/,   "", inp); }
23     else if ( inp ~ /^\\/)   { out = out "";   sub(/^\+/,   "", inp); }
24     else { tmp = inp; sub(/[\\+].*$/, "", tmp); out = out tmp; sub(/^[^\\+]*/, "", inp); }
25   }
26   return out;
27 }
28
29 function rx( regex ) {
30   gsub(/[].*+?^${}()|\\[]/, "\\\\&", regex);
31   return regex;
32 }
33
34 BEGIN {
35   FS = "        "; ledger = 0;
36   fn = n = uid = iban = tmp = "";
37   split("", uid_n); split("", uid_fn); split("", uid_iban);
38   split("", iban_uid); split("", ibans); split("", uids);
39
40   split("", sure); split("", unsure); split("", unknown);
41   split("", unsure_rec)
42 }
43
44 /^BEGIN;:VCARD$/ { fn = n = id = iban = tmp = ""; }
45
46    /^UID;[^:]*:/ {  uid = $0; sub(/^[^;]+;[^:]*:/, "",  uid); }
47     /^FN;[^:]*:/ {   fn = $0; sub(/^[^;]+;[^:]*:/, "",   fn); }
48      /^N;[^:]*:/ {    n = $0; sub(/^[^;]+;[^:]*:/, "",    n); sub(/;.*$/, "", n); }
49 /^X-IBAN;[^:]*:/ { iban = $0; sub(/^[^;]+;[^:]*:/, "", iban); ibans[length(ibans)] = iban; }
50
51 /^END;:VCARD$/ {
52   uid_n[uid] = n; uid_fn[uid] = fn; uid_iban[uid] = iban;
53   for (iban in ibans) iban_uid[ibans[iban]] = iban_uid[ibans[iban]] ? iban_uid[ibans[iban]] " " uid : uid;
54   fn = n = uid = iban = tmp = ""; split("", ibans);
55 }
56
57 /^BEGIN:LEDGERS$/ { ledger = 1; }
58
59 ledger && strftime("%Y-%m-%d", $2, "UTC") == $1 {
60   if ($3 in iban_uid) {
61     sure[$3] = iban_uid[$3];
62   } else {
63     for (uid in uid_fn) if ( match(UNSTRING($5), rx(uid_fn[uid])) ) {
64       if (! match(unsure[$3], rx(uid))) unsure[$3] = unsure[$3] ? unsure[$3] " " uid : uid;
65       unsure_rec[$3] = $0
66     }
67     for (uid in uid_n) if ( uid_n[uid] && match(UNSTRING($4), rx(uid_n[uid])) ) {
68       if (! match(unsure[$3], rx(uid))) unsure[$3] = unsure[$3] ? unsure[$3] " " uid : uid;
69       unsure_rec[$3] = $0
70     }
71   }
72   if (!($3 in sure) && !($3 in unsure)) unknown[$3] = $0;
73 }
74
75 END {
76   for (iban in unsure) {
77     line = "guess       " iban " " STRING(unsure_rec[iban]);
78     split(unsure[iban], uids, / /);
79     for (k in uids) line = line "       " STRING(uids[k] "/" uid_fn[uids[k]]);
80     print line;
81   }
82   for (iban in unknown) {
83     line = "unknown     " iban " " unknown[iban];
84     print line;
85   }
86   for (iban in sure) {
87     line = "sure        " iban;
88     split(sure[iban], uids, / /);
89     for (k in uids) line = line "       " STRING(uids[k] "/" uid_fn[uids[k]]);
90     print line;
91   }
92 }