tweaks for publish

This commit is contained in:
David Rose 2004-05-27 01:40:39 +00:00
parent 798348ea12
commit 53a7e319d8
6 changed files with 63 additions and 5 deletions

View File

@ -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 (dump_verbose || dump_brief) {
if (!file.write(cout, dump_brief)) { if (!file.write(cout, dump_brief)) {
return (1); return (1);

View File

@ -161,6 +161,20 @@ get_inherited_field(int n) const {
return get_field(n); 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 #ifdef HAVE_PYTHON
//////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////
// Function: DCClass::set_class_def // Function: DCClass::set_class_def
@ -511,7 +525,10 @@ ai_format_generate(PyObject *distobj, int do_id,
// Description: // Description:
//////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////
DCClass:: DCClass::
DCClass(const string &name) : _name(name) { DCClass(const string &name, bool bogus_class) :
_bogus_class(bogus_class),
_name(name)
{
#ifdef HAVE_PYTHON #ifdef HAVE_PYTHON
_class_def = NULL; _class_def = NULL;
#endif #endif

View File

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

View File

@ -36,6 +36,7 @@
//////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////
DCFile:: DCFile::
DCFile() { DCFile() {
_all_classes_valid = true;
} }
//////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////
@ -232,7 +233,9 @@ write(ostream &out, bool brief) const {
Classes::const_iterator ci; Classes::const_iterator ci;
for (ci = _classes.begin(); ci != _classes.end(); ++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"; out << "\n";
} }
@ -278,6 +281,19 @@ get_class_by_name(const string &name) {
return (DCClass *)NULL; 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 // Function: DCFile::get_num_import_modules
// Access: Published // Access: Published
@ -379,6 +395,11 @@ add_class(DCClass *dclass) {
dclass->_number = get_num_classes(); dclass->_number = get_num_classes();
_classes.push_back(dclass); _classes.push_back(dclass);
if (dclass->is_bogus_class()) {
_all_classes_valid = false;
}
return true; return true;
} }

View File

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

View File

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