ack/util/led/output.c

97 lines
2.2 KiB
C
Raw Permalink 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:24:36 +00:00
#ifndef lint
1994-06-24 11:31:16 +00:00
static char rcsid[] = "$Id$";
1985-01-10 13:24:36 +00:00
#endif
2017-01-18 18:55:56 +00:00
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <stdbool.h>
#include "out.h"
#include "object.h"
1985-01-10 13:24:36 +00:00
#include "const.h"
#include "output.h"
1985-01-10 13:24:36 +00:00
#include "memory.h"
#include "error.h"
#include "write.h"
#include "sym.h"
1985-01-10 13:24:36 +00:00
static void generate_section_names(void);
1985-01-10 13:24:36 +00:00
extern struct outhead outhead;
extern bool incore;
1985-01-10 13:24:36 +00:00
extern int flagword;
/*
* We have counted all relocation structs but we know only now if
* these must be emitted.We add all names here,unless the -s(trip)
* flag was given.
* If this flag is given we don't need the string table either.
*/
void beginoutput(void)
1985-01-10 13:24:36 +00:00
{
extern long NLChars, NGChars;
extern char *outputname;
1985-01-10 13:24:36 +00:00
if (! wr_open(outputname)) {
fatal("can't create %s", outputname);
}
1985-01-10 13:24:36 +00:00
if (incore)
generate_section_names();
if (!(flagword & (CFLAG|RFLAG)))
outhead.oh_nrelo = (unsigned short)0;
1985-01-10 13:24:36 +00:00
if (flagword & SFLAG) {
outhead.oh_nname = (unsigned short)0;
1985-01-10 13:24:36 +00:00
outhead.oh_nchar = (long)0;
} else {
outhead.oh_nname = NLocals + NGlobals + outhead.oh_nsect;
outhead.oh_nchar = NLChars + NGChars;
}
if (!incore)
begin_write();
}
/*
* Generate names for all sections and put them after the global names.
* Section names are used for relocation.
*/
static void generate_section_names(void)
1985-01-10 13:24:36 +00:00
{
register struct outname *name;
register int sectindex;
register size_t size;
1985-01-10 13:24:36 +00:00
extern struct outsect outsect[];
size = outhead.oh_nsect * sizeof(struct outname);
1985-01-10 13:24:36 +00:00
name = (struct outname *)core_alloc(ALLOGLOB, size);
if (name == (struct outname *)0)
return;
for (sectindex = 0; sectindex < outhead.oh_nsect; sectindex++, name++) {
name->on_foff = (long)0; /* No string name. */
name->on_type = (S_MIN + sectindex) | S_SCT;
name->on_desc = (unsigned short)0;
1985-01-10 13:24:36 +00:00
name->on_valu = outsect[sectindex].os_base;
}
}
/*
* If we didn't keep the whole output file in core, most of it has been
* written out, and we just finish that.
* If we did, we write out our pieces of core.
*/
void endoutput(void)
1985-01-10 13:24:36 +00:00
{
if (!incore) {
if (!(flagword & SFLAG))
end_write();
} else {
write_bytes();
}
wr_close();
1985-01-10 13:24:36 +00:00
}