1#!/usr/bin/awk -f
2#
3
4#-
5# SPDX-License-Identifier: BSD-2-Clause
6#
7# Copyright (c) 2004 Mark Santcroos <marks@ripe.net>
8# All rights reserved.
9#
10# Redistribution and use in source and binary forms, with or without
11# modification, are permitted provided that the following conditions
12# are met:
13# 1. Redistributions of source code must retain the above copyright
14#    notice, this list of conditions and the following disclaimer.
15# 2. Redistributions in binary form must reproduce the above copyright
16#    notice, this list of conditions and the following disclaimer in the
17#    documentation and/or other materials provided with the distribution.
18#
19# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
20# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
21# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
22# ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
23# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
24# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
25# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
26# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
27# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
28# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
29# SUCH DAMAGE.
30#
31
32BEGIN {
33	OUTPUT="acpi_quirks.h"
34}
35
36# Print header and id
37NR == 1 {
38	VERSION = $0;
39	gsub("\^# ", "", VERSION)
40	gsub("\\$", "", VERSION)
41
42	printf("/*\n") > OUTPUT;
43	printf(" * THIS FILE IS AUTOMAGICALLY GENERATED.  DO NOT EDIT.\n") \
44	    > OUTPUT;
45	printf(" *\n") > OUTPUT;
46	printf(" * Generated from:\n") > OUTPUT;
47	printf(" * %s\n", VERSION) > OUTPUT;
48	printf(" */\n\n") > OUTPUT;
49}
50
51# Ignore comments and empty lines
52/^#/, NF == 0 {
53}
54
55#
56# NAME field: this is the first line of every entry
57#
58$1 == "name:" {
59	ENTRY_NAME = $2;
60	printf("const struct acpi_q_rule %s[] = {\n", ENTRY_NAME) > OUTPUT;
61}
62
63#
64# OEM field
65#
66$1 == "oem:" {
67	LENGTH = length();
68
69	# Parse table type to match
70	TABLE = $2;
71
72	# Parse OEM ID
73	M = match ($0, /\"[^\"]*\"/);
74	OEM_ID = substr($0, M, RLENGTH);
75
76	# Parse OEM Table ID
77	ANCHOR = LENGTH - (M + RLENGTH - 1);
78	REMAINDER = substr($0, M + RLENGTH, ANCHOR);
79	M = match (REMAINDER, /\"[^\"]*\"/);
80	OEM_TABLE_ID = substr(REMAINDER, M, RLENGTH);
81
82	printf("\t{ \"%s\", OEM, {%s}, {%s} },\n",
83	    TABLE, OEM_ID, OEM_TABLE_ID) > OUTPUT;
84}
85
86#
87# CREATOR field
88#
89$1 == "creator:" {
90	# Parse table type to match
91	TABLE = $2;
92
93	M = match ($0, /\"[^\"]*\"/);
94	CREATOR = substr($0, M, RLENGTH);
95
96	printf("\t{ \"%s\", CREATOR, {%s} },\n",
97	    TABLE, CREATOR) > OUTPUT;
98}
99
100#
101# OEM REVISION field
102#
103$1 == "oem_rev:" {
104	TABLE = $2;
105	SIGN = $3;
106	VALUE = $4;
107
108	# Parse operand
109	OPERAND = trans_sign(SIGN);
110
111	printf("\t{ \"%s\", OEM_REV, {.op = %s}, {.rev = %s} },\n",
112	    TABLE, OPERAND, VALUE) > OUTPUT;
113}
114
115#
116# CREATOR REVISION field
117#
118$1 == "creator_rev:" {
119	TABLE = $2;
120	SIGN = $3;
121	VALUE = $4;
122
123	# Parse operand
124	OPERAND = trans_sign(SIGN);
125
126	printf("\t{ \"%s\", CREATOR_REV, {.op = %s}, {.rev = %s} },\n",
127	    TABLE, OPERAND, VALUE) > OUTPUT;
128}
129
130#
131# QUIRKS field: This is the last line of every entry
132#
133$1 == "quirks:" {
134	printf("\t{ \"\" }\n};\n\n") > OUTPUT;
135
136	QUIRKS = $0;
137	sub(/^quirks:[ ]*/ , "", QUIRKS);
138
139	QUIRK_COUNT++;
140	QUIRK_LIST[QUIRK_COUNT] = QUIRKS;
141	QUIRK_NAME[QUIRK_COUNT] = ENTRY_NAME;
142}
143
144#
145# All information is gathered, now create acpi_quirks_table
146#
147END {
148	# Header
149	printf("const struct acpi_q_entry acpi_quirks_table[] = {\n") \
150	    > OUTPUT;
151
152	# Array of all quirks
153	for (i = 1; i <= QUIRK_COUNT; i++) {
154		printf("\t{ %s, %s },\n", QUIRK_NAME[i], QUIRK_LIST[i]) \
155		    > OUTPUT;
156	}
157
158	# Footer
159	printf("\t{ NULL, 0 }\n") > OUTPUT;
160	printf("};\n") > OUTPUT;
161
162	exit(0);
163}
164
165#
166# Translate math SIGN into verbal OPERAND
167#
168function trans_sign(TMP_SIGN)
169{
170	if (TMP_SIGN == "=")
171		TMP_OPERAND = "OP_EQL";
172	else if (TMP_SIGN == "!=")
173		TMP_OPERAND = "OP_NEQ";
174	else if (TMP_SIGN == "<=")
175		TMP_OPERAND = "OP_LEQ";
176	else if (TMP_SIGN == ">=")
177		TMP_OPERAND = "OP_GEQ";
178	else if (TMP_SIGN == ">")
179		TMP_OPERAND = "OP_GTR";
180	else if (TMP_SIGN == "<")
181		TMP_OPERAND = "OP_LES";
182	else {
183		printf("error: unknown sign: " TMP_SIGN "\n");
184		exit(1);
185	}
186
187	return (TMP_OPERAND);
188}
189