File: 240_offsetof.t

package info (click to toggle)
libconvert-binary-c-perl 0.85-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 13,260 kB
  • sloc: ansic: 47,820; perl: 4,980; yacc: 2,143; makefile: 61
file content (232 lines) | stat: -rw-r--r-- 10,843 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
################################################################################
#
# Copyright (c) 2002-2024 Marcus Holland-Moritz. All rights reserved.
# This program is free software; you can redistribute it and/or modify
# it under the same terms as Perl itself.
#
################################################################################

use Test::More tests => 377;
use Convert::Binary::C @ARGV;

my $c = Convert::Binary::C->new( IntSize => 4, CharSize => 1, Alignment => 1 );

eval {
$c->parse(<<'ENDC');

struct normal {
  int  a;
  char b[3];
  char c[3][3][3];
};

struct flexible {
  int  a;
  char b[];
};

ENDC
};

is($@, '', "parse C code");

my @tests = (
  [ 'normal',   'a'                    =>       0 ],

  [ 'normal',   'b'                    =>       4 ],
  [ 'normal',   'b[0]'                 =>       4 ],
  [ 'normal',   'b[1]'                 =>       5 ],
  [ 'normal',   'b[2]'                 =>       6 ],
  [ 'normal',   'b[3]'                 =>       7 ],
  [ 'normal',   'b[4]'                 =>       8 ],
  [ 'normal',   'b[+4]'                =>       8 ],
  [ 'normal',   'b[+1000000]'          => 1000004 ],
  [ 'normal',   'b[-0]'                =>       4 ],
  [ 'normal',   'b[-1]'                =>       3 ],
  [ 'normal',   'b[-2]'                =>       2 ],
  [ 'normal',   'b[-3]'                =>       1 ],
  [ 'normal',   'b[-4]'                =>       0 ],
  [ 'normal',   'b[-5]'                =>      -1 ],
  [ 'normal',   'b[-1000000]'          => -999996 ],

  [ 'normal',   'c'                    =>       7 ],
  [ 'normal',   'c[0]'                 =>       7 ],
  [ 'normal',   'c[+1]'                =>      16 ],
  [ 'normal',   'c[-1]'                =>      -2 ],
  [ 'normal',   'c[+100]'              =>     907 ],
  [ 'normal',   'c[-100]'              =>    -893 ],
  [ 'normal',   'c[0][0]'              =>       7 ],
  [ 'normal',   'c[0][+1]'             =>      10 ],
  [ 'normal',   'c[0][-1]'             =>       4 ],
  [ 'normal',   'c[0][+100]'           =>     307 ],
  [ 'normal',   'c[0][-100]'           =>    -293 ],
  [ 'normal',   'c[+1][0]'             =>      16 ],
  [ 'normal',   'c[+1][+1]'            =>      19 ],
  [ 'normal',   'c[+1][-1]'            =>      13 ],
  [ 'normal',   'c[+1][+100]'          =>     316 ],
  [ 'normal',   'c[+1][-100]'          =>    -284 ],
  [ 'normal',   'c[-1][0]'             =>      -2 ],
  [ 'normal',   'c[-1][+1]'            =>       1 ],
  [ 'normal',   'c[-1][-1]'            =>      -5 ],
  [ 'normal',   'c[-1][+100]'          =>     298 ],
  [ 'normal',   'c[-1][-100]'          =>    -302 ],
  [ 'normal',   'c[+100][0]'           =>     907 ],
  [ 'normal',   'c[+100][+1]'          =>     910 ],
  [ 'normal',   'c[+100][-1]'          =>     904 ],
  [ 'normal',   'c[+100][+100]'        =>    1207 ],
  [ 'normal',   'c[+100][-100]'        =>     607 ],
  [ 'normal',   'c[-100][0]'           =>    -893 ],
  [ 'normal',   'c[-100][+1]'          =>    -890 ],
  [ 'normal',   'c[-100][-1]'          =>    -896 ],
  [ 'normal',   'c[-100][+100]'        =>    -593 ],
  [ 'normal',   'c[-100][-100]'        =>   -1193 ],
  [ 'normal',   'c[0][0][0]'           =>       7 ],
  [ 'normal',   'c[0][0][+1]'          =>       8 ],
  [ 'normal',   'c[0][0][-1]'          =>       6 ],
  [ 'normal',   'c[0][0][+100]'        =>     107 ],
  [ 'normal',   'c[0][0][-100]'        =>     -93 ],
  [ 'normal',   'c[0][+1][0]'          =>      10 ],
  [ 'normal',   'c[0][+1][+1]'         =>      11 ],
  [ 'normal',   'c[0][+1][-1]'         =>       9 ],
  [ 'normal',   'c[0][+1][+100]'       =>     110 ],
  [ 'normal',   'c[0][+1][-100]'       =>     -90 ],
  [ 'normal',   'c[0][-1][0]'          =>       4 ],
  [ 'normal',   'c[0][-1][+1]'         =>       5 ],
  [ 'normal',   'c[0][-1][-1]'         =>       3 ],
  [ 'normal',   'c[0][-1][+100]'       =>     104 ],
  [ 'normal',   'c[0][-1][-100]'       =>     -96 ],
  [ 'normal',   'c[0][+100][0]'        =>     307 ],
  [ 'normal',   'c[0][+100][+1]'       =>     308 ],
  [ 'normal',   'c[0][+100][-1]'       =>     306 ],
  [ 'normal',   'c[0][+100][+100]'     =>     407 ],
  [ 'normal',   'c[0][+100][-100]'     =>     207 ],
  [ 'normal',   'c[0][-100][0]'        =>    -293 ],
  [ 'normal',   'c[0][-100][+1]'       =>    -292 ],
  [ 'normal',   'c[0][-100][-1]'       =>    -294 ],
  [ 'normal',   'c[0][-100][+100]'     =>    -193 ],
  [ 'normal',   'c[0][-100][-100]'     =>    -393 ],
  [ 'normal',   'c[+1][0][0]'          =>      16 ],
  [ 'normal',   'c[+1][0][+1]'         =>      17 ],
  [ 'normal',   'c[+1][0][-1]'         =>      15 ],
  [ 'normal',   'c[+1][0][+100]'       =>     116 ],
  [ 'normal',   'c[+1][0][-100]'       =>     -84 ],
  [ 'normal',   'c[+1][+1][0]'         =>      19 ],
  [ 'normal',   'c[+1][+1][+1]'        =>      20 ],
  [ 'normal',   'c[+1][+1][-1]'        =>      18 ],
  [ 'normal',   'c[+1][+1][+100]'      =>     119 ],
  [ 'normal',   'c[+1][+1][-100]'      =>     -81 ],
  [ 'normal',   'c[+1][-1][0]'         =>      13 ],
  [ 'normal',   'c[+1][-1][+1]'        =>      14 ],
  [ 'normal',   'c[+1][-1][-1]'        =>      12 ],
  [ 'normal',   'c[+1][-1][+100]'      =>     113 ],
  [ 'normal',   'c[+1][-1][-100]'      =>     -87 ],
  [ 'normal',   'c[+1][+100][0]'       =>     316 ],
  [ 'normal',   'c[+1][+100][+1]'      =>     317 ],
  [ 'normal',   'c[+1][+100][-1]'      =>     315 ],
  [ 'normal',   'c[+1][+100][+100]'    =>     416 ],
  [ 'normal',   'c[+1][+100][-100]'    =>     216 ],
  [ 'normal',   'c[+1][-100][0]'       =>    -284 ],
  [ 'normal',   'c[+1][-100][+1]'      =>    -283 ],
  [ 'normal',   'c[+1][-100][-1]'      =>    -285 ],
  [ 'normal',   'c[+1][-100][+100]'    =>    -184 ],
  [ 'normal',   'c[+1][-100][-100]'    =>    -384 ],
  [ 'normal',   'c[-1][0][0]'          =>      -2 ],
  [ 'normal',   'c[-1][0][+1]'         =>      -1 ],
  [ 'normal',   'c[-1][0][-1]'         =>      -3 ],
  [ 'normal',   'c[-1][0][+100]'       =>      98 ],
  [ 'normal',   'c[-1][0][-100]'       =>    -102 ],
  [ 'normal',   'c[-1][+1][0]'         =>       1 ],
  [ 'normal',   'c[-1][+1][+1]'        =>       2 ],
  [ 'normal',   'c[-1][+1][-1]'        =>       0 ],
  [ 'normal',   'c[-1][+1][+100]'      =>     101 ],
  [ 'normal',   'c[-1][+1][-100]'      =>     -99 ],
  [ 'normal',   'c[-1][-1][0]'         =>      -5 ],
  [ 'normal',   'c[-1][-1][+1]'        =>      -4 ],
  [ 'normal',   'c[-1][-1][-1]'        =>      -6 ],
  [ 'normal',   'c[-1][-1][+100]'      =>      95 ],
  [ 'normal',   'c[-1][-1][-100]'      =>    -105 ],
  [ 'normal',   'c[-1][+100][0]'       =>     298 ],
  [ 'normal',   'c[-1][+100][+1]'      =>     299 ],
  [ 'normal',   'c[-1][+100][-1]'      =>     297 ],
  [ 'normal',   'c[-1][+100][+100]'    =>     398 ],
  [ 'normal',   'c[-1][+100][-100]'    =>     198 ],
  [ 'normal',   'c[-1][-100][0]'       =>    -302 ],
  [ 'normal',   'c[-1][-100][+1]'      =>    -301 ],
  [ 'normal',   'c[-1][-100][-1]'      =>    -303 ],
  [ 'normal',   'c[-1][-100][+100]'    =>    -202 ],
  [ 'normal',   'c[-1][-100][-100]'    =>    -402 ],
  [ 'normal',   'c[+100][0][0]'        =>     907 ],
  [ 'normal',   'c[+100][0][+1]'       =>     908 ],
  [ 'normal',   'c[+100][0][-1]'       =>     906 ],
  [ 'normal',   'c[+100][0][+100]'     =>    1007 ],
  [ 'normal',   'c[+100][0][-100]'     =>     807 ],
  [ 'normal',   'c[+100][+1][0]'       =>     910 ],
  [ 'normal',   'c[+100][+1][+1]'      =>     911 ],
  [ 'normal',   'c[+100][+1][-1]'      =>     909 ],
  [ 'normal',   'c[+100][+1][+100]'    =>    1010 ],
  [ 'normal',   'c[+100][+1][-100]'    =>     810 ],
  [ 'normal',   'c[+100][-1][0]'       =>     904 ],
  [ 'normal',   'c[+100][-1][+1]'      =>     905 ],
  [ 'normal',   'c[+100][-1][-1]'      =>     903 ],
  [ 'normal',   'c[+100][-1][+100]'    =>    1004 ],
  [ 'normal',   'c[+100][-1][-100]'    =>     804 ],
  [ 'normal',   'c[+100][+100][0]'     =>    1207 ],
  [ 'normal',   'c[+100][+100][+1]'    =>    1208 ],
  [ 'normal',   'c[+100][+100][-1]'    =>    1206 ],
  [ 'normal',   'c[+100][+100][+100]'  =>    1307 ],
  [ 'normal',   'c[+100][+100][-100]'  =>    1107 ],
  [ 'normal',   'c[+100][-100][0]'     =>     607 ],
  [ 'normal',   'c[+100][-100][+1]'    =>     608 ],
  [ 'normal',   'c[+100][-100][-1]'    =>     606 ],
  [ 'normal',   'c[+100][-100][+100]'  =>     707 ],
  [ 'normal',   'c[+100][-100][-100]'  =>     507 ],
  [ 'normal',   'c[-100][0][0]'        =>    -893 ],
  [ 'normal',   'c[-100][0][+1]'       =>    -892 ],
  [ 'normal',   'c[-100][0][-1]'       =>    -894 ],
  [ 'normal',   'c[-100][0][+100]'     =>    -793 ],
  [ 'normal',   'c[-100][0][-100]'     =>    -993 ],
  [ 'normal',   'c[-100][+1][0]'       =>    -890 ],
  [ 'normal',   'c[-100][+1][+1]'      =>    -889 ],
  [ 'normal',   'c[-100][+1][-1]'      =>    -891 ],
  [ 'normal',   'c[-100][+1][+100]'    =>    -790 ],
  [ 'normal',   'c[-100][+1][-100]'    =>    -990 ],
  [ 'normal',   'c[-100][-1][0]'       =>    -896 ],
  [ 'normal',   'c[-100][-1][+1]'      =>    -895 ],
  [ 'normal',   'c[-100][-1][-1]'      =>    -897 ],
  [ 'normal',   'c[-100][-1][+100]'    =>    -796 ],
  [ 'normal',   'c[-100][-1][-100]'    =>    -996 ],
  [ 'normal',   'c[-100][+100][0]'     =>    -593 ],
  [ 'normal',   'c[-100][+100][+1]'    =>    -592 ],
  [ 'normal',   'c[-100][+100][-1]'    =>    -594 ],
  [ 'normal',   'c[-100][+100][+100]'  =>    -493 ],
  [ 'normal',   'c[-100][+100][-100]'  =>    -693 ],
  [ 'normal',   'c[-100][-100][0]'     =>   -1193 ],
  [ 'normal',   'c[-100][-100][+1]'    =>   -1192 ],
  [ 'normal',   'c[-100][-100][-1]'    =>   -1194 ],
  [ 'normal',   'c[-100][-100][+100]'  =>   -1093 ],
  [ 'normal',   'c[-100][-100][-100]'  =>   -1293 ],

  [ 'flexible', 'a'                    =>       0 ],

  [ 'flexible', 'b'                    =>       4 ],
  [ 'flexible', 'b[0]'                 =>       4 ],
  [ 'flexible', 'b[1]'                 =>       5 ],
  [ 'flexible', 'b[2]'                 =>       6 ],
  [ 'flexible', 'b[3]'                 =>       7 ],
  [ 'flexible', 'b[4]'                 =>       8 ],
  [ 'flexible', 'b[+4]'                =>       8 ],
  [ 'flexible', 'b[+1000000]'          => 1000004 ],
  [ 'flexible', 'b[-0]'                =>       4 ],
  [ 'flexible', 'b[-1]'                =>       3 ],
  [ 'flexible', 'b[-2]'                =>       2 ],
  [ 'flexible', 'b[-3]'                =>       1 ],
  [ 'flexible', 'b[-4]'                =>       0 ],
  [ 'flexible', 'b[-5]'                =>      -1 ],
  [ 'flexible', 'b[-1000000]'          => -999996 ],
);

for my $t (@tests) {
  my $offs = eval { $c->offsetof($t->[0], $t->[1]) };
  is($@, '', "eval { offsetof($t->[0], $t->[1]) }");
  is($offs, $t->[2], "offsetof($t->[0], $t->[1]) == $t->[2]");
}