17 #include "MummyVersion.h"
19 #include "cableClass.h"
20 #include "cableNamespace.h"
21 #include "cableSourceRepresentation.h"
22 #include "cableVariable.h"
23 #include "cableXMLParser.h"
25 #include "gxsys/CommandLineArguments.hxx"
26 #include "gxsys/RegularExpression.hxx"
27 #include "gxsys/ios/fstream"
28 #include "gxsys/ios/iostream"
29 #include "gxsys/stl/algorithm"
30 #include "gxsys/stl/map"
31 #include "gxsys/stl/set"
32 #include "gxsys/stl/string"
33 #include "gxsys/stl/vector"
110 arguments.AddArgument(
112 gxsys::CommandLineArguments::SPACE_ARGUMENT,
114 "Input file describing mummy configuration settings, including the set of wrapped classes. Required."
117 arguments.AddArgument(
119 gxsys::CommandLineArguments::SPACE_ARGUMENT,
121 "C# output file. Default value is 'ClassName.cs' in the current directory."
124 arguments.AddArgument(
125 "--export-layer-file",
126 gxsys::CommandLineArguments::SPACE_ARGUMENT,
128 "C++ output file. Default value is 'ClassNameEL.cxx' in the current directory."
131 arguments.AddArgument(
132 "--csharp-unit-test-file",
133 gxsys::CommandLineArguments::SPACE_ARGUMENT,
135 "C# output file. Default value is 'ClassNameUnitTest.cs' in the current directory."
138 arguments.AddArgument(
140 gxsys::CommandLineArguments::SPACE_ARGUMENT,
142 "Input file (output of gccxml) describing class to be wrapped. Required."
145 arguments.AddCallback(
147 gxsys::CommandLineArguments::NO_ARGUMENT,
150 "Display (this) detailed help information."
153 arguments.AddArgument(
155 gxsys::CommandLineArguments::NO_ARGUMENT,
157 "Overwhelm me with output, I don't have enough reading material... ;)"
160 arguments.AddCallback(
162 gxsys::CommandLineArguments::NO_ARGUMENT,
165 "Display the program version."
168 arguments.AddArgument(
169 "--suppress-warnings",
170 gxsys::CommandLineArguments::MULTI_ARGUMENT,
172 "Space separated list of warning numbers to suppress."
182 gxsys::CommandLineArguments arguments;
186 arguments.Initialize(argc, argv);
193 if (!arguments.Parse())
196 LogError(err, <<
"Could not parse all arguments in MummySettings::Initialize. Use --help for detailed help information.");
201 gxsys_stl::vector<int>::iterator wit;
212 LogError(err, <<
"Required setting --settings-file not given. Use --help for detailed help information.");
218 LogError(err, <<
"Required setting --gccxml-file not given. Use --help for detailed help information.");
293 references.insert(references.begin(),
305 gxsys_stl::map<gxsys_stl::string, ClassWrappingSettings>::iterator mit;
306 gxsys_stl::vector<ClassWrappingSettings>::iterator vit;
307 gxsys::RegularExpression re;
308 gxsys_stl::string s(name);
316 (*cws) = mit->second;
323 re.compile(vit->pattern.c_str());
324 if (re.find(s.c_str()))
342 bool wrappable =
false;
350 gxsys_stl::map<gxsys_stl::string, ClassWrappingSettings>::iterator mit;
351 gxsys_stl::vector<ClassWrappingSettings>::iterator vit;
352 gxsys::RegularExpression re;
364 re.compile(vit->pattern.c_str());
365 if (re.find(s.c_str()))
379 #define READ_MummySettings_ATTS() \
381 if (s=="beginExcludeRegex"){attBeginExcludeRegex = atts[i+1];knownAttribute = true;} \
382 if (s=="countedMethodsRegex"){attCountedMethodsRegex = atts[i+1];knownAttribute = true;} \
383 if (s=="csharpConstructorModifier"){attCsharpConstructorModifier = atts[i+1];knownAttribute = true;} \
384 if (s=="defaultDisposalMethod"){attDefaultDisposalMethod = atts[i+1];knownAttribute = true;} \
385 if (s=="defaultFactoryMethod"){attDefaultFactoryMethod = atts[i+1];knownAttribute = true;} \
386 if (s=="emitDefaultFactoryMethod"){attEmitDefaultFactoryMethod = atts[i+1];knownAttribute = true;} \
387 if (s=="endExcludeRegex"){attEndExcludeRegex = atts[i+1];knownAttribute = true;} \
388 if (s=="exceptionBaseClass"){attExceptionBaseClass = atts[i+1];knownAttribute = true;} \
389 if (s=="exceptionCloneMethod"){attExceptionCloneMethod = atts[i+1];knownAttribute = true;} \
390 if (s=="exceptionInclude"){attExceptionInclude = atts[i+1];knownAttribute = true;} \
391 if (s=="excludeMarkedLines"){attExcludeMarkedLines = atts[i+1];knownAttribute = true;} \
392 if (s=="externalHints"){attExternalHints = atts[i+1];knownAttribute = true;} \
393 if (s=="extraCsharpCode"){attExtraCsharpCode = atts[i+1];knownAttribute = true;} \
394 if (s=="extraCsharpUnitTestCode"){attExtraCsharpUnitTestCode = atts[i+1];knownAttribute = true;} \
395 if (s=="extraExportLayerCode"){attExtraExportLayerCode = atts[i+1];knownAttribute = true;} \
396 if (s=="getMummyTypeEntryMethod"){attGetMummyTypeEntryMethod = atts[i+1];knownAttribute = true;} \
397 if (s=="getRefCountMethod"){attGetRefCountMethod = atts[i+1];knownAttribute = true;} \
398 if (s=="partial"){attPartial = atts[i+1];knownAttribute = true;} \
399 if (s=="registerBaseClass"){attRegisterBaseClass = atts[i+1];knownAttribute = true;} \
400 if (s=="registerMethod"){attRegisterMethod = atts[i+1];knownAttribute = true;} \
401 if (s=="registerInclude"){attRegisterInclude = atts[i+1];knownAttribute = true;} \
402 if (s=="setMummyTypeEntryMethod"){attSetMummyTypeEntryMethod = atts[i+1];knownAttribute = true;} \
403 if (s=="shadow"){attShadow = atts[i+1];knownAttribute = true;} \
404 if (s=="unRegisterMethod"){attUnRegisterMethod = atts[i+1];knownAttribute = true;} \
405 if (s=="wrappedObjectBase"){attWrappedObjectBase = atts[i+1];knownAttribute = true;} \
416 static Pointer
New() {
return new Self; }
424 gxsys_stl::string elementName(name);
426 gxsys_stl::string attName;
427 gxsys_stl::string attPattern;
428 gxsys_stl::string attSortKey;
429 gxsys_stl::string attWrappable;
431 gxsys_stl::string attCsharpConstructorModifier(
"");
432 gxsys_stl::string attDefaultDisposalMethod(
"");
433 gxsys_stl::string attDefaultFactoryMethod(
"");
434 gxsys_stl::string attEmitDefaultFactoryMethod(
"false");
435 gxsys_stl::string attCountedMethodsRegex(
"");
436 gxsys_stl::string attShadow(
"false");
437 gxsys_stl::string attExceptionBaseClass(
"");
438 gxsys_stl::string attExceptionCloneMethod(
"");
439 gxsys_stl::string attExceptionInclude(
"");
440 gxsys_stl::string attExternalHints(
"");
441 gxsys_stl::string attExtraCsharpCode(
"");
442 gxsys_stl::string attExtraCsharpUnitTestCode(
"");
443 gxsys_stl::string attExtraExportLayerCode(
"");
444 gxsys_stl::string attPartial(
"false");
445 gxsys_stl::string attRegisterMethod(
"");
446 gxsys_stl::string attUnRegisterMethod(
"");
447 gxsys_stl::string attRegisterBaseClass(
"");
448 gxsys_stl::string attRegisterInclude(
"");
449 gxsys_stl::string attGetRefCountMethod(
"");
450 gxsys_stl::string attGetMummyTypeEntryMethod(
"");
451 gxsys_stl::string attSetMummyTypeEntryMethod(
"");
452 gxsys_stl::string attExcludeMarkedLines(
"false");
453 gxsys_stl::string attBeginExcludeRegex(
"");
454 gxsys_stl::string attEndExcludeRegex(
"");
455 gxsys_stl::string attWrappedObjectBase(
"");
458 bool knownAttribute =
false;
461 if (elementName ==
"Class")
463 for (
unsigned int i=0; atts[i] && atts[i+1]; i+=2)
466 knownAttribute =
false;
468 if (s==
"name"){attName = atts[i+1];knownAttribute =
true;}
469 if (s==
"wrappable"){attWrappable = atts[i+1];knownAttribute =
true;}
476 << elementName <<
"/@" << s <<
"'");
484 attDefaultFactoryMethod,
485 attEmitDefaultFactoryMethod ==
"false" ?
false :
true,
486 attCountedMethodsRegex,
487 attDefaultDisposalMethod,
488 attShadow ==
"false" ?
false :
true,
490 attExtraExportLayerCode,
492 attExtraCsharpUnitTestCode,
493 attCsharpConstructorModifier,
496 attGetRefCountMethod,
497 attRegisterBaseClass,
499 attGetMummyTypeEntryMethod,
500 attSetMummyTypeEntryMethod,
501 attExcludeMarkedLines ==
"false" ?
false :
true,
502 attBeginExcludeRegex,
504 attPartial ==
"false" ?
false :
true,
505 attExceptionBaseClass,
506 attExceptionCloneMethod,
511 if (attWrappable ==
"false")
522 if (elementName ==
"ClassPattern")
524 for (
unsigned int i=0; atts[i] && atts[i+1]; i+=2)
527 knownAttribute =
false;
529 if (s==
"pattern"){attPattern = atts[i+1];knownAttribute =
true;}
530 if (s==
"wrappable"){attWrappable = atts[i+1];knownAttribute =
true;}
531 if (s==
"sortkey"){attSortKey = atts[i+1];knownAttribute =
true;}
538 << elementName <<
"/@" << s <<
"'");
546 attDefaultFactoryMethod,
547 attEmitDefaultFactoryMethod ==
"false" ?
false :
true,
548 attCountedMethodsRegex,
549 attDefaultDisposalMethod,
550 attShadow ==
"false" ?
false :
true,
552 attExtraExportLayerCode,
554 attExtraCsharpUnitTestCode,
555 attCsharpConstructorModifier,
558 attGetRefCountMethod,
559 attRegisterBaseClass,
561 attGetMummyTypeEntryMethod,
562 attSetMummyTypeEntryMethod,
563 attExcludeMarkedLines ==
"false" ?
false :
true,
564 attBeginExcludeRegex,
566 attPartial ==
"false" ?
false :
true,
567 attExceptionBaseClass,
568 attExceptionCloneMethod,
573 if (attWrappable ==
"false")
584 if (elementName ==
"Reference")
586 for (
unsigned int i=0; atts[i] && atts[i+1]; i+=2)
589 knownAttribute =
false;
591 if (s==
"name"){attName = atts[i+1];knownAttribute =
true;}
596 << elementName <<
"/@" << s <<
"'");
632 gxsys_ios::ifstream inFile(filename, std::ios_base::in|std::ios_base::binary);
637 err, <<
"Could not open file: '" << filename <<
"'");
643 parser->SetStream(&inFile);
644 parser->SetSettings(
this);
649 err, <<
"Could not parse file: '" << filename <<
"'");
651 parser->SetStream(0);
652 parser->SetSettings(0);
661 bool ParseName(
const char* name, gxsys_stl::string& result)
663 gxsys_stl::string group = name;
664 gxsys_stl::string::size_type l = group.find(
'"');
665 gxsys_stl::string::size_type r = group.rfind(
'"');
666 if((l != gxsys_stl::string::npos) && (r != gxsys_stl::string::npos) && (r > l))
668 result = group.substr(l+1, r-l-1);
677 gxsys_stl::string& groupName,
678 gxsys_stl::vector<gxsys_stl::string>& groupsNames,
679 gxsys_stl::string& packageName,
680 gxsys_stl::string& packageVersion,
681 gxsys_stl::string& headerName,
682 gxsys_stl::string& configFile)
685 const cable::Variable* group = 0;
686 cable::Context::Iterator lower = cns->LowerBound(
"group");
687 cable::Context::Iterator upper = cns->UpperBound(
"group");
690 group = cable::Variable::SafeDownCast(*lower);
699 const cable::Variable* groups = 0;
700 lower = cns->LowerBound(
"groups");
701 upper = cns->UpperBound(
"groups");
704 groups = cable::Variable::SafeDownCast(*lower);
713 const cable::Variable*
package = 0;
714 lower = cns->LowerBound(
"package");
715 upper = cns->UpperBound(
"package");
718 package = cable::Variable::SafeDownCast(*lower);
727 const cable::Variable* package_version = 0;
728 lower = cns->LowerBound(
"package_version");
729 upper = cns->UpperBound(
"package_version");
732 package_version = cable::Variable::SafeDownCast(*lower);
733 if (!package_version)
741 const cable::Variable* header = 0;
742 lower = cns->LowerBound(
"header");
743 upper = cns->UpperBound(
"header");
746 header = cable::Variable::SafeDownCast(*lower);
758 if (!
ParseName(group->GetInitializer(), groupName))
765 configFile = group->GetFile();
768 if (package && !
ParseName(package->GetInitializer(), packageName))
774 if (package_version &&
775 !
ParseName(package_version->GetInitializer(), packageVersion))
783 gxsys_stl::string gl = groups->GetInitializer();
784 gxsys_stl::string::size_type lpos = gl.find(
'"');
785 while((lpos != gxsys_stl::string::npos) && (lpos < gl.length()))
787 gxsys_stl::string::size_type rpos = gl.find_first_of(
",}", lpos);
788 gxsys_stl::string result;
789 if((rpos == gxsys_stl::string::npos) ||
790 !
ParseName(gl.substr(lpos, rpos-lpos).c_str(), result))
795 groupsNames.push_back(result);
802 if (!
ParseName(header->GetInitializer(), headerName))
825 const cable::Namespace* gns = sr->GetGlobalNamespace();
830 cable::Context::Iterator lower = gns->LowerBound(
"_cable_");
831 cable::Context::Iterator upper = gns->UpperBound(
"_cable_");
832 cable::Namespace* cns = 0;
835 cns = cable::Namespace::SafeDownCast(*lower);
843 gxsys_stl::string group;
844 gxsys_stl::vector<gxsys_stl::string> groups;
845 gxsys_stl::string package;
846 gxsys_stl::string packageVersion;
847 gxsys_stl::string header;
848 gxsys_stl::string configFile;
850 if (group.size() == 0)
852 if (package.size() == 0)
877 Trace(
"IncreaseCoverage\n");
930 if (getenv(
"DART_TEST_FROM_DART"))
932 gxsys_ios::cout << gxsys_ios::endl;
933 gxsys_ios::cout <<
"CTEST_FULL_OUTPUT (Avoid ctest truncation of output)" << gxsys_ios::endl;
936 gxsys_ios::cout << gxsys_ios::endl;
937 gxsys_ios::cout <<
"Command line options:" << gxsys_ios::endl;
942 gxsys_ios::cout << gxsys_ios::endl;
943 gxsys_ios::cout <<
"svn status (retrieved at CMake configure time):" << gxsys_ios::endl;
944 gxsys_ios::cout <<
"===============================================" << gxsys_ios::endl;
946 gxsys_ios::cout << gxsys_ios::endl;
973 return Mummy_FULL_VERSION_STRING;
1102 gxsys_stl::string s;
1111 s =
"ERROR_NoCsharpConstructorModifier";
1123 gxsys_stl::string s;
1132 s =
"ERROR_NoFactoryMethod";
1164 gxsys_stl::string s;
1173 s =
"ERROR_NoCountedMethodsRegex";
1185 gxsys_stl::string s;
1194 s =
"ERROR_NoDisposalMethod";
1206 bool shadow =
false;
1226 gxsys_stl::string s;
1235 s =
"ERROR_NoExternalHints";
1247 gxsys_stl::string s;
1256 s =
"ERROR_NoExtraCsharpCode";
1268 gxsys_stl::string s;
1277 s =
"ERROR_NoExtraExportLayerCode";
1289 gxsys_stl::string s;
1298 s =
"ERROR_NoExtraCsharpUnitTestCode";
1310 gxsys_stl::string s;
1319 s =
"ERROR_NoRegisterMethod";
1331 gxsys_stl::string s;
1340 s =
"ERROR_NoUnRegisterMethod";
1352 gxsys_stl::string s;
1361 s =
"ERROR_NoRegisterBaseClass";
1373 gxsys_stl::string s;
1382 s =
"ERROR_NoRegisterInclude";
1394 bool partial =
false;