| #!/bin/sh -efu |
| # |
| # Copyright (c) 2015 Elvira Khabirova <lineprinter0@gmail.com> |
| # Copyright (c) 2015 Dmitry V. Levin <ldv@altlinux.org> |
| # All rights reserved. |
| # |
| # Redistribution and use in source and binary forms, with or without |
| # modification, are permitted provided that the following conditions |
| # are met: |
| # 1. Redistributions of source code must retain the above copyright |
| # notice, this list of conditions and the following disclaimer. |
| # 2. Redistributions in binary form must reproduce the above copyright |
| # notice, this list of conditions and the following disclaimer in the |
| # documentation and/or other materials provided with the distribution. |
| # 3. The name of the author may not be used to endorse or promote products |
| # derived from this software without specific prior written permission. |
| # |
| # THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
| # IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
| # OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
| # IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
| # INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
| # NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
| # DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
| # THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
| # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
| # THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
| |
| mpers_name="$1"; shift |
| size="$(printf %s "$mpers_name" |tr -cd '[0-9]')" |
| [ "$size" -gt 0 ] |
| |
| srcdir=${0%/*} |
| mpers_sh="${srcdir}/mpers.sh" |
| |
| mpers_dir="mpers-$mpers_name" |
| mkdir -p "$mpers_dir" |
| |
| sample="$mpers_dir/sample.c" |
| cat > "$sample" <<EOF |
| #include "mpers_type.h" |
| #include DEF_MPERS_TYPE(sample_struct) |
| typedef struct { |
| struct { |
| void *p; |
| char sc; |
| /* unsigned char mpers_filler_1[1]; */ |
| short ss; |
| unsigned char uc; |
| /* unsigned char mpers_filler_2[3]; */ |
| int si; |
| unsigned ui; |
| long sl; |
| unsigned short us; |
| /* unsigned char mpers_filler_3[6]; */ |
| long long sll __attribute__((__aligned__(8))); |
| unsigned long long ull; |
| unsigned long ul; |
| long asl[3]; |
| char f; |
| /* unsigned char mpers_end_filler_4[7]; */ |
| } s; |
| union { |
| long long sll; |
| unsigned long long ull; |
| void *p; |
| long sl; |
| unsigned long ul; |
| int si; |
| unsigned ui; |
| short ss; |
| unsigned short us; |
| char sc; |
| unsigned char uc; |
| } u[3]; |
| short f[0]; |
| } sample_struct; |
| #include MPERS_DEFS |
| EOF |
| |
| expected="$mpers_dir/sample.expected" |
| cat > "$expected" <<EOF |
| #include <inttypes.h> |
| typedef uint${size}_t mpers_ptr_t; |
| typedef |
| struct { |
| struct { |
| mpers_ptr_t p; |
| char sc; |
| unsigned char mpers_filler_1[1]; |
| int16_t ss; |
| unsigned char uc; |
| unsigned char mpers_filler_2[3]; |
| int32_t si; |
| uint32_t ui; |
| int${size}_t sl; |
| uint16_t us; |
| unsigned char mpers_filler_3[6]; |
| int64_t sll; |
| uint64_t ull; |
| uint${size}_t ul; |
| int${size}_t asl[3]; |
| char f; |
| unsigned char mpers_end_filler_4[7]; |
| } ATTRIBUTE_PACKED s; |
| union { |
| int64_t sll; |
| uint64_t ull; |
| mpers_ptr_t p; |
| int${size}_t sl; |
| uint${size}_t ul; |
| int32_t si; |
| uint32_t ui; |
| int16_t ss; |
| uint16_t us; |
| char sc; |
| unsigned char uc; |
| } u[3]; |
| int16_t f[0]; |
| } ATTRIBUTE_PACKED ${mpers_name}_sample_struct; |
| #define MPERS_${mpers_name}_sample_struct ${mpers_name}_sample_struct |
| EOF |
| |
| CFLAGS="$CPPFLAGS -I${srcdir}" \ |
| CPPFLAGS="$CPPFLAGS -I${srcdir} -DIN_MPERS -DMPERS_IS_${mpers_name}" \ |
| "$mpers_sh" "-$mpers_name" "$sample" |
| cmp "$expected" "$mpers_dir"/sample_struct.h > /dev/null |