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