1 # 2 # Copyright (c) 2018 Tetsuya Isaki. All rights reserved. 3 # 4 # Redistribution and use in source and binary forms, with or without 5 # modification, are permitted provided that the following conditions 6 # are met: 7 # 1. Redistributions of source code must retain the above copyright 8 # notice, this list of conditions and the following disclaimer. 9 # 2. Redistributions in binary form must reproduce the above copyright 10 # notice, this list of conditions and the following disclaimer in the 11 # documentation and/or other materials provided with the distribution. 12 # 13 # THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 14 # IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 15 # OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 16 # IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 17 # INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, 18 # BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 19 # LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED 20 # AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, 21 # OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 22 # OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 23 # SUCH DAMAGE. 24 25 BEGIN { 26 print "/* generated by mkdefs.awk */" 27 print "#ifndef XPLX_DEFINE" 28 print "#define XPLX_DEFINE" 29 } 30 31 # hex to decimal 32 function h2d(s, i,c,n,rv) 33 { 34 rv = 0 35 for (i = 1; i <= length(s); i++) { 36 c = toupper(substr(s, i, 1)) 37 n = index("0123456789ABCDEF", c) 38 if (n == 0) { 39 error = 1 40 exit error 41 } 42 rv = rv * 16 + n - 1 43 } 44 return rv 45 } 46 47 # Global label 48 /::/ { 49 print "/* " $0 " */" 50 for (i = 1; i <= NF; i++) { 51 f = $(i) 52 if (f ~ /::/) { 53 break; 54 } 55 } 56 sub(/::/, "", f) 57 sub(/:/, "", $1) 58 printf("#define %s 0x%s\n", f, $1); 59 60 k = "GLOBAL_" 61 keys[""] = k 62 v = h2d($1) 63 while (values["", v] != "") v++; 64 values["", v] = f 65 counts[""]++ 66 } 67 68 $2 ~ /#define/ { 69 printf("%s %s %s\n", $2, $3, $4); 70 71 # multiple if statements 72 # because match() returns index/length by global variables 73 if (match($3, /^XPLX_R_/)) { 74 k = substr($3, RSTART, RLENGTH) 75 } else 76 if (match($3, /^DEVID_/)) { 77 k = substr($3, RSTART, RLENGTH) 78 } else 79 if (match($3, /^[^_]+_(CMD|ENC)_/)) { 80 k = substr($3, RSTART, RLENGTH) 81 } else { 82 next 83 } 84 sub(k, "", $3) 85 keys[k] = k 86 values[k, $4] = $3 87 counts[k]++ 88 } 89 90 END { 91 print "#endif /* !XPLX_DEFINE */" 92 } 93