Example #1
0
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;
}
Example #2
0
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");

  /*}}}  */

}