| 1 | LONGX CIB7::b6_hit(RECSTRU *irecp, LONGX nord, LONGX setno) |
|---|
| 2 | #else /* CICPP */ |
|---|
| 3 | LONGX b6_hit(cib6p,irec,nord,setno) /* |
|---|
| 4 | ----------- |
|---|
| 5 | abenda se vrecp nao inicializado; |
|---|
| 6 | abenda se registro irec nao alocado; |
|---|
| 7 | abenda se registro irec invalido; |
|---|
| 8 | retorna total de hits se nord = 0; |
|---|
| 9 | se nord > total de hits |
|---|
| 10 | zera hit e mfn correntes e retorna -1; |
|---|
| 11 | mantem controles para chamadas subsequentes; |
|---|
| 12 | retorna o mfn correspondente ao hit nord |
|---|
| 13 | (retorna -2 .. -n se algum erro) |
|---|
| 14 | */ |
|---|
| 15 | b6_CIB7 *cib6p; |
|---|
| 16 | LONGX irec; /* indice de vrecp, para info/store */ |
|---|
| 17 | LONGX nord; /* numero de ordem do hit a analisar */ |
|---|
| 18 | LONGX setno; /* query number */ |
|---|
| 19 | #endif /* CICPP */ |
|---|
| 20 | { |
|---|
| 21 | RECSTRU *recp; |
|---|
| 22 | LONGX hits,hcur,hsiz,hmfn; |
|---|
| 23 | int xdir_hits,xdir_hcur,xdir_hsiz,xdir_hmfn,xdir_hmem; |
|---|
| 24 | unsigned char *p; |
|---|
| 25 | char buffup[B7UPLEN+1]; /* area for fldupdat */ |
|---|
| 26 | char filname[CIMPL+1]; |
|---|
| 27 | int fd; |
|---|
| 28 | LONGX offset,mfn; |
|---|
| 29 | LONGX by8left,block,lastblock,maxblock; |
|---|
| 30 | LONGX bufleft,bufsiz,lastbsize; |
|---|
| 31 | off_t seek; |
|---|
| 32 | unsigned int toread,nr; |
|---|
| 33 | int loop,n,delta8,delta1,found; |
|---|
| 34 | |
|---|
| 35 | /* b6_CIB7 *debug=cib6p; */ |
|---|
| 36 | |
|---|
| 37 | #if HITTRACE |
|---|
| 38 | printf("b6_hit - irec,nord: %"_LD_,%"_LD_" \n",irec,nord); |
|---|
| 39 | #endif |
|---|
| 40 | #if SHOWCORE |
|---|
| 41 | if (b60trace) showcore("b6_hit"); |
|---|
| 42 | #endif |
|---|
| 43 | strcpy(b6errxy,"b6_hit"); /* b6_hiterr() */ |
|---|
| 44 | |
|---|
| 45 | #if CICPP |
|---|
| 46 | recp=irecp; |
|---|
| 47 | if (!recp) |
|---|
| 48 | #if CDROM |
|---|
| 49 | return(-2L); |
|---|
| 50 | #else |
|---|
| 51 | fatal("b6_hit/recp"); |
|---|
| 52 | #endif |
|---|
| 53 | if (!recp->recmfp) |
|---|
| 54 | #if CDROM |
|---|
| 55 | return(-3L); |
|---|
| 56 | #else |
|---|
| 57 | fatal("b6_hit/recmfp"); |
|---|
| 58 | #endif |
|---|
| 59 | #else /* CICPP */ |
|---|
| 60 | recp=vrecp[irec]; |
|---|
| 61 | if (!recp) |
|---|
| 62 | #if CDROM |
|---|
| 63 | return(-3L); |
|---|
| 64 | #else |
|---|
| 65 | fatal("b6_hit/irec"); |
|---|
| 66 | #endif |
|---|
| 67 | #endif /* CICPP */ |
|---|
| 68 | |
|---|
| 69 | if (RECtype != TYPEMFQ || RECrc != RCNORMAL) |
|---|
| 70 | #if CDROM |
|---|
| 71 | return(-4L); |
|---|
| 72 | #else |
|---|
| 73 | fatal("b6_hit/check"); |
|---|
| 74 | #endif |
|---|
| 75 | |
|---|
| 76 | #if CICPP |
|---|
| 77 | if ((xdir_hits=irecp->xfieldx(MFQTHITS,1)) < 0) |
|---|
| 78 | #else /* CICPP */ |
|---|
| 79 | if ((xdir_hits=fieldx(irec,MFQTHITS,1)) < 0) |
|---|
| 80 | #endif /* CICPP */ |
|---|
| 81 | #if CDROM |
|---|
| 82 | return(-5L); |
|---|
| 83 | #else |
|---|
| 84 | fatal("b6_hit/xdir_hits"); |
|---|
| 85 | #endif |
|---|
| 86 | |
|---|
| 87 | for (hits=0, p=(unsigned char *)FIELDP(xdir_hits), loop=DIRlen(xdir_hits); loop--; p++) |
|---|
| 88 | hits = hits * 10 + (*p - '0'); |
|---|
| 89 | if (nord < 0 || nord > (hits+1)) |
|---|
| 90 | #if CDROM |
|---|
| 91 | return(-6L); |
|---|
| 92 | #else |
|---|
| 93 | fatal("b6_hit/nord"); |
|---|
| 94 | #endif |
|---|
| 95 | |
|---|
| 96 | #if CICPP |
|---|
| 97 | if ((xdir_hcur=irecp->xfieldx(MFQTHCUR,1)) < 0) |
|---|
| 98 | #else /* CICPP */ |
|---|
| 99 | if ((xdir_hcur=fieldx(irec,MFQTHCUR,1)) < 0) |
|---|
| 100 | #endif /* CICPP */ |
|---|
| 101 | #if CDROM |
|---|
| 102 | return(-7L); |
|---|
| 103 | #else |
|---|
| 104 | fatal("b6_hit/xdir_hcur"); |
|---|
| 105 | #endif |
|---|
| 106 | |
|---|
| 107 | #if CICPP |
|---|
| 108 | if ((xdir_hmfn=irecp->xfieldx(MFQTHMFN,1)) < 0) |
|---|
| 109 | #else /* CICPP */ |
|---|
| 110 | if ((xdir_hmfn=fieldx(irec,MFQTHMFN,1)) < 0) |
|---|
| 111 | #endif /* CICPP */ |
|---|
| 112 | #if CDROM |
|---|
| 113 | return(-8L); |
|---|
| 114 | #else |
|---|
| 115 | fatal("b6_hit/xdir_hmfn"); |
|---|
| 116 | #endif |
|---|
| 117 | |
|---|
| 118 | #if CICPP |
|---|
| 119 | if ((xdir_hsiz=irecp->xfieldx(MFQTHSIZ,1)) < 0) |
|---|
| 120 | #else /* CICPP */ |
|---|
| 121 | if ((xdir_hsiz=fieldx(irec,MFQTHSIZ,1)) < 0) |
|---|
| 122 | #endif /* CICPP */ |
|---|
| 123 | #if CDROM |
|---|
| 124 | return(-9L); |
|---|
| 125 | #else |
|---|
| 126 | fatal("b6_hit/xdir_hsiz"); |
|---|
| 127 | #endif |
|---|
| 128 | |
|---|
| 129 | |
|---|
| 130 | if (nord == 0 || nord > hits) { |
|---|
| 131 | if (nord == 0) |
|---|
| 132 | mfn=hits; /* returning value */ |
|---|
| 133 | else |
|---|
| 134 | mfn=(-1L); |
|---|
| 135 | } |
|---|
| 136 | else { |
|---|
| 137 | for (hcur=0, p=(unsigned char *)FIELDP(xdir_hcur), loop=DIRlen(xdir_hcur); loop--; p++) |
|---|
| 138 | hcur = hcur * 10 + (*p - '0'); |
|---|
| 139 | for (hmfn=0, p=(unsigned char *)FIELDP(xdir_hmfn), loop=DIRlen(xdir_hmfn); loop--; p++) |
|---|
| 140 | hmfn = hmfn * 10 + (*p - '0'); |
|---|
| 141 | for (hsiz=0, p=(unsigned char *)FIELDP(xdir_hsiz), loop=DIRlen(xdir_hsiz); loop--; p++) |
|---|
| 142 | hsiz = hsiz * 10 + (*p - '0'); |
|---|
| 143 | #if HITTRACx |
|---|
| 144 | printf("b6_hit - rec - hits=%"_LD_" hcur=%"_LD_" hsiz=%"_LD_" hmfn=%"_LD_"\n", |
|---|
| 145 | hits,hcur,hsiz,hmfn); |
|---|
| 146 | #endif |
|---|
| 147 | if (hcur == nord) |
|---|
| 148 | mfn=hmfn; |
|---|
| 149 | else { |
|---|
| 150 | #if CICPP |
|---|
| 151 | if ((xdir_hmem=irecp->xfieldx(MFQTHMEM,1)) < 0) |
|---|
| 152 | #else /* CICPP */ |
|---|
| 153 | if ((xdir_hmem=fieldx(irec,MFQTHMEM,1)) < 0) |
|---|
| 154 | #endif /* CICPP */ |
|---|
| 155 | #if CDROM |
|---|
| 156 | return(-10L); |
|---|
| 157 | #else |
|---|
| 158 | fatal("b6_hit/xdir_hmem"); |
|---|
| 159 | #endif |
|---|
| 160 | if (!b6bufferp) |
|---|
| 161 | #if CICPP |
|---|
| 162 | b6_hballoc(hsiz,&(b6bufferp)); |
|---|
| 163 | if (b6bufferp->bufsiz <= 0) fatal("b6_hit/bufsiz"); |
|---|
| 164 | if (hcur == 0 || b6bufferp->setno != setno) b6_hbinit(setno,b6bufferp); |
|---|
| 165 | #else /* CICPP */ |
|---|
| 166 | b6_hballoc(cib6p,hsiz,&(b6bufferp)); |
|---|
| 167 | if (b6bufferp->bufsiz <= 0) fatal("b6_hit/bufsiz"); |
|---|
| 168 | if (hcur == 0 || b6bufferp->setno != setno) b6_hbinit(cib6p,setno,b6bufferp); |
|---|
| 169 | #endif /* CICPP */ |
|---|
| 170 | fd=0; found=0; |
|---|
| 171 | if (nord > hcur) { |
|---|
| 172 | delta8 = 8; delta1 = 1; |
|---|
| 173 | } |
|---|
| 174 | else { |
|---|
| 175 | delta8 = -8; delta1 = -1; |
|---|
| 176 | } |
|---|
| 177 | mfn = (hcur == 0) ? 0 : hmfn+delta1; |
|---|
| 178 | offset = (mfn/8); |
|---|
| 179 | |
|---|
| 180 | hsiz = hsiz/8 + 1; |
|---|
| 181 | |
|---|
| 182 | bufsiz = (b6bufferp->bufsiz <= hsiz) ? b6bufferp->bufsiz : hsiz; |
|---|
| 183 | block = offset / bufsiz; |
|---|
| 184 | maxblock = (hsiz-1) / bufsiz; |
|---|
| 185 | bufleft = (block+1)*bufsiz - offset; |
|---|
| 186 | p = b6bufferp->area + bufsiz - bufleft; |
|---|
| 187 | if (nord > hcur) { |
|---|
| 188 | lastblock = maxblock; |
|---|
| 189 | lastbsize = hsiz % bufsiz; /* hsiz - (lastblock+1)*bufsiz; */ |
|---|
| 190 | if (lastbsize == 0) lastbsize=bufsiz; |
|---|
| 191 | by8left = hsiz - offset; |
|---|
| 192 | if (block == lastblock) bufleft=lastbsize; |
|---|
| 193 | } |
|---|
| 194 | else { |
|---|
| 195 | lastblock = 0; |
|---|
| 196 | lastbsize = bufsiz; |
|---|
| 197 | by8left = offset + 1; |
|---|
| 198 | bufleft = bufsiz - bufleft + 1; |
|---|
| 199 | } |
|---|
| 200 | if (bufleft <= 0 || bufleft > bufsiz) fatal("b6_hit/bufleft"); |
|---|
| 201 | if (lastbsize <= 0 || lastbsize>bufsiz) fatal("b6_hit/lastbsize"); |
|---|
| 202 | if (b6bufferp->block != block) { |
|---|
| 203 | memcpy(filname,FIELDP(xdir_hmem),n=DIRlen(xdir_hmem)); |
|---|
| 204 | filname[n]='\0'; |
|---|
| 205 | fd=dbxopen(b6_gidbnp,filname,""); |
|---|
| 206 | seek=block*bufsiz; |
|---|
| 207 | if (LSEEK64(fd,seek,SEEK_SET) != seek) fatal("b6_hit/lseek"); |
|---|
| 208 | toread = (block == lastblock) ? lastbsize : bufsiz; |
|---|
| 209 | nr=(unsigned)CIREAD(fd,b6bufferp->area,toread); |
|---|
| 210 | if (nr != toread) fatal("b6_hit/read/1"); |
|---|
| 211 | b6bufferp->block = block; |
|---|
| 212 | #if HITTRACx |
|---|
| 213 | printf("b6_hit - left/1=%"_LD_"/%"_LD_" hcur=%"_LD_" nord=%"_LD_" mfn=%"_LD_" block=%"_LD_"=%d", |
|---|
| 214 | by8left,bufleft,hcur,nord,mfn,block,nr); |
|---|
| 215 | for (n=0; n < nr; n++) printf(" %02x",bufferp->area[n]); |
|---|
| 216 | printf("\n"); |
|---|
| 217 | #endif |
|---|
| 218 | } |
|---|
| 219 | for (; by8left--; p+=delta1) { |
|---|
| 220 | if (!bufleft--) { |
|---|
| 221 | block+=delta1; |
|---|
| 222 | if (block < 0 || block > maxblock) fatal("b6_hit/block"); |
|---|
| 223 | } |
|---|
| 224 | #if HITTRACx |
|---|
| 225 | printf("b6_hit - hcur=%"_LD_" nord=%"_LD_" mfn=%"_LD_" hmfn=%"_LD_" left=%"_LD_"/%"_LD_" |
|---|
| 226 | block=%"_LD_"\n", |
|---|
| 227 | hcur,nord,mfn,hmfn,by8left,bufleft,block); |
|---|
| 228 | #endif |
|---|
| 229 | if (b6bufferp->block != block) { |
|---|
| 230 | if (fd == 0) { |
|---|
| 231 | memcpy(filname,FIELDP(xdir_hmem),n=DIRlen(xdir_hmem)); |
|---|
| 232 | filname[n]='\0'; |
|---|
| 233 | fd=dbxopen(b6_gidbnp,filname,""); |
|---|
| 234 | } |
|---|
| 235 | seek=block*bufsiz; |
|---|
| 236 | if (LSEEK64(fd,seek,SEEK_SET) != seek) fatal("b6_hit/lseek"); |
|---|
| 237 | toread = (block == lastblock) ? lastbsize : bufsiz; |
|---|
| 238 | nr=(unsigned)CIREAD(fd,b6bufferp->area,toread); |
|---|
| 239 | if (nr != toread) fatal("b6_hit/read/2"); |
|---|
| 240 | b6bufferp->block = block; |
|---|
| 241 | bufleft = bufsiz; |
|---|
| 242 | if (block == lastblock) bufleft=lastbsize; |
|---|
| 243 | if (nord > hcur) |
|---|
| 244 | p = b6bufferp->area; |
|---|
| 245 | else |
|---|
| 246 | p = b6bufferp->area + (bufsiz - 1); |
|---|
| 247 | #if HITTRACx |
|---|
| 248 | printf("b6_hit - left/2=%"_LD_"/%"_LD_" hcur=%"_LD_" nord=%"_LD_" mfn=%"_LD_" block=%"_LD_"=%d", |
|---|
| 249 | by8left,bufleft,hcur,nord,mfn,block,nr); |
|---|
| 250 | for (n=0; n < nr; n++) printf(" %02x",b6bufferp->area[n]); |
|---|
| 251 | printf("\n"); |
|---|
| 252 | #endif |
|---|
| 253 | bufleft--; |
|---|
| 254 | } |
|---|
| 255 | if (!*p) { |
|---|
| 256 | mfn+=delta8; |
|---|
| 257 | #if HITTRACx |
|---|
| 258 | printf("b6_hit - hcur=%"_LD_" nord=%"_LD_" mfn=%"_LD_" *p=%02x - continue\n", |
|---|
| 259 | hcur,nord,mfn,*p); |
|---|
| 260 | #endif |
|---|
| 261 | } |
|---|
| 262 | else { |
|---|
| 263 | if (nord > hcur) |
|---|
| 264 | loop = 8 - (mfn&BY8RMASK); |
|---|
| 265 | else |
|---|
| 266 | loop = (mfn&BY8RMASK) + 1; |
|---|
| 267 | for (; loop--; mfn+=delta1) { |
|---|
| 268 | n=mfn&BY8RMASK; |
|---|
| 269 | #if HITTRACx |
|---|
| 270 | printf("b6_hit - hcur=%"_LD_" nord=%"_LD_" mfn=%"_LD_" *p=%02x loop=%d n=%d\n", |
|---|
| 271 | hcur,nord,mfn,*p,loop,n); |
|---|
| 272 | #endif |
|---|
| 273 | if (*p & bitmask[n]) { |
|---|
| 274 | hmfn=mfn; hcur+=delta1; |
|---|
| 275 | if (nord == hcur) { |
|---|
| 276 | found=1; |
|---|
| 277 | by8left=0; /* break */ |
|---|
| 278 | break; |
|---|
| 279 | } |
|---|
| 280 | } |
|---|
| 281 | } |
|---|
| 282 | } |
|---|
| 283 | } /* end for by8left */ |
|---|
| 284 | if (!found) fatal("b6_hit/found"); |
|---|
| 285 | |
|---|
| 286 | if (fd) CLOSE(fd); |
|---|
| 287 | |
|---|
| 288 | /* store */ |
|---|
| 289 | sprintf(buffup,B7EDIT1,hcur); |
|---|
| 290 | memcpy(FIELDP(xdir_hcur),buffup,B7UPLEN); |
|---|
| 291 | sprintf(buffup,B7EDIT1,hmfn); |
|---|
| 292 | memcpy(FIELDP(xdir_hmfn),buffup,B7UPLEN); |
|---|
| 293 | |
|---|
| 294 | } /* end else hcur == nord */ |
|---|
| 295 | |
|---|
| 296 | } /* end else nord == 0 || nord > hits */ |
|---|
| 297 | |
|---|
| 298 | #if HITTRACE |
|---|
| 299 | printf("b6_hit - mfn: %"_LD_"\n",mfn); |
|---|
| 300 | #endif |
|---|
| 301 | #if SHOWCORE |
|---|
| 302 | if (b60trace) showcore("b6_hit - exit"); |
|---|
| 303 | #endif |
|---|
| 304 | return(mfn); |
|---|
| 305 | } |
|---|