ack/util/led/write.c

116 lines
2.2 KiB
C
Raw Normal View History

1987-03-09 19:15:41 +00:00
/*
* (c) copyright 1987 by the Vrije Universiteit, Amsterdam, The Netherlands.
* See the copyright notice in the ACK home directory, in the file "Copyright".
*/
1985-01-10 13:35:39 +00:00
#ifndef lint
static char rcsid[] = "$Header$";
#endif
#include <out.h>
1985-01-10 13:35:39 +00:00
#include <stdio.h>
#include "const.h"
#include "assert.h"
#include "memory.h"
extern struct outhead outhead;
extern struct outsect outsect[];
extern int flagword;
extern bool incore;
wr_fatal()
{
fatal("write error");
}
1985-01-10 13:35:39 +00:00
static long off_char;
1985-01-10 13:35:39 +00:00
/*
* Open the output file according to the chosen strategy.
* Write away the header and section table: they will not change anymore.
*/
begin_write()
{
register struct outhead *hd = &outhead;
1985-01-10 13:35:39 +00:00
assert(! incore);
wr_ohead(hd);
wr_sect(outsect, hd->oh_nsect);
off_char = OFF_CHAR(*hd);
1985-01-10 13:35:39 +00:00
}
static struct outname *
sectname(sectindex)
int sectindex;
{
static struct outname namebuf;
namebuf.on_foff = (long)0; /* No string name. */
namebuf.on_type = (S_MIN + sectindex) | S_SCT;
namebuf.on_desc = 0;
namebuf.on_valu = outsect[sectindex].os_base;
return &namebuf;
}
/*
* Write out the symbol table and the section names.
*/
end_write()
{
register struct outname *name;
register int sectindex;
extern ushort NGlobals;
1987-04-08 17:15:30 +00:00
extern long NGChars;
1985-01-10 13:35:39 +00:00
assert(!incore);
assert(!(flagword & SFLAG));
name = (struct outname *)address(ALLOGLOB, (ind_t)0);
1987-04-08 17:15:30 +00:00
namecpy(name, NGlobals, off_char);
wr_name(name, NGlobals);
wr_string(mems[ALLOGCHR].mem_base+1, NGChars);
off_char += NGChars;
1985-01-10 13:35:39 +00:00
for (sectindex = 0; sectindex < outhead.oh_nsect; sectindex++)
1987-04-08 17:15:30 +00:00
wrt_name(sectname(sectindex), 1);
1985-01-10 13:35:39 +00:00
}
wrt_emit(emit, sectindex, cnt)
char *emit;
int sectindex;
long cnt;
1985-01-10 13:35:39 +00:00
{
wr_outsect(sectindex);
wr_emit(emit, cnt);
1985-01-10 13:35:39 +00:00
}
wrt_nulls(sectindex, cnt)
register long cnt;
1985-01-10 13:35:39 +00:00
{
static char nullbuf[BUFSIZ];
1985-01-10 13:35:39 +00:00
wr_outsect(sectindex);
1985-01-10 13:35:39 +00:00
while (cnt) {
register int n = cnt >= BUFSIZ ? BUFSIZ : cnt;
wr_emit(nullbuf, (long)n);
1985-01-10 13:35:39 +00:00
cnt -= n;
}
}
1987-04-08 17:15:30 +00:00
wrt_name(name, writename)
1985-01-10 13:35:39 +00:00
register struct outname *name;
{
assert(!incore);
assert(!(flagword & SFLAG));
if (name->on_mptr != (char *)0) {
register long len = strlen(name->on_mptr) + 1;
1985-01-10 13:35:39 +00:00
wr_string(name->on_mptr, len);
name->on_foff = off_char;
off_char += len;
1985-01-10 13:35:39 +00:00
} else {
name->on_foff = (long)0;
}
1987-04-08 17:15:30 +00:00
if (writename) wr_name(name, 1);
1985-01-10 13:35:39 +00:00
}