1/*
2 * Copyright (C) 2008 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 *      http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17/* ---- includes ----------------------------------------------------------- */
18
19#include "b_BasicEm/Functions.h"
20#include "b_BitFeatureEm/Feature.h"
21
22#include "b_BitFeatureEm/Sequence.h"
23#include "b_BitFeatureEm/I04Dns2x2Ftr.h"
24#include "b_BitFeatureEm/I04Tld2x4Ftr.h"
25#include "b_BitFeatureEm/I04Dns2x4Ftr.h"
26#include "b_BitFeatureEm/L01Tld2x4Ftr.h"
27#include "b_BitFeatureEm/L01Dns2x4Ftr.h"
28#include "b_BitFeatureEm/L04Dns2x4Ftr.h"
29#include "b_BitFeatureEm/L04Dns3x3Ftr.h"
30#include "b_BitFeatureEm/L06Dns3x3Ftr.h"
31#include "b_BitFeatureEm/L06Dns4x4Ftr.h"
32#include "b_BitFeatureEm/L06DnsNx4x4Ftr.h"
33#include "b_BitFeatureEm/L01Tld1x1Ftr.h"
34#include "b_BitFeatureEm/L04Tld2x4Ftr.h"
35#include "b_BitFeatureEm/L04Dns2x2Ftr.h"
36
37/* ------------------------------------------------------------------------- */
38
39/* ========================================================================= */
40/*                                                                           */
41/* ---- \ghd{ auxiliary functions } ---------------------------------------- */
42/*                                                                           */
43/* ========================================================================= */
44
45/* ------------------------------------------------------------------------- */
46
47/* ========================================================================= */
48/*                                                                           */
49/* ---- \ghd{ constructor / destructor } ----------------------------------- */
50/*                                                                           */
51/* ========================================================================= */
52
53/* ------------------------------------------------------------------------- */
54
55void bbf_Feature_init( struct bbs_Context* cpA,
56					   struct bbf_Feature* ptrA )
57{
58	ptrA->typeE = 0;
59	ptrA->patchWidthE = 0;
60	ptrA->patchHeightE = 0;
61	ptrA->vpActivityE = NULL;
62}
63
64/* ------------------------------------------------------------------------- */
65
66void bbf_Feature_exit( struct bbs_Context* cpA,
67					   struct bbf_Feature* ptrA )
68{
69	ptrA->typeE = 0;
70	ptrA->patchWidthE = 0;
71	ptrA->patchHeightE = 0;
72	ptrA->vpActivityE = NULL;
73}
74
75/* ------------------------------------------------------------------------- */
76
77/* ========================================================================= */
78/*                                                                           */
79/* ---- \ghd{ operators } -------------------------------------------------- */
80/*                                                                           */
81/* ========================================================================= */
82
83/* ------------------------------------------------------------------------- */
84
85void bbf_Feature_copy( struct bbs_Context* cpA,
86					   struct bbf_Feature* ptrA,
87					   const struct bbf_Feature* srcPtrA )
88{
89	ptrA->typeE			= srcPtrA->typeE;
90	ptrA->patchWidthE	= srcPtrA->patchWidthE;
91	ptrA->patchHeightE	= srcPtrA->patchHeightE;
92	ptrA->vpActivityE	= srcPtrA->vpActivityE;
93}
94
95/* ------------------------------------------------------------------------- */
96
97flag bbf_Feature_equal( struct bbs_Context* cpA,
98					    const struct bbf_Feature* ptrA,
99						const struct bbf_Feature* srcPtrA )
100{
101
102	if( ptrA->typeE			!= srcPtrA->typeE ) return FALSE;
103	if( ptrA->patchWidthE	!= srcPtrA->patchWidthE ) return FALSE;
104	if( ptrA->patchHeightE	!= srcPtrA->patchHeightE ) return FALSE;
105	if( ptrA->vpActivityE	!= srcPtrA->vpActivityE ) return FALSE;
106	return TRUE;
107}
108
109/* ------------------------------------------------------------------------- */
110
111/* ========================================================================= */
112/*                                                                           */
113/* ---- \ghd{ query functions } -------------------------------------------- */
114/*                                                                           */
115/* ========================================================================= */
116
117/* ------------------------------------------------------------------------- */
118
119/* ========================================================================= */
120/*                                                                           */
121/* ---- \ghd{ modify functions } ------------------------------------------- */
122/*                                                                           */
123/* ========================================================================= */
124
125/* ------------------------------------------------------------------------- */
126
127/* ========================================================================= */
128/*                                                                           */
129/* ---- \ghd{ I/O } -------------------------------------------------------- */
130/*                                                                           */
131/* ========================================================================= */
132
133/* ------------------------------------------------------------------------- */
134
135uint32 bbf_Feature_memSize( struct bbs_Context* cpA,
136						    const struct bbf_Feature* ptrA )
137{
138	uint32 memSizeL = 0;
139	memSizeL += bbs_SIZEOF16( ptrA->typeE );
140	memSizeL += bbs_SIZEOF16( ptrA->patchWidthE );
141	memSizeL += bbs_SIZEOF16( ptrA->patchHeightE );
142	return memSizeL;
143}
144
145/* ------------------------------------------------------------------------- */
146
147uint32 bbf_Feature_memWrite( struct bbs_Context* cpA,
148							 const struct bbf_Feature* ptrA,
149							 uint16* memPtrA )
150{
151	uint32 memSizeL = bbf_Feature_memSize( cpA, ptrA );
152	memPtrA += bbs_memWrite32( &ptrA->typeE, memPtrA );
153	memPtrA += bbs_memWrite32( &ptrA->patchWidthE, memPtrA );
154	memPtrA += bbs_memWrite32( &ptrA->patchHeightE, memPtrA );
155	return memSizeL;
156}
157
158/* ------------------------------------------------------------------------- */
159
160uint32 bbf_Feature_memRead( struct bbs_Context* cpA,
161						    struct bbf_Feature* ptrA,
162							const uint16* memPtrA )
163{
164	if( bbs_Context_error( cpA ) ) return 0;
165	memPtrA += bbs_memRead32( &ptrA->typeE, memPtrA );
166	memPtrA += bbs_memRead32( &ptrA->patchWidthE, memPtrA );
167	memPtrA += bbs_memRead32( &ptrA->patchHeightE, memPtrA );
168	return bbf_Feature_memSize( cpA, ptrA );
169}
170
171/* ------------------------------------------------------------------------- */
172
173/* ========================================================================= */
174/*                                                                           */
175/* ---- \ghd{ exec functions } --------------------------------------------- */
176/*                                                                           */
177/* ========================================================================= */
178
179/* ------------------------------------------------------------------------- */
180
181void bbf_featureInit( struct bbs_Context* cpA,
182					  struct bbf_Feature* ptrA,
183					  enum bbf_FeatureType typeA )
184{
185	switch( typeA )
186	{
187		case bbf_FT_SEQUENCE:		    bbf_Sequence_init( cpA, ( struct bbf_Sequence* )ptrA ); return;
188		case bbf_FT_I04_DNS_2X2_FTR:    bbf_I04Dns2x2Ftr_init( cpA, ( struct bbf_I04Dns2x2Ftr* )ptrA ); return;
189		case bbf_FT_I04_TLD_2X4_FTR:    bbf_I04Tld2x4Ftr_init( cpA, ( struct bbf_I04Tld2x4Ftr* )ptrA ); return;
190		case bbf_FT_I04_DNS_2X4_FTR:    bbf_I04Dns2x4Ftr_init( cpA, ( struct bbf_I04Dns2x4Ftr* )ptrA ); return;
191		case bbf_FT_L01_TLD_2X4_FTR:    bbf_L01Tld2x4Ftr_init( cpA, ( struct bbf_L01Tld2x4Ftr* )ptrA ); return;
192		case bbf_FT_L01_DNS_2X4_FTR:    bbf_L01Dns2x4Ftr_init( cpA, ( struct bbf_L01Dns2x4Ftr* )ptrA ); return;
193		case bbf_FT_L04_DNS_2X4_FTR:    bbf_L04Dns2x4Ftr_init( cpA, ( struct bbf_L04Dns2x4Ftr* )ptrA ); return;
194		case bbf_FT_L04_DNS_3X3_FTR:    bbf_L04Dns3x3Ftr_init( cpA, ( struct bbf_L04Dns3x3Ftr* )ptrA ); return;
195		case bbf_FT_L06_DNS_3X3_FTR:    bbf_L06Dns3x3Ftr_init( cpA, ( struct bbf_L06Dns3x3Ftr* )ptrA ); return;
196		case bbf_FT_L06_DNS_4X4_FTR:    bbf_L06Dns4x4Ftr_init( cpA, ( struct bbf_L06Dns4x4Ftr* )ptrA ); return;
197		case bbf_FT_L06_DNS_NX4X4_FTR:  bbf_L06DnsNx4x4Ftr_init( cpA, ( struct bbf_L06DnsNx4x4Ftr* )ptrA ); return;
198		case bbf_FT_L01_TLD_1X1_FTR:    bbf_L01Tld1x1Ftr_init( cpA, ( struct bbf_L01Tld1x1Ftr* )ptrA ); return;
199		case bbf_FT_L04_TLD_2X4_FTR:    bbf_L04Tld2x4Ftr_init( cpA, ( struct bbf_L04Tld2x4Ftr* )ptrA ); return;
200		case bbf_FT_L04_DNS_2X2_FTR:    bbf_L04Dns2x2Ftr_init( cpA, ( struct bbf_L04Dns2x2Ftr* )ptrA ); return;
201
202		default: bbs_ERROR0( "bbf_featureInit: invalid type" );
203	}
204}
205
206/* ------------------------------------------------------------------------- */
207
208void bbf_featureExit( struct bbs_Context* cpA,
209					  struct bbf_Feature* ptrA )
210{
211	switch( ptrA->typeE )
212	{
213		case bbf_FT_SEQUENCE:		   bbf_Sequence_exit( cpA, ( struct bbf_Sequence* )ptrA ); return;
214		case bbf_FT_I04_DNS_2X2_FTR:   bbf_I04Dns2x2Ftr_exit( cpA, ( struct bbf_I04Dns2x2Ftr* )ptrA ); return;
215		case bbf_FT_I04_TLD_2X4_FTR:   bbf_I04Tld2x4Ftr_exit( cpA, ( struct bbf_I04Tld2x4Ftr* )ptrA ); return;
216		case bbf_FT_I04_DNS_2X4_FTR:   bbf_I04Dns2x4Ftr_exit( cpA, ( struct bbf_I04Dns2x4Ftr* )ptrA ); return;
217		case bbf_FT_L01_TLD_2X4_FTR:   bbf_L01Tld2x4Ftr_exit( cpA, ( struct bbf_L01Tld2x4Ftr* )ptrA ); return;
218		case bbf_FT_L01_DNS_2X4_FTR:   bbf_L01Dns2x4Ftr_exit( cpA, ( struct bbf_L01Dns2x4Ftr* )ptrA ); return;
219		case bbf_FT_L04_DNS_2X4_FTR:   bbf_L04Dns2x4Ftr_exit( cpA, ( struct bbf_L04Dns2x4Ftr* )ptrA ); return;
220		case bbf_FT_L04_DNS_3X3_FTR:   bbf_L04Dns3x3Ftr_exit( cpA, ( struct bbf_L04Dns3x3Ftr* )ptrA ); return;
221		case bbf_FT_L06_DNS_3X3_FTR:   bbf_L06Dns3x3Ftr_exit( cpA, ( struct bbf_L06Dns3x3Ftr* )ptrA ); return;
222		case bbf_FT_L06_DNS_4X4_FTR:   bbf_L06Dns4x4Ftr_exit( cpA, ( struct bbf_L06Dns4x4Ftr* )ptrA ); return;
223		case bbf_FT_L06_DNS_NX4X4_FTR: bbf_L06DnsNx4x4Ftr_exit( cpA, ( struct bbf_L06DnsNx4x4Ftr* )ptrA ); return;
224		case bbf_FT_L01_TLD_1X1_FTR:   bbf_L01Tld1x1Ftr_exit( cpA, ( struct bbf_L01Tld1x1Ftr* )ptrA ); return;
225		case bbf_FT_L04_TLD_2X4_FTR:   bbf_L04Tld2x4Ftr_exit( cpA, ( struct bbf_L04Tld2x4Ftr* )ptrA ); return;
226		case bbf_FT_L04_DNS_2X2_FTR:   bbf_L04Dns2x2Ftr_exit( cpA, ( struct bbf_L04Dns2x2Ftr* )ptrA ); return;
227		default: bbs_ERROR0( "bbf_featureExit: invalid type" );
228	}
229}
230
231/* ------------------------------------------------------------------------- */
232
233uint32 bbf_featureMemSize( struct bbs_Context* cpA,
234						   const struct bbf_Feature* ptrA )
235{
236	switch( ptrA->typeE )
237	{
238		case bbf_FT_SEQUENCE:		   return bbf_Sequence_memSize( cpA, ( struct bbf_Sequence* )ptrA );
239		case bbf_FT_I04_DNS_2X2_FTR:   return bbf_I04Dns2x2Ftr_memSize( cpA, ( struct bbf_I04Dns2x2Ftr* )ptrA );
240		case bbf_FT_I04_TLD_2X4_FTR:   return bbf_I04Tld2x4Ftr_memSize( cpA, ( struct bbf_I04Tld2x4Ftr* )ptrA );
241		case bbf_FT_I04_DNS_2X4_FTR:   return bbf_I04Dns2x4Ftr_memSize( cpA, ( struct bbf_I04Dns2x4Ftr* )ptrA );
242		case bbf_FT_L01_TLD_2X4_FTR:   return bbf_L01Tld2x4Ftr_memSize( cpA, ( struct bbf_L01Tld2x4Ftr* )ptrA );
243		case bbf_FT_L01_DNS_2X4_FTR:   return bbf_L01Dns2x4Ftr_memSize( cpA, ( struct bbf_L01Dns2x4Ftr* )ptrA );
244		case bbf_FT_L04_DNS_2X4_FTR:   return bbf_L04Dns2x4Ftr_memSize( cpA, ( struct bbf_L04Dns2x4Ftr* )ptrA );
245		case bbf_FT_L04_DNS_3X3_FTR:   return bbf_L04Dns3x3Ftr_memSize( cpA, ( struct bbf_L04Dns3x3Ftr* )ptrA );
246		case bbf_FT_L06_DNS_3X3_FTR:   return bbf_L06Dns3x3Ftr_memSize( cpA, ( struct bbf_L06Dns3x3Ftr* )ptrA );
247		case bbf_FT_L06_DNS_4X4_FTR:   return bbf_L06Dns4x4Ftr_memSize( cpA, ( struct bbf_L06Dns4x4Ftr* )ptrA );
248		case bbf_FT_L06_DNS_NX4X4_FTR: return bbf_L06DnsNx4x4Ftr_memSize( cpA, ( struct bbf_L06DnsNx4x4Ftr* )ptrA );
249		case bbf_FT_L01_TLD_1X1_FTR:   return bbf_L01Tld1x1Ftr_memSize( cpA, ( struct bbf_L01Tld1x1Ftr* )ptrA );
250		case bbf_FT_L04_TLD_2X4_FTR:   return bbf_L04Tld2x4Ftr_memSize( cpA, ( struct bbf_L04Tld2x4Ftr* )ptrA );
251		case bbf_FT_L04_DNS_2X2_FTR:   return bbf_L04Dns2x2Ftr_memSize( cpA, ( struct bbf_L04Dns2x2Ftr* )ptrA );
252		default: bbs_ERROR0( "bbf_featureExit: invalid type" );
253	}
254	return 0;
255}
256
257/* ------------------------------------------------------------------------- */
258
259uint32 bbf_featureMemWrite( struct bbs_Context* cpA,
260						    const struct bbf_Feature* ptrA, uint16* memPtrA )
261{
262	switch( ptrA->typeE )
263	{
264		case bbf_FT_SEQUENCE:		   return bbf_Sequence_memWrite( cpA, ( struct bbf_Sequence* )ptrA, memPtrA  );
265		case bbf_FT_I04_DNS_2X2_FTR:   return bbf_I04Dns2x2Ftr_memWrite( cpA, ( struct bbf_I04Dns2x2Ftr* )ptrA, memPtrA );
266		case bbf_FT_I04_TLD_2X4_FTR:   return bbf_I04Tld2x4Ftr_memWrite( cpA, ( struct bbf_I04Tld2x4Ftr* )ptrA, memPtrA );
267		case bbf_FT_I04_DNS_2X4_FTR:   return bbf_I04Dns2x4Ftr_memWrite( cpA, ( struct bbf_I04Dns2x4Ftr* )ptrA, memPtrA );
268		case bbf_FT_L01_TLD_2X4_FTR:   return bbf_L01Tld2x4Ftr_memWrite( cpA, ( struct bbf_L01Tld2x4Ftr* )ptrA, memPtrA );
269		case bbf_FT_L01_DNS_2X4_FTR:   return bbf_L01Dns2x4Ftr_memWrite( cpA, ( struct bbf_L01Dns2x4Ftr* )ptrA, memPtrA );
270		case bbf_FT_L04_DNS_2X4_FTR:   return bbf_L04Dns2x4Ftr_memWrite( cpA, ( struct bbf_L04Dns2x4Ftr* )ptrA, memPtrA );
271		case bbf_FT_L04_DNS_3X3_FTR:   return bbf_L04Dns3x3Ftr_memWrite( cpA, ( struct bbf_L04Dns3x3Ftr* )ptrA, memPtrA );
272		case bbf_FT_L06_DNS_3X3_FTR:   return bbf_L06Dns3x3Ftr_memWrite( cpA, ( struct bbf_L06Dns3x3Ftr* )ptrA, memPtrA );
273		case bbf_FT_L06_DNS_4X4_FTR:   return bbf_L06Dns4x4Ftr_memWrite( cpA, ( struct bbf_L06Dns4x4Ftr* )ptrA, memPtrA );
274		case bbf_FT_L06_DNS_NX4X4_FTR: return bbf_L06DnsNx4x4Ftr_memWrite( cpA, ( struct bbf_L06DnsNx4x4Ftr* )ptrA, memPtrA );
275		case bbf_FT_L01_TLD_1X1_FTR:   return bbf_L01Tld1x1Ftr_memWrite( cpA, ( struct bbf_L01Tld1x1Ftr* )ptrA, memPtrA );
276		case bbf_FT_L04_TLD_2X4_FTR:   return bbf_L04Tld2x4Ftr_memWrite( cpA, ( struct bbf_L04Tld2x4Ftr* )ptrA, memPtrA );
277		case bbf_FT_L04_DNS_2X2_FTR:   return bbf_L04Dns2x2Ftr_memWrite( cpA, ( struct bbf_L04Dns2x2Ftr* )ptrA, memPtrA );
278		default: bbs_ERROR0( "bbf_featureMemWrite: invalid type" );
279	}
280	return 0;
281}
282
283/* ------------------------------------------------------------------------- */
284
285uint32 bbf_featureMemRead( struct bbs_Context* cpA,
286						   struct bbf_Feature* ptrA,
287						   const uint16* memPtrA,
288						   struct bbs_MemTbl* mtpA )
289{
290	switch( ptrA->typeE )
291	{
292		case bbf_FT_SEQUENCE:		   return bbf_Sequence_memRead( cpA, ( struct bbf_Sequence* )ptrA, memPtrA, mtpA );
293		case bbf_FT_I04_DNS_2X2_FTR:   return bbf_I04Dns2x2Ftr_memRead( cpA, ( struct bbf_I04Dns2x2Ftr* )ptrA, memPtrA, mtpA );
294		case bbf_FT_I04_TLD_2X4_FTR:   return bbf_I04Tld2x4Ftr_memRead( cpA, ( struct bbf_I04Tld2x4Ftr* )ptrA, memPtrA, mtpA );
295		case bbf_FT_I04_DNS_2X4_FTR:   return bbf_I04Dns2x4Ftr_memRead( cpA, ( struct bbf_I04Dns2x4Ftr* )ptrA, memPtrA, mtpA );
296		case bbf_FT_L01_TLD_2X4_FTR:   return bbf_L01Tld2x4Ftr_memRead( cpA, ( struct bbf_L01Tld2x4Ftr* )ptrA, memPtrA, mtpA );
297		case bbf_FT_L01_DNS_2X4_FTR:   return bbf_L01Dns2x4Ftr_memRead( cpA, ( struct bbf_L01Dns2x4Ftr* )ptrA, memPtrA, mtpA );
298		case bbf_FT_L04_DNS_2X4_FTR:   return bbf_L04Dns2x4Ftr_memRead( cpA, ( struct bbf_L04Dns2x4Ftr* )ptrA, memPtrA, mtpA );
299		case bbf_FT_L04_DNS_3X3_FTR:   return bbf_L04Dns3x3Ftr_memRead( cpA, ( struct bbf_L04Dns3x3Ftr* )ptrA, memPtrA, mtpA );
300		case bbf_FT_L06_DNS_3X3_FTR:   return bbf_L06Dns3x3Ftr_memRead( cpA, ( struct bbf_L06Dns3x3Ftr* )ptrA, memPtrA, mtpA );
301		case bbf_FT_L06_DNS_4X4_FTR:   return bbf_L06Dns4x4Ftr_memRead( cpA, ( struct bbf_L06Dns4x4Ftr* )ptrA, memPtrA, mtpA );
302		case bbf_FT_L06_DNS_NX4X4_FTR: return bbf_L06DnsNx4x4Ftr_memRead( cpA, ( struct bbf_L06DnsNx4x4Ftr* )ptrA, memPtrA, mtpA );
303		case bbf_FT_L01_TLD_1X1_FTR:   return bbf_L01Tld1x1Ftr_memRead( cpA, ( struct bbf_L01Tld1x1Ftr* )ptrA, memPtrA, mtpA );
304		case bbf_FT_L04_TLD_2X4_FTR:   return bbf_L04Tld2x4Ftr_memRead( cpA, ( struct bbf_L04Tld2x4Ftr* )ptrA, memPtrA, mtpA );
305		case bbf_FT_L04_DNS_2X2_FTR:   return bbf_L04Dns2x2Ftr_memRead( cpA, ( struct bbf_L04Dns2x2Ftr* )ptrA, memPtrA, mtpA );
306		default: bbs_ERROR0( "bbf_featureMemRead: invalid type" );
307	}
308	return 0;
309}
310
311/* ------------------------------------------------------------------------- */
312
313uint32 bbf_featureSizeOf16( struct bbs_Context* cpA, enum bbf_FeatureType typeA )
314{
315	switch( typeA )
316	{
317		case bbf_FT_SEQUENCE:		   return bbs_SIZEOF16( struct bbf_Sequence );
318		case bbf_FT_I04_DNS_2X2_FTR:   return bbs_SIZEOF16( struct bbf_I04Dns2x2Ftr );
319		case bbf_FT_I04_TLD_2X4_FTR:   return bbs_SIZEOF16( struct bbf_I04Tld2x4Ftr );
320		case bbf_FT_I04_DNS_2X4_FTR:   return bbs_SIZEOF16( struct bbf_I04Dns2x4Ftr );
321		case bbf_FT_L01_TLD_2X4_FTR:   return bbs_SIZEOF16( struct bbf_L01Tld2x4Ftr );
322		case bbf_FT_L01_DNS_2X4_FTR:   return bbs_SIZEOF16( struct bbf_L01Dns2x4Ftr );
323		case bbf_FT_L04_DNS_2X4_FTR:   return bbs_SIZEOF16( struct bbf_L04Dns2x4Ftr );
324		case bbf_FT_L04_DNS_3X3_FTR:   return bbs_SIZEOF16( struct bbf_L04Dns3x3Ftr );
325		case bbf_FT_L06_DNS_3X3_FTR:   return bbs_SIZEOF16( struct bbf_L06Dns3x3Ftr );
326		case bbf_FT_L06_DNS_4X4_FTR:   return bbs_SIZEOF16( struct bbf_L06Dns4x4Ftr );
327		case bbf_FT_L06_DNS_NX4X4_FTR: return bbs_SIZEOF16( struct bbf_L06DnsNx4x4Ftr );
328		case bbf_FT_L01_TLD_1X1_FTR:   return bbs_SIZEOF16( struct bbf_L01Tld1x1Ftr );
329		case bbf_FT_L04_TLD_2X4_FTR:   return bbs_SIZEOF16( struct bbf_L04Tld2x4Ftr );
330		case bbf_FT_L04_DNS_2X2_FTR:   return bbs_SIZEOF16( struct bbf_L04Dns2x2Ftr );
331		default: bbs_ERROR0( "bbf_featureSizeOf16: invalid type" );
332	}
333	return 0;
334}
335
336/* ------------------------------------------------------------------------- */
337
338/* ========================================================================= */
339
340