Home | History | Annotate | Line # | Download | only in xplx
      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