mirror of
https://github.com/GrammaticalFramework/gf-core.git
synced 2026-05-08 10:42:50 -06:00
make it possible to merge PGF files in the compiler
This commit is contained in:
@@ -213,6 +213,33 @@ PgfDB *pgf_new_ngf(PgfText *abstract_name,
|
||||
return NULL;
|
||||
}
|
||||
|
||||
PGF_API
|
||||
void pgf_merge_pgf(PgfDB *db, PgfRevision revision,
|
||||
const char* fpath,
|
||||
PgfExn* err)
|
||||
{
|
||||
FILE *in = NULL;
|
||||
|
||||
PGF_API_BEGIN {
|
||||
in = fopen(fpath, "rb");
|
||||
if (!in) {
|
||||
throw pgf_systemerror(errno, fpath);
|
||||
}
|
||||
|
||||
{
|
||||
DB_scope scope(db, WRITER_SCOPE);
|
||||
ref<PgfPGF> pgf = PgfDB::revision2pgf(revision);
|
||||
|
||||
PgfReader rdr(in);
|
||||
rdr.merge_pgf(pgf);
|
||||
}
|
||||
} PGF_API_END
|
||||
|
||||
end:
|
||||
if (in != NULL)
|
||||
fclose(in);
|
||||
}
|
||||
|
||||
PGF_API
|
||||
void pgf_write_pgf(const char* fpath,
|
||||
PgfDB *db, PgfRevision revision,
|
||||
|
||||
@@ -257,6 +257,11 @@ PgfDB *pgf_new_ngf(PgfText *abstract_name,
|
||||
PgfRevision *revision,
|
||||
PgfExn* err);
|
||||
|
||||
PGF_API
|
||||
void pgf_merge_pgf(PgfDB *db, PgfRevision revision,
|
||||
const char* fpath,
|
||||
PgfExn* err);
|
||||
|
||||
PGF_API_DECL
|
||||
void pgf_write_pgf(const char* fpath,
|
||||
PgfDB *db, PgfRevision revision,
|
||||
|
||||
@@ -169,6 +169,16 @@ Namespace<V> PgfReader::read_namespace(ref<V> (PgfReader::*read_value)())
|
||||
return read_namespace(read_value, len);
|
||||
}
|
||||
|
||||
template<class V>
|
||||
void PgfReader::merge_namespace(ref<V> (PgfReader::*read_value)())
|
||||
{
|
||||
size_t len = read_len();
|
||||
for (size_t i = 0; i < len; i++) {
|
||||
ref<V> value = (this->*read_value)();
|
||||
V::release(value);
|
||||
}
|
||||
}
|
||||
|
||||
template <class C, class V>
|
||||
ref<C> PgfReader::read_vector(Vector<V> C::* field, void (PgfReader::*read_value)(ref<V> val))
|
||||
{
|
||||
@@ -371,6 +381,16 @@ void PgfReader::read_abstract(ref<PgfAbstr> abstract)
|
||||
abstract->cats = read_namespace<PgfAbsCat>(&PgfReader::read_abscat);
|
||||
}
|
||||
|
||||
void PgfReader::merge_abstract(ref<PgfAbstr> abstract)
|
||||
{
|
||||
this->abstract = abstract;
|
||||
|
||||
read_name(); // ?
|
||||
merge_namespace<PgfFlag>(&PgfReader::read_flag); // ?
|
||||
merge_namespace<PgfAbsFun>(&PgfReader::read_absfun); // ?
|
||||
merge_namespace<PgfAbsCat>(&PgfReader::read_abscat); // ?
|
||||
}
|
||||
|
||||
ref<PgfLParam> PgfReader::read_lparam()
|
||||
{
|
||||
size_t i0 = read_int();
|
||||
@@ -597,3 +617,27 @@ ref<PgfPGF> PgfReader::read_pgf()
|
||||
|
||||
return pgf;
|
||||
}
|
||||
|
||||
void PgfReader::merge_pgf(ref<PgfPGF> pgf)
|
||||
{
|
||||
uint16_t major_version = read_u16be();
|
||||
uint16_t minor_version = read_u16be();
|
||||
|
||||
if (pgf->major_version != PGF_MAJOR_VERSION ||
|
||||
pgf->minor_version != PGF_MINOR_VERSION) {
|
||||
throw pgf_error("Unsupported format version");
|
||||
}
|
||||
|
||||
merge_namespace<PgfFlag>(&PgfReader::read_flag); // ??
|
||||
|
||||
merge_abstract(ref<PgfAbstr>::from_ptr(&pgf->abstract));
|
||||
|
||||
size_t len = read_len();
|
||||
for (size_t i = 0; i < len; i++) {
|
||||
ref<PgfConcr> concr = PgfReader::read_concrete();
|
||||
Namespace<PgfConcr> concrs =
|
||||
namespace_insert(pgf->concretes, concr);
|
||||
namespace_release(pgf->concretes);
|
||||
pgf->concretes = concrs;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -44,6 +44,9 @@ public:
|
||||
template<class V>
|
||||
Namespace<V> read_namespace(ref<V> (PgfReader::*read_value)());
|
||||
|
||||
template<class V>
|
||||
void merge_namespace(ref<V> (PgfReader::*read_value)());
|
||||
|
||||
template <class C, class V>
|
||||
ref<C> read_vector(Vector<V> C::* field, void (PgfReader::*read_value)(ref<V> val));
|
||||
|
||||
@@ -62,6 +65,7 @@ public:
|
||||
ref<PgfAbsFun> read_absfun();
|
||||
ref<PgfAbsCat> read_abscat();
|
||||
void read_abstract(ref<PgfAbstr> abstract);
|
||||
void merge_abstract(ref<PgfAbstr> abstract);
|
||||
|
||||
ref<PgfConcrLincat> read_lincat();
|
||||
ref<PgfLParam> read_lparam();
|
||||
@@ -75,6 +79,7 @@ public:
|
||||
ref<PgfConcr> read_concrete();
|
||||
|
||||
ref<PgfPGF> read_pgf();
|
||||
void merge_pgf(ref<PgfPGF> pgf);
|
||||
|
||||
private:
|
||||
FILE *in;
|
||||
|
||||
Reference in New Issue
Block a user