shithub: scc

ref: d278581748408090b5f80c955a256264b3a9dd69
dir: /lib/scc/wmyro.c/

View raw version
static char sccsid[] = "@(#) ./lib/scc/wmyro.c";

#include <assert.h>
#include <stdio.h>
#include <string.h>

#include "../../inc/scc.h"
#include "../../inc/myro.h"

int
wrmyrohdr(FILE *fp, struct myrohdr *hdr)
{
	unsigned char buf[MYROHDR_SIZ];
	int len;

	len = lpack(buf, "cccclqqqqq",
	            hdr->magic[0], hdr->magic[1],
	            hdr->magic[2], hdr->magic[3],
	            hdr->format,
	            hdr->entry,
	            hdr->strsize,
	            hdr->secsize,
	            hdr->symsize,
	            hdr->relsize);
	assert(MYROHDR_SIZ == len);
	fwrite(buf, len, 1, fp);

	return (ferror(fp)) ? EOF : len;
}

int
wrmyrosec(FILE *fp, struct myrosect *sect)
{
	unsigned char buf[MYROSECT_SIZ];
	int len;

	len = lpack(buf, "lsccqq",
	            sect->name,
	            sect->flags,
	            sect->fill,
	            sect->aligment,
	            sect->offset,
	            sect->len);
	assert(MYROSECT_SIZ == len);
	fwrite(buf, len, 1, fp);

	return (ferror(fp)) ? EOF : len;
}

int
wrmyrosym(FILE *fp, struct myrosym *sym)
{
	unsigned char buf[MYROSYM_SIZ];
	int len;

	len = lpack(buf, "llccqq",
	            sym->name,
	            sym->type,
	            sym->section,
	            sym->flags,
	            sym->offset,
	            sym->len);
	assert(MYROSYM_SIZ == len);
	fwrite(buf, len, 1, fp);

	return (ferror(fp)) ? EOF : len;
}

int
wrmyrorel(FILE *fp, struct myrorel *rel)
{
	unsigned char buf[MYROREL_SIZ];
	int len;

	len = lpack(buf, "lccccq",
	            rel->id,
	            rel->flags,
	            rel->size,
	            rel->nbits,
	            rel->shift,
	            rel->offset);
	assert(MYROREL_SIZ == len);
	fwrite(buf, len, 1, fp);

	return (ferror(fp)) ? EOF : len;
}