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