56 lines
767 B
Awk
56 lines
767 B
Awk
|
#!/bin/awk -f
|
||
|
function pr(str) {
|
||
|
if(lastc !~ "[{(]")
|
||
|
gsub(/'/, "''", str)
|
||
|
printf "%s", str
|
||
|
}
|
||
|
function trans(c) {
|
||
|
printf "%s", end
|
||
|
|
||
|
lastc = c
|
||
|
end = "\n"
|
||
|
if(c == "%")
|
||
|
end = ""
|
||
|
else if(c == "(")
|
||
|
printf "echo -n "
|
||
|
else if(c ~ "[})]") {
|
||
|
end = "'\n"
|
||
|
printf "echo -n '"
|
||
|
}
|
||
|
}
|
||
|
|
||
|
BEGIN {
|
||
|
lastc = "{"
|
||
|
trans("}")
|
||
|
}
|
||
|
END {
|
||
|
print end
|
||
|
}
|
||
|
|
||
|
/^%/ && $0 !~ /^%[{()}%]/ && lastc !~ /[({]/ {
|
||
|
trans("%")
|
||
|
print substr($0, 2)
|
||
|
next
|
||
|
}
|
||
|
{
|
||
|
if(lastc == "%")
|
||
|
trans("}")
|
||
|
n = split($0, a, "%")
|
||
|
pr(a[1])
|
||
|
for(i=2; i<=n; i++) {
|
||
|
c = substr(a[i], 1, 1)
|
||
|
rest = substr(a[i], 2)
|
||
|
|
||
|
if((lastc !~ "[({]" && c ~ "[({]") ||
|
||
|
(lastc == "{" && c == "}") ||
|
||
|
(lastc == "(" && c == ")"))
|
||
|
trans(c)
|
||
|
else if(c == "%")
|
||
|
pr("%")
|
||
|
else
|
||
|
pr("%" c)
|
||
|
pr(rest)
|
||
|
}
|
||
|
pr("\n")
|
||
|
}
|