/** * Not yet required * @return idl_explore - Apparently this means process the rest of the file. */ static idl_action idl_structureOpen( idl_scope scope, const char *name, idl_typeStruct structSpec, void *userData) { char* sampleType; (void) scope; (void) userData; if (idl_keyResolve(idl_keyDefDefGet(), idl_typeUserScope(idl_typeUser(structSpec)), name) != NULL) { sampleType = idl_corbaCxxTypeFromTypeSpec(idl_typeSpec(structSpec)); idl_fileOutPrintf(idl_fileCur(), "REGISTER_TOPIC_TRAITS(%s)\n", sampleType); /* Remove "StreamSample" for REGISTER_STREAM_TOPIC_TRAITS */ if(strlen(name) > 12 && strcmp(name+strlen(name)-12, "StreamSample")==0) { sampleType[strlen(sampleType)-12] = '\0'; idl_fileOutPrintf(idl_fileCur(), "REGISTER_STREAM_TOPIC_TRAITS(%s)\n", sampleType); } os_free(sampleType); } return idl_explore; }
/* Return the Language specific type identifier for the specified type specification */ c_char * idl_corbaLanguageTypeFromTypeSpec ( idl_typeSpec typeSpec) { c_char *id = NULL; switch (lang) { case IDL_LANG_C: id = idl_corbaCTypeFromTypeSpec (typeSpec); break; case IDL_LANG_CXX: id = idl_corbaCxxTypeFromTypeSpec (typeSpec); break; case IDL_LANG_JAVA: id = idl_corbaJavaTypeFromTypeSpec (typeSpec); break; case IDL_LANG_UNKNOWN: default: break; } return id; }
static void idl_arrayTypeImpl( idl_typeArray typeArray, const char *name, struct idl_genSACPPData *arg) { idl_typeSpec actualType; idl_typeSpec subType; c_ulong totalDim; actualType = idl_typeArrayActual(typeArray); subType = idl_typeArrayType(typeArray); /* determine total buffer len, by multiplying all dimensions */ totalDim = idl_genArrayTotalDimension(typeArray); idl_printIndent(arg->indent_level); idl_fileOutPrintf(idl_fileCur(),"template <>\n"); idl_printIndent(arg->indent_level); idl_fileOutPrintf(idl_fileCur(),"%s_slice *DDS_DCPS_ArrayHelper<%s, %s_slice, %s_uniq_>::alloc()\n", name, name, name, name); idl_printIndent(arg->indent_level); idl_fileOutPrintf(idl_fileCur(),"{\n"); idl_printIndent(arg->indent_level+1); idl_fileOutPrintf(idl_fileCur(),"return %s_alloc();\n", name); idl_printIndent(arg->indent_level); idl_fileOutPrintf(idl_fileCur(),"}\n\n"); idl_printIndent(arg->indent_level); idl_fileOutPrintf(idl_fileCur(),"template <>\n"); idl_printIndent(arg->indent_level); idl_fileOutPrintf(idl_fileCur(),"void DDS_DCPS_ArrayHelper<%s, %s_slice, %s_uniq_>::copy(%s_slice *to, const %s_slice *from)\n", name, name, name, name, name); idl_printIndent(arg->indent_level); idl_fileOutPrintf(idl_fileCur(),"{\n"); idl_printIndent(arg->indent_level+1); idl_fileOutPrintf(idl_fileCur(),"%s_copy(to, from);\n", name); idl_printIndent(arg->indent_level); idl_fileOutPrintf(idl_fileCur(),"}\n\n"); idl_printIndent(arg->indent_level); idl_fileOutPrintf(idl_fileCur(),"template <>\n"); idl_printIndent(arg->indent_level); idl_fileOutPrintf(idl_fileCur(),"void DDS_DCPS_ArrayHelper<%s, %s_slice, %s_uniq_>::free(%s_slice *ptr)\n", name, name, name, name); idl_printIndent(arg->indent_level); idl_fileOutPrintf(idl_fileCur(),"{\n"); idl_printIndent(arg->indent_level+1); idl_fileOutPrintf(idl_fileCur(),"%s_free(ptr);\n", name); idl_printIndent(arg->indent_level); idl_fileOutPrintf(idl_fileCur(),"}\n\n"); /* Generate implementation _alloc() method */ idl_printIndent(arg->indent_level); idl_fileOutPrintf(idl_fileCur(),"%s_slice *%s_alloc()\n", name, name); idl_printIndent(arg->indent_level); idl_fileOutPrintf(idl_fileCur(),"{\n"); arg->indent_level++; if ((idl_typeSpecType(actualType) == idl_tbasic) && (idl_typeBasicType(idl_typeBasic(actualType)) == idl_string)) { idl_printIndent(arg->indent_level); idl_fileOutPrintf(idl_fileCur(),"::DDS::String_mgr *ret = (::DDS::String_mgr *) new ::DDS::String_mgr[%d];\n",totalDim); idl_printIndent(arg->indent_level); idl_fileOutPrintf(idl_fileCur(),"for (::DDS::ULong i = 0; i < %d; i++) {\n", totalDim); idl_printIndent(arg->indent_level+1); idl_fileOutPrintf(idl_fileCur(),"ret[i] = (::DDS::String)NULL;\n"); idl_printIndent(arg->indent_level); idl_fileOutPrintf(idl_fileCur(),"}\n"); idl_printIndent(arg->indent_level); idl_fileOutPrintf(idl_fileCur(),"return (%s_slice *)ret;\n"); } else { if (idl_typeSpecType(actualType) == idl_tseq) { /* \TODO */ } else { idl_printIndent(arg->indent_level); idl_fileOutPrintf(idl_fileCur(),"%s *ret = (%s *) new %s[%d];\n", idl_corbaCxxTypeFromTypeSpec(actualType), idl_corbaCxxTypeFromTypeSpec(actualType), idl_corbaCxxTypeFromTypeSpec(actualType), totalDim); idl_printIndent(arg->indent_level); idl_fileOutPrintf(idl_fileCur(),"return (%s_slice *)ret;\n", name); } } arg->indent_level--; idl_printIndent(arg->indent_level); idl_fileOutPrintf(idl_fileCur(),"}\n\n"); /* Generate implementation _free() method: * Implementation is independent of the actual type. */ idl_printIndent(arg->indent_level); idl_fileOutPrintf(idl_fileCur(),"void %s_free(%s_slice *s)\n", name, name); idl_printIndent(arg->indent_level); idl_fileOutPrintf(idl_fileCur(),"{\n"); arg->indent_level++; if ((idl_typeSpecType(actualType) == idl_tbasic) && (idl_typeBasicType(idl_typeBasic(actualType)) == idl_string)) { idl_printIndent(arg->indent_level); idl_fileOutPrintf(idl_fileCur(),"if (s) {\n"); arg->indent_level++; idl_printIndent(arg->indent_level); idl_fileOutPrintf(idl_fileCur(),"::DDS::String_mgr *base = (::DDS::String_mgr *)s;\n"); idl_printIndent(arg->indent_level); idl_fileOutPrintf(idl_fileCur(),"for (::DDS::ULong i = 0; i < %d; i++) {\n", totalDim); idl_printIndent(arg->indent_level+1); idl_fileOutPrintf(idl_fileCur(),"base[i] = (::DDS::String)NULL;\n"); idl_printIndent(arg->indent_level); idl_fileOutPrintf(idl_fileCur(),"}\n"); arg->indent_level--; idl_printIndent(arg->indent_level); idl_fileOutPrintf(idl_fileCur(),"}\n"); idl_printIndent(arg->indent_level); idl_fileOutPrintf(idl_fileCur(),"delete [] s;\n"); } else { if (idl_typeSpecType(actualType) == idl_tseq) { /* \TODO */ } else { idl_printIndent(arg->indent_level); idl_fileOutPrintf(idl_fileCur(),"delete [] s;\n"); } } arg->indent_level--; idl_printIndent(arg->indent_level); idl_fileOutPrintf(idl_fileCur(),"}\n\n"); /* Generate implementation _copy() method */ idl_printIndent(arg->indent_level); idl_fileOutPrintf(idl_fileCur(),"void %s_copy(%s_slice *to, const %s_slice *from)\n", name, name, name); idl_printIndent(arg->indent_level); idl_fileOutPrintf(idl_fileCur(),"{\n"); arg->indent_level++; if ((idl_typeSpecType(actualType) == idl_tbasic) && (idl_typeBasicType(idl_typeBasic(actualType)) == idl_string)) { idl_printIndent(arg->indent_level); idl_fileOutPrintf(idl_fileCur(),"::DDS::String_mgr *sv = (::DDS::String_mgr *)from;\n"); idl_printIndent(arg->indent_level); idl_fileOutPrintf(idl_fileCur(),"::DDS::String_mgr *tv = (::DDS::String_mgr *)to;\n"); idl_printIndent(arg->indent_level); idl_fileOutPrintf(idl_fileCur(),"for (::DDS::ULong i = 0; i < %d; i++) {\n", totalDim); idl_printIndent(arg->indent_level+1); idl_fileOutPrintf(idl_fileCur(),"tv[i] = ::DDS::string_dup (sv[i]);\n"); idl_printIndent(arg->indent_level); idl_fileOutPrintf(idl_fileCur(),"}\n"); } else { if (idl_typeSpecType(actualType) == idl_tseq) { /* \TODO */ } else { idl_printIndent(arg->indent_level); idl_fileOutPrintf(idl_fileCur(),"%s *sv = (%s *)from;\n", idl_corbaCxxTypeFromTypeSpec(actualType), idl_corbaCxxTypeFromTypeSpec(actualType)); idl_printIndent(arg->indent_level); idl_fileOutPrintf(idl_fileCur(),"%s *tv = (%s *)to;\n", idl_corbaCxxTypeFromTypeSpec(actualType), idl_corbaCxxTypeFromTypeSpec(actualType)); idl_printIndent(arg->indent_level); idl_fileOutPrintf(idl_fileCur(),"for (::DDS::ULong i = 0; i < %d; i++) {\n", totalDim); idl_printIndent(arg->indent_level+1); idl_fileOutPrintf(idl_fileCur(),"tv[i] = sv[i];\n"); idl_printIndent(arg->indent_level); idl_fileOutPrintf(idl_fileCur(),"}\n"); } } arg->indent_level--; idl_printIndent(arg->indent_level); idl_fileOutPrintf(idl_fileCur(),"}\n\n"); /* Generate implementation _dup() method */ idl_printIndent(arg->indent_level); idl_fileOutPrintf(idl_fileCur(),"%s_slice *%s_dup(const %s_slice *from)\n", name, name, name); idl_printIndent(arg->indent_level); idl_fileOutPrintf(idl_fileCur(),"{\n"); arg->indent_level++; idl_printIndent(arg->indent_level); idl_fileOutPrintf(idl_fileCur(),"%s_slice *to = %s_alloc();\n", name, name); idl_printIndent(arg->indent_level); idl_fileOutPrintf(idl_fileCur(),"%s_copy(to, from);\n", name); idl_printIndent(arg->indent_level); idl_fileOutPrintf(idl_fileCur(),"return to;\n"); arg->indent_level--; idl_fileOutPrintf(idl_fileCur(),"}\n\n"); }
/** @brief callback function called on definition of a named type in the IDL input file. * * Generate code for the following IDL construct: * @verbatim => typedef <type-name> <name>; @endverbatim * * @param scope Current scope * @param name Specifies the name of the type * @param defSpec Specifies the type of the named type */ static void idl_typedefOpenClose( idl_scope scope, const char *name, idl_typeDef defSpec, void *userData) { struct idl_genSACPPData *arg = (struct idl_genSACPPData *)userData; idl_typeSpec actualType; idl_typeSpec refType; const char *refName; char *scopedName; actualType = idl_typeDefActual(defSpec); refType = idl_typeDefRefered(defSpec); refName = idl_typeSpecName(refType); scopedName = idl_corbaCxxTypeFromTypeSpec(idl_typeSpec(defSpec)); if (idl_typeSpecType(refType) == idl_tarray) { /* ex. typedef long myArr[22]; */ idl_arrayTypeImpl(idl_typeArray(refType), scopedName, arg); } else { if (idl_typeSpecType(actualType) == idl_tarray) { /* Generate implementation _alloc() method */ idl_printIndent(arg->indent_level); idl_fileOutPrintf(idl_fileCur(),"%s_slice *%s_alloc()\n", scopedName, scopedName); idl_printIndent(arg->indent_level); idl_fileOutPrintf(idl_fileCur(),"{\n"); idl_printIndent(arg->indent_level+1); idl_fileOutPrintf(idl_fileCur(),"return (%s_slice *)%s_alloc();\n", scopedName, refName); idl_printIndent(arg->indent_level+1); idl_fileOutPrintf(idl_fileCur(),"}\n\n"); /* Generate implementation _free() method: * Implementation is independent of the actual type. */ idl_printIndent(arg->indent_level); idl_fileOutPrintf(idl_fileCur(),"void %s_free(%s_slice *s)\n", scopedName, scopedName); idl_printIndent(arg->indent_level); idl_fileOutPrintf(idl_fileCur(),"{\n"); idl_printIndent(arg->indent_level+1); idl_fileOutPrintf(idl_fileCur(),"%s_free(s);\n", refName); idl_printIndent(arg->indent_level); idl_fileOutPrintf(idl_fileCur(),"}\n\n"); /* Generate implementation _copy() method */ idl_printIndent(arg->indent_level); idl_fileOutPrintf(idl_fileCur(),"void *%s_copy(%s_slice *to, const %s_slice *from)\n", scopedName, scopedName, scopedName); idl_printIndent(arg->indent_level); idl_fileOutPrintf(idl_fileCur(),"{\n"); idl_printIndent(arg->indent_level+1); idl_fileOutPrintf(idl_fileCur(),"%s_copy(to, from);\n", refName); idl_printIndent(arg->indent_level); idl_fileOutPrintf(idl_fileCur(),"}\n\n"); /* Generate implementation _dup() method */ idl_printIndent(arg->indent_level); idl_fileOutPrintf(idl_fileCur(),"%s_slice *%s_dup(const %s_slice *from)\n", scopedName, scopedName); idl_printIndent(arg->indent_level); idl_fileOutPrintf(idl_fileCur(),"{\n"); arg->indent_level++; idl_printIndent(arg->indent_level); idl_fileOutPrintf(idl_fileCur(),"%s_slice *to = %s_alloc();\n", scopedName, scopedName); idl_printIndent(arg->indent_level); idl_fileOutPrintf(idl_fileCur(),"%s_copy(to, from);\n", refName); idl_printIndent(arg->indent_level); idl_fileOutPrintf(idl_fileCur(),"return to;\n"); arg->indent_level--; idl_fileOutPrintf(idl_fileCur(),"}\n\n"); } } os_free(scopedName); }