summaryrefslogtreecommitdiff
path: root/src/script/api/generate_widget.awk
blob: fe9fbe8345e3be71accd60004b9d0c375e43bf85 (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
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
# This file is part of OpenTTD.
# OpenTTD is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2.
# OpenTTD is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
# See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with OpenTTD. If not, see <http://www.gnu.org/licenses/>.

#
# Awk script to automatically generate the enums in script_window.hpp
#
# The file is scanned for @enum and @endenum tokens, and the content between them is replaced by an enum from a different file.
#
# Example:
#   // @enum enumname filename
#   ... content here is replaced ...
#   // @endenum
#
# The parameter "enumname" specifies the enumeration to extract. This can also be a regular expression.
# The parameter "filename" specifies the relative path to the file, where the enumeration is extracted from. This can also be a glob expression.
#
#

BEGIN {
	skiptillend = 0;
}

{ CR = (match($0, "\\r$") > 0 ? "\r" : "") }

/@enum/ {
	print;
	add_indent = gensub("[^	]*", "", "g");
	sub(".*@enum *", "");
	enum = $1;
	pattern = $2;

	files = "echo " pattern;
	files | getline filelist;
	close(files);

	split(filelist, filearray);
	count = asort(filearray);
	for (i = 1; i <= count; i++) {
		active = 0;
		active_comment = 0;
		comment = "";
		file = filearray[i];
		print add_indent "/* automatically generated from " file " */" CR
		while ((getline < file) > 0) {
			sub(rm_indent, "");

			# Remember possible doxygen comment before enum declaration
			if ((active == 0) && (match($0, "/\\*\\*") > 0)) {
				comment = add_indent $0;
				active_comment = 1;
			} else if (active_comment == 1) {
				comment = comment "\n" add_indent $0;
			}

			# Check for enum match
			if (match($0, "^	*enum *" enum " *\\{") > 0)  {
				rm_indent = $0;
				gsub("[^	]*", "", rm_indent);
				active = 1;
				if (active_comment > 0) print comment;
				active_comment = 0;
				comment = "";
			}

			# Forget doxygen comment, if no enum follows
			if (active_comment == 2 && $0 != "" CR) {
				active_comment = 0;
				comment = "";
			}
			if (active_comment == 1 && match($0, "\\*/") > 0) active_comment = 2;

			if (active != 0) {
				if (match($0, "^	*[A-Za-z0-9_]* *[,=]") > 0) {
					# Transform enum values
					sub(" *=[^,]*", "");
					sub(" *//", " //");

					match($0, "^(	*)([A-Za-z0-9_]+),(.*)", parts);

					if (parts[3] == "" CR) {
						printf "%s%s%-45s= ::%s\n", add_indent, parts[1], parts[2], (parts[2] "," CR)
					} else {
						printf "%s%s%-45s= ::%-45s%s\n", add_indent, parts[1], parts[2], (parts[2] ","), (parts[3]);
					}
				} else if ($0 == "" CR) {
					print "" CR;
				} else {
					print add_indent $0;
				}
			}

			if (match($0, "^	*\\};") > 0) {
				if (active != 0) print "" CR;
				active = 0;
			}
		}
		close(file);
	}

	skiptillend = 1;
	next;
}

/@endenum/ {
	print;
	skiptillend = 0;
	next;
}

{
	if (skiptillend == 0) print;
}