|
@@ -21,6 +21,7 @@
|
|
|
#include "dcClass.h"
|
|
#include "dcClass.h"
|
|
|
#include "dcTypedef.h"
|
|
#include "dcTypedef.h"
|
|
|
#include "memoryUsage.h"
|
|
#include "memoryUsage.h"
|
|
|
|
|
+#include "indent.h"
|
|
|
|
|
|
|
|
#ifndef HAVE_GETOPT
|
|
#ifndef HAVE_GETOPT
|
|
|
#include "gnu_getopt.h"
|
|
#include "gnu_getopt.h"
|
|
@@ -33,7 +34,7 @@ usage() {
|
|
|
cerr <<
|
|
cerr <<
|
|
|
"\n"
|
|
"\n"
|
|
|
"Usage:\n\n"
|
|
"Usage:\n\n"
|
|
|
- "dcparse [-v | -b] [file1 file2 ...]\n"
|
|
|
|
|
|
|
+ "dcparse [options] [file1 file2 ...]\n"
|
|
|
"dcparse -h\n\n";
|
|
"dcparse -h\n\n";
|
|
|
}
|
|
}
|
|
|
|
|
|
|
@@ -46,18 +47,93 @@ help() {
|
|
|
"the file(s) are read and concatenated, and a single hash code is printed\n"
|
|
"the file(s) are read and concatenated, and a single hash code is printed\n"
|
|
|
"corresponding to the file's contents.\n\n"
|
|
"corresponding to the file's contents.\n\n"
|
|
|
|
|
|
|
|
- "With -b, this writes a brief version of the file to standard output\n"
|
|
|
|
|
- "instead. With -v, this writes a more verbose version.\n\n";
|
|
|
|
|
|
|
+ "Options:\n\n"
|
|
|
|
|
+
|
|
|
|
|
+ " -v Writes a complete parseable version of the file to standard\n"
|
|
|
|
|
+ " output instead of printing a hash code.\n\n"
|
|
|
|
|
+
|
|
|
|
|
+ " -b Writes a brief parseable version of the file instead of a full\n"
|
|
|
|
|
+ " version. This is semantically the same as the output produced\n"
|
|
|
|
|
+ " the above -v option--reading it would produce exactly the same\n"
|
|
|
|
|
+ " results--but it is designed to be slightly obfuscated. The\n"
|
|
|
|
|
+ " comments and parameter names are not included.\n\n"
|
|
|
|
|
+
|
|
|
|
|
+ " -c Write a list of class names, showing the inheritance hierarchy.\n"
|
|
|
|
|
+ " Some class names will be listed twice in the presence of multiple\n"
|
|
|
|
|
+ " inheritance.\n\n"
|
|
|
|
|
+
|
|
|
|
|
+ " -f Write a complete list of field names available for each class,\n"
|
|
|
|
|
+ " including all inherited fields.\n\n";
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+void
|
|
|
|
|
+write_class_hierarchy(int indent_level, const DCFile &file,
|
|
|
|
|
+ const DCClass *this_dclass) {
|
|
|
|
|
+ indent(cout, indent_level)
|
|
|
|
|
+ << this_dclass->get_name() << "\n";
|
|
|
|
|
+
|
|
|
|
|
+ int num_classes = file.get_num_classes();
|
|
|
|
|
+ for (int i = 0; i < num_classes; ++i) {
|
|
|
|
|
+ const DCClass *dclass = file.get_class(i);
|
|
|
|
|
+ bool is_my_child = false;
|
|
|
|
|
+ int num_parents = dclass->get_num_parents();
|
|
|
|
|
+ for (int j = 0; j < num_parents && !is_my_child; ++j) {
|
|
|
|
|
+ is_my_child = (dclass->get_parent(j) == this_dclass);
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ if (is_my_child) {
|
|
|
|
|
+ write_class_hierarchy(indent_level + 2, file, dclass);
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+void
|
|
|
|
|
+write_class_hierarchy(const DCFile &file) {
|
|
|
|
|
+ int num_classes = file.get_num_classes();
|
|
|
|
|
+ for (int i = 0; i < num_classes; ++i) {
|
|
|
|
|
+ const DCClass *dclass = file.get_class(i);
|
|
|
|
|
+ if (dclass->get_num_parents() == 0) {
|
|
|
|
|
+ write_class_hierarchy(0, file, dclass);
|
|
|
|
|
+ cout << "\n";
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+void
|
|
|
|
|
+write_complete_field_list(const DCFile &file) {
|
|
|
|
|
+ int num_classes = file.get_num_classes();
|
|
|
|
|
+ for (int i = 0; i < num_classes; ++i) {
|
|
|
|
|
+ const DCClass *dclass = file.get_class(i);
|
|
|
|
|
+ cout << "\n" << dclass->get_name() << "\n";
|
|
|
|
|
+ int num_inherited_fields = dclass->get_num_inherited_fields();
|
|
|
|
|
+ for (int j = 0; j < num_inherited_fields; ++j) {
|
|
|
|
|
+ const DCField *field = dclass->get_inherited_field(j);
|
|
|
|
|
+ cout << " ";
|
|
|
|
|
+ if (field->get_class() != dclass) {
|
|
|
|
|
+ cout << field->get_class()->get_name() << "::";
|
|
|
|
|
+ }
|
|
|
|
|
+ cout << field->get_name();
|
|
|
|
|
+ if (field->as_atomic_field() != (DCAtomicField *)NULL ||
|
|
|
|
|
+ field->as_molecular_field() != (DCMolecularField *)NULL) {
|
|
|
|
|
+ // It's a "method".
|
|
|
|
|
+ cout << "()";
|
|
|
|
|
+ }
|
|
|
|
|
+ field->output_keywords(cout);
|
|
|
|
|
+ cout << "\n";
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
int
|
|
int
|
|
|
main(int argc, char *argv[]) {
|
|
main(int argc, char *argv[]) {
|
|
|
// extern char *optarg;
|
|
// extern char *optarg;
|
|
|
extern int optind;
|
|
extern int optind;
|
|
|
- const char *optstr = "bvh";
|
|
|
|
|
|
|
+ const char *optstr = "bvcfh";
|
|
|
|
|
|
|
|
bool dump_verbose = false;
|
|
bool dump_verbose = false;
|
|
|
bool dump_brief = false;
|
|
bool dump_brief = false;
|
|
|
|
|
+ bool dump_classes = false;
|
|
|
|
|
+ bool dump_fields = false;
|
|
|
|
|
|
|
|
int flag = getopt(argc, argv, optstr);
|
|
int flag = getopt(argc, argv, optstr);
|
|
|
|
|
|
|
@@ -71,6 +147,14 @@ main(int argc, char *argv[]) {
|
|
|
dump_verbose = true;
|
|
dump_verbose = true;
|
|
|
break;
|
|
break;
|
|
|
|
|
|
|
|
|
|
+ case 'c':
|
|
|
|
|
+ dump_classes = true;
|
|
|
|
|
+ break;
|
|
|
|
|
+
|
|
|
|
|
+ case 'f':
|
|
|
|
|
+ dump_fields = true;
|
|
|
|
|
+ break;
|
|
|
|
|
+
|
|
|
case 'h':
|
|
case 'h':
|
|
|
help();
|
|
help();
|
|
|
exit(1);
|
|
exit(1);
|
|
@@ -116,16 +200,22 @@ main(int argc, char *argv[]) {
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- return (1);
|
|
|
|
|
|
|
+ return 1;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
if (dump_verbose || dump_brief) {
|
|
if (dump_verbose || dump_brief) {
|
|
|
if (!file.write(cout, dump_brief)) {
|
|
if (!file.write(cout, dump_brief)) {
|
|
|
- return (1);
|
|
|
|
|
|
|
+ return 1;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+ } else if (dump_classes) {
|
|
|
|
|
+ write_class_hierarchy(file);
|
|
|
|
|
+
|
|
|
|
|
+ } else if (dump_fields) {
|
|
|
|
|
+ write_complete_field_list(file);
|
|
|
|
|
+
|
|
|
} else {
|
|
} else {
|
|
|
- long hash = file.get_hash();
|
|
|
|
|
|
|
+ unsigned long hash = file.get_hash();
|
|
|
cerr << "File hash is " << hash << "\n";
|
|
cerr << "File hash is " << hash << "\n";
|
|
|
}
|
|
}
|
|
|
|
|
|
|
@@ -141,5 +231,5 @@ main(int argc, char *argv[]) {
|
|
|
}
|
|
}
|
|
|
#endif
|
|
#endif
|
|
|
|
|
|
|
|
- return (0);
|
|
|
|
|
|
|
+ return 0;
|
|
|
}
|
|
}
|