|
|
1.1 root 1: #define SF_HASH 823
2: struct SF_CELL {
3: SF_CELL *link;
4: char buf[1];
5: };
6: void sprintf(char*, char* ...);
7:
8: char *sf(char *f ... )
9: {
10: int *a = (int*)&f;
11: static SF_CELL *Table[SF_HASH];
12: static Calls, Strings, Worst, Bytes;
13: char x[1024], *p;
14: unsigned long len, h, i;
15: struct SF_CELL *s;
16:
17: if( !f ){
18: static char report[128];
19: sprintf( report, "strings=%d calls=%d worst=%d bytes=%d",
20: Strings, Calls, Worst, Bytes );
21: return report;
22: }
23: ++Calls;
24: sprintf( x, f, a[1], a[2], a[3], a[4], a[5], a[6], a[7], a[8], a[9] );
25: h = 0;
26: for( len = 0, p = x; *p; )
27: h += (*p++) << (++len%4);
28: h %= SF_HASH;
29: for( s=Table[h],i=1; s; s=s->link,++i )
30: if(!strcmp(x,s->buf)) return s->buf;
31: ++Strings;
32: if( i>Worst ) Worst = i;
33: len = (len+4+sizeof(SF_CELL*)) / 4 * 4; /* vax */
34: s = (SF_CELL*) new char [len];
35: if( !s ) return "sf(): out of memory";
36: Bytes += len;
37: s->link = Table[h];
38: Table[h] = s;
39: strcpy( s->buf, x );
40: return s->buf;
41: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.