void assemble(char *outname) { char *aline; int dataoffset, stringsoffset, linkisoffset; int datalen, stringslen, linkislen, oldlineno; struct export *e, *eo; numfuncs = 0; numlinkis = 0; temptype = -2; if(src == NULL) return; if(verbose) fprintf(stderr, "\n%s: Assembling file `%s'\n", progname, src->filename); errors = 0; makearea(&oheaders); makearea(&ostrings); makearea(&odata); makearea(&olinkis); PARENTO = addonestrtoarea(outname); /* build header */ addinttoarea(&oheaders, 0x6a624f51); /* "QObj" */ addinttoarea(&oheaders, -1); /* creator string */ addinttoarea(&oheaders, -1); /* num funcs */ addinttoarea(&oheaders, 60); /* address func headers */ addinttoarea(&oheaders, -1); /* procos */ addinttoarea(&oheaders, 0); /* reserved */ addinttoarea(&oheaders, 2); /* obj format version */ addinttoarea(&oheaders, 0); /* address code/data */ addinttoarea(&oheaders, 0); /* length code/data */ addinttoarea(&oheaders, 0); /* address strings */ addinttoarea(&oheaders, 0); /* length strings */ addinttoarea(&oheaders, 0); /* address linkis */ addinttoarea(&oheaders, 0); /* length linkis */ addinttoarea(&oheaders, 0); /* address debug info */ addinttoarea(&oheaders, 0); /* length debug info */ strcpy(creator, "qas RISC OS ARM Assembler vsn "VERS" © Stu Smith ["__DATE__"]"); strcpy(procos, "ARM/RISCOS"); funcheadsoff = oheaders.used; /* assemble line-by-line */ parseinit(); clearvalues(&llabels); clearvalues(&rns); clearvalues(&fns); clearvalues(&cns); clearvalues(&sets); while(src) { aline = getline(); decomment(aline); stripw(aline); if(*aline) { assmline(aline); } } endprevfunc(); placeint(&oheaders, addonestrtoarea(creator), 4); placeint(&oheaders, addonestrtoarea(procos), 16); placeint(&oheaders, numfuncs, 8); /* concat headers-data-strings */ alignarea(&oheaders); alignarea(&odata); alignarea(&ostrings); dataoffset = addtoarea(&oheaders, odata.mem, odata.used); datalen = odata.used; droparea(&odata); alignarea(&oheaders); linkisoffset = addtoarea(&oheaders, olinkis.mem, olinkis.used); linkislen = olinkis.used; droparea(&olinkis); alignarea(&oheaders); stringsoffset = addtoarea(&oheaders, ostrings.mem, ostrings.used); stringslen = ostrings.used; droparea(&ostrings); alignarea(&oheaders); if(numfuncs == 0) error("No symbols defined"); placeint(&oheaders, dataoffset, 28); placeint(&oheaders, datalen, 32); placeint(&oheaders, stringsoffset, 36); placeint(&oheaders, stringslen, 40); placeint(&oheaders, linkisoffset, 44); placeint(&oheaders, linkislen, 48); placeint(&oheaders, 0, 52); placeint(&oheaders, 0, 56); e = exportlist; while(e) { oldlineno = lineno; lineno = e->line; error("Can't export symbol `%s': not defined", e->symname); lineno = oldlineno; freemem(e->symname); eo = e->next; freemem(e); e = eo; } exportlist = NULL; /* save object file */ #ifndef DEBUG if(errors == 0) #endif saveblock(outname, oheaders.mem, oheaders.used); droparea(&oheaders); }
bool_t c_fadd(FILE *dst, const char *src_filename, size_t *size, size_t *compressed, comdec_t *comdec, int level) { void *s; void *d; if (dst == NULL) { fprintf(stderr, "c_fadd: dst == NULL.\n"); return FALSE; } if (src_filename == NULL) { fprintf(stderr, "c_fadd: src_filename == NULL.\n"); return FALSE; } if (size == NULL) { fprintf(stderr, "c_fadd: size == NULL.\n"); return FALSE; } if (compressed == NULL) { fprintf(stderr, "c_fadd: compressed == NULL.\n"); return FALSE; } if (comdec == NULL) { fprintf(stderr, "c_fadd: comdec == NULL.\n"); return FALSE; } if ((level < 0) || (level > 9)) { fprintf(stderr, "c_fadd: wrong level.\n"); return FALSE; } *compressed = 0; s = loadfile(src_filename, size); if (*size == 0) return TRUE; if (s == NULL) { fprintf(stderr, "c_fadd: loadfile failed.\n"); return FALSE; } if (level != 0) { *compressed = comdec->dsize(*size); d = malloc(*compressed); if (d != NULL) { if (comdec->compress(s, *size, d, compressed, level) == FALSE) { fprintf(stderr, "c_fadd: compression failed, trying to add uncompressed data.\n"); free(d); *compressed = *size; } else if (*compressed >= *size) { fprintf(stderr, "c_fadd: compression not effective, trying to add uncompressed data.\n"); free(d); *compressed = *size; } else { free(s); s = d; } } else { fprintf(stderr, "c_fadd: can't get memory for compression, trying to add uncompressed data.\n"); *compressed = *size; } } else *compressed = *size; if (saveblock(dst, s, *compressed) == FALSE) { fprintf(stderr, "c_fadd: saveblock failed.\n"); free(s); return FALSE; } free(s); if (*compressed == *size) *compressed = 0; return TRUE; }