summaryrefslogtreecommitdiff
path: root/lib/ss/ct_c.awk
blob: a4424c88ba5ead545f9e303f5fec2b3e18db652b (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
/^command_table / {
	cmdtbl = $2;
	printf "/* %s.c - automatically generated from %s.ct */\n", \
		rootname, rootname > outfile
	print "#include <ss/ss.h>" > outfile
	print "" >outfile
}
	
/^BOR$/ {
	cmdnum++
	options = 0
	cmdtab = ""
	printf "static char const * const ssu%05d[] = {\n", cmdnum > outfile
}

/^sub/ {
	subr = substr($0, 6, length($0)-5)
}

/^hlp/ {
	help = substr($0, 6, length($0)-5)
}

/^cmd/ {
	cmd = substr($0, 6, length($0)-5)
	printf "%s\"%s\",\n", cmdtab, cmd > outfile
	cmdtab = "    "
}

/^opt/ {
	opt = substr($0, 6, length($0)-5)
	if (opt == "dont_list") {
		options += 1
	}
	if (opt == "dont_summarize") {
		options += 2
	}
}

/^EOR/ {
	print "    (char const *)0" > outfile
	print "};" > outfile 
	printf "extern void %s __SS_PROTO;\n", subr > outfile
	# Work around a bug in gawk 3.0.5
	awk_bug = cmdnum
	subr_tab[awk_bug] = subr
	options_tab[awk_bug] = options
	help_tab[awk_bug] = help
}

/^[0-9]/ {
	linenum = $1;
}

/^ERROR/ {
	error = substr($0, 8, length($0)-7)
	printf "Error in line %d: %s\n", linenum, error
	print "#__ERROR_IN_FILE__" > outfile
}

END {
	printf "static ss_request_entry ssu%05d[] = {\n", cmdnum+1 > outfile
	for (i=1; i <= cmdnum; i++) {
		printf "    { ssu%05d,\n", i > outfile
		printf "      %s,\n", subr_tab[i] > outfile
		printf "      \"%s\",\n", help_tab[i] > outfile
		printf "      %d },\n", options_tab[i] > outfile
	}
	print "    { 0, 0, 0, 0 }" > outfile
	print "};" > outfile
	print "" > outfile
	printf "ss_request_table %s = { 2, ssu%05d };\n", \
		cmdtbl, cmdnum+1 > outfile
}