From 04d031d33d6722988ea3db6fce917ababd75a5a7 Mon Sep 17 00:00:00 2001 From: ceriel Date: Fri, 13 Feb 1987 12:44:33 +0000 Subject: [PATCH] Added some buffering for writes --- mach/proto/as/comm4.c | 1 + mach/proto/as/comm6.c | 85 +++++++++++++++++++++++++++++++++++-------- 2 files changed, 70 insertions(+), 16 deletions(-) diff --git a/mach/proto/as/comm4.c b/mach/proto/as/comm4.c index 3bfec2bc8..db522c06d 100644 --- a/mach/proto/as/comm4.c +++ b/mach/proto/as/comm4.c @@ -109,6 +109,7 @@ char **argv; pass_23(PASS_2); #endif pass_23(PASS_3); + oflush(); wr_close(); stop(); } diff --git a/mach/proto/as/comm6.c b/mach/proto/as/comm6.c index 347f7b92f..6b2efc877 100644 --- a/mach/proto/as/comm6.c +++ b/mach/proto/as/comm6.c @@ -236,10 +236,23 @@ valu_t bytes; } #ifdef RELOCATION +static int nrelo; +static struct outrelo relobuf[100]; + +struct outrelo * +neworelo() +{ + if (nrelo == 100) { + wr_relo(relobuf, 100); + nrelo = 0; + } + return &relobuf[nrelo++]; +} + newrelo(s, n) short s; { - struct outrelo outrelo; + register struct outrelo *outrelo; int iscomm; if (rflag == 0) @@ -271,12 +284,13 @@ short s; return; } s &= ~S_VAR; - outrelo.or_type = (char)n; - outrelo.or_sect = (char)DOTTYP; + outrelo = neworelo(); + outrelo->or_type = (char)n; + outrelo->or_sect = (char)DOTTYP; #ifndef ASLD if (s == S_UND || iscomm) { assert(relonami != 0); - outrelo.or_nami = relonami-1; + outrelo->or_nami = relonami-1; relonami = 0; } else #endif @@ -285,28 +299,58 @@ short s; /* * use first non existing entry (argh) */ - outrelo.or_nami = outhead.oh_nname; + outrelo->or_nami = outhead.oh_nname; } else { /* * section symbols are at the end */ - outrelo.or_nami = outhead.oh_nname + outrelo->or_nami = outhead.oh_nname - outhead.oh_nsect + (s - S_MIN) ; } - outrelo.or_addr = (long)DOTVAL; - wr_relo(&outrelo, 1); + outrelo->or_addr = (long)DOTVAL; } #endif +static char sbuf[1024]; +static char *psbuf = sbuf; + +mwr_string(nm,len) + register char *nm; +{ + register char *q = psbuf; + + while (len--) { + *q++ = *nm++; + if (q == &sbuf[1024]) { + wr_string(sbuf,1024L); + q = sbuf; + } + } + psbuf = q; +} + +static struct outname obuf[100]; +static int nnames; + +static struct outname * +newoname() +{ + if (nnames == 100) { + wr_name(obuf,100); + nnames = 0; + } + return &obuf[nnames++]; +} + newsymb(name, type, desc, valu) register char *name; short type; short desc; valu_t valu; { - struct outname outname; + register struct outname *outname; if (name && *name == 0) name = 0; @@ -318,18 +362,27 @@ valu_t valu; return; } nname++; + outname = newoname(); if (name) { int len = strlen(name) + 1; - wr_string(name, len); - outname.on_foff = outhead.oh_nchar; + mwr_string(name, len); + outname->on_foff = outhead.oh_nchar; outhead.oh_nchar += len; } else - outname.on_foff = 0; - outname.on_type = type; - outname.on_desc = desc; - outname.on_valu = valu & ~((0xFFFFFFFF)<<(8*sizeof(valu_t))); - wr_name(&outname, 1); + outname->on_foff = 0; + outname->on_type = type; + outname->on_desc = desc; + outname->on_valu = valu & ~((0xFFFFFFFF)<<(8*sizeof(valu_t))); +} + +oflush() +{ +#ifdef RELOCATION + if (nrelo) wr_relo(relobuf,nrelo); +#endif + if (nnames) wr_name(obuf,nnames); + if (psbuf > sbuf) wr_string(sbuf, (long) (psbuf - sbuf)); } new_common(ip) -- 2.34.1