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

View File

@ -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

View File

@ -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;

View File

@ -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;
}

View File

@ -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;

View File

@ -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;