Lines Matching refs:tab

53 static int vdputinst(Table_t* tab, uchar* begs, uchar* here, reg int copy, int n_copy)
55 static int vdputinst(tab, begs, here, copy, n_copy)
56 Table_t* tab;
67 c_addr = (here-tab->tar)+tab->n_src; /* current address */
80 { if((d = copy - tab->recent[n]) < 0 || d >= best)
85 if(best >= I_MORE && tab->quick[n = copy%K_QSIZE] == copy)
97 K_UPDATE(tab->quick,tab->recent,tab->rhere,copy);
117 if(VDPUTC((Vdio_t*)tab,i_add) < 0 )
120 (*_Vdputu)((Vdio_t*)tab, (ulong)A_PUT(n_add)) < 0 )
122 if((*_Vdwrite)((Vdio_t*)tab, begs, n_add) < 0 )
127 { if(!MERGABLE(n_add,n_copy,k_type) && VDPUTC((Vdio_t*)tab,i_copy) < 0 )
131 (*_Vdputu)((Vdio_t*)tab, (ulong)C_PUT(n_copy)) < 0 )
135 { if(VDPUTC((Vdio_t*)tab,(uchar)best) < 0 )
139 { if((*_Vdputu)((Vdio_t*)tab, (ulong)best) < 0 )
150 static int vdfold(Table_t* tab, reg uchar* fold, reg uchar* endfold, int target)
152 static int vdfold(tab, fold, endfold, target)
153 Table_t* tab;
163 reg int head, len, n_src = tab->n_src;
164 reg uchar *src = tab->src, *tar = tab->tar;
165 reg int size = tab->size, *link = tab->link, *hash = tab->hash;
173 curm = (fold - tab->tar) + n_src;
174 else curm = (fold - tab->src);
242 { if(target && vdputinst(tab,add,fold,bestm,len) < 0)
292 { if((len = (tab->tar+tab->n_tar) - endfold) > 0 ) /* match at end */
296 return vdputinst(tab,add,endfold,bestm,len);
303 static int vdprocess(Table_t* tab)
305 static int vdprocess(tab)
306 Table_t* tab;
313 src = tab->src;
314 tar = tab->tar;
315 if((n_tar = tab->n_tar) <= 0)
317 if((n_src = tab->n_src) <= 0)
318 return vdfold(tab,tar,tar+n_tar,1);
326 if((hn = tar - tab->tar) < LARGE_MATCH )
327 { tar = tab->tar;
328 src = tab->src;
332 { if(vdputinst(tab,NIL(uchar*),tab->tar,0,hn) < 0)
339 endtar = tab->tar + n_tar - 1;
340 endsrc = tab->src + n_src - 1;
349 if((tn = (tab->tar+n_tar) - endtar) < LARGE_MATCH)
350 { endtar = tab->tar+n_tar;
351 endsrc = tab->src+n_src;
360 if(vdfold(tab,src,endsrc,0) < 0)
363 return vdfold(tab,tar,endtar,1);
378 Table_t tab;
393 tab.n_src = tab.n_tar = tab.size = 0;
394 tab.tar = tab.src = NIL(uchar*);
395 tab.link = NIL(int*);
396 tab.hash = NIL(int*);
397 INIT(&tab.io,delta);
405 if(!target->data && !(tab.tar = (uchar*)malloc(size*sizeof(uchar))) )
427 if(size > 0 && !(tab.src = (uchar*)malloc(size*sizeof(uchar))) )
437 if(!(tab.hash = (int*)malloc(k*sizeof(int))) )
441 tab.link = tab.hash+size;
442 tab.size = size-1;
446 if(tab.tar)
447 { free((Void_t*)tab.tar);
448 tab.tar = NIL(uchar*);
450 if(tab.src)
451 { free((Void_t*)tab.src);
452 tab.src = NIL(uchar*);
463 if((*_Vdwrite)(&tab.io,(uchar*)VD_MAGIC,k) != k ||
464 (*_Vdputu)(&tab.io,(ulong)n_tar) <= 0 ||
465 (*_Vdputu)(&tab.io,(ulong)n_src) <= 0 ||
466 (*_Vdputu)(&tab.io,(ulong)window) <= 0 )
474 tab.n_src = 0;
478 tab.src = tab.tar + tab.n_tar - size;
479 else memcpy((Void_t*)tab.src,
480 (Void_t*)(tab.tar + tab.n_tar - size),
482 tab.n_src = size;
495 tab.src = (uchar*)source->data + p;
496 else if((*source->readf)(tab.src,size,p,source) != size)
498 tab.n_src = size;
506 tab.n_tar = size;
508 tab.tar = (uchar*)target->data + n;
510 { size = (*target->readf)(tab.tar, size, (long)n, target);
511 if((long)size != tab.n_tar)
516 for(k = tab.size; k >= 0; --k)
517 tab.hash[k] = -1;
518 K_INIT(tab.quick,tab.recent,tab.rhere);
520 if(vdprocess(&tab) < 0)
527 (void)(*_Vdflsbuf)(&tab.io);
529 if(!target->data && tab.tar)
530 free((Void_t*)tab.tar);
531 if(tab.src && ((n_src <= 0 && !target->data) || (n_src > 0 && !source->data) ) )
532 free((Void_t*)tab.src);
533 if(tab.hash)
534 free((Void_t*)tab.hash);
536 return tab.io.here + (tab.io.next - tab.io.data);