Browse Source

tweaks for publish

David Rose 21 years ago
parent
commit
53a7e319d8

+ 14 - 0
direct/src/dcparse/dcparse.cxx

@@ -93,6 +93,20 @@ main(int argc, char *argv[]) {
     }
   }
 
+  if (!file.all_classes_valid() && !dump_brief) {
+    cerr << "File is incomplete.  The following classes are undefined:\n";
+
+    int num_classes = file.get_num_classes();
+    for (int i = 0; i < num_classes; i++) {
+      DCClass *dclass = file.get_class(i);
+      if (dclass->is_bogus_class()) {
+        cerr << "  " << dclass->get_name() << "\n";
+      }
+    }
+
+    return (1);
+  }
+
   if (dump_verbose || dump_brief) {
     if (!file.write(cout, dump_brief)) {
       return (1);

+ 18 - 1
direct/src/dcparser/dcClass.cxx

@@ -161,6 +161,20 @@ get_inherited_field(int n) const {
   return get_field(n);
 }
 
+////////////////////////////////////////////////////////////////////
+//     Function: DCClass::is_bogus_class
+//       Access: Public
+//  Description: Returns true if the class has been flagged as a bogus
+//               class.  This is set for classes that are generated by
+//               the parser as placeholder for missing classes, as
+//               when reading a partial file; it should not occur in a
+//               normal valid dc file.
+////////////////////////////////////////////////////////////////////
+bool DCClass::
+is_bogus_class() const {
+  return _bogus_class;
+}
+
 #ifdef HAVE_PYTHON
 ////////////////////////////////////////////////////////////////////
 //     Function: DCClass::set_class_def
@@ -511,7 +525,10 @@ ai_format_generate(PyObject *distobj, int do_id,
 //  Description:
 ////////////////////////////////////////////////////////////////////
 DCClass::
-DCClass(const string &name) : _name(name) {
+DCClass(const string &name, bool bogus_class) : 
+  _bogus_class(bogus_class), 
+  _name(name) 
+{
 #ifdef HAVE_PYTHON
   _class_def = NULL;
 #endif

+ 4 - 1
direct/src/dcparser/dcClass.h

@@ -44,6 +44,8 @@ PUBLISHED:
   int get_num_inherited_fields() const;
   DCField *get_inherited_field(int n) const;
 
+  bool is_bogus_class() const;
+
 #ifdef HAVE_PYTHON
   void set_class_def(PyObject *class_def);
   PyObject *get_class_def() const;
@@ -70,7 +72,7 @@ PUBLISHED:
 #endif 
 
 public:
-  DCClass(const string &name);
+  DCClass(const string &name, bool bogus_class = false);
   ~DCClass();
 
   void write(ostream &out, bool brief, int indent_level) const;
@@ -83,6 +85,7 @@ private:
 
   // These members define the primary interface to the distributed
   // class as read from the file.
+  bool _bogus_class;
   int _number;
   string _name;
 

+ 22 - 1
direct/src/dcparser/dcFile.cxx

@@ -36,6 +36,7 @@
 ////////////////////////////////////////////////////////////////////
 DCFile::
 DCFile() {
+  _all_classes_valid = true;
 }
 
 ////////////////////////////////////////////////////////////////////
@@ -232,7 +233,9 @@ write(ostream &out, bool brief) const {
 
   Classes::const_iterator ci;
   for (ci = _classes.begin(); ci != _classes.end(); ++ci) {
-    (*ci)->write(out, brief, 0);
+    if (!(*ci)->is_bogus_class()) {
+      (*ci)->write(out, brief, 0);
+    }
     out << "\n";
   }
 
@@ -278,6 +281,19 @@ get_class_by_name(const string &name) {
   return (DCClass *)NULL;
 }
 
+////////////////////////////////////////////////////////////////////
+//     Function: DCFile::all_classes_valid
+//       Access: Published
+//  Description: Returns true if all of the classes read from the DC
+//               file were defined and valid, or false if any of them
+//               were undefined ("bogus classes").  If this is true,
+//               we might have read a partial file.
+////////////////////////////////////////////////////////////////////
+bool DCFile::
+all_classes_valid() const {
+  return _all_classes_valid;
+}
+
 ////////////////////////////////////////////////////////////////////
 //     Function: DCFile::get_num_import_modules
 //       Access: Published
@@ -379,6 +395,11 @@ add_class(DCClass *dclass) {
 
   dclass->_number = get_num_classes();
   _classes.push_back(dclass);
+
+  if (dclass->is_bogus_class()) {
+    _all_classes_valid = false;
+  }
+
   return true;
 }
 

+ 4 - 0
direct/src/dcparser/dcFile.h

@@ -50,6 +50,8 @@ PUBLISHED:
   DCClass *get_class(int n);
   DCClass *get_class_by_name(const string &name);
 
+  bool all_classes_valid() const;
+
   int get_num_import_modules() const;
   string get_import_module(int n) const;
   int get_num_import_symbols(int n) const;
@@ -79,6 +81,8 @@ public:
   typedef pvector<Import> Imports;
   Imports _imports;
 
+  bool _all_classes_valid;
+
 public:
   // This map is built up during parsing for the convenience of the parser.
   typedef pmap<string, DCClass *> ClassesByName;

+ 1 - 2
direct/src/dcparser/dcParser.yxx

@@ -112,8 +112,7 @@ dclass_name:
   DCFile::ClassesByName::const_iterator ni;
   ni = dc_file->_classes_by_name.find($1);
   if (ni == dc_file->_classes_by_name.end()) {
-    dcyywarning("Unknown class: " + $1);
-    $$ = new DCClass($1);
+    $$ = new DCClass($1, true);
     dc_file->add_class($$);
   } else {
     $$ = (*ni).second;