string()
{
 	local escape=0 octal=0 ordinal= value="$*"
 	value=${value#\"}
 	value=${value%\"}

	while [ -n "$value" ]
	do
		local next="${value#?}"
		local char="${value%"$next"}"

		if [ $octal -eq 1 ]
		then
			if [ ${#ordinal} -eq 3 ]
			then
				octal=0

			else
				case "$char" in
				([0-7])
					;;
				(*)
					octal=0
				esac
			fi

			if [ $octal -eq 0 ]
			then
				printf "\\${ordinal}"
				ordinal=
				escape=0
				OFFSET=$(($OFFSET + 1))
			fi
		fi

		if [ $escape -eq 1 ]
		then
			case "$char" in
			([0-7])
				ordinal="${ordinal}${char}"
				octal=1
				value="$next"
				continue
				;;
			('a')
				printf "\a"
				escape=0
				OFFSET=$(($OFFSET + 1))
				;;
			('b')
				printf "\b"
				escape=0
				OFFSET=$(($OFFSET + 1))
				;;
			('c')
				return
				;;
			('f')
				printf "\f"
				escape=0
				OFFSET=$(($OFFSET + 1))
				;;
			('r')
				printf "\r"
				escape=0
				OFFSET=$(($OFFSET + 1))
				;;
			('n')
				printf "\n"
				escape=0
				OFFSET=$(($OFFSET + 1))
				;;
			('t')
				printf "\t"
				escape=0
				OFFSET=$(($OFFSET + 1))
				;;
			('v')
				printf "\v"
				escape=0
				OFFSET=$(($OFFSET + 1))
				;;
			('\')
				printf "\\"
				escape=0
				OFFSET=$(($OFFSET + 1))
				;;
			('"')
				printf '"'
				escape=0
				OFFSET=$(($OFFSET + 1))
				;;
			("'")
				printf "'"
				escape=0
				OFFSET=$(($OFFSET + 1))
				;;
			(*)
				printf '\\%c' "$char"
				escape=0
				OFFSET=$(($OFFSET + 2))
				;;
			esac

		else
			case "$char" in
			('\')
				escape=1
				;;
			(*)
				printf "%c" "$char"
				OFFSET=$(($OFFSET + 1))
				;;
			esac
		fi

		value="$next"
	done

	if [ $octal -eq 1 ]
	then
		printf "\\${ordinal}"
		OFFSET=$(($OFFSET + 1))

	elif [ $escape -eq 1 ]
	then
		printf "\\"
		OFFSET=$(($OFFSET + 1))
	fi
}

MACROS="string $MACROS"
