|
|
|
@ -4,7 +4,7 @@ |
|
|
|
|
/* */ |
|
|
|
|
/* The FreeType services (specification only). */ |
|
|
|
|
/* */ |
|
|
|
|
/* Copyright 2003, 2004, 2005, 2006, 2007 by */ |
|
|
|
|
/* Copyright 2003-2007, 2012 by */ |
|
|
|
|
/* David Turner, Robert Wilhelm, and Werner Lemberg. */ |
|
|
|
|
/* */ |
|
|
|
|
/* This file is part of the FreeType project, and may only be used, */ |
|
|
|
@ -163,299 +163,367 @@ FT_BEGIN_HEADER |
|
|
|
|
|
|
|
|
|
typedef const FT_ServiceDescRec* FT_ServiceDesc; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/*************************************************************************/ |
|
|
|
|
/* */ |
|
|
|
|
/* <Macro> */ |
|
|
|
|
/* FT_DEFINE_SERVICEDESCREC1 .. FT_DEFINE_SERVICEDESCREC6 */ |
|
|
|
|
/* */ |
|
|
|
|
/* <Description> */ |
|
|
|
|
/* Used to initialize an array of FT_ServiceDescRec structs. */ |
|
|
|
|
/* Used to initialize an array of FT_ServiceDescRec structures. */ |
|
|
|
|
/* */ |
|
|
|
|
/* When FT_CONFIG_OPTION_PIC is defined a Create funtion will need */ |
|
|
|
|
/* to called with a pointer where the allocated array is returned. */ |
|
|
|
|
/* And when it is no longer needed a Destroy function needs */ |
|
|
|
|
/* to be called to release that allocation. */ |
|
|
|
|
/* When FT_CONFIG_OPTION_PIC is defined a `create' function needs to */ |
|
|
|
|
/* be called with a pointer to return an allocated array. As soon as */ |
|
|
|
|
/* it is no longer needed, a `destroy' function needs to be called to */ |
|
|
|
|
/* release that allocation. */ |
|
|
|
|
/* */ |
|
|
|
|
/* These functions should be manyally called from the pic_init and */ |
|
|
|
|
/* pic_free functions of your module (see FT_DEFINE_MODULE) */ |
|
|
|
|
/* These functions should be manually called from the `pic_init' and */ |
|
|
|
|
/* `pic_free' functions of your module (see FT_DEFINE_MODULE). */ |
|
|
|
|
/* */ |
|
|
|
|
/* When FT_CONFIG_OPTION_PIC is not defined the array will be */ |
|
|
|
|
/* allocated in the global scope (or the scope where the macro */ |
|
|
|
|
/* is used). */ |
|
|
|
|
/* allocated in the global scope (or the scope where the macro is */ |
|
|
|
|
/* used). */ |
|
|
|
|
/* */ |
|
|
|
|
#ifndef FT_CONFIG_OPTION_PIC |
|
|
|
|
|
|
|
|
|
#define FT_DEFINE_SERVICEDESCREC1(class_, serv_id_1, serv_data_1) \ |
|
|
|
|
static const FT_ServiceDescRec class_[] = \
|
|
|
|
|
#define FT_DEFINE_SERVICEDESCREC1( class_, \ |
|
|
|
|
serv_id_1, serv_data_1 ) \
|
|
|
|
|
static const FT_ServiceDescRec class_[] = \
|
|
|
|
|
{ \
|
|
|
|
|
{serv_id_1, serv_data_1}, \
|
|
|
|
|
{NULL, NULL} \
|
|
|
|
|
{ serv_id_1, serv_data_1 }, \
|
|
|
|
|
{ NULL, NULL } \
|
|
|
|
|
}; |
|
|
|
|
#define FT_DEFINE_SERVICEDESCREC2(class_, serv_id_1, serv_data_1, \ |
|
|
|
|
serv_id_2, serv_data_2) \
|
|
|
|
|
static const FT_ServiceDescRec class_[] = \
|
|
|
|
|
|
|
|
|
|
#define FT_DEFINE_SERVICEDESCREC2( class_, \ |
|
|
|
|
serv_id_1, serv_data_1, \
|
|
|
|
|
serv_id_2, serv_data_2 ) \
|
|
|
|
|
static const FT_ServiceDescRec class_[] = \
|
|
|
|
|
{ \
|
|
|
|
|
{serv_id_1, serv_data_1}, \
|
|
|
|
|
{serv_id_2, serv_data_2}, \
|
|
|
|
|
{NULL, NULL} \
|
|
|
|
|
{ serv_id_1, serv_data_1 }, \
|
|
|
|
|
{ serv_id_2, serv_data_2 }, \
|
|
|
|
|
{ NULL, NULL } \
|
|
|
|
|
}; |
|
|
|
|
#define FT_DEFINE_SERVICEDESCREC3(class_, serv_id_1, serv_data_1, \ |
|
|
|
|
serv_id_2, serv_data_2, serv_id_3, serv_data_3) \
|
|
|
|
|
static const FT_ServiceDescRec class_[] = \
|
|
|
|
|
|
|
|
|
|
#define FT_DEFINE_SERVICEDESCREC3( class_, \ |
|
|
|
|
serv_id_1, serv_data_1, \
|
|
|
|
|
serv_id_2, serv_data_2, \
|
|
|
|
|
serv_id_3, serv_data_3 ) \
|
|
|
|
|
static const FT_ServiceDescRec class_[] = \
|
|
|
|
|
{ \
|
|
|
|
|
{serv_id_1, serv_data_1}, \
|
|
|
|
|
{serv_id_2, serv_data_2}, \
|
|
|
|
|
{serv_id_3, serv_data_3}, \
|
|
|
|
|
{NULL, NULL} \
|
|
|
|
|
{ serv_id_1, serv_data_1 }, \
|
|
|
|
|
{ serv_id_2, serv_data_2 }, \
|
|
|
|
|
{ serv_id_3, serv_data_3 }, \
|
|
|
|
|
{ NULL, NULL } \
|
|
|
|
|
}; |
|
|
|
|
#define FT_DEFINE_SERVICEDESCREC4(class_, serv_id_1, serv_data_1, \ |
|
|
|
|
serv_id_2, serv_data_2, serv_id_3, serv_data_3, \
|
|
|
|
|
serv_id_4, serv_data_4) \
|
|
|
|
|
static const FT_ServiceDescRec class_[] = \
|
|
|
|
|
|
|
|
|
|
#define FT_DEFINE_SERVICEDESCREC4( class_, \ |
|
|
|
|
serv_id_1, serv_data_1, \
|
|
|
|
|
serv_id_2, serv_data_2, \
|
|
|
|
|
serv_id_3, serv_data_3, \
|
|
|
|
|
serv_id_4, serv_data_4 ) \
|
|
|
|
|
static const FT_ServiceDescRec class_[] = \
|
|
|
|
|
{ \
|
|
|
|
|
{serv_id_1, serv_data_1}, \
|
|
|
|
|
{serv_id_2, serv_data_2}, \
|
|
|
|
|
{serv_id_3, serv_data_3}, \
|
|
|
|
|
{serv_id_4, serv_data_4}, \
|
|
|
|
|
{NULL, NULL} \
|
|
|
|
|
{ serv_id_1, serv_data_1 }, \
|
|
|
|
|
{ serv_id_2, serv_data_2 }, \
|
|
|
|
|
{ serv_id_3, serv_data_3 }, \
|
|
|
|
|
{ serv_id_4, serv_data_4 }, \
|
|
|
|
|
{ NULL, NULL } \
|
|
|
|
|
}; |
|
|
|
|
#define FT_DEFINE_SERVICEDESCREC5(class_, serv_id_1, serv_data_1, \ |
|
|
|
|
serv_id_2, serv_data_2, serv_id_3, serv_data_3, \
|
|
|
|
|
serv_id_4, serv_data_4, serv_id_5, serv_data_5) \
|
|
|
|
|
static const FT_ServiceDescRec class_[] = \
|
|
|
|
|
|
|
|
|
|
#define FT_DEFINE_SERVICEDESCREC5( class_, \ |
|
|
|
|
serv_id_1, serv_data_1, \
|
|
|
|
|
serv_id_2, serv_data_2, \
|
|
|
|
|
serv_id_3, serv_data_3, \
|
|
|
|
|
serv_id_4, serv_data_4, \
|
|
|
|
|
serv_id_5, serv_data_5 ) \
|
|
|
|
|
static const FT_ServiceDescRec class_[] = \
|
|
|
|
|
{ \
|
|
|
|
|
{serv_id_1, serv_data_1}, \
|
|
|
|
|
{serv_id_2, serv_data_2}, \
|
|
|
|
|
{serv_id_3, serv_data_3}, \
|
|
|
|
|
{serv_id_4, serv_data_4}, \
|
|
|
|
|
{serv_id_5, serv_data_5}, \
|
|
|
|
|
{NULL, NULL} \
|
|
|
|
|
{ serv_id_1, serv_data_1 }, \
|
|
|
|
|
{ serv_id_2, serv_data_2 }, \
|
|
|
|
|
{ serv_id_3, serv_data_3 }, \
|
|
|
|
|
{ serv_id_4, serv_data_4 }, \
|
|
|
|
|
{ serv_id_5, serv_data_5 }, \
|
|
|
|
|
{ NULL, NULL } \
|
|
|
|
|
}; |
|
|
|
|
#define FT_DEFINE_SERVICEDESCREC6(class_, serv_id_1, serv_data_1, \ |
|
|
|
|
serv_id_2, serv_data_2, serv_id_3, serv_data_3, \
|
|
|
|
|
serv_id_4, serv_data_4, serv_id_5, serv_data_5, \
|
|
|
|
|
serv_id_6, serv_data_6) \
|
|
|
|
|
static const FT_ServiceDescRec class_[] = \
|
|
|
|
|
|
|
|
|
|
#define FT_DEFINE_SERVICEDESCREC6( class_, \ |
|
|
|
|
serv_id_1, serv_data_1, \
|
|
|
|
|
serv_id_2, serv_data_2, \
|
|
|
|
|
serv_id_3, serv_data_3, \
|
|
|
|
|
serv_id_4, serv_data_4, \
|
|
|
|
|
serv_id_5, serv_data_5, \
|
|
|
|
|
serv_id_6, serv_data_6 ) \
|
|
|
|
|
static const FT_ServiceDescRec class_[] = \
|
|
|
|
|
{ \
|
|
|
|
|
{serv_id_1, serv_data_1}, \
|
|
|
|
|
{serv_id_2, serv_data_2}, \
|
|
|
|
|
{serv_id_3, serv_data_3}, \
|
|
|
|
|
{serv_id_4, serv_data_4}, \
|
|
|
|
|
{serv_id_5, serv_data_5}, \
|
|
|
|
|
{serv_id_6, serv_data_6}, \
|
|
|
|
|
{NULL, NULL} \
|
|
|
|
|
{ serv_id_1, serv_data_1 }, \
|
|
|
|
|
{ serv_id_2, serv_data_2 }, \
|
|
|
|
|
{ serv_id_3, serv_data_3 }, \
|
|
|
|
|
{ serv_id_4, serv_data_4 }, \
|
|
|
|
|
{ serv_id_5, serv_data_5 }, \
|
|
|
|
|
{ serv_id_6, serv_data_6 }, \
|
|
|
|
|
{ NULL, NULL } \
|
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
#else /* FT_CONFIG_OPTION_PIC */ |
|
|
|
|
|
|
|
|
|
#define FT_DEFINE_SERVICEDESCREC1(class_, serv_id_1, serv_data_1) \ |
|
|
|
|
#define FT_DEFINE_SERVICEDESCREC1( class_, \ |
|
|
|
|
serv_id_1, serv_data_1 ) \
|
|
|
|
|
void \
|
|
|
|
|
FT_Destroy_Class_##class_( FT_Library library, \
|
|
|
|
|
FT_ServiceDescRec* clazz ) \
|
|
|
|
|
FT_Destroy_Class_ ## class_( FT_Library library, \
|
|
|
|
|
FT_ServiceDescRec* clazz ) \
|
|
|
|
|
{ \
|
|
|
|
|
FT_Memory memory = library->memory; \
|
|
|
|
|
FT_Memory memory = library->memory; \
|
|
|
|
|
\
|
|
|
|
|
\
|
|
|
|
|
if ( clazz ) \
|
|
|
|
|
FT_FREE( clazz ); \
|
|
|
|
|
} \
|
|
|
|
|
\
|
|
|
|
|
FT_Error \
|
|
|
|
|
FT_Create_Class_##class_( FT_Library library, \
|
|
|
|
|
FT_ServiceDescRec** output_class) \
|
|
|
|
|
FT_Create_Class_ ## class_( FT_Library library, \
|
|
|
|
|
FT_ServiceDescRec** output_class ) \
|
|
|
|
|
{ \
|
|
|
|
|
FT_ServiceDescRec* clazz; \
|
|
|
|
|
FT_Error error; \
|
|
|
|
|
FT_Memory memory = library->memory; \
|
|
|
|
|
FT_Error error; \
|
|
|
|
|
FT_Memory memory = library->memory; \
|
|
|
|
|
\
|
|
|
|
|
\
|
|
|
|
|
if ( FT_ALLOC( clazz, sizeof(*clazz)*2 ) ) \
|
|
|
|
|
if ( FT_ALLOC( clazz, sizeof ( *clazz ) * 2 ) ) \
|
|
|
|
|
return error; \
|
|
|
|
|
clazz[0].serv_id = serv_id_1; \
|
|
|
|
|
\
|
|
|
|
|
clazz[0].serv_id = serv_id_1; \
|
|
|
|
|
clazz[0].serv_data = serv_data_1; \
|
|
|
|
|
clazz[1].serv_id = NULL; \
|
|
|
|
|
clazz[1].serv_id = NULL; \
|
|
|
|
|
clazz[1].serv_data = NULL; \
|
|
|
|
|
\
|
|
|
|
|
*output_class = clazz; \
|
|
|
|
|
\
|
|
|
|
|
return FT_Err_Ok; \
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
#define FT_DEFINE_SERVICEDESCREC2(class_, serv_id_1, serv_data_1, \ |
|
|
|
|
serv_id_2, serv_data_2) \
|
|
|
|
|
#define FT_DEFINE_SERVICEDESCREC2( class_, \ |
|
|
|
|
serv_id_1, serv_data_1, \
|
|
|
|
|
serv_id_2, serv_data_2 ) \
|
|
|
|
|
void \
|
|
|
|
|
FT_Destroy_Class_##class_( FT_Library library, \
|
|
|
|
|
FT_ServiceDescRec* clazz ) \
|
|
|
|
|
FT_Destroy_Class_ ## class_( FT_Library library, \
|
|
|
|
|
FT_ServiceDescRec* clazz ) \
|
|
|
|
|
{ \
|
|
|
|
|
FT_Memory memory = library->memory; \
|
|
|
|
|
FT_Memory memory = library->memory; \
|
|
|
|
|
\
|
|
|
|
|
\
|
|
|
|
|
if ( clazz ) \
|
|
|
|
|
FT_FREE( clazz ); \
|
|
|
|
|
} \
|
|
|
|
|
\
|
|
|
|
|
FT_Error \
|
|
|
|
|
FT_Create_Class_##class_( FT_Library library, \
|
|
|
|
|
FT_ServiceDescRec** output_class) \
|
|
|
|
|
FT_Create_Class_ ## class_( FT_Library library, \
|
|
|
|
|
FT_ServiceDescRec** output_class ) \
|
|
|
|
|
{ \
|
|
|
|
|
FT_ServiceDescRec* clazz; \
|
|
|
|
|
FT_Error error; \
|
|
|
|
|
FT_Memory memory = library->memory; \
|
|
|
|
|
FT_Error error; \
|
|
|
|
|
FT_Memory memory = library->memory; \
|
|
|
|
|
\
|
|
|
|
|
if ( FT_ALLOC( clazz, sizeof(*clazz)*3 ) ) \
|
|
|
|
|
\
|
|
|
|
|
if ( FT_ALLOC( clazz, sizeof ( *clazz ) * 3 ) ) \
|
|
|
|
|
return error; \
|
|
|
|
|
clazz[0].serv_id = serv_id_1; \
|
|
|
|
|
\
|
|
|
|
|
clazz[0].serv_id = serv_id_1; \
|
|
|
|
|
clazz[0].serv_data = serv_data_1; \
|
|
|
|
|
clazz[1].serv_id = serv_id_2; \
|
|
|
|
|
clazz[1].serv_id = serv_id_2; \
|
|
|
|
|
clazz[1].serv_data = serv_data_2; \
|
|
|
|
|
clazz[2].serv_id = NULL; \
|
|
|
|
|
clazz[2].serv_id = NULL; \
|
|
|
|
|
clazz[2].serv_data = NULL; \
|
|
|
|
|
\
|
|
|
|
|
*output_class = clazz; \
|
|
|
|
|
\
|
|
|
|
|
return FT_Err_Ok; \
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
#define FT_DEFINE_SERVICEDESCREC3(class_, serv_id_1, serv_data_1, \ |
|
|
|
|
serv_id_2, serv_data_2, serv_id_3, serv_data_3) \
|
|
|
|
|
#define FT_DEFINE_SERVICEDESCREC3( class_, \ |
|
|
|
|
serv_id_1, serv_data_1, \
|
|
|
|
|
serv_id_2, serv_data_2, \
|
|
|
|
|
serv_id_3, serv_data_3 ) \
|
|
|
|
|
void \
|
|
|
|
|
FT_Destroy_Class_##class_( FT_Library library, \
|
|
|
|
|
FT_ServiceDescRec* clazz ) \
|
|
|
|
|
FT_Destroy_Class_ ## class_( FT_Library library, \
|
|
|
|
|
FT_ServiceDescRec* clazz ) \
|
|
|
|
|
{ \
|
|
|
|
|
FT_Memory memory = library->memory; \
|
|
|
|
|
FT_Memory memory = library->memory; \
|
|
|
|
|
\
|
|
|
|
|
\
|
|
|
|
|
if ( clazz ) \
|
|
|
|
|
FT_FREE( clazz ); \
|
|
|
|
|
} \
|
|
|
|
|
\
|
|
|
|
|
FT_Error \
|
|
|
|
|
FT_Create_Class_##class_( FT_Library library, \
|
|
|
|
|
FT_ServiceDescRec** output_class) \
|
|
|
|
|
FT_Create_Class_ ## class_( FT_Library library, \
|
|
|
|
|
FT_ServiceDescRec** output_class ) \
|
|
|
|
|
{ \
|
|
|
|
|
FT_ServiceDescRec* clazz; \
|
|
|
|
|
FT_Error error; \
|
|
|
|
|
FT_Memory memory = library->memory; \
|
|
|
|
|
FT_Error error; \
|
|
|
|
|
FT_Memory memory = library->memory; \
|
|
|
|
|
\
|
|
|
|
|
if ( FT_ALLOC( clazz, sizeof(*clazz)*4 ) ) \
|
|
|
|
|
\
|
|
|
|
|
if ( FT_ALLOC( clazz, sizeof ( *clazz ) * 4 ) ) \
|
|
|
|
|
return error; \
|
|
|
|
|
clazz[0].serv_id = serv_id_1; \
|
|
|
|
|
\
|
|
|
|
|
clazz[0].serv_id = serv_id_1; \
|
|
|
|
|
clazz[0].serv_data = serv_data_1; \
|
|
|
|
|
clazz[1].serv_id = serv_id_2; \
|
|
|
|
|
clazz[1].serv_id = serv_id_2; \
|
|
|
|
|
clazz[1].serv_data = serv_data_2; \
|
|
|
|
|
clazz[2].serv_id = serv_id_3; \
|
|
|
|
|
clazz[2].serv_id = serv_id_3; \
|
|
|
|
|
clazz[2].serv_data = serv_data_3; \
|
|
|
|
|
clazz[3].serv_id = NULL; \
|
|
|
|
|
clazz[3].serv_id = NULL; \
|
|
|
|
|
clazz[3].serv_data = NULL; \
|
|
|
|
|
\
|
|
|
|
|
*output_class = clazz; \
|
|
|
|
|
\
|
|
|
|
|
return FT_Err_Ok; \
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
#define FT_DEFINE_SERVICEDESCREC4(class_, serv_id_1, serv_data_1, \ |
|
|
|
|
serv_id_2, serv_data_2, serv_id_3, serv_data_3, \
|
|
|
|
|
serv_id_4, serv_data_4) \
|
|
|
|
|
#define FT_DEFINE_SERVICEDESCREC4( class_, \ |
|
|
|
|
serv_id_1, serv_data_1, \
|
|
|
|
|
serv_id_2, serv_data_2, \
|
|
|
|
|
serv_id_3, serv_data_3, \
|
|
|
|
|
serv_id_4, serv_data_4 ) \
|
|
|
|
|
void \
|
|
|
|
|
FT_Destroy_Class_##class_( FT_Library library, \
|
|
|
|
|
FT_ServiceDescRec* clazz ) \
|
|
|
|
|
FT_Destroy_Class_ ## class_( FT_Library library, \
|
|
|
|
|
FT_ServiceDescRec* clazz ) \
|
|
|
|
|
{ \
|
|
|
|
|
FT_Memory memory = library->memory; \
|
|
|
|
|
FT_Memory memory = library->memory; \
|
|
|
|
|
\
|
|
|
|
|
\
|
|
|
|
|
if ( clazz ) \
|
|
|
|
|
FT_FREE( clazz ); \
|
|
|
|
|
} \
|
|
|
|
|
\
|
|
|
|
|
FT_Error \
|
|
|
|
|
FT_Create_Class_##class_( FT_Library library, \
|
|
|
|
|
FT_ServiceDescRec** output_class) \
|
|
|
|
|
FT_Create_Class_ ## class_( FT_Library library, \
|
|
|
|
|
FT_ServiceDescRec** output_class ) \
|
|
|
|
|
{ \
|
|
|
|
|
FT_ServiceDescRec* clazz; \
|
|
|
|
|
FT_Error error; \
|
|
|
|
|
FT_Memory memory = library->memory; \
|
|
|
|
|
FT_Error error; \
|
|
|
|
|
FT_Memory memory = library->memory; \
|
|
|
|
|
\
|
|
|
|
|
\
|
|
|
|
|
if ( FT_ALLOC( clazz, sizeof(*clazz)*5 ) ) \
|
|
|
|
|
if ( FT_ALLOC( clazz, sizeof ( *clazz ) * 5 ) ) \
|
|
|
|
|
return error; \
|
|
|
|
|
clazz[0].serv_id = serv_id_1; \
|
|
|
|
|
\
|
|
|
|
|
clazz[0].serv_id = serv_id_1; \
|
|
|
|
|
clazz[0].serv_data = serv_data_1; \
|
|
|
|
|
clazz[1].serv_id = serv_id_2; \
|
|
|
|
|
clazz[1].serv_id = serv_id_2; \
|
|
|
|
|
clazz[1].serv_data = serv_data_2; \
|
|
|
|
|
clazz[2].serv_id = serv_id_3; \
|
|
|
|
|
clazz[2].serv_id = serv_id_3; \
|
|
|
|
|
clazz[2].serv_data = serv_data_3; \
|
|
|
|
|
clazz[3].serv_id = serv_id_4; \
|
|
|
|
|
clazz[3].serv_id = serv_id_4; \
|
|
|
|
|
clazz[3].serv_data = serv_data_4; \
|
|
|
|
|
clazz[4].serv_id = NULL; \
|
|
|
|
|
clazz[4].serv_id = NULL; \
|
|
|
|
|
clazz[4].serv_data = NULL; \
|
|
|
|
|
\
|
|
|
|
|
*output_class = clazz; \
|
|
|
|
|
\
|
|
|
|
|
return FT_Err_Ok; \
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
#define FT_DEFINE_SERVICEDESCREC5(class_, serv_id_1, serv_data_1, \ |
|
|
|
|
serv_id_2, serv_data_2, serv_id_3, serv_data_3, serv_id_4, \
|
|
|
|
|
serv_data_4, serv_id_5, serv_data_5) \
|
|
|
|
|
#define FT_DEFINE_SERVICEDESCREC5( class_, \ |
|
|
|
|
serv_id_1, serv_data_1, \
|
|
|
|
|
serv_id_2, serv_data_2, \
|
|
|
|
|
serv_id_3, serv_data_3, \
|
|
|
|
|
serv_id_4, serv_data_4, \
|
|
|
|
|
serv_id_5, serv_data_5 ) \
|
|
|
|
|
void \
|
|
|
|
|
FT_Destroy_Class_##class_( FT_Library library, \
|
|
|
|
|
FT_ServiceDescRec* clazz ) \
|
|
|
|
|
FT_Destroy_Class_ ## class_( FT_Library library, \
|
|
|
|
|
FT_ServiceDescRec* clazz ) \
|
|
|
|
|
{ \
|
|
|
|
|
FT_Memory memory = library->memory; \
|
|
|
|
|
FT_Memory memory = library->memory; \
|
|
|
|
|
\
|
|
|
|
|
\
|
|
|
|
|
if ( clazz ) \
|
|
|
|
|
FT_FREE( clazz ); \
|
|
|
|
|
} \
|
|
|
|
|
\
|
|
|
|
|
FT_Error \
|
|
|
|
|
FT_Create_Class_##class_( FT_Library library, \
|
|
|
|
|
FT_ServiceDescRec** output_class) \
|
|
|
|
|
FT_Create_Class_ ## class_( FT_Library library, \
|
|
|
|
|
FT_ServiceDescRec** output_class ) \
|
|
|
|
|
{ \
|
|
|
|
|
FT_ServiceDescRec* clazz; \
|
|
|
|
|
FT_Error error; \
|
|
|
|
|
FT_Memory memory = library->memory; \
|
|
|
|
|
FT_Error error; \
|
|
|
|
|
FT_Memory memory = library->memory; \
|
|
|
|
|
\
|
|
|
|
|
\
|
|
|
|
|
if ( FT_ALLOC( clazz, sizeof(*clazz)*6 ) ) \
|
|
|
|
|
if ( FT_ALLOC( clazz, sizeof ( *clazz ) * 6 ) ) \
|
|
|
|
|
return error; \
|
|
|
|
|
clazz[0].serv_id = serv_id_1; \
|
|
|
|
|
\
|
|
|
|
|
clazz[0].serv_id = serv_id_1; \
|
|
|
|
|
clazz[0].serv_data = serv_data_1; \
|
|
|
|
|
clazz[1].serv_id = serv_id_2; \
|
|
|
|
|
clazz[1].serv_id = serv_id_2; \
|
|
|
|
|
clazz[1].serv_data = serv_data_2; \
|
|
|
|
|
clazz[2].serv_id = serv_id_3; \
|
|
|
|
|
clazz[2].serv_id = serv_id_3; \
|
|
|
|
|
clazz[2].serv_data = serv_data_3; \
|
|
|
|
|
clazz[3].serv_id = serv_id_4; \
|
|
|
|
|
clazz[3].serv_id = serv_id_4; \
|
|
|
|
|
clazz[3].serv_data = serv_data_4; \
|
|
|
|
|
clazz[4].serv_id = serv_id_5; \
|
|
|
|
|
clazz[4].serv_id = serv_id_5; \
|
|
|
|
|
clazz[4].serv_data = serv_data_5; \
|
|
|
|
|
clazz[5].serv_id = NULL; \
|
|
|
|
|
clazz[5].serv_id = NULL; \
|
|
|
|
|
clazz[5].serv_data = NULL; \
|
|
|
|
|
\
|
|
|
|
|
*output_class = clazz; \
|
|
|
|
|
\
|
|
|
|
|
return FT_Err_Ok; \
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
#define FT_DEFINE_SERVICEDESCREC6(class_, serv_id_1, serv_data_1, \ |
|
|
|
|
serv_id_2, serv_data_2, serv_id_3, serv_data_3, \
|
|
|
|
|
serv_id_4, serv_data_4, serv_id_5, serv_data_5, \
|
|
|
|
|
serv_id_6, serv_data_6) \
|
|
|
|
|
#define FT_DEFINE_SERVICEDESCREC6( class_, \ |
|
|
|
|
serv_id_1, serv_data_1, \
|
|
|
|
|
serv_id_2, serv_data_2, \
|
|
|
|
|
serv_id_3, serv_data_3, \
|
|
|
|
|
serv_id_4, serv_data_4, \
|
|
|
|
|
serv_id_5, serv_data_5, \
|
|
|
|
|
serv_id_6, serv_data_6 ) \
|
|
|
|
|
void \
|
|
|
|
|
FT_Destroy_Class_##class_( FT_Library library, \
|
|
|
|
|
FT_ServiceDescRec* clazz ) \
|
|
|
|
|
FT_Destroy_Class_ ## class_( FT_Library library, \
|
|
|
|
|
FT_ServiceDescRec* clazz ) \
|
|
|
|
|
{ \
|
|
|
|
|
FT_Memory memory = library->memory; \
|
|
|
|
|
FT_Memory memory = library->memory; \
|
|
|
|
|
\
|
|
|
|
|
\
|
|
|
|
|
if ( clazz ) \
|
|
|
|
|
FT_FREE( clazz ); \
|
|
|
|
|
} \
|
|
|
|
|
\
|
|
|
|
|
FT_Error \
|
|
|
|
|
FT_Create_Class_##class_( FT_Library library, \
|
|
|
|
|
FT_ServiceDescRec** output_class) \
|
|
|
|
|
FT_Create_Class_ ## class_( FT_Library library, \
|
|
|
|
|
FT_ServiceDescRec** output_class) \
|
|
|
|
|
{ \
|
|
|
|
|
FT_ServiceDescRec* clazz; \
|
|
|
|
|
FT_Error error; \
|
|
|
|
|
FT_Memory memory = library->memory; \
|
|
|
|
|
FT_Error error; \
|
|
|
|
|
FT_Memory memory = library->memory; \
|
|
|
|
|
\
|
|
|
|
|
\
|
|
|
|
|
if ( FT_ALLOC( clazz, sizeof(*clazz)*7 ) ) \
|
|
|
|
|
if ( FT_ALLOC( clazz, sizeof ( *clazz ) * 7 ) ) \
|
|
|
|
|
return error; \
|
|
|
|
|
clazz[0].serv_id = serv_id_1; \
|
|
|
|
|
\
|
|
|
|
|
clazz[0].serv_id = serv_id_1; \
|
|
|
|
|
clazz[0].serv_data = serv_data_1; \
|
|
|
|
|
clazz[1].serv_id = serv_id_2; \
|
|
|
|
|
clazz[1].serv_id = serv_id_2; \
|
|
|
|
|
clazz[1].serv_data = serv_data_2; \
|
|
|
|
|
clazz[2].serv_id = serv_id_3; \
|
|
|
|
|
clazz[2].serv_id = serv_id_3; \
|
|
|
|
|
clazz[2].serv_data = serv_data_3; \
|
|
|
|
|
clazz[3].serv_id = serv_id_4; \
|
|
|
|
|
clazz[3].serv_id = serv_id_4; \
|
|
|
|
|
clazz[3].serv_data = serv_data_4; \
|
|
|
|
|
clazz[4].serv_id = serv_id_5; \
|
|
|
|
|
clazz[4].serv_id = serv_id_5; \
|
|
|
|
|
clazz[4].serv_data = serv_data_5; \
|
|
|
|
|
clazz[5].serv_id = serv_id_6; \
|
|
|
|
|
clazz[5].serv_id = serv_id_6; \
|
|
|
|
|
clazz[5].serv_data = serv_data_6; \
|
|
|
|
|
clazz[6].serv_id = NULL; \
|
|
|
|
|
clazz[6].serv_id = NULL; \
|
|
|
|
|
clazz[6].serv_data = NULL; \
|
|
|
|
|
\
|
|
|
|
|
*output_class = clazz; \
|
|
|
|
|
\
|
|
|
|
|
return FT_Err_Ok; \
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
#endif /* FT_CONFIG_OPTION_PIC */ |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* Parse a list of FT_ServiceDescRec descriptors and look for |
|
|
|
|
* a specific service by ID. Note that the last element in the |
|
|
|
|