X-Git-Url: https://git.plutz.net/?a=blobdiff_plain;f=pdiread.sh;h=49c2c20d88a7baca7754b0bde5d96482dbe4f3f8;hb=7aab9839b794a48adaf4b3049fc0b8a999d925f8;hp=d774ada3caedba752d1271aa1bc8ceacc662b5d5;hpb=a76ef45bd763687be2e517955bc50089adaa64ed;p=lobster diff --git a/pdiread.sh b/pdiread.sh index d774ada..49c2c20 100755 --- a/pdiread.sh +++ b/pdiread.sh @@ -56,7 +56,7 @@ pdi_load() { # === Unscramble aggregated fields === :disag - s;\n([^:]+:)((.*[^\])?(\\\\)*),;\n\1\2\n\1;; + s;\n([^:\n]+:)(([^\n]*[^\])?(\\\\)*),;\n\1\2\n\1;; t disag; # === Insert FN when only N is present === @@ -103,6 +103,33 @@ pdi_load() { p;' "$1" } +pdi_escape(){ + local in out='' + for in in "$@"; do + out="${out}${out:+;}" + while [ "$in" ]; do case $in in + \\*) out="${out}\\\\"; in="${in#\\}" ;; + ,*) out="${out}\\,"; in="${in#,}" ;; + \;*) out="${out}\\;"; in="${in#;}" ;; + "$BR"*) out="${out}\\n"; in="${in#${BR}}" ;; + *) out="${out}${in%%[\\,;${BR}]*}"; in="${in#${in%%[\\,;${BR}]*}}" ;; + esac; done + done + printf '%s\n' "$out" +} + +pdi_unescape(){ + local in out='' + [ $# -gt 0 ] && in="$*" || in="$(cat)" + while [ "$in" ]; do case $in in + \\\\*) out="${out}\\"; in="${in#\\\\}" ;; + \\n*) out="${out}${BR}"; in="${in#\\n}" ;; + \\*) in="${in#\\}" ;; + *) out="${out}${in%%\\*}"; in="${in#${in%%\\*}}" ;; + esac; done + printf '%s\n' "$out" +} + pdi_count(){ local card="$1" name="$2" rc='' cnt=0 while rc="${card#*${BR}${name};}"; do @@ -114,13 +141,31 @@ pdi_count(){ } pdi_attrib(){ - local card=":$1" name="$2" cnt="${3:-1}" + local card=":$1" name="$2" cnt="${3:-1}" attr="$4" while [ $cnt -gt 0 ]; do [ "${card#*${BR}${name};}" = "$card" ] && return 1 card="${card#*${BR}${name};}" cnt=$((cnt - 1)) done - printf %s\\n "${card%%:*}" + card="${card%%:*}" + if [ "$attr" ]; then + case $card in + *\;"$attr"=*) card="${card#*;${attr}=}";; + "$attr"=*) card="${card#${attr}=}";; + "$attr"|*\;"$attr"|"$attr"\;*|*\;"$attr"\;*) return 0;; + *) return 1;; + esac + case $card in + \"*\"\;*|\'*\'\;*) + card="${card#[\"\']}"; card="${card%%[\"\'];*}" + ;; + \"*\"|\'*\') + card="${card#[\"\']}"; card="${card%%[\"\']}" + ;; + *\;*) card="${card%%;*}";; + esac + fi + printf %s\\n "${card}" } pdi_value(){