コード例 #1
0
ファイル: assm.c プロジェクト: BigEd/pyldin
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);
}
コード例 #2
0
ファイル: comdec.c プロジェクト: old-games/game-utilities
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;
}