scc

A fork of https://git.simple-cc.org/scc/ for Qute

git clone https://git.8pit.net/scc.git

  1
  2BEGIN		{
  3		nvar=0
  4		printf "#include <scc/mach.h>\n"\
  5		       "#include <scc/scc.h>\n"\
  6		       "#include \"../as.h\"\n"\
  7		       "#include \"proc.h\"\n"
  8
  9		rules = "opers.dat"
 10		while (getline < rules > 0) {
 11			regex[++nregs] = $1
 12			value[nregs] = $2
 13		}
 14		close(rules)
 15}
 16		{sub(/#.*/,"")}
 17
 18$7 !~ cpu	{next}
 19
 20/^$/		{next}
 21
 22		{
 23		if (op[$1] == 0) {
 24			op[$1] = 1
 25			opstart[$1] = nvar
 26			opnames[nop++] = $1
 27		}
 28		opcount[$1]++
 29		opargs[nvar] = $3
 30		opsize[nvar] = $4
 31		opbytes[nvar] = ($5 == "none") ? "" : $5
 32		opformat[nvar++] = $6
 33		formats[$6] = 1
 34}
 35
 36END		{
 37		for (i in formats)
 38			printf "Format %s;\n", i
 39
 40		print "struct ins instab[] = {"
 41		for (i = 0; i < nop; i++) {
 42			n = opnames[i]
 43			start = opstart[n]
 44			end = start + opcount[n]
 45			printf "\t{.str = \"%s\", .begin = %d, .end = %d},\n",
 46			       n, start, end
 47		}
 48		printf "};\n\n"
 49
 50		for (i = 0; i < nop; i++)
 51			print opnames[i] | "../lexh"
 52		close("../lexh")
 53
 54		print "struct op optab[] = {"
 55		for (i = 0; i < nvar; i++) {
 56			printf "\t/* %d */\n", i
 57			printf "\t{\n" \
 58			       "\t\t.size = %d,\n"\
 59			       "\t\t.format = %s,\n",
 60			       opsize[i], opformat[i]
 61
 62			if (opbytes[i] != "")
 63				printf "\t\t.bytes = (unsigned char [%d]) {%s},\n",
 64				        opsize[i],
 65				        opbytes[i]
 66
 67			a = str2args(opargs[i])
 68			if (a != "")
 69				printf "\t\t.args = (unsigned char []) {%s}\n", a
 70
 71			print "\t},"
 72		}
 73		print "};"
 74}
 75
 76function str2args(s, args, i, j, out, n, found)
 77{
 78	n = split(s, args, /,/)
 79	if (n == 0 || args[1] == "none")
 80		return ""
 81	for (i = 1; i <= n; i++) {
 82		a = args[i]
 83		found = 0
 84
 85		if (a ~ /\?$/)
 86			out = out "AOPT ,"
 87		else if (a ~ /\+$/)
 88			out = out "AREP ,"
 89
 90		for (j = 1; j <= nregs; j++) {
 91			if (match(a, "^" regex[j])) {
 92				out = out value[j]
 93				found = 1
 94				break
 95			}
 96		}
 97
 98		if (!found) {
 99			print FILENAME ":" NR ":" \
100			      $0 ":wrong arg in opcode list", a > "/dev/stderr"
101			exit 1
102		}
103
104		a = substr(a, RLENGTH+1)
105		sub(/\?$/, "", a)
106		sub(/\+$/, "", a)
107		if (a != "") {
108			print FILENAME ":" NR ":" \
109			      $0 ": trailing chars: ", a > "/dev/stderr"
110			exit 1
111		}
112		out = out ","
113	}
114	out = out "0"
115
116	return out
117}