Files
Sepp J Morris 31738079c4 Upload
Digital Research
2020-11-06 18:50:37 +01:00

171 lines
3.7 KiB
C

#include "stdio.h"
/*
* Changed to use the Standard I/O library 9/13/82 FZ
*/
#include "acom.h"
/*
* Version 3.3, 7/5/82. Added hooks for profiling and performance
* enhancements.
*
* Version 3.2, 5/22/82. Added exit routine to replace the standard one
* in libc.a.
*/
static char ident[] = "@(#)a.misc.c 3.3";
/***********************************************************************
* ferr - Issues a fatal error message and terminates.
* Used a variable number of parameters - replaced by in-line
* calls to fprintf, followed everywhere by exit(1).
* FZ 9/14/82
*/
/*
*ferr(arglist) char *arglist; {
*
* fprintf(ERROR,"%r",&arglist);
* exit(1);
*}
************************************************************************/
/*
* getline - Reads the next line of source, and puts it into the global
* array sline and into the listing buffer lline.
*/
getline() {
reg struct input *rinfp;
reg int ch;
reg char *slp;
reg char *llp;
scanpt = slp = sline; llp = llsrc;
for( ; ; ) {
if((rinfp = infp) == 0) { /* end of file */
sline[0] = -1;
sline[1] = '\0';
return;
}
if(rinfp->in_cnt-- <= 0) { /* end of input stack frame */
fillin();
continue;
}
if((ch = *rinfp->in_ptr++ & 0377) >= 0200 &&
rinfp->in_typ == INMAC) { /* push macro argument frame */
macarg(ch);
continue;
}
ch &= 0177;
if(ch == '\n') /* we have a line */
break;
if(ch == '\f') linect = 0; /* page eject */
else if(slp < &sline[SLINSIZ]) *slp++ = *llp++ = ch;
}
*slp++ = *llp++ = '\n'; *slp = *llp = '\0';
rinfp->in_seq++;
if(rinfp == (struct input *)instk)
sprintf(llseq," %4d",rinfp->in_seq);
else sprintf(llseq,"+%4d",rinfp->in_seq);
/*
* Decide now whether listing of this line is enabled.
*/
llfull = curlst && (condlev<=truelev || condlst);
curxpl = pagect<<6|LLPP-linect+1;
if(linect == 0) curxpl += 64-LLPP; /* anticipate form feed */
}
/*
* palloc - Allocates a block of physical memory of the specified size,
* and returns a pointer to the block.
*/
char *
palloc(size) uns size; {
static char *oldtop;
oldtop = phytop; phytop += size;
while(phytop > phylim) {
if(sbrk(1024) == -1) {
fprintf(ERROR,"Out of memory\n");
exit(1);
}
phylim += 1024;
}
return(oldtop);
}
/*
* pgcheck - Checks to see if a new listing page is needed, and starts one
* if necessary. Then updates the line counter in anticipation of a line
* of output.
*/
pgcheck() {
int i;
if(linect <= 0) { /* time for a new page */
pagect++;
fprintf(LIST,"\f\n\n%-8s%-48s%s\
%-48s Page%4d\n\n",
prname,titl1,datstr,titl2,pagect);
linect = LLPP;
}
linect--;
}
/*
* putline - Outputs the next line of the assembly listing, provided
* it is pass 2 and there is something to output.
*/
putline() {
static char lstfmt[] = "%-3s %-4s %-8s %-5s %s";
if(pass2) {
if(*llerr) { /* put out an error listing line */
fprintf(ERROR,lstfmt,llerr,llloc, llobj,llseq,llsrc);
}
if(lflag && (llfull||*llerr)) { /* put out assembly listing */
pgcheck(); /* start a new page if necessary */
if(*llerr == '\0') { /* put listing line number */
sprintf(llerr," %2d",LLPP-linect);
}
fprintf(LIST,lstfmt,llerr,llloc,llobj,llseq,llsrc);
}
}
llsrc[0] = '\n';
*llerr = *llloc = *llobj = *llseq = llsrc[1] = '\0';
llert = llerr; llobt = llobj;
}
/*
* symcmp - Compares two symbols, and returns a number which is:
*
* > 0, if a > b,
* == 0, if a == b,
* < 0, if a < b.
*/
symcmp(a,b) reg char *a, *b; {
reg int i;
i = SYMSIZ;
while(--i>=0 && *a==*b++) {
if(*a++ == '\0') return(0);
}
return(i<0 ? 0 : *a-*--b);
}
/*
* symcpy - Copies one symbol from source to destination.
*/
symcpy(d,s) reg char *d, *s; {
reg char i;
i = SYMSIZ;
do {
if((*d++ = *s++) == '\0') return;
} while(--i > 0);
}