3 function STRING( inp ) {
4 gsub(/\\/, "\\\\", inp);
5 gsub(/\n/, "\\n", inp);
6 gsub(/\r/, "\\r", inp);
7 gsub(/\t/, "\\t", inp);
8 gsub(/\+/, "\\+", inp);
10 return inp ? inp : "\\";
13 function UNSTRING( inp, out, tmp ) {
15 if ( inp ~ /^\\\\/) { out = out "\\"; sub(/^\\\\/, "", inp); }
16 else if ( inp ~ /^\\n/) { out = out "\n"; sub(/^\\n/, "", inp); }
17 else if ( inp ~ /^\\r/) { out = out "\r"; sub(/^\\r/, "", inp); }
18 else if ( inp ~ /^\\t/) { out = out "\t"; sub(/^\\t/, "", inp); }
19 else if ( inp ~ /^\\+/) { out = out "+"; sub(/^\\+/, "", inp); }
20 else if ( inp ~ /^\+/) { out = out " "; sub(/^\+/, "", inp); }
21 else if ( inp ~ /^\\/) { out = out ""; sub(/^\+/, "", inp); }
22 else { tmp = inp; sub(/[\\+].*$/, "", tmp); out = out tmp; sub(/^[^\\+]*/, "", inp); }
27 function rx( regex ) {
28 gsub(/[].*+?^${}()|\\[]/, "\\\\&", regex);
34 fn = n = uid = iban = tmp = "";
35 split("", uid_n); split("", uid_fn); split("", uid_iban);
36 split("", iban_uid); split("", ibans); split("", uids);
38 split("", sure); split("", unsure); split("", unknown);
42 /^BEGIN;:VCARD$/ { fn = n = id = iban = tmp = ""; }
44 /^UID;[^:]*:/ { uid = $0; sub(/^[^;]+;[^:]*:/, "", uid); }
45 /^FN;[^:]*:/ { fn = $0; sub(/^[^;]+;[^:]*:/, "", fn); }
46 /^N;[^:]*:/ { n = $0; sub(/^[^;]+;[^:]*:/, "", n); sub(/;.*$/, "", n); }
47 /^X-IBAN;[^:]*:/ { iban = $0; sub(/^[^;]+;[^:]*:/, "", iban); ibans[length(ibans)] = iban; }
50 uid_n[uid] = n; uid_fn[uid] = fn; uid_iban[uid] = iban;
51 for (iban in ibans) iban_uid[ibans[iban]] = iban_uid[ibans[iban]] ? iban_uid[ibans[iban]] " " uid : uid;
52 fn = n = uid = iban = tmp = ""; split("", ibans);
55 strftime("%Y-%m-%d", $1, "UTC") == $2 && strftime("%Y-%m-%d", $3, "UTC") == $4 { ledger = 1; }
57 ledger && strftime("%Y-%m-%d", $2, "UTC") == $1 {
59 sure[$3] = iban_uid[$3];
61 for (uid in uid_fn) if ( match(UNSTRING($5), rx(uid_fn[uid])) ) {
62 if (! match(unsure[$3], rx(uid))) unsure[$3] = unsure[$3] ? unsure[$3] " " uid : uid;
65 for (uid in uid_n) if ( uid_n[uid] && match(UNSTRING($4), rx(uid_n[uid])) ) {
66 if (! match(unsure[$3], rx(uid))) unsure[$3] = unsure[$3] ? unsure[$3] " " uid : uid;
70 if (!($3 in sure) && !($3 in unsure)) unknown[$3] = $0;
76 split(sure[iban], uids, / /);
77 for (k in uids) line = line " " STRING(uids[k] "/" uid_fn[uids[k]]);
80 for (iban in unsure) {
81 line = "guess " iban " " STRING(unsure_rec[iban]);
82 split(unsure[iban], uids, / /);
83 for (k in uids) line = line " " STRING(uids[k] "/" uid_fn[uids[k]]);
86 for (iban in unknown) {
87 line = "unknown " iban " " unknown[iban];