summaryrefslogtreecommitdiff
path: root/package.c
diff options
context:
space:
mode:
Diffstat (limited to 'package.c')
-rw-r--r--package.c65
1 files changed, 60 insertions, 5 deletions
diff --git a/package.c b/package.c
index 5c429b0..0bf724d 100644
--- a/package.c
+++ b/package.c
@@ -25,42 +25,81 @@ static void exptr_create(Exporter *ex, FILE *out, char *code) {
static inline void export_u8(Exporter *ex, U8 u8) {
write_u8(ex->out, u8);
}
+static inline U8 import_u8(Importer *i) {
+ return read_u8(i->in);
+}
static inline void export_i8(Exporter *ex, I8 i8) {
write_i8(ex->out, i8);
}
+static inline I8 import_i8(Importer *i) {
+ return read_i8(i->in);
+}
static inline void export_u16(Exporter *ex, U16 u16) {
write_u16(ex->out, u16);
}
+static inline U16 import_u16(Importer *i) {
+ return read_u16(i->in);
+}
static inline void export_i16(Exporter *ex, I16 i16) {
write_i16(ex->out, i16);
}
+static inline I16 import_i16(Importer *i) {
+ return read_i16(i->in);
+}
static inline void export_u32(Exporter *ex, U32 u32) {
write_u32(ex->out, u32);
}
+static inline U32 import_u32(Importer *i) {
+ return read_u32(i->in);
+}
static inline void export_i32(Exporter *ex, I32 i32) {
write_i32(ex->out, i32);
}
+static inline I32 import_i32(Importer *i) {
+ return read_i32(i->in);
+}
static inline void export_u64(Exporter *ex, U64 u64) {
write_u64(ex->out, u64);
}
+static inline U64 import_u64(Importer *i) {
+ return read_u64(i->in);
+}
static inline void export_i64(Exporter *ex, I64 i64) {
write_i64(ex->out, i64);
}
+static inline I64 import_i64(Importer *i) {
+ return read_i64(i->in);
+}
static inline void export_f32(Exporter *ex, F32 f32) {
write_f32(ex->out, f32);
}
+static inline F32 import_f32(Importer *i) {
+ return read_f32(i->in);
+}
static inline void export_f64(Exporter *ex, F64 f64) {
write_f64(ex->out, f64);
}
+static inline F64 import_f64(Importer *i) {
+ return read_f64(i->in);
+}
static inline void export_bool(Exporter *ex, bool b) {
write_bool(ex->out, b);
}
+static inline bool import_bool(Importer *i) {
+ return read_bool(i->in);
+}
static inline void export_char(Exporter *ex, char c) {
write_char(ex->out, c);
}
+static inline bool import_char(Importer *i) {
+ return read_char(i->in);
+}
static inline void export_vlq(Exporter *ex, U64 x) {
write_vlq(ex->out, x);
}
+static inline bool import_vlq(Importer *i) {
+ return read_vlq(i->in);
+}
static inline void export_str(Exporter *ex, const char *str, size_t len) {
#ifdef TOC_DEBUG
@@ -97,14 +136,15 @@ static inline void export_len(Exporter *ex, size_t len) {
export_vlq(ex, (U64)len);
}
+static const U8 toc_package_indicator[3] = {116, 111, 112};
+
/* writes the header */
static void exptr_start(Exporter *ex, const char *pkg_name, size_t pkg_name_len) {
- const U8 toc[3] = {116, 111, 112}; /* "top" in ASCII */
const char *code = ex->code;
ex->started = true;
- export_u8(ex, toc[0]);
- export_u8(ex, toc[1]);
- export_u8(ex, toc[2]);
+ export_u8(ex, toc_package_indicator[0]);
+ export_u8(ex, toc_package_indicator[1]);
+ export_u8(ex, toc_package_indicator[2]);
export_u32(ex, TOP_FMT_VERSION);
assert(ftell(ex->out) == 7L);
export_u64(ex, 0); /* placeholder for identifier offset in file */
@@ -606,6 +646,21 @@ static bool exptr_finish(Exporter *ex) {
return true;
}
-static void import_pkg(Package *p, FILE *f) {
+/* where = where was this imported */
+static bool import_pkg(Package *p, FILE *f, const char *fname, Location where) {
+ Importer i = {0};
idents_create(&p->idents);
+ i.pkg = p;
+ i.in = f;
+ U8 toc[3];
+ toc[0] = import_u8(&i);
+ toc[1] = import_u8(&i);
+ toc[2] = import_u8(&i);
+ if (toc[0] != toc_package_indicator[0] ||
+ toc[1] != toc_package_indicator[1] ||
+ toc[2] != toc_package_indicator[2]) {
+ err_print(where, "%s is not a toc package file.", fname);
+ return false;
+ }
+ return true;
}