blob: 72b5f5dab3848941142fa976731829fcc4025467 [file] [log] [blame]
Elvira Khabirova09294222015-08-04 01:47:02 +03001#!/bin/sh -efu
Dmitry V. Levin38a34c92015-12-17 17:56:48 +00002#
3# Copyright (c) 2015 Elvira Khabirova <lineprinter0@gmail.com>
4# Copyright (c) 2015 Dmitry V. Levin <ldv@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.
Elvira Khabirova09294222015-08-04 01:47:02 +030028
29mpers_name="$1"; shift
Dmitry V. Levinc4afd6d2015-12-15 12:58:42 +000030size="$(printf %s "$mpers_name" |tr -cd '[0-9]')"
31[ "$size" -gt 0 ]
32
Elvira Khabirova09294222015-08-04 01:47:02 +030033srcdir=${0%/*}
34mpers_sh="${srcdir}/mpers.sh"
35
36mpers_dir="mpers-$mpers_name"
37mkdir -p "$mpers_dir"
38
39sample="$mpers_dir/sample.c"
40cat > "$sample" <<EOF
41#include "mpers_type.h"
Dmitry V. Levin59992182015-12-15 00:26:46 +000042#include DEF_MPERS_TYPE(sample_struct)
Dmitry V. Levinc4afd6d2015-12-15 12:58:42 +000043typedef 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;
Elvira Khabirova09294222015-08-04 01:47:02 +030078#include MPERS_DEFS
79EOF
80
81expected="$mpers_dir/sample.expected"
82cat > "$expected" <<EOF
83#include <inttypes.h>
Dmitry V. Levinc4afd6d2015-12-15 12:58:42 +000084typedef uint${size}_t mpers_ptr_t;
Elvira Khabirova09294222015-08-04 01:47:02 +030085typedef
Dmitry V. Levin59992182015-12-15 00:26:46 +000086struct {
Dmitry V. Levinc4afd6d2015-12-15 12:58:42 +000087struct {
88mpers_ptr_t p;
89char sc;
90unsigned char mpers_filler_1[1];
91int16_t ss;
92unsigned char uc;
93unsigned char mpers_filler_2[3];
94int32_t si;
95uint32_t ui;
96int${size}_t sl;
97uint16_t us;
98unsigned char mpers_filler_3[6];
99int64_t sll;
100uint64_t ull;
101uint${size}_t ul;
102int${size}_t asl[3];
103char f;
104unsigned char mpers_end_filler_4[7];
105} ATTRIBUTE_PACKED s;
106union {
107int64_t sll;
108uint64_t ull;
109mpers_ptr_t p;
110int${size}_t sl;
111uint${size}_t ul;
112int32_t si;
113uint32_t ui;
114int16_t ss;
115uint16_t us;
116char sc;
117unsigned char uc;
118} u[3];
119int16_t f[0];
Dmitry V. Levin59992182015-12-15 00:26:46 +0000120} ATTRIBUTE_PACKED ${mpers_name}_sample_struct;
121#define MPERS_${mpers_name}_sample_struct ${mpers_name}_sample_struct
Elvira Khabirova09294222015-08-04 01:47:02 +0300122EOF
123
124CFLAGS="$CPPFLAGS -I${srcdir}" \
125CPPFLAGS="$CPPFLAGS -I${srcdir} -DIN_MPERS -DMPERS_IS_${mpers_name}" \
126"$mpers_sh" "-$mpers_name" "$sample"
Dmitry V. Levin59992182015-12-15 00:26:46 +0000127cmp "$expected" "$mpers_dir"/sample_struct.h > /dev/null