1 #!/bin/sh -efu 2 # 3 # Copyright (c) 2015 Elvira Khabirova <lineprinter0 (at] gmail.com> 4 # Copyright (c) 2015 Dmitry V. Levin <ldv (at] altlinux.org> 5 # All rights reserved. 6 # 7 # Redistribution and use in source and binary forms, with or without 8 # modification, are permitted provided that the following conditions 9 # are met: 10 # 1. Redistributions of source code must retain the above copyright 11 # notice, this list of conditions and the following disclaimer. 12 # 2. 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 # 3. The name of the author may not be used to endorse or promote products 16 # derived from this software without specific prior written permission. 17 # 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. 28 29 mpers_name="$1"; shift 30 size="$(printf %s "$mpers_name" |tr -cd '[0-9]')" 31 [ "$size" -gt 0 ] 32 33 srcdir=${0%/*} 34 mpers_sh="${srcdir}/mpers.sh" 35 36 mpers_dir="mpers-$mpers_name" 37 mkdir -p "$mpers_dir" 38 39 sample="$mpers_dir/sample.c" 40 cat > "$sample" <<EOF 41 #include "mpers_type.h" 42 #include DEF_MPERS_TYPE(sample_struct) 43 typedef struct { 44 struct { 45 void *p; 46 char sc; 47 /* unsigned char mpers_filler_1[1]; */ 48 short ss; 49 unsigned char uc; 50 /* unsigned char mpers_filler_2[3]; */ 51 int si; 52 unsigned ui; 53 long sl; 54 unsigned short us; 55 /* unsigned char mpers_filler_3[6]; */ 56 long long sll __attribute__((__aligned__(8))); 57 unsigned long long ull; 58 unsigned long ul; 59 long asl[3]; 60 char f; 61 /* unsigned char mpers_end_filler_4[7]; */ 62 } s; 63 union { 64 long long sll; 65 unsigned long long ull; 66 void *p; 67 long sl; 68 unsigned long ul; 69 int si; 70 unsigned ui; 71 short ss; 72 unsigned short us; 73 char sc; 74 unsigned char uc; 75 } u[3]; 76 short f[0]; 77 } sample_struct; 78 #include MPERS_DEFS 79 EOF 80 81 expected="$mpers_dir/sample.expected" 82 cat > "$expected" <<EOF 83 #include <inttypes.h> 84 typedef uint${size}_t mpers_ptr_t; 85 typedef 86 struct { 87 struct { 88 mpers_ptr_t p; 89 char sc; 90 unsigned char mpers_filler_1[1]; 91 int16_t ss; 92 unsigned char uc; 93 unsigned char mpers_filler_2[3]; 94 int32_t si; 95 uint32_t ui; 96 int${size}_t sl; 97 uint16_t us; 98 unsigned char mpers_filler_3[6]; 99 int64_t sll; 100 uint64_t ull; 101 uint${size}_t ul; 102 int${size}_t asl[3]; 103 char f; 104 unsigned char mpers_end_filler_4[7]; 105 } ATTRIBUTE_PACKED s; 106 union { 107 int64_t sll; 108 uint64_t ull; 109 mpers_ptr_t p; 110 int${size}_t sl; 111 uint${size}_t ul; 112 int32_t si; 113 uint32_t ui; 114 int16_t ss; 115 uint16_t us; 116 char sc; 117 unsigned char uc; 118 } u[3]; 119 int16_t f[0]; 120 } ATTRIBUTE_PACKED ${mpers_name}_sample_struct; 121 #define MPERS_${mpers_name}_sample_struct ${mpers_name}_sample_struct 122 EOF 123 124 CFLAGS="$CPPFLAGS -I${srcdir}" \ 125 CPPFLAGS="$CPPFLAGS -I${srcdir} -DIN_MPERS -DMPERS_IS_${mpers_name}" \ 126 "$mpers_sh" "-$mpers_name" "$sample" 127 cmp "$expected" "$mpers_dir"/sample_struct.h > /dev/null 128