diff options
Diffstat (limited to 'codemaker/source/cppumaker/cppumaker.cxx')
-rw-r--r-- | codemaker/source/cppumaker/cppumaker.cxx | 254 |
1 files changed, 60 insertions, 194 deletions
diff --git a/codemaker/source/cppumaker/cppumaker.cxx b/codemaker/source/cppumaker/cppumaker.cxx index 1f63ef26b5b2..8869e87df4d6 100644 --- a/codemaker/source/cppumaker/cppumaker.cxx +++ b/codemaker/source/cppumaker/cppumaker.cxx @@ -17,221 +17,87 @@ * the License at http://www.apache.org/licenses/LICENSE-2.0 . */ +#include "sal/config.h" -#include <stdio.h> +#include <cstdlib> +#include <cstring> +#include <iostream> +#include <vector> +#include "codemaker/generatedtypeset.hxx" +#include "codemaker/typemanager.hxx" #include "rtl/ref.hxx" +#include "rtl/string.hxx" +#include "rtl/ustring.hxx" #include "sal/main.h" - -#include "codemaker/typemanager.hxx" -#include "codemaker/generatedtypeset.hxx" +#include "sal/types.h" +#include "unoidl/unoidl.hxx" #include "cppuoptions.hxx" #include "cpputype.hxx" - -namespace { - -void failed(OString const & typeName, CppuOptions * options) { - fprintf(stderr, "%s ERROR: %s\n", options->getProgramName().getStr(), - OString("cannot dump Type '" + typeName + "'").getStr()); - exit(99); -} - -void produce( - RegistryKey& rTypeKey, bool bIsExtraType, - rtl::Reference< TypeManager > const & typeMgr, - codemaker::GeneratedTypeSet & generated, CppuOptions * options) -{ - if (!produceType(rTypeKey, bIsExtraType, typeMgr, generated, options)) { - OString typeName = typeMgr->getTypeName(rTypeKey); - failed(typeName, options); - } -} - -void produce( - OString const & typeName, - rtl::Reference< TypeManager > const & typeMgr, - codemaker::GeneratedTypeSet & generated, CppuOptions * options) -{ - if (!produceType(typeName, typeMgr, generated, options)) { - failed(typeName, options); - } -} - -void produceAllTypes(RegistryKey& rTypeKey, bool bIsExtraType, - rtl::Reference< TypeManager > const & typeMgr, - codemaker::GeneratedTypeSet & generated, - CppuOptions* pOptions, - sal_Bool bFullScope) - throw( CannotDumpException ) -{ - OString typeName = typeMgr->getTypeName(rTypeKey); - - produce(rTypeKey, bIsExtraType, typeMgr, generated, pOptions); - - RegistryKeyList typeKeys = typeMgr->getTypeKeys(typeName); - RegistryKeyList::const_iterator iter = typeKeys.begin(); - RegistryKey key, subKey; - RegistryKeyArray subKeys; - - while (iter != typeKeys.end()) - { - key = (*iter).first; - - if (!(*iter).second && !key.openSubKeys(OUString(), subKeys)) - { - for (sal_uInt32 i = 0; i < subKeys.getLength(); i++) - { - subKey = subKeys.getElement(i); - if (bFullScope) - { - produceAllTypes(subKey, (*iter).second, typeMgr, - generated, pOptions, true); - } else - { - produce(subKey, (*iter).second, - typeMgr, generated, pOptions); - } - } +SAL_IMPLEMENT_MAIN_WITH_ARGS(argc, argv) { + CppuOptions options; + try { + if (!options.initOptions(argc, argv)) { + return EXIT_FAILURE; } - - ++iter; + } catch (IllegalArgument & e) { + std::cerr << "Illegal option " << e.m_message << '\n'; + return EXIT_FAILURE; } -} - -void produceAllTypes(const OString& typeName, - rtl::Reference< TypeManager > const & typeMgr, - codemaker::GeneratedTypeSet & generated, - CppuOptions* pOptions, - sal_Bool bFullScope) - throw( CannotDumpException ) -{ - produce(typeName, typeMgr, generated, pOptions); - - RegistryKeyList typeKeys = typeMgr->getTypeKeys(typeName); - RegistryKeyList::const_iterator iter = typeKeys.begin(); - RegistryKey key, subKey; - RegistryKeyArray subKeys; - - while (iter != typeKeys.end()) - { - key = (*iter).first; - if (!(*iter).second && !key.openSubKeys(OUString(), subKeys)) + try { + rtl::Reference< TypeManager > typeMgr(new TypeManager); + for (std::vector< OString >::const_iterator i( + options.getExtraInputFiles().begin()); + i != options.getExtraInputFiles().end(); ++i) { - for (sal_uInt32 i = 0; i < subKeys.getLength(); i++) - { - subKey = subKeys.getElement(i); - if (bFullScope) - { - produceAllTypes(subKey, (*iter).second, typeMgr, - generated, pOptions, true); - } else - { - produce(subKey, (*iter).second, - typeMgr, generated, pOptions); - } - } + typeMgr->loadProvider(b2u(*i), false); } - - ++iter; - } -} - -} - -SAL_IMPLEMENT_MAIN_WITH_ARGS(argc, argv) -{ - CppuOptions options; - - try - { - if (!options.initOptions(argc, argv)) + for (std::vector< OString >::const_iterator i( + options.getInputFiles().begin()); + i != options.getInputFiles().end(); ++i) { - exit(1); + typeMgr->loadProvider(b2u(*i), true); } - } - catch( IllegalArgument& e) - { - fprintf(stderr, "Illegal option: %s\n", e.m_message.getStr()); - exit(99); - } - - rtl::Reference< TypeManager > typeMgr(new TypeManager); - - if (!typeMgr->init(options.getInputFiles(), options.getExtraInputFiles())) - { - fprintf(stderr, "%s : init registries failed, check your registry files.\n", options.getProgramName().getStr()); - exit(99); - } - - if (options.isValid("-B")) - { - typeMgr->setBase(options.getOption("-B")); - } - - codemaker::GeneratedTypeSet generated; - try - { - if (options.isValid("-T")) - { - OString tOption(options.getOption("-T")); - - OString typeName, tmpName; - sal_Int32 nIndex = 0; - do - { - typeName = tOption.getToken(0, ';', nIndex); - - sal_Int32 nPos = typeName.lastIndexOf( '.' ); - tmpName = typeName.copy( nPos != -1 ? nPos+1 : 0 ); - if (tmpName == "*") - { - // produce this type and his scope - if (typeName == "*") - { - tmpName = "/"; - } else - { - tmpName = typeName.copy(0, typeName.lastIndexOf('.')).replace('.', '/'); - if (tmpName.isEmpty()) - tmpName = "/"; - else - tmpName = tmpName.replace('.', '/'); - } - // related to task #116780# the scope is recursively - // generated. bFullScope = true - produceAllTypes( - tmpName, typeMgr, generated, &options, true); - } else - { - // produce only this type + codemaker::GeneratedTypeSet generated; + if (options.isValid("-T")) { + OUString names(b2u(options.getOption("-T"))); + for (sal_Int32 i = 0; i != -1;) { + OUString name(names.getToken(0, ';', i)); + if (!name.isEmpty()) { produce( - typeName.replace('.', '/'), typeMgr, generated, &options); + (name == "*" + ? "" + : name.endsWith(".*") + ? name.copy(0, name.getLength() - std::strlen(".*")) + : name), + typeMgr, generated, options); } - } while( nIndex != -1 ); - } else - { - // produce all types - produceAllTypes("/", typeMgr, generated, &options, true); + } + } else { + produce("", typeMgr, generated, options); } // C++ header files generated for the following UNO types are included // in header files in cppu/inc/com/sun/star/uno (Any.hxx, Reference.hxx, // Type.h), so it seems best to always generate those C++ header files: - produce("com/sun/star/uno/RuntimeException", typeMgr, generated, &options); - produce("com/sun/star/uno/TypeClass", typeMgr, generated, &options); - produce("com/sun/star/uno/XInterface", typeMgr, generated, &options); + produce( + "com.sun.star.uno.RuntimeException", typeMgr, generated, options); + produce("com.sun.star.uno.TypeClass", typeMgr, generated, options); + produce("com.sun.star.uno.XInterface", typeMgr, generated, options); + } catch (CannotDumpException & e) { + std::cerr << "ERROR: " << e.getMessage() << '\n'; + return EXIT_FAILURE; + } catch (unoidl::NoSuchFileException & e) { + std::cerr << "ERROR: No such file <" << e.getUri() << ">\n"; + return EXIT_FAILURE; + } catch (unoidl::FileFormatException & e) { + std::cerr + << "ERROR: Bad format of <" << e.getUri() << ">, \"" + << e.getDetail() << "\"\n"; + return EXIT_FAILURE; } - catch( CannotDumpException& e) - { - fprintf(stderr, "%s ERROR: %s\n", - options.getProgramName().getStr(), - e.m_message.getStr()); - exit(99); - } - - return 0; + return EXIT_SUCCESS; } - /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ |