/* @brief generate dimension of an array slice * * arraySliceDimensions is a local support function to generate * the array dimensions of an array slice * * @param typeArray Specifies the type of the array */ static void idl_arraySliceDimensions( idl_typeArray typeArray) { idl_fileOutPrintf(idl_fileCur(), "[%d]", idl_typeArraySize(typeArray)); if (idl_typeSpecType(idl_typeArrayType(typeArray)) == idl_tarray && idl_typeSpecType(idl_typeArrayType(idl_typeArray(idl_typeArrayType(typeArray)))) == idl_tarray) { idl_arraySliceDimensions(idl_typeArray(idl_typeArrayType(typeArray))); } }
static c_ulong idl_genArrayTotalDimension( idl_typeArray typeArray) { c_ulong result = 0; idl_typeSpec ptr; result = (c_ulong)idl_typeArraySize(typeArray); ptr = idl_typeArrayType(typeArray); while (idl_typeSpecType(ptr) == idl_tarray) { result = result * (c_ulong)idl_typeArraySize(idl_typeArray(ptr)); ptr = idl_typeArrayType(idl_typeArray(ptr)); } return result; }
/* @brief function to find out whether the elements of an array * require initialization. * * idl_arrayElementsNeedInitialization is a local support function to find out * whether the specified array is of a type for which all elements need to be * initialized individually. If the array is of a primitive type, this is never * necessary, but if the array contains a reference type and no underlying * sequences (which will be initialized to 0 elements) then for loops will * need to be created to explicitly initialize all of these attributes. * * @param typeSpec Specifies the attribute type that needs to be investigated. */ static int idl_arrayElementsNeedInitialization( idl_typeArray typeArray) { int initRequired = FALSE; /* Obtain the type of the array. */ idl_typeSpec typeSpec = idl_typeArrayType(typeArray); /* Resolve potential typedefs. */ while (idl_typeSpecType(typeSpec) == idl_ttypedef) { typeSpec = idl_typeDefRefered(idl_typeDef(typeSpec)); } if (idl_typeSpecType(typeSpec) == idl_tarray) { initRequired = idl_arrayElementsNeedInitialization(idl_typeArray(typeSpec)); } else if ( idl_typeSpecType(typeSpec) == idl_tstruct || idl_typeSpecType(typeSpec) == idl_tunion || idl_typeSpecType(typeSpec) == idl_tenum || ( idl_typeSpecType(typeSpec) == idl_tbasic && idl_typeBasicType(idl_typeBasic (typeSpec)) == idl_string) ) { initRequired = TRUE; } return initRequired; }
/* @brief generate dimension of an array or a sequence * * java_arrayDimensions is a local support function to generate * the dimensions of a java Array representing an IDL sequence or * array. Since Sequences will always be initialized to 0 elements, * its dimensions will always be assigned 0. Arrays will be assigned * their IDL dimensions. * * @param typeSeq Specifies the type of the sequence */ static void java_arrayDimensions( idl_typeSpec typeSpec) { while (idl_typeSpecType(typeSpec) == idl_ttypedef) { typeSpec = idl_typeDefRefered(idl_typeDef(typeSpec)); } if (idl_typeSpecType(typeSpec) == idl_tarray) { idl_typeArray typeArray = idl_typeArray(typeSpec); idl_fileOutPrintf (idl_fileCur(), "[%d]", idl_typeArraySize(typeArray)); java_arrayDimensions(idl_typeArrayType(typeArray)); } else if (idl_typeSpecType(typeSpec) == idl_tseq) { idl_fileOutPrintf(idl_fileCur(), "[0]"); java_arrayDimensions(idl_typeSeqType(idl_typeSeq(typeSpec))); } }
/* @brief generate dimension of an array * * arrayDimensions is a local support function to generate * the array dimensions of an array * * @param typeArray Specifies the type of the array */ static void idl_arrayDimensions ( idl_typeArray typeArray, os_boolean resolveTypedefs) { idl_typeSpec subType; idl_fileOutPrintf(idl_fileCur(), "[%d]", idl_typeArraySize(typeArray)); subType = idl_typeArrayType(typeArray); while(resolveTypedefs && idl_typeSpecType(subType) == idl_ttypedef) { subType = idl_typeDefResolveFully(subType); } if (idl_typeSpecType(subType) == idl_tarray) { idl_arrayDimensions (idl_typeArray(subType), resolveTypedefs); } }
c_char * idl_arrayJavaIndexString ( idl_typeArray typeArray) { c_char *arrayString; os_size_t arrayStringLen; c_char *arrayStringPrev; if (idl_typeSpecType(idl_typeArrayType(typeArray)) == idl_tarray) { arrayStringPrev = idl_arrayJavaIndexString(idl_typeArray(idl_typeArrayType(typeArray))); arrayStringLen = strlen(arrayStringPrev) + 3; arrayString = os_malloc(arrayStringLen); snprintf(arrayString, arrayStringLen, "[]%s", arrayStringPrev); } else if (idl_typeSpecType(idl_typeArrayType(typeArray)) == idl_tseq) { arrayStringPrev = idl_sequenceIndexString(idl_typeSeq(idl_typeArrayType (typeArray))); arrayStringLen = strlen(arrayStringPrev) + 3; arrayString = os_malloc(arrayStringLen); snprintf(arrayString, arrayStringLen, "[]%s", arrayStringPrev); } else if (idl_typeSpecType(idl_typeArrayType(typeArray)) == idl_ttypedef && idl_typeSpecType(idl_typeDefActual(idl_typeDef(idl_typeArrayType(typeArray)))) == idl_tarray) { arrayStringPrev = idl_arrayJavaIndexString(idl_typeArray(idl_typeDefActual(idl_typeDef(idl_typeArrayType(typeArray))))); arrayStringLen = strlen(arrayStringPrev) + 3; arrayString = os_malloc(arrayStringLen); snprintf(arrayString, arrayStringLen, "[]%s", arrayStringPrev); } else if (idl_typeSpecType(idl_typeArrayType(typeArray)) == idl_ttypedef && idl_typeSpecType(idl_typeDefActual(idl_typeDef(idl_typeArrayType(typeArray)))) == idl_tseq) { arrayStringPrev = idl_sequenceIndexString(idl_typeSeq(idl_typeDefActual(idl_typeDef(idl_typeArrayType(typeArray))))); arrayStringLen = strlen(arrayStringPrev) + 3; arrayString = os_malloc(arrayStringLen); snprintf(arrayString, arrayStringLen, "[]%s", arrayStringPrev); } else { arrayString = os_malloc(3); snprintf(arrayString, 3, "[]"); } return arrayString; }
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 generate initialization of array elements. * * idl_arrayElementInit generates for-loops that initialize * each attribute of an array explicitly. * * @param typeArray Specifies the type of the array */ static void idl_arrayElementInit( idl_typeSpec typeSpec, const char *elementName, int dimCount, int indent) { while (idl_typeSpecType(typeSpec) == idl_ttypedef) { typeSpec = idl_typeDefRefered(idl_typeDef(typeSpec)); } if (idl_typeSpecType(typeSpec) == idl_tarray) { idl_fileOutPrintf( idl_fileCur(), "%*sfor(int i%d = 0; i%d < %d; i%d++) {\n", indent, "", dimCount, dimCount, idl_typeArraySize(idl_typeArray(typeSpec)), dimCount); idl_arrayElementInit( idl_typeArrayType(idl_typeArray(typeSpec)), elementName, dimCount + 1, indent + 4); idl_fileOutPrintf( idl_fileCur(), "%*s}\n", indent, ""); } else { int j; idl_fileOutPrintf( idl_fileCur(), "%*s%s", indent, "", elementName); for (j = 1; j < dimCount; j++) { idl_fileOutPrintf(idl_fileCur(), "[i%d]", j); } if ( idl_typeSpecType(typeSpec) == idl_tbasic && idl_typeBasicType(idl_typeBasic(typeSpec)) == idl_string) { idl_fileOutPrintf( idl_fileCur(), " = \"\";\n"); } else if ( idl_typeSpecType(typeSpec) == idl_tunion || idl_typeSpecType(typeSpec) == idl_tstruct ) { idl_fileOutPrintf( idl_fileCur(), " = new %s();\n", idl_corbaJavaTypeFromTypeSpec(typeSpec)); } else if (idl_typeSpecType(typeSpec) == idl_tenum) { idl_fileOutPrintf( idl_fileCur(), " = %s.from_int(0);\n", idl_corbaJavaTypeFromTypeSpec(typeSpec)); } } }