Пример #1
0
/**
 * 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;
}
Пример #2
0
/* 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;
}
Пример #3
0
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");
}
Пример #4
0
/** @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);
}