ATerm SSL_write_term_to_binary_string(ATerm term) { int i; int length; char* result = ATwriteToBinaryString(term, &length); ATermList result_term = ATmakeList0();; if(result == NULL) { perror("SRTS/write_term_to_binary_string"); _fail(term); } for(i = length - 1; i >= 0; i--) { ATerm next = (ATerm) ATmakeInt(result[i]); result_term = ATinsert(result_term, next); } return (ATerm) result_term; }
static void generateSource(FILE *file, ATermList terms, ATermList afuns) { int len, row, col, index; unsigned char *data; ATerm all; ATermList list, term_aliases, afun_aliases; ATermList term_values, afun_values; if (opt_gen_date) { time_t now = time(NULL); fprintf(file, "/*\n * Generated at %s", ctime(&now)); fprintf(file, " */\n\n"); } fprintf(file, "#include \"%s.h\"\n\n", file_prefix); /*{{{ unzip term and afun lists */ term_aliases = ATempty; afun_aliases = ATempty; term_values = ATempty; afun_values = ATempty; list = afuns; while (!ATisEmpty(list)) { ATerm alias, value; ATerm pair = ATgetFirst(list); list = ATgetNext(list); if (!ATmatch(pair, "[<term>,<term>]", &alias, &value)) { ATfprintf(stderr, "malformed [alias,afun] pair: %t\n", pair); exit(1); } afun_aliases = ATinsert(afun_aliases, alias); afun_values = ATinsert(afun_values, value); } afun_aliases = ATreverse(afun_aliases); afun_values = ATreverse(afun_values); list = terms; while (!ATisEmpty(list)) { ATerm alias, value; ATerm pair = ATgetFirst(list); list = ATgetNext(list); if (!ATmatch(pair, "[<term>,<term>]", &alias, &value)) { ATfprintf(stderr, "malformed [alias,term] pair: %t\n", pair); exit(1); } term_aliases = ATinsert(term_aliases, alias); term_values = ATinsert(term_values, value); } term_aliases = ATreverse(term_aliases); term_values = ATreverse(term_values); /*}}} */ /*{{{ generate symbol declarations */ list = afun_aliases; while (!ATisEmpty(list)) { ATerm alias = ATgetFirst(list); list = ATgetNext(list); checkAlias(alias); ATfprintf(file, "AFun %t;\n", alias); } fprintf(file, "\n"); /*}}} */ /*{{{ generate term declarations */ list = term_aliases; while (!ATisEmpty(list)) { ATerm alias = ATgetFirst(list); list = ATgetNext(list); checkAlias(alias); ATfprintf(file, "ATerm %t = NULL;\n", alias); } /*}}} */ /*{{{ generate BAF data */ ATfprintf(file, "\n/*\n"); list = afuns; while (!ATisEmpty(list)) { ATermList pair = (ATermList)ATgetFirst(list); list = ATgetNext(list); ATfprintf(file, " * %t = %t\n", ATelementAt(pair, 0), ATelementAt(pair, 1)); } ATfprintf(file, " *\n"); list = terms; while (!ATisEmpty(list)) { ATermList pair = (ATermList)ATgetFirst(list); list = ATgetNext(list); ATfprintf(file, " * %t = %t\n", ATelementAt(pair, 0), ATelementAt(pair, 1)); } ATfprintf(file, " *\n"); ATfprintf(file, " */\n"); ATfprintf(file, "\nstatic ATerm _%s = NULL;\n\n", code_prefix); all = ATmake("[<term>,<term>]", afun_values, term_values); data = (unsigned char *)ATwriteToBinaryString(all, &len); ATfprintf(file, "#define _%s_LEN %d\n\n", code_prefix, len); ATfprintf(file, "static char _%s_baf[_%s_LEN] = {\n", code_prefix, code_prefix, len); index = 0; for (row=0; index<len; row++) { for (col=0; col<ROW_LENGTH && index<len; col++) { fprintf(file, "0x%02X", data[index++]); if (index < len) { fprintf(file, ","); } } fprintf(file, "\n"); } ATfprintf(file, "};\n\n"); /*}}} */ /*{{{ generate init function */ ATfprintf(file, "void init_%s()\n", code_prefix); ATfprintf(file, "{\n"); ATfprintf(file, " ATermList afuns, terms;\n\n"); ATfprintf(file, " _%s = ATreadFromBinaryString(_%s_baf, _%s_LEN);\n", code_prefix, code_prefix, code_prefix); ATfprintf(file, " assert(_%s);\n\n", code_prefix); ATfprintf(file, " ATprotect(&_%s);\n\n", code_prefix); ATfprintf(file, " afuns = (ATermList)ATelementAt((ATermList)_%s, 0);\n\n", code_prefix); list = afuns; while (!ATisEmpty(list)) { ATerm alias; ATermList pair = (ATermList)ATgetFirst(list); list = ATgetNext(list); alias = ATelementAt(pair, 0); ATfprintf(file, " %t = ATgetAFun((ATermAppl)ATgetFirst(afuns));\n", alias); ATfprintf(file, " afuns = ATgetNext(afuns);\n"); } ATfprintf(file, "\n terms = (ATermList)ATelementAt((ATermList)_%s, 1);\n\n", code_prefix); list = terms; index = 0; while (!ATisEmpty(list)) { ATerm alias; ATermList pair = (ATermList)ATgetFirst(list); list = ATgetNext(list); alias = ATelementAt(pair, 0); ATfprintf(file, " %t = ATgetFirst(terms);\n", alias); ATfprintf(file, " terms = ATgetNext(terms);\n"); } ATfprintf(file, "}\n"); /*}}} */ }