ack/mach/proto/ncg/gencode.c

149 lines
2.7 KiB
C
Raw Normal View History

1985-01-08 15:34:54 +00:00
#ifndef NORCSID
1994-06-24 14:02:31 +00:00
static char rcsid[] = "$Id$";
1985-01-08 15:34:54 +00:00
#endif
#include <assert.h>
1985-01-08 15:34:54 +00:00
#include <stdio.h>
#include <unistd.h> /* isatty */
1985-01-08 15:34:54 +00:00
#include "param.h"
#include "tables.h"
#include "types.h"
#include <cgg_cg.h>
#include "data.h"
#include "result.h"
#include "extern.h"
#ifdef USE_TES
#include "xmach.h"
1990-07-18 14:53:19 +00:00
#endif
1985-01-08 15:34:54 +00:00
/*
1987-03-10 01:26:51 +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-08 15:34:54 +00:00
*
* Author: Hans van Staveren
*/
FILE *codefile;
void out_init(char *filename) {
1985-01-08 15:34:54 +00:00
#ifndef NDEBUG
static char stderrbuff[BUFSIZ];
if (Debug) {
codefile = stderr;
if (!isatty(2))
setbuf(stderr,stderrbuff);
} else {
#endif
if (filename == (char *) 0)
codefile = stdout;
else
2022-07-17 10:58:48 +00:00
if ((codefile=freopen(filename,"wb",stdout))==NULL)
1985-01-08 15:34:54 +00:00
error("Can't create %s",filename);
#ifndef NDEBUG
}
#endif
}
void out_finish(void) {
1985-01-08 15:34:54 +00:00
#ifndef NDEBUG
if (Debug)
fflush(stderr);
else
#endif
1988-04-14 16:09:02 +00:00
if (codefile) fclose(codefile);
1985-01-08 15:34:54 +00:00
#ifdef TABLEDEBUG
termlset();
#endif
}
void tstoutput(void) {
1985-01-08 15:34:54 +00:00
if (ferror(codefile))
error("Write error on output");
}
void genstr(int stringno) {
1985-01-08 15:34:54 +00:00
fputs(codestrings[stringno],codefile);
}
string ad2str(address_t ad) {
1985-01-08 15:34:54 +00:00
static char buf[100];
if (ad.ea_str==0)
ad.ea_str="";
if ((long)ad.ea_off==(long)0) {
1986-10-24 16:58:46 +00:00
if(ad.ea_str[0]==0)
return(mystrcpy("0")); /* don't return empty string */
else
return(mystrcpy(ad.ea_str));
}
1987-01-28 13:00:33 +00:00
sprintf(buf,"%s%c%ld",ad.ea_str,ad.ea_off>=0 ? '+' : ' ',(long)ad.ea_off);
1985-01-08 15:34:54 +00:00
return(mystrcpy(buf));
}
static void praddr(address_t ad) {
1985-01-08 15:34:54 +00:00
1987-01-16 13:51:45 +00:00
if (ad.ea_str==0 || *(ad.ea_str) == '\0')
1985-01-08 15:34:54 +00:00
fprintf(codefile,WRD_FMT,ad.ea_off);
else {
fputs(ad.ea_str, codefile);
1987-01-16 13:51:45 +00:00
if (ad.ea_off<0) {
putc('-', codefile);
1987-01-16 13:51:45 +00:00
fprintf(codefile,WRD_FMT,-ad.ea_off);
}
1985-01-08 15:34:54 +00:00
else if(ad.ea_off>0) {
putc('+',codefile);
1985-01-08 15:34:54 +00:00
fprintf(codefile,WRD_FMT,ad.ea_off);
}
}
}
void gennl(void) {
putc('\n',codefile);
1985-01-08 15:34:54 +00:00
}
void prtoken(token_p tp, int leadingchar) {
int c;
char *code;
tkdef_p tdp;
1985-01-08 15:34:54 +00:00
putc(leadingchar,codefile);
1985-01-08 15:34:54 +00:00
if (tp->t_token == -1) {
fputs(codestrings[machregs[tp->t_att[0].ar].r_repr],codefile);
1985-01-08 15:34:54 +00:00
return;
}
tdp = &tokens[tp->t_token];
assert(tdp->t_format != -1);
code = codestrings[tdp->t_format];
while ((c = *code++) != 0) {
if (c>=' ' && c<='~')
putc(c,codefile);
1985-01-08 15:34:54 +00:00
else {
assert(c>0 && c<=TOKENSIZE);
switch(tdp->t_type[c-1]) {
default:
assert(FALSE);
case EV_INT:
fprintf(codefile,WRD_FMT,tp->t_att[c-1].aw);
break;
case EV_ADDR:
praddr(tp->t_att[c-1].aa);
break;
case EV_REG:
fputs(codestrings[machregs[tp->t_att[c-1].ar].r_repr],codefile);
1985-01-08 15:34:54 +00:00
break;
}
}
}
}
1990-07-18 14:53:19 +00:00
#ifdef USE_TES
void printlabel(int labnum) {
1990-07-18 14:53:19 +00:00
newilb(dollar[labnum].e_v.e_addr.ea_str);
}
#endif