Annotation of researchv9/jtools/src/pads/host/cache.c, revision 1.1.1.1

1.1       root        1: #include <pads.pri>
                      2: SRCFILE("cache.c")
                      3: 
                      4: static CartesMade, CarteBytes, ItemsMade, ItemBytes;
                      5: 
                      6: char *CacheStats()
                      7: {
                      8:        static char report[128];
                      9: 
                     10:        sprintf( report, "terminal: %d Cartes in %d bytes; %d Items in %d bytes",
                     11:                CartesMade, CarteBytes, ItemsMade, ItemBytes );
                     12:        return report;
                     13: }
                     14: 
                     15: short Index::sht()             { return (major<<8) | minor; }
                     16: 
                     17: Item::Item(char* t,Action a,long o)    { text = t; action = a; opand = o; }
                     18: Item::Item()                           { text = "error"; action = 0; opand = 0; }
                     19: 
                     20: int Cache::ok() { return this!=0; }    
                     21: 
                     22: Cache::Cache( unsigned char maj, unsigned char min )
                     23: {
                     24:        trace( "%d.Cache(%d,%d)", this, maj, min );     VOK;
                     25:        SIZE = Index(maj,min);
                     26:        current = Index(0,1);
                     27: }
                     28: 
                     29: ItemCache::ItemCache():(250,250)       /* (250,250) for megabyte term */
                     30: {
                     31:        trace( "%d.ItemCache()", this );        VOK;
                     32:        cache = new Item** [SIZE.major];
                     33:        ItemBytes += SIZE.major*4;                              /* term */
                     34:        R->pktstart( P_I_DEFINE );
                     35:        R->sendshort(SIZE.sht());
                     36:        R->pktend();
                     37: };
                     38: 
                     39: CarteCache::CarteCache():(250,250)     /* (250,250) for megabyte term */
                     40: {
                     41:        trace( "%d.CarteCache()", this );       VOK;
                     42:        cache = new Carte** [SIZE.major];
                     43:        CarteBytes += SIZE.major*4;                             /* term */
                     44:        R->pktstart( P_C_DEFINE );
                     45:        R->sendshort(SIZE.sht());
                     46:        R->pktend();
                     47: };
                     48: 
                     49: int ItemCmp( Item *a, Item *b )
                     50: {
                     51:        int cmp = strcmp(a->text,b->text);
                     52:        if( cmp ) return cmp;
                     53:        if( a->action == b->action ) return a->opand - b->opand;
                     54:        return (long)a->action - (long)b->action;
                     55: }
                     56: 
                     57: Index ItemCache::place( Item i )
                     58: {
                     59:        Binary  *b, *above;
                     60:        int     cmp, size;
                     61:        Item    copy;
                     62: 
                     63:        trace( "%d.index(%s,%d,%d)", this, i.text, i.action, i.opand );OK(0);
                     64:        for( b = root; b; above = b, b = cmp < 0 ? b->left : b->right ){
                     65:                cmp = ItemCmp( &i, cache[b->index.major][b->index.minor] );
                     66:                if( cmp == 0 ){
                     67:                        trace( "%d:%d", b->index.major, b->index.minor );
                     68:                        return b->index;
                     69:                }
                     70:        }
                     71:        b = new Binary;
                     72:        if( !root ) root = b;
                     73:        else if( cmp < 0 ) above->left = b;
                     74:        else above->right = b;
                     75:        if( (size = strlen(i.text)+1) >= SIZE.minor ) abort();
                     76:        trace( "%d %d %d", size, current.minor, size+current.minor );
                     77:        if( size+current.minor >= SIZE.minor ){
                     78:                if( ++current.major >= SIZE.major )
                     79:                        abort();
                     80:                current.minor = 0;
                     81:        }
                     82:        if( !cache[current.major] ){
                     83:                trace( "Item alloc %d", current.major );
                     84:                cache[current.major] = new Item* [SIZE.minor];
                     85:                ItemBytes += SIZE.minor;                                // term
                     86:        }
                     87:        b->index = current;
                     88:        copy = i;
                     89:        copy.text = sf( "%s", i.text);
                     90:        cache[current.major][current.minor] = new Item;                 // ccom bug
                     91:        *(cache[current.major][current.minor]) = copy;                  // 860224
                     92:        trace( "%s:%d:%d", copy.text, copy.action, copy.opand );
                     93:        R->pktstart( P_I_CACHE );
                     94:        R->sendshort(current.sht());
                     95:        R->sendstring( sf("%0.64s", copy.text) );
                     96:        R->pktend();
                     97:        ++ItemsMade;
                     98:        current.minor += size;
                     99:        trace( "%s", CacheStats() );
                    100:        trace( "%d:%d", b->index.major, b->index.minor );
                    101:        return b->index;
                    102: }
                    103: 
                    104: Item *ItemCache::take(Index i)
                    105: {
                    106:        trace( "%d.take(%d:%d)", this, i.major, i.minor ); OK(0);
                    107:        if( (i.major&CARTE) || i.major>=SIZE.major
                    108:         || !cache[i.major] || !cache[i.major][i.minor] ) abort();
                    109:        return cache[i.major][i.minor];
                    110: }
                    111: 
                    112: int CarteCmp( Carte *a, Carte *b )
                    113: {
                    114:        int i;
                    115:        IF_LIVE( !a || !b || a->size<=0 || b->size<=0 ) return 0;
                    116:        if( a->size != b->size ) return a->size - b->size;
                    117:        for( i = 0; i <= a->size; ++i )
                    118:                if( a->bin[i].sht() != b->bin[i].sht() )
                    119:                        return a->bin[i].sht() - b->bin[i].sht();
                    120:        return 0;
                    121: }
                    122: 
                    123: Index CarteCache::place( Carte *c )
                    124: {
                    125:        Binary  *b, *above;
                    126:        int     cmp, i;
                    127:        Carte   *copy;
                    128: 
                    129:        trace( "%d.place(%d)", this, c );       OK(0);
                    130:        for( b = root; b; above = b, b = cmp < 0 ? b->left : b->right ){
                    131:                cmp = CarteCmp( c, cache[b->index.major][b->index.minor] );
                    132:                if( cmp == 0 ){
                    133:                        trace( "%d:%d", b->index.major, b->index.minor );
                    134:                        { Index ix = b->index; ix.major|=CARTE; return ix; }
                    135:                }
                    136:        }
                    137:        b = new Binary;
                    138:        if( !root ) root = b;
                    139:        else if( cmp < 0 ) above->left = b;
                    140:        else above->right = b;
                    141:        if( current.minor >= SIZE.minor ){
                    142:                if( ++current.major >= SIZE.major )
                    143:                        abort();
                    144:                current.minor = 0;
                    145:        }
                    146:        if( !cache[current.major] ){
                    147:                trace( "Carte alloc %d", current.major );
                    148:                cache[current.major] = new Carte* [SIZE.minor];
                    149:                CarteBytes += SIZE.minor*4;                     /* term */
                    150:        }
                    151:        b->index = current;
                    152:        cache[current.major][current.minor] = copy =
                    153:                (Carte *) new char [CARTESIZE(c->size)];
                    154:        CarteBytes += c->size*2+4;                              /* term */
                    155:        *copy = *c;
                    156:        for( i = 0; i <= copy->size; ++i ) copy->bin[i] = c->bin[i];
                    157:        R->pktstart( P_C_CACHE );
                    158:        R->sendshort(current.sht());
                    159:        if( copy->attrib&NUMERIC ) {
                    160:                R->senduchar( 1 );
                    161:                R->senduchar( copy->attrib );
                    162:                R->sendshort( copy->bin[0].sht() );
                    163:                R->sendshort( copy->bin[1].sht() );
                    164:        } else {
                    165:                R->senduchar( copy->size );
                    166:                R->senduchar( copy->attrib );
                    167:                for( i = 0; i <= copy->size; ++i )
                    168:                        R->sendshort( copy->bin[i].sht() );
                    169:        }
                    170:        cartelimits(copy);
                    171:        R->senduchar(copy->items);
                    172:        R->senduchar(copy->width);
                    173:        R->pktend();
                    174:        ++CartesMade;
                    175:        ++current.minor;
                    176:        trace( "%s", CacheStats() );
                    177:        trace( "%d:%d", b->index.major, b->index.minor );
                    178:        { Index ix = b->index; ix.major|=CARTE; return ix; }
                    179: }
                    180: 
                    181: Carte *CarteCache::take(Index i)
                    182: {
                    183:        trace( "%d.take(0x%X)", i.sht() ); OK(0);
                    184:        IF_LIVE( !(i.major&CARTE) ) return 0;
                    185:        i.major &= ~CARTE;
                    186:        IF_LIVE(i.major>=SIZE.major || !cache[i.major] || !cache[i.major][i.minor])
                    187:                return 0;
                    188:        return cache[i.major][i.minor];
                    189: }
                    190: 
                    191: Index CarteCache::numeric(short lo, short hi)
                    192: {
                    193:        Index ix;
                    194:        Carte *c;
                    195: 
                    196:        trace( "%d.Carte(%d,%d)", this, lo, hi );       OK(0);
                    197:        IF_LIVE( lo > hi ) return 0;
                    198:        c = (Carte *) new char [CARTESIZE(2)];
                    199:        if( hi > lo+255 ) hi = lo+255;
                    200:        c->size = 2;
                    201:        c->attrib = NUMERIC;
                    202:        c->bin[1] = Index(lo);
                    203:        c->bin[2] = Index(hi);
                    204:        ix = place(c);
                    205:        trace( "%u:%u", ix.major, ix.minor );
                    206:        return ix;
                    207: }
                    208: 
                    209: Index NumericRange(short lo, short hi) { return CCache->numeric(lo,hi); }
                    210: 
                    211: void CarteCache::cartelimits(Carte *c)
                    212: {
                    213:        trace( "%d.ItemCount(%d)", this, c ); VOK;
                    214:        c->items = c->width = 0;
                    215:        if( c->attrib&NUMERIC ){
                    216:                c->items = c->bin[2].sht() - c->bin[1].sht() + 1;
                    217:                c->width = 5;                   /* max log10 d ? */
                    218:                return;
                    219:        }
                    220:        for( int j = 1; j <= c->size; ++j ){
                    221:                if( c->bin[j].major&CARTE ){
                    222:                        Carte *t = take(c->bin[j]);
                    223:                        if( t->bin[0].null() ){
                    224:                                c->items += t->items;
                    225:                                if( t->width > c->width ) c->width = t->width;
                    226:                        } else {
                    227:                                ++c->items;
                    228:                                int l = strlen(ICache->take(t->bin[0])->text);
                    229:                                if( l > c->width ) c->width = l;
                    230:                        }
                    231:                } else {
                    232:                        ++c->items;
                    233:                        int l = strlen(ICache->take(c->bin[j])->text);
                    234:                        if( l > c->width ) c->width = l;
                    235:                }
                    236:        }
                    237: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.