#include "AsFix.h" #include "AsFix2src.h" #include "aterm-macs.h" #include "AsFix-fun.h" /* Calculate the length of the source represented by an asfix term. */ int calc_size(char *fname, int pos, ATerm t); int AFsourceSize(ATerm asfix) { int pos, size = 0; ATerm arg; if(t_is_appl(asfix)) { ATermAppl appl = (ATermAppl)asfix; Symbol sym = ATgetSymbol(appl); int arity = ATgetArity(sym); char *fname = ATgetName(sym); switch(arity) { case 0: return strlen(fname); case 1: /* Singe argument might be a quoted string */ arg = ATgetArgument(appl, 0); if(t_is_appl(arg)) { Symbol argsym = ATgetSymbol((ATermAppl) arg); if(ATgetArity(argsym) == 0 && ATisQuoted(argsym)) { if(asfix_str_eq(fname, "ql")) return 2+strlen(ATgetName(argsym)); else return strlen(ATgetName(argsym)); } } } /* More than one argument, or argument is not a quoted string */ for(pos=0; pos bufsize) { if(buf) free(buf); buf = (char *)malloc(size+1); if(!buf) ATerror("out of memory in AFsourceToBuf"); bufsize = size; } size2 = AFsource(asfix, buf); if(size2 != size) ATerror("sizes don't match: %d != %d in AFsourceToFile", size, size2); fwrite(buf, 1, size, file); } char *treat_appl_arg(char *fname, int pos, ATerm t, char *buf); static char *build_source(ATerm asfix, char *buf) { int pos; ATerm arg; if(t_is_appl(asfix)) { ATermAppl appl = (ATermAppl)asfix; Symbol sym = ATgetSymbol((ATermAppl) asfix); int arity = ATgetArity(sym); char *fname = ATgetName(sym); switch(arity) { case 0: strcpy(buf, fname); buf += strlen(buf); return buf; case 1: arg = ATgetArgument(appl, 0); if(t_is_appl(arg)) { Symbol argsym = ATgetSymbol((ATermAppl) arg); if(ATgetArity(argsym) == 0 && ATisQuoted(argsym)) { if(asfix_str_eq(fname, "ql")) { *buf++ = '"'; strcpy(buf, ATgetName(argsym)); buf += strlen(buf); *buf++ = '"'; return buf; } else { strcpy(buf, ATgetName(argsym)); buf += strlen(buf); return buf; } } } } /* More than one argument, or single argument was not a quoted string */ for(pos=0; pos