#!/bin/sh -efu

### main message loop

userhandler() {  # trick to protect loop values
    local l= readmsg= params=
    local IFS="$IFS" PATH="$PATH" # Protected variables
    on_message ||: # ignore exit code of user actions
}

newline_decode()
{
    if [ "$1" != "_objects" ]; then
      local separator=$(printf '\007')
      sed  $sed_options "s,\\\\\(.\),$separator\1,g
	      s,${separator}n,\n,g
	      s,$separator,,g"
    else
      cat
    fi
}

message_loop() {
    local l= readmsg= params= name= value=
    while read -r l; do
	if [ "$l" != "${l#_message:begin}" ]; then 
	    readmsg=1
	    continue
	fi
	if [ -n "$readmsg" -a "$l" != "${l#_message:end}" ]; then
	    userhandler
	    readmsg=
	    [ -n "$params" ] && unset $params params ||:
	fi
	[ -n "$readmsg" ] || continue
	name="$(printf %s\\n "${l%%:*}" | sed -e 's,[^[:alnum:]_],,g')" && 
	value="$(printf %s\\n "${l#*:}" | newline_decode "$name" | sed -e 's/["$`\]/\\&/g' )" ||
    		continue
	eval "in_$name=\"$value\"" && params="$params in_$name" && name= value= ||:
    done
}

### input/output functions

string_quote()
{
	sed 's,[\"],\\&,g'
}

write_string()
{
    echo "$1"|string_quote
}

write_bool()
{
    case "$1" in
	[Yy][Ee][Ss]|[Tt][Rr][Uu][Ee]|[Oo][Nn]|[Yy]|1)
	    echo '#t'
	    ;;
	*)
	    echo '#f'
	    ;;
    esac
}

write_error()
{
    printf '(error "%s")\n' "$(write_string "$1")"
}

write_nop()
{
    echo '()'
}

test_bool()
{
    [ "$1" = "#t" ]
}


### i18n support

write_language()
{
    local charset="${po_charset:-UTF-8}"
    echo "$1" |
	sed -r \
	    -e "s,([^;]+)(;|$),\1.$charset\2,g" \
	    -e 's,;,:,g'
}

#Note: gettext uses encoding from lc_ctype and translation from language
_()
{
    local domain="${2:-$po_domain}"
    local langlist="$(write_language "$in_language")"
    local firstlang="${langlist%%:*}"

    LC_ALL="$firstlang" LANGUAGE="$langlist" gettext "$domain" "$1"
}

### backward compatibility
alias simple_quote=string_quote
