3 # Copyright (c) 2018 CZ.NIC, z.s.p.o.
6 # Redistribution and use in source and binary forms, with or without
7 # modification, are permitted provided that the following conditions
10 # - Redistributions of source code must retain the above copyright
11 # notice, this list of conditions and the following disclaimer.
12 # - Redistributions in binary form must reproduce the above copyright
13 # notice, this list of conditions and the following disclaimer in the
14 # documentation and/or other materials provided with the distribution.
15 # - The name of the author may not be used to endorse or promote products
16 # derived from this software without specific prior written permission.
18 # THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
19 # IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
20 # OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
21 # IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
22 # INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
23 # NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
24 # DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
25 # THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
26 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
27 # THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
31 # Jiří Zárevúcky <jiri.zarevucky@nic.cz>
36 print "// Generated file. Fix the included header if static assert fails."
37 print "// Inlined \"" filename "\""
45 pattern =
"}( __attribute__\\(.*\\))? (" struct_name
"_t)?;"
47 print("Bad struct ending: " $
0) > "/dev/stderr"
50 macro_name =
toupper(struct_name
) "_SIZE"
51 output
[output_lines
++] =
"_Static_assert(" macro_name
" == sizeof(struct " struct_name
"), \"\");"
56 if (struct_name
!= "") {
57 # Remove array subscript, if any.
58 sub("(\\[.*\\])?;", "", $
0)
61 macro_name =
toupper(struct_name
) "_OFFSET_" toupper(member
)
62 output
[output_lines
++] =
"_Static_assert(" macro_name
" == __builtin_offsetof(struct " struct_name
", " member
"), \"\");"
64 macro_name =
toupper(struct_name
) "_SIZE_" toupper(member
)
65 output
[output_lines
++] =
"#ifdef " macro_name
66 output
[output_lines
++] =
"_Static_assert(" macro_name
" == sizeof(((struct " struct_name
"){ })." member
"), \"\");"
67 output
[output_lines
++] =
"#endif"
71 /^typedef struct .
* \
{/ {
76 for ( i =
0; i
< output_lines
; i
++ ) {