c_structure idl_stacDefFindMetaStructureResolved( c_metaObject scope, const char *typeName) { c_baseObject object; c_structure structure; object = c_baseObject(c_metaResolve(scope, typeName)); if(!object) { printf("FATAL ERROR | #pragma stac: Trying to locate structure '%s' in " "scope '%s'. But no such object exists.\n", typeName, c_metaScopedName(c_metaObject(scope))); exit(-2); } /* Resolve typedefs */ idl_stacDefResolveTypeDef(object); /* The final object (after typedef resolving) should be a structure */ if(object->kind != M_STRUCTURE) { printf("FATAL ERROR | #pragma stac: Trying to locate structure '%s' in " "scope '%s'. But the identified object is not a structure.\n", typeName, c_metaScopedName(c_metaObject(scope))); exit(-2); } structure = c_structure(object); return structure; }
c_bool __sensor_msgs_msg_dds__CompressedImage___copyIn( c_base base, struct ::sensor_msgs::msg::dds_::CompressedImage_ *from, struct _sensor_msgs_msg_dds__CompressedImage_ *to) { c_bool result = OS_C_TRUE; (void) base; if(result){ extern c_bool __std_msgs_msg_dds__Header___copyIn(c_base, ::std_msgs::msg::dds_::Header_ *, _std_msgs_msg_dds__Header_ *); result = __std_msgs_msg_dds__Header___copyIn(base, &from->header_, &to->header_); } #ifdef OSPL_BOUNDS_CHECK if(from->format_){ to->format_ = c_stringNew(base, from->format_); } else { OS_REPORT (OS_ERROR, "copyIn", 0,"Member 'sensor_msgs::msg::dds_::CompressedImage_.format_' of type 'c_string' is NULL."); result = OS_C_FALSE; } #else to->format_ = c_stringNew(base, from->format_); #endif { /* Code generated by /home/erle/opensplice/src/tools/idlpp/code/idl_genCorbaCxxCopyin.c at line 774 */ static c_type type0 = NULL; c_type subtype0; c_long length0; c_octet *dest0; ::sensor_msgs::msg::dds_::CompressedImage_::_data__seq *src = &from->data_; if (type0 == NULL) { subtype0 = c_type(c_metaResolve (c_metaObject(base), "c_octet")); type0 = c_metaSequenceTypeNew(c_metaObject(base),"C_SEQUENCE<c_octet>",subtype0,0); c_free(subtype0); } length0 = (c_long)(*src).length(); #ifdef OSPL_BOUNDS_CHECK dest0 = (c_octet *)c_newSequence(c_collectionType(type0),length0); { /* Code generated by /home/erle/opensplice/src/tools/idlpp/code/idl_genCorbaCxxCopyin.c at line 1873 */ c_octet *buf0; buf0 = (c_octet *)(*src).get_buffer(); memcpy (dest0,buf0,length0* sizeof(*dest0)); } to->data_ = (c_sequence)dest0; #else dest0 = (c_octet *)c_newSequence(c_collectionType(type0),length0); { /* Code generated by /home/erle/opensplice/src/tools/idlpp/code/idl_genCorbaCxxCopyin.c at line 1873 */ c_octet *buf0; buf0 = (c_octet *)(*src).get_buffer(); memcpy (dest0,buf0,length0* sizeof(*dest0)); } to->data_ = (c_sequence)dest0; #endif } return result; }
c_bool __std_msgs_msg_dds__UInt64MultiArray___copyIn( c_base base, struct ::std_msgs::msg::dds_::UInt64MultiArray_ *from, struct _std_msgs_msg_dds__UInt64MultiArray_ *to) { c_bool result = OS_C_TRUE; (void) base; if(result){ extern c_bool __std_msgs_msg_dds__MultiArrayLayout___copyIn(c_base, ::std_msgs::msg::dds_::MultiArrayLayout_ *, _std_msgs_msg_dds__MultiArrayLayout_ *); result = __std_msgs_msg_dds__MultiArrayLayout___copyIn(base, &from->layout_, &to->layout_); } { /* Code generated by /home/erle/opensplice/src/tools/idlpp/code/idl_genCorbaCxxCopyin.c at line 774 */ static c_type type0 = NULL; c_type subtype0; c_long length0; c_ulonglong *dest0; ::std_msgs::msg::dds_::UInt64MultiArray_::_data__seq *src = &from->data_; if (type0 == NULL) { subtype0 = c_type(c_metaResolve (c_metaObject(base), "c_ulonglong")); type0 = c_metaSequenceTypeNew(c_metaObject(base),"C_SEQUENCE<c_ulonglong>",subtype0,0); c_free(subtype0); } length0 = (c_long)(*src).length(); #ifdef OSPL_BOUNDS_CHECK dest0 = (c_ulonglong *)c_newSequence(c_collectionType(type0),length0); { /* Code generated by /home/erle/opensplice/src/tools/idlpp/code/idl_genCorbaCxxCopyin.c at line 1873 */ c_ulonglong *buf0; buf0 = (c_ulonglong *)(*src).get_buffer(); memcpy (dest0,buf0,length0* sizeof(*dest0)); } to->data_ = (c_sequence)dest0; #else dest0 = (c_ulonglong *)c_newSequence(c_collectionType(type0),length0); { /* Code generated by /home/erle/opensplice/src/tools/idlpp/code/idl_genCorbaCxxCopyin.c at line 1873 */ c_ulonglong *buf0; buf0 = (c_ulonglong *)(*src).get_buffer(); memcpy (dest0,buf0,length0* sizeof(*dest0)); } to->data_ = (c_sequence)dest0; #endif } return result; }
c_bool __rcl_interfaces_srv_dds__GetParameterTypes_Response___copyIn( c_base base, struct ::rcl_interfaces::srv::dds_::GetParameterTypes_Response_ *from, struct _rcl_interfaces_srv_dds__GetParameterTypes_Response_ *to) { c_bool result = OS_C_TRUE; (void) base; { /* Code generated by /home/erle/opensplice/src/tools/idlpp/code/idl_genCorbaCxxCopyin.c at line 774 */ static c_type type0 = NULL; c_type subtype0; c_long length0; c_octet *dest0; ::rcl_interfaces::srv::dds_::GetParameterTypes_Response_::_types__seq *src = &from->types_; if (type0 == NULL) { subtype0 = c_type(c_metaResolve (c_metaObject(base), "c_octet")); type0 = c_metaSequenceTypeNew(c_metaObject(base),"C_SEQUENCE<c_octet>",subtype0,0); c_free(subtype0); } length0 = (c_long)(*src).length(); #ifdef OSPL_BOUNDS_CHECK dest0 = (c_octet *)c_newSequence(c_collectionType(type0),length0); { /* Code generated by /home/erle/opensplice/src/tools/idlpp/code/idl_genCorbaCxxCopyin.c at line 1873 */ c_octet *buf0; buf0 = (c_octet *)(*src).get_buffer(); memcpy (dest0,buf0,length0* sizeof(*dest0)); } to->types_ = (c_sequence)dest0; #else dest0 = (c_octet *)c_newSequence(c_collectionType(type0),length0); { /* Code generated by /home/erle/opensplice/src/tools/idlpp/code/idl_genCorbaCxxCopyin.c at line 1873 */ c_octet *buf0; buf0 = (c_octet *)(*src).get_buffer(); memcpy (dest0,buf0,length0* sizeof(*dest0)); } to->types_ = (c_sequence)dest0; #endif } return result; }
void createField( v_entity entity, c_voidp argument ) { c_type type; c_metaObject userData; struct createFieldArg * arg = (struct createFieldArg *)argument; type = c_resolve(c_getBase(entity), arg->typeName); assert(type != NULL); userData = c_metaResolve(c_metaObject(type), arg->fieldName); c_free(type); arg->fieldOffset = c_property(userData)->offset; c_free(userData); }
static void getCopyInfo ( v_entity e, c_voidp argument) { v_topic kt; c_type sampleType; c_property messageAttr; _DataReader dataReader = (_DataReader)argument; sampleType = v_dataReaderSampleType(v_dataReader(e)); kt = v_dataReaderGetTopic(v_dataReader(e)); dataReader->userdataOffset = v_topicDataOffset(kt); c_free(kt); messageAttr = c_property(c_metaResolve(c_metaObject(sampleType),"message")); dataReader->messageOffset = messageAttr->offset; c_free(messageAttr); }
c_unionCase c_unionCaseNew ( c_metaObject scope, const c_char *name, c_type type, c_iter labels) { c_unionCase o; c_ulong nrOfLabels; c_type subType; nrOfLabels = c_iterLength(labels); o = c_unionCase(c_metaDefine(scope,M_UNIONCASE)); subType = c_type(c_metaResolve(scope,"c_literal")); o->labels = c_arrayNew(subType,nrOfLabels); c_free(subType); c_iterArray(labels,o->labels); c_specifier(o)->name = c_stringNew(c__getBase(scope),name); /* Do not keep type as usage expects transferral of refcount. * If changed then odlpp and idlpp must be adapted accordingly. */ c_specifier(o)->type = type; return o; }
c_field c_fieldNew ( c_type type, const c_char *fieldName) { c_array path; c_field field; c_metaObject o; c_long n,length; c_address offset; c_iter nameList, refsList; c_string name; c_base base; if ((fieldName == NULL) || (type == NULL)) { OS_REPORT(OS_ERROR, "c_fieldNew failed",0, "illegal parameter"); return NULL; } base = c__getBase(type); if (base == NULL) { OS_REPORT(OS_ERROR, "c_fieldNew failed",0, "failed to retreive base"); return NULL; } nameList = c_splitString(fieldName,"."); length = c_iterLength(nameList); field = NULL; if (length > 0) { o = NULL; offset = 0; refsList = NULL; path = c_newArray(c_fieldPath_t(base),length); if (path) { for (n=0;n<length;n++) { name = c_iterTakeFirst(nameList); o = c_metaResolve(c_metaObject(type),name); os_free(name); if (o == NULL) { c_iterWalk(nameList,(c_iterWalkAction)os_free,NULL); c_iterFree(nameList); c_iterFree(refsList); c_free(path); return NULL; } path[n] = o; switch (c_baseObject(o)->kind) { case M_ATTRIBUTE: case M_RELATION: type = c_property(o)->type; offset += c_property(o)->offset; break; case M_MEMBER: type = c_specifier(o)->type; offset += c_member(o)->offset; break; default: c_iterWalk(nameList,(c_iterWalkAction)os_free,NULL); c_iterFree(nameList); c_iterFree(refsList); c_free(path); return NULL; } switch (c_baseObject(type)->kind) { case M_INTERFACE: case M_CLASS: case M_COLLECTION: /*Longs are inserted in an iterator? Explanation please...*/ refsList = c_iterInsert(refsList,(c_voidp)offset); offset = 0; break; default: break; } } if (offset > 0) { refsList = c_iterInsert(refsList,(c_voidp)offset); } field = c_new(c_field_t(base)); field->name = c_stringNew(base,fieldName); field->path = path; field->type = c_keep(type); field->kind = c_metaValueKind(o); field->refs = NULL; if (refsList) { length = c_iterLength(refsList); field->offset = 0; if (length > 0) { field->refs = c_newArray(c_fieldRefs_t(base),length); if (field->refs) { for (n=(length-1);n>=0;n--) { field->refs[n] = c_iterTakeFirst(refsList); } } else { OS_REPORT(OS_ERROR, "c_fieldNew failed",0, "failed to allocate field->refs array"); c_free(field); field = NULL; } } c_iterFree(refsList); } else { field->offset = offset; } } else { OS_REPORT(OS_ERROR, "c_fieldNew failed",0, "failed to allocate field->path array"); c_iterWalk(nameList,(c_iterWalkAction)os_free,NULL); c_iterFree(nameList); } c_iterFree(nameList); } else { OS_REPORT_1(OS_ERROR, "c_fieldNew failed",0, "failed to process field name <%s>", fieldName); } return field; }
void idl_registerType ( c_base base, const char *basename, c_iter typeNames ) { sd_serializer metaSer; sd_serializedData serData; char *metaDescription = NULL; char *typeName; c_char *fname; c_metaObject type; int i; fname = os_malloc((size_t)((int)strlen(basename)+20)); snprintf (fname, (size_t)((int)strlen(basename)+20), "%s_register.h", basename); idl_fileSetCur (idl_fileOutNew (fname, "w")); if (idl_fileCur () == NULL) { idl_reportOpenError (fname); } idl_registerHeaderFile (basename); idl_fileOutFree (idl_fileCur()); snprintf (fname, (size_t)((int)strlen(basename)+20), "%s_register.c", basename); idl_fileSetCur (idl_fileOutNew (fname, "w")); if (idl_fileCur () == NULL) { idl_reportOpenError (fname); } idl_registerBodyHeader (basename); for (i = 0; i < c_iterLength(typeNames); i++) { typeName = c_iterObject(typeNames, i); type = c_metaResolve ((c_metaObject)base, (const char *)typeName); if (type) { metaSer = sd_serializerXMLTypeinfoNew (base, TRUE); if (metaSer) { serData = sd_serializerSerialize (metaSer, c_object(type)); if (serData) { metaDescription = sd_serializerToString (metaSer, serData); if (metaDescription) { idl_registerBody (typeName, metaDescription); os_free (metaDescription); } } sd_serializerFree (metaSer); } } else { printf ("Specified type %s not found\n", typeName); } } idl_fileOutPrintf (idl_fileCur(), "\n"); idl_fileOutPrintf (idl_fileCur(), "void\n"); idl_fileOutPrintf (idl_fileCur(), "%s__register_types (c_base base)\n", basename); idl_fileOutPrintf (idl_fileCur(), "{\n"); for (i = 0; i < c_iterLength(typeNames); i++) { typeName = c_iterObject(typeNames, i); idl_fileOutPrintf (idl_fileCur(), " %s__register_type (base);\n", idl_cScopedTypeName(typeName)); } idl_fileOutPrintf (idl_fileCur(), "}\n"); idl_fileOutFree (idl_fileCur()); os_free (fname); }
c_type idl_stacDefConvertStacApprovedMember( c_structure structure, c_type orgMemberType) { c_type dereffedOrgType; c_metaObject o = NULL; c_type newType; os_char buffer[1024]; c_metaObject found; memset(buffer, 0, 1024); dereffedOrgType = c_typeActualType(c_type(idl_stacDefResolveTypeDef(c_baseObject(orgMemberType)))); if(c_baseObject(dereffedOrgType)->kind == M_COLLECTION) { o = c_metaObject(c_metaDefine(c_metaObject(structure), M_COLLECTION)); /* Can be a string or an array or a sequence */ if(c_collectionType(dereffedOrgType)->kind == OSPL_C_STRING) { if((c_collectionType(dereffedOrgType)->maxSize != 0)) { c_collectionType(o)->kind = OSPL_C_ARRAY; c_collectionType(o)->subType = c_type(c_metaResolve(c_metaObject(structure), "c_char")); /* increase maxSize with 1 to accomodate the '\0' char found in strings */ c_collectionType(o)->maxSize = c_collectionType(dereffedOrgType)->maxSize + 1; os_sprintf( buffer, "C_ARRAY<%s,%d>", c_metaObject(c_collectionType(o)->subType)->name, c_collectionType(o)->maxSize/*use maxSize of new c_type, must be the same*/); } else { printf("FATAL ERROR | #pragma stac: Trying to apply stac algorithm to listed members of struct %s, but " "encountered an internal error. The conversion algorithm (idl_stacDefConvertStacApprovedMember) " "has become out of synch with the verification algorithm (idl_stacDefCanStacBeAppliedToMember).\n", c_metaScopedName(c_metaObject(structure))); assert(0); exit(-2); } } else if(c_collectionType(dereffedOrgType)->kind == OSPL_C_ARRAY) { c_collectionType(o)->kind = OSPL_C_ARRAY; /* increase maxSize with 1 to accomodate the '\0' char found in strings */ c_collectionType(o)->maxSize = c_collectionType(dereffedOrgType)->maxSize; c_collectionType(o)->subType = idl_stacDefConvertStacApprovedMember(structure, c_collectionType(dereffedOrgType)->subType); os_sprintf( buffer, "C_ARRAY<%s,%d>", c_metaObject(c_collectionType(o)->subType)->name, c_collectionType(o)->maxSize/*use maxSize of new c_type, must be the same*/); } else if(c_collectionType(dereffedOrgType)->kind == OSPL_C_SEQUENCE) { c_collectionType(o)->kind = OSPL_C_SEQUENCE; /* increase maxSize with 1 to accomodate the '\0' char found in strings */ c_collectionType(o)->maxSize = c_collectionType(dereffedOrgType)->maxSize; c_collectionType(o)->subType = idl_stacDefConvertStacApprovedMember(structure, c_collectionType(dereffedOrgType)->subType); os_sprintf( buffer, "C_SEQUENCE<%s,%d>", c_metaObject(c_collectionType(o)->subType)->name, c_collectionType(o)->maxSize/*use maxSize of new c_type, must be the same*/); } else { printf("FATAL ERROR | #pragma stac: Trying to apply stac algorithm to listed members of struct %s, but " "encountered an internal error. The conversion algorithm (idl_stacDefConvertStacApprovedMember) " "has become out of synch with the verification algorithm (idl_stacDefCanStacBeAppliedToMember).\n", c_metaScopedName(c_metaObject(structure))); assert(0); exit(-2); } } else { printf("FATAL ERROR | #pragma stac: Trying to apply stac algorithm to listed members of struct %s, but " "encountered an internal error. The conversion algorithm (idl_stacDefConvertStacApprovedMember) " "has become out of synch with the verification algorithm (idl_stacDefCanStacBeAppliedToMember).\n", c_metaScopedName(c_metaObject(structure))); assert(0); exit(-2); } if(o) { c_metaObject(o)->definedIn = c_metaObject(structure); c_metaFinalize(o); found = c_metaBind(c_metaObject(structure), &buffer[0], o); c_free(o); newType = c_type(found); } else { printf("FATAL ERROR | #pragma stac: Trying to apply stac algorithm to listed members of struct %s, but " "encountered an internal error. The conversion algorithm (idl_stacDefConvertStacApprovedMember) " "has become out of synch with the verification algorithm (idl_stacDefCanStacBeAppliedToMember).\n", c_metaScopedName(c_metaObject(structure))); assert(0); exit(-2); } return newType; }
void v_indexInit( v_index index, c_type instanceType, c_array keyList, v_reader reader) { c_property keyProperty; c_structure keyStructure; c_char fieldName[16]; c_char *keyExpr; c_size i,nrOfKeys,totalSize; assert(index != NULL); assert(C_TYPECHECK(index,v_index)); assert(C_TYPECHECK(instanceType,c_type)); keyProperty = c_property(c_metaResolve(c_metaObject(instanceType),"key")); if (keyProperty) { keyStructure = c_structure(keyProperty->type); nrOfKeys = c_arraySize(keyStructure->members); c_free(keyProperty); } else { nrOfKeys = 0; } if (nrOfKeys>0) { totalSize = nrOfKeys * strlen("key.field0,"); if (nrOfKeys > 9) { /* For each key number greater than one digit * i.e. number of keys > 9 add one additional * character space to the total size. */ totalSize += (nrOfKeys-9); if (nrOfKeys > 99) { /* For each key number greater than two digits * i.e. number of keys > 99 add one additional * character space to the total size. */ totalSize += (nrOfKeys-99); } } keyExpr = (char *)os_alloca(totalSize); keyExpr[0] = 0; for (i=0;i<nrOfKeys;i++) { os_sprintf(fieldName,"key.field%d",i); os_strcat(keyExpr,fieldName); if (i<(nrOfKeys-1)) { os_strcat(keyExpr,","); } } } else { keyExpr = NULL; } index->reader = reader; index->sourceKeyList = createKeyList(instanceType, keyList); index->messageKeyList = c_keep(keyList); /* keyList is either topic->messageKeyList or a user-defined keylist */ index->objects = c_tableNew(instanceType,keyExpr); index->notEmptyList = c_tableNew(instanceType,keyExpr); if(keyExpr){ os_freea(keyExpr); } index->objectType = c_keep(instanceType); }
c_bool __sensor_msgs_msg_dds__CameraInfo___copyIn( c_base base, struct ::sensor_msgs::msg::dds_::CameraInfo_ *from, struct _sensor_msgs_msg_dds__CameraInfo_ *to) { c_bool result = OS_C_TRUE; (void) base; if(result){ extern c_bool __std_msgs_msg_dds__Header___copyIn(c_base, ::std_msgs::msg::dds_::Header_ *, _std_msgs_msg_dds__Header_ *); result = __std_msgs_msg_dds__Header___copyIn(base, &from->header_, &to->header_); } to->height_ = (c_ulong)from->height_; to->width_ = (c_ulong)from->width_; #ifdef OSPL_BOUNDS_CHECK if(from->distortion_model_){ to->distortion_model_ = c_stringNew(base, from->distortion_model_); } else { OS_REPORT (OS_ERROR, "copyIn", 0,"Member 'sensor_msgs::msg::dds_::CameraInfo_.distortion_model_' of type 'c_string' is NULL."); result = OS_C_FALSE; } #else to->distortion_model_ = c_stringNew(base, from->distortion_model_); #endif { /* Code generated by /home/erle/opensplice/src/tools/idlpp/code/idl_genCorbaCxxCopyin.c at line 774 */ static c_type type0 = NULL; c_type subtype0; c_long length0; c_double *dest0; ::sensor_msgs::msg::dds_::CameraInfo_::_d__seq *src = &from->d_; if (type0 == NULL) { subtype0 = c_type(c_metaResolve (c_metaObject(base), "c_double")); type0 = c_metaSequenceTypeNew(c_metaObject(base),"C_SEQUENCE<c_double>",subtype0,0); c_free(subtype0); } length0 = (c_long)(*src).length(); #ifdef OSPL_BOUNDS_CHECK dest0 = (c_double *)c_newSequence(c_collectionType(type0),length0); { /* Code generated by /home/erle/opensplice/src/tools/idlpp/code/idl_genCorbaCxxCopyin.c at line 1873 */ c_double *buf0; buf0 = (c_double *)(*src).get_buffer(); memcpy (dest0,buf0,length0* sizeof(*dest0)); } to->d_ = (c_sequence)dest0; #else dest0 = (c_double *)c_newSequence(c_collectionType(type0),length0); { /* Code generated by /home/erle/opensplice/src/tools/idlpp/code/idl_genCorbaCxxCopyin.c at line 1873 */ c_double *buf0; buf0 = (c_double *)(*src).get_buffer(); memcpy (dest0,buf0,length0* sizeof(*dest0)); } to->d_ = (c_sequence)dest0; #endif } if(result){ extern c_bool __sensor_msgs_msg_dds__sensor_msgs__CameraInfo__double_array_9__copyIn(c_base, ::sensor_msgs::msg::dds_::sensor_msgs__CameraInfo__double_array_9 *, _sensor_msgs_msg_dds__sensor_msgs__CameraInfo__double_array_9 *); result = __sensor_msgs_msg_dds__sensor_msgs__CameraInfo__double_array_9__copyIn(base, &from->k_, &to->k_); } if(result){ extern c_bool __sensor_msgs_msg_dds__sensor_msgs__CameraInfo__double_array_9__copyIn(c_base, ::sensor_msgs::msg::dds_::sensor_msgs__CameraInfo__double_array_9 *, _sensor_msgs_msg_dds__sensor_msgs__CameraInfo__double_array_9 *); result = __sensor_msgs_msg_dds__sensor_msgs__CameraInfo__double_array_9__copyIn(base, &from->r_, &to->r_); } if(result){ extern c_bool __sensor_msgs_msg_dds__sensor_msgs__CameraInfo__double_array_12__copyIn(c_base, ::sensor_msgs::msg::dds_::sensor_msgs__CameraInfo__double_array_12 *, _sensor_msgs_msg_dds__sensor_msgs__CameraInfo__double_array_12 *); result = __sensor_msgs_msg_dds__sensor_msgs__CameraInfo__double_array_12__copyIn(base, &from->p_, &to->p_); } to->binning_x_ = (c_ulong)from->binning_x_; to->binning_y_ = (c_ulong)from->binning_y_; if(result){ extern c_bool __sensor_msgs_msg_dds__RegionOfInterest___copyIn(c_base, ::sensor_msgs::msg::dds_::RegionOfInterest_ *, _sensor_msgs_msg_dds__RegionOfInterest_ *); result = __sensor_msgs_msg_dds__RegionOfInterest___copyIn(base, &from->roi_, &to->roi_); } return result; }
struct v_messageExtCdrInfo * v_messageExtCdrInfoNew( c_type topicMessageType, const struct sd_cdrControl *control) { static const char headerTypeName[] = "kernelModule::v_messageExt"; c_base base = c_getBase (topicMessageType); c_property userDataProperty = c_property(c_metaResolve(c_metaObject(topicMessageType),"userData")); c_type topicDataType = userDataProperty->type; c_type headerClass = c_resolve (base, headerTypeName); c_type dataClass; c_type type; c_object o; c_array members; struct v_messageExtCdrInfo *xci; struct c_type_s const *tstk[2]; c_free(userDataProperty); /* Wrap user data in a class, so that we can make a struct with a pointer to it */ dataClass = c_type(c_metaDefine(c_metaObject(base), M_CLASS)); c_class(dataClass)->extends = NULL; o = c_metaDeclare(c_metaObject(dataClass), "userData", M_ATTRIBUTE); c_property(o)->type = c_keep(topicDataType); c_metaObject(dataClass)->definedIn = c_keep(base); c_metaFinalize(c_metaObject(dataClass)); c_free(o); /* Make a struct containing two pointers, one to the v_messageExt class, and one to the just-created anonymous dataClass type, corresponding to struct v_messageExtCdrTmp */ type = c_type(c_metaDefine(c_metaObject(base),M_STRUCTURE)); members = c_arrayNew(c_member_t(base),2); members[0] = (c_voidp)c_metaDefine(c_metaObject(base),M_MEMBER); c_specifier(members[0])->name = c_stringNew(base,"h"); c_specifier(members[0])->type = c_keep(headerClass); members[1] = (c_voidp)c_metaDefine(c_metaObject(base),M_MEMBER); c_specifier(members[1])->name = c_stringNew(base,"d"); c_specifier(members[1])->type = c_keep(dataClass); c_structure(type)->members = members; c_metaObject(type)->definedIn = c_keep(base); c_metaFinalize(c_metaObject(type)); c_free(dataClass); c_free(headerClass); xci = os_malloc(sizeof(*xci)); xci->ci = sd_cdrInfoNewControl(type, control); /* Note: current simplistic annotation processing requires the annotations to be made in the order in which they are encountered when walking the type */ tstk[0] = type; tstk[1] = headerClass; if (sd_cdrNoteQuietRef(xci->ci, 2, tstk) < 0) { goto err_note; } tstk[1] = dataClass; if (sd_cdrNoteQuietRef(xci->ci, 2, tstk) < 0) { goto err_note; } if (sd_cdrCompile(xci->ci) < 0) { goto err_compile; } xci->vmsgType = c_keep(topicMessageType); c_free(type); return xci; err_compile: err_note: os_free(xci); c_free(type); return NULL; }