eccodes/tools/compile.cc

107 lines
2.9 KiB
C++
Raw Permalink Normal View History

2013-03-25 12:04:10 +00:00
/*
2020-01-28 14:32:34 +00:00
* (C) Copyright 2005- ECMWF.
2013-03-25 12:04:10 +00:00
*
* This software is licensed under the terms of the Apache Licence Version 2.0
* which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
*
* In applying this licence, ECMWF does not waive the privileges and immunities granted to it by
* virtue of its status as an intergovernmental organisation nor does it submit to any jurisdiction.
*/
#include <stdio.h>
#include "grib_api_internal.h"
2020-01-22 13:10:59 +00:00
typedef struct list
{
2013-03-25 12:04:10 +00:00
char path[1024];
char name[1024];
struct list* next;
} list;
2020-01-22 13:10:59 +00:00
int main(int argc, char* argv[])
2013-03-25 12:04:10 +00:00
{
2020-01-22 13:10:59 +00:00
int i = 0;
int j = 0;
int fail = 0;
grib_compiler compiler = {
0,
};
2013-03-25 12:04:10 +00:00
grib_context* c = grib_context_get_default();
2020-01-22 13:10:59 +00:00
grib_action* a;
2013-03-25 12:04:10 +00:00
2020-01-22 13:10:59 +00:00
list* first = NULL;
list* l = NULL;
2013-03-25 12:04:10 +00:00
compiler.out = stdout;
compiler.max = 4096;
printf("#include \"grib_api_internal.h\"\n\n");
2020-01-22 13:10:59 +00:00
for (i = 1; i < argc; i++) {
2013-03-25 12:04:10 +00:00
char name[1024];
const char* p = argv[i];
const char* path;
2020-01-22 13:10:59 +00:00
while (*p && strncmp(p, "definitions", strlen("definitions")))
p++;
2013-03-25 12:04:10 +00:00
path = p;
2020-01-22 13:10:59 +00:00
strcpy(name, "grib_");
2013-03-25 12:04:10 +00:00
j = strlen(name);
2020-01-22 13:10:59 +00:00
while (*p) {
if (isalnum(*p)) {
2013-03-25 12:04:10 +00:00
name[j++] = *p;
}
else {
name[j++] = '_';
}
p++;
}
name[j++] = 0;
2020-01-22 13:10:59 +00:00
printf("static grib_action* %s(grib_context *ctx) {\n", name);
printf("grib_action* a[%d] = {0,};\n\n", compiler.max);
printf("grib_action* b[%d] = {0,};\n\n", compiler.max);
2013-03-25 12:04:10 +00:00
compiler.cnt = 0;
printf("/* %s */\n", path);
2020-01-22 13:10:59 +00:00
if (!(a = grib_parse_file(c, argv[i]))) {
2013-03-25 12:04:10 +00:00
fail++;
exit(1);
}
2020-01-22 13:10:59 +00:00
else {
grib_compile_action_branch(a, &compiler, NULL);
2013-03-25 12:04:10 +00:00
}
printf("return a[0];\n");
printf("}\n");
2020-01-22 13:10:59 +00:00
l = calloc(sizeof(list), 1);
2013-03-25 12:04:10 +00:00
l->next = first;
2020-01-22 13:10:59 +00:00
strcpy(l->name, name);
strcpy(l->path, path);
2013-03-25 12:04:10 +00:00
first = l;
}
printf("void grib_load_compiled_definitions(grib_context* ctx){\n");
printf("grib_action_file* af;\n");
printf("ctx = ctx ? ctx : grib_context_get_default();\n\n");
2020-01-22 13:10:59 +00:00
printf("if(!ctx->grib_reader)\n");
printf(" ctx->grib_reader =(grib_action_file_list*)grib_context_malloc_clear_persistent(ctx,sizeof(grib_action_file_list));");
2013-03-25 12:04:10 +00:00
2020-01-22 13:10:59 +00:00
while (l) {
2013-03-25 12:04:10 +00:00
printf("af =(grib_action_file*)grib_context_malloc_clear_persistent(ctx,sizeof(grib_action_file));\n");
2020-01-22 13:10:59 +00:00
printf("af->root = %s(ctx);\n", l->name);
printf("af->filename = grib_context_strdup_persistent(ctx,\"COMPILED/%s\");\n", l->path);
2013-03-25 12:04:10 +00:00
printf("grib_push_action_file(af,ctx->grib_reader);\n\n");
l = l->next;
}
printf("}\n");
2020-01-22 13:10:59 +00:00
printf("int main(int argc,char* argv[]) {grib_load_compiled_definitions(0);return 0 ;}\n");
2013-03-25 12:04:10 +00:00
return fail;
}