From 2b0222bf310ddfd221e18d0bae46e803c04db1d2 Mon Sep 17 00:00:00 2001 From: Christiaan Welvaart Date: Thu, 7 Jul 2011 16:29:04 +0000 Subject: - extract gobject introspection typelib interdependencies using a helper program --- g-ir-extract-deps.c | 68 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 68 insertions(+) create mode 100644 g-ir-extract-deps.c (limited to 'g-ir-extract-deps.c') diff --git a/g-ir-extract-deps.c b/g-ir-extract-deps.c new file mode 100644 index 0000000..1c1735d --- /dev/null +++ b/g-ir-extract-deps.c @@ -0,0 +1,68 @@ +/* + extract the dependencies string from a GObject Introspection 1.0 typelib file + and print it on stdout +*/ + +#include +#include +#include + +#define G_IR_MAGIC "GOBJ\nMETADATA\r\n\032" + +int main(int argc, char ** argv) +{ + FILE * typelib; + char * magic; + uint32_t deps_offset; + char * deps; + + if (argc < 2) + { + fprintf(stderr, "too few arguments\n"); + exit(1); + } + + typelib = fopen(argv[1], "r"); + if (typelib == NULL) + { + fprintf(stderr, "failed to open %s\n", argv[1]); + exit(1); + } + magic = malloc(16); + deps = malloc(8192); + if ((magic == NULL) || (deps == NULL)) + { + fprintf(stderr, "failed to allocate memory\n"); + exit(1); + } + if (fread(magic, 16, 1, typelib) < 1) + { + fprintf(stderr, "failed to read magic from typelib\n"); + exit(1); + } + if (strcmp(magic, G_IR_MAGIC)) + { + fprintf(stderr, "magic mismatch, not a typelib?\n"); + exit(1); + } + + fseek(typelib, 36, SEEK_SET); + if (fread(&deps_offset, 4, 1, typelib) < 1) + { + fprintf(stderr, "failed to read deps offset from typelib\n"); + exit(1); + } + fseek(typelib, deps_offset, SEEK_SET); + if (fscanf(typelib, "%8191s", deps) < 1) + { + fprintf(stderr, "failed to read deps from typelib\n"); + exit(1); + } + + free(deps); + free(magic); + fclose(typelib); + + printf("%s\n", deps); + return 0; +} -- cgit v1.2.1