made bittable dynamic

This commit is contained in:
ceriel 1988-06-16 13:24:10 +00:00
parent 184984d472
commit a0934dc7e0
4 changed files with 39 additions and 13 deletions

View file

@ -26,7 +26,6 @@
/* table sizes */ /* table sizes */
#define STRINGMAX 200 /* <= 256 */ #define STRINGMAX 200 /* <= 256 */
#define BITMAX 2000 /* for short or long branches */
#define SECTMAX 64 #define SECTMAX 64
#define NAMEMAX 80 #define NAMEMAX 80
#define MEMINCR 2048 #define MEMINCR 2048

View file

@ -78,9 +78,11 @@ extern short hashindex; /* see item_search() */
extern item_t *fb_ptr[4*FB_SIZE]; extern item_t *fb_ptr[4*FB_SIZE];
#ifdef THREE_PASS #ifdef THREE_PASS
extern char bittab[BITMAX>>3]; #define BITCHUNK (8 * MEMINCR)
/* one bit per small-large decision */ extern int nbits;
extern long nbits; /* number of decisions so far */ extern int bitindex; /* bitindex * MEMINCR * 8 + nbits gives
number of decisions so far
*/
#endif #endif
#ifdef LISTING #ifdef LISTING

View file

@ -139,6 +139,11 @@ char **argv;
register nfile = 0; register nfile = 0;
#endif #endif
#ifdef THREE_PASS
bitindex = -1;
nbits = BITCHUNK;
#endif
tempfile = fftemp(temppath, "asTXXXXXX"); tempfile = fftemp(temppath, "asTXXXXXX");
#ifdef LISTING #ifdef LISTING
listmode = dflag; listmode = dflag;
@ -384,7 +389,8 @@ pass_23(n)
listeoln = 1; listeoln = 1;
#endif #endif
#ifdef THREE_PASS #ifdef THREE_PASS
nbits = 0; bitindex = -1;
nbits = BITCHUNK;
#endif #endif
for (i = 0; i < FB_SIZE; i++) for (i = 0; i < FB_SIZE; i++)
fb_ptr[FB_FORW+i] = fb_ptr[FB_HEAD+i]; fb_ptr[FB_FORW+i] = fb_ptr[FB_HEAD+i];

View file

@ -172,6 +172,9 @@ listline(textline)
/* ---------- code optimization ---------- */ /* ---------- code optimization ---------- */
#ifdef THREE_PASS #ifdef THREE_PASS
#define PBITTABSZ 128
static char *pbittab[PBITTABSZ];
small(fitsmall, gain) small(fitsmall, gain)
{ {
register bit; register bit;
@ -181,16 +184,32 @@ small(fitsmall, gain)
nosect(); nosect();
if (bflag) if (bflag)
return(0); return(0);
if (nbits == BITMAX) { if (nbits == BITCHUNK) {
static int w_given; bitindex++;
if (pass == PASS_1 && ! w_given) { nbits = 0;
w_given = 1; if (bitindex == PBITTABSZ) {
warning("bit table overflow"); static int w_given;
if (pass == PASS_1 && ! w_given) {
w_given = 1;
warning("bit table overflow");
}
return(0);
} }
return(0); if (pbittab[bitindex] == 0 && pass == PASS_1) {
if ((pbittab[bitindex] = malloc(MEMINCR)) == 0) {
static int w2_given;
if (!w2_given) {
w2_given = 1;
warning("out of space for bit table");
}
}
}
if (pbittab[bitindex] == 0)
return (0);
} }
p = &bittab[(int) (nbits>>3)]; bit = 1 << (nbits&7);
bit = 1 << ((int)nbits&7); p = pbittab[bitindex]+(nbits>>3);
nbits++; nbits++;
switch (pass) { switch (pass) {
case PASS_1: case PASS_1: