From e9d477fd6eaa2f20f4cb761abb9f2b126f4695fe Mon Sep 17 00:00:00 2001 From: ceriel Date: Fri, 17 Nov 1989 15:56:53 +0000 Subject: [PATCH] more internal buffering --- modules/src/object/object.3 | 7 +------ modules/src/object/object.h | 15 +++++++-------- modules/src/object/rd.c | 7 +++++++ modules/src/object/wr.c | 34 ++++++++++++++++------------------ modules/src/object/wr_putc.c | 7 ++++++- 5 files changed, 37 insertions(+), 33 deletions(-) diff --git a/modules/src/object/object.3 b/modules/src/object/object.3 index 7dbc1c30f..7f66502fc 100644 --- a/modules/src/object/object.3 +++ b/modules/src/object/object.3 @@ -2,7 +2,7 @@ .ad .SH NAME wr_open, wr_close, wr_ohead, wr_sect, wr_outsect, wr_emit, wr_putc, wr_relo, -wr_name, wr_string, wr_arhdr, wr_ranlib, wr_int2, wr_long, wr_bytes, wr_fd, +wr_name, wr_string, wr_arhdr, wr_ranlib, wr_int2, wr_long, wr_bytes, rd_open, rd_fdopen, rd_close, rd_ohead, rd_sect, rd_outsect, rd_emit, rd_relo, rd_rew_relo, rd_name, rd_string, rd_arhdr, rd_ranlib, rd_int2, rd_unsigned2, rd_long, rd_bytes, rd_fd\ \-\ routines to read @@ -82,8 +82,6 @@ and write ACK-object files and libraries .br .B long l; .PP -.B int wr_fd() -.PP .B int rd_open(filename) .br .B char *filename; @@ -261,9 +259,6 @@ bytes from to file descriptor .IB fd . .PP -.I Wr_fd -returns the current output file descriptor. -.PP Most of the .I rd_ routines are the opposite of the diff --git a/modules/src/object/object.h b/modules/src/object/object.h index f08b6e0e8..028b1db61 100644 --- a/modules/src/object/object.h +++ b/modules/src/object/object.h @@ -36,6 +36,7 @@ #define put4(l, c) (* ((long *) (c)) = (l)) #endif +#define SECTCNT 3 /* number of sections with own output buffer */ #if BIGMACHINE #define WBUFSIZ (8*BUFSIZ) #else @@ -55,17 +56,15 @@ struct fil { extern struct fil __parts[]; -#define OUTBYTE(p, b) {if (__parts[p].cnt == 0) __wr_flush(&__parts[p]);\ - __parts[p].cnt--; *__parts[p].pnow++ = (b);} - #define PARTEMIT 0 -#define PARTRELO 1 -#define PARTNAME 2 -#define PARTCHAR 3 +#define PARTRELO (PARTEMIT+SECTCNT) +#define PARTNAME (PARTRELO+1) +#define PARTCHAR (PARTNAME+1) #ifdef SYMDBUG -#define PARTDBUG 4 +#define PARTDBUG (PARTCHAR+1) #else -#define PARTDBUG 3 +#define PARTDBUG (PARTCHAR+0) #endif #define NPARTS (PARTDBUG + 1) +#define getsect(s) (PARTEMIT+((s)>=(SECTCNT-1)?(SECTCNT-1):(s))) diff --git a/modules/src/object/rd.c b/modules/src/object/rd.c index dbc5e14f2..6f9d84374 100644 --- a/modules/src/object/rd.c +++ b/modules/src/object/rd.c @@ -11,6 +11,13 @@ extern long lseek(); /* * Parts of the output file. */ +#undef PARTEMIT +#undef PARTRELO +#undef PARTNAME +#undef PARTCHAR +#undef PARTDBUG +#undef NPARTS + #define PARTEMIT 0 #define PARTRELO 1 #define PARTNAME 2 diff --git a/modules/src/object/wr.c b/modules/src/object/wr.c index d3df4d30c..f6a166981 100644 --- a/modules/src/object/wr.c +++ b/modules/src/object/wr.c @@ -26,7 +26,8 @@ struct fil __parts[NPARTS]; static int outfile; static long currpos; #endif -static int sectionnr; +int __sectionnr; +#define sectionnr __sectionnr static int offcnt; __wr_flush(ptr) @@ -40,7 +41,7 @@ __wr_flush(ptr) #endif wr_bytes(ptr->fd, ptr->pbegin, (long)(ptr->pnow - ptr->pbegin)); ptr->currpos += ptr->pnow - ptr->pbegin; - if (ptr == &__parts[PARTEMIT]) { + if (ptr < &__parts[PARTEMIT+SECTCNT]) { offset[sectionnr] = ptr->currpos; } } @@ -70,7 +71,7 @@ static OUTWRITE(p, b, n) n -= i; b += i; ptr->currpos += i; - if (ptr == &__parts[PARTEMIT]) { + if (ptr < &__parts[PARTEMIT+SECTCNT]) { offset[sectionnr] = ptr->currpos; } } @@ -93,7 +94,7 @@ static OUTWRITE(p, b, n) b += m; n &= WBUFSIZ - 1; ptr->currpos += m; - if (ptr == &__parts[PARTEMIT]) { + if (ptr < &__parts[PARTEMIT+SECTCNT]) { offset[sectionnr] = ptr->currpos; } } @@ -126,6 +127,8 @@ static BEGINSEEK(p, o) #else ptr->currpos = lseek(ptr->fd, o, 0); #endif + if (p >= PARTRELO) o = 0; /* no attempt to align writes + for the time being */ ptr->cnt = WBUFSIZ - ((int)o & (WBUFSIZ-1)); ptr->pbegin = ptr->pbuf + (WBUFSIZ - ptr->cnt); ptr->pnow = ptr->pbegin; @@ -172,15 +175,6 @@ wr_close() #endif /* OUTSEEK */ } -wr_fd() -{ -#ifdef OUTSEEK - return outfile; -#else - return __parts[PARTEMIT].fd; -#endif -} - wr_ohead(head) register struct outhead *head; { @@ -239,6 +233,9 @@ wr_sect(sect, cnt1) put4(sect->os_size, c); c += 4; put4(sect->os_foff, c); c += 4; } + if (offcnt >= 1 && offcnt < SECTCNT) { + BEGINSEEK(PARTEMIT+offcnt, sect->os_foff); + } offset[offcnt++] = sect->os_foff; #if ! (BYTES_REVERSED || WORDS_REVERSED) if (sizeof(struct outsect) != SZ_SECT) @@ -262,10 +259,9 @@ wr_sect(sect, cnt1) wr_outsect(s) int s; /* section number */ { - register struct fil *ptr = &__parts[PARTEMIT]; + register struct fil *ptr = &__parts[PARTEMIT + getsect(sectionnr)]; - if (s != sectionnr && - offset[s] != ptr->currpos + (ptr->pnow - ptr->pbegin)) { + if (s != sectionnr && s >= (SECTCNT-1) && sectionnr >= (SECTCNT-1)) { #ifdef OUTSEEK if (currpos != ptr->currpos) currpos = lseek(ptr->fd, ptr->currpos, 0); @@ -276,7 +272,9 @@ wr_outsect(s) #endif ptr->currpos += ptr->pnow - ptr->pbegin; offset[sectionnr] = ptr->currpos; - ptr->currpos = lseek(ptr->fd, offset[s], 0); + if (offset[s] != ptr->currpos) { + ptr->currpos = lseek(ptr->fd, offset[s], 0); + } ptr->cnt = WBUFSIZ - ((int)offset[s] & (WBUFSIZ-1)); ptr->pbegin = ptr->pbuf + (WBUFSIZ - ptr->cnt); ptr->pnow = ptr->pbegin; @@ -291,7 +289,7 @@ wr_emit(emit, cnt) char *emit; long cnt; { - OUTWRITE(PARTEMIT, emit, cnt); + OUTWRITE(PARTEMIT + getsect(sectionnr) , emit, cnt); } wr_relo(relo, cnt) diff --git a/modules/src/object/wr_putc.c b/modules/src/object/wr_putc.c index 16d7f9d83..18ef03ab9 100644 --- a/modules/src/object/wr_putc.c +++ b/modules/src/object/wr_putc.c @@ -5,7 +5,12 @@ */ #include "object.h" +extern int __sectionnr; + wr_putc(ch) { - OUTBYTE(PARTEMIT, ch); + register struct fil *ptr = &__parts[PARTEMIT+getsect(__sectionnr)]; + + if (ptr->cnt == 0) __wr_flush(ptr); + ptr->cnt--; *ptr->pnow++ = ch; }