| 1 | LONGX b5_hit(irec,nord,buffup) /* |
|---|
| 2 | ----------- |
|---|
| 3 | abenda se vrecp nao inicializado; |
|---|
| 4 | abenda se registro irec nao alocado; |
|---|
| 5 | abenda se registro irec invalido; |
|---|
| 6 | retorna total de hits se nord = 0; |
|---|
| 7 | se nord > total de hits |
|---|
| 8 | zera hit e mfn correntes e retorna -1; |
|---|
| 9 | mantem controles para chamadas subsequentes; |
|---|
| 10 | retorna o mfn correspondente ao hit nord |
|---|
| 11 | (retorna -2 .. -n se algum erro) |
|---|
| 12 | */ |
|---|
| 13 | LONGX irec; /* indice de vrecp, para info/store */ |
|---|
| 14 | LONGX nord; /* numero de ordem do hit a analisar */ |
|---|
| 15 | char *buffup; /* area addr for fldupdat */ |
|---|
| 16 | { |
|---|
| 17 | RECSTRU *recp; |
|---|
| 18 | LONGX hits,hcur,hsiz,hmfn; |
|---|
| 19 | int xdir_hits,xdir_hcur,xdir_hsiz,xdir_hmfn,xdir_hmem; |
|---|
| 20 | unsigned char *p; |
|---|
| 21 | LONGX offset,mfn; |
|---|
| 22 | LONGX loop; |
|---|
| 23 | int loop2,n,delta8,delta1; |
|---|
| 24 | #if CHKFOUND |
|---|
| 25 | int found; |
|---|
| 26 | #endif |
|---|
| 27 | #if HITTRACE |
|---|
| 28 | printf("b6_hit - irec,nord: %"_LD_,%"_LD_" \n",irec,nord); |
|---|
| 29 | #endif |
|---|
| 30 | #if SHOWCORE |
|---|
| 31 | if (b60trace) showcore("b6_hit"); |
|---|
| 32 | #endif |
|---|
| 33 | strcpy(b62errxy,"b6_hit"); /* b6_hiterr() */ |
|---|
| 34 | if (!nrecs) |
|---|
| 35 | #if CDROM |
|---|
| 36 | return(-2L); |
|---|
| 37 | #else |
|---|
| 38 | fatal("b6_hit/nrecs"); |
|---|
| 39 | #endif |
|---|
| 40 | recp=vrecp[irec]; |
|---|
| 41 | if (!recp) |
|---|
| 42 | #if CDROM |
|---|
| 43 | return(-3L); |
|---|
| 44 | #else |
|---|
| 45 | fatal("b6_hit/irec"); |
|---|
| 46 | #endif |
|---|
| 47 | if (RECtype != TYPEMFQ || RECrc != RCNORMAL) |
|---|
| 48 | #if CDROM |
|---|
| 49 | return(-4L); |
|---|
| 50 | #else |
|---|
| 51 | fatal("b6_hit/check"); |
|---|
| 52 | #endif |
|---|
| 53 | if ((xdir_hits=fieldx(irec,MFQTHITS,1)) < 0) |
|---|
| 54 | #if CDROM |
|---|
| 55 | return(-5L); |
|---|
| 56 | #else |
|---|
| 57 | fatal("b6_hit/xdir_hits"); |
|---|
| 58 | #endif |
|---|
| 59 | for (hits=0, p=FIELDP(xdir_hits), loop=DIRlen(xdir_hits); loop--; p++) |
|---|
| 60 | hits = hits * 10 + (*p - '0'); |
|---|
| 61 | if (nord < 0 || nord > (hits+1)) |
|---|
| 62 | #if CDROM |
|---|
| 63 | return(-6L); |
|---|
| 64 | #else |
|---|
| 65 | fatal("b6_hit/nord"); |
|---|
| 66 | #endif |
|---|
| 67 | if ((xdir_hcur=fieldx(irec,MFQTHCUR,1)) < 0) |
|---|
| 68 | #if CDROM |
|---|
| 69 | return(-7L); |
|---|
| 70 | #else |
|---|
| 71 | fatal("b6_hit/xdir_hcur"); |
|---|
| 72 | #endif |
|---|
| 73 | if ((xdir_hmfn=fieldx(irec,MFQTHMFN,1)) < 0) |
|---|
| 74 | #if CDROM |
|---|
| 75 | return(-8L); |
|---|
| 76 | #else |
|---|
| 77 | fatal("b6_hit/xdir_hmfn"); |
|---|
| 78 | #endif |
|---|
| 79 | if ((xdir_hsiz=fieldx(irec,MFQTHSIZ,1)) < 0) |
|---|
| 80 | #if CDROM |
|---|
| 81 | return(-9L); |
|---|
| 82 | #else |
|---|
| 83 | fatal("b6_hit/xdir_hsiz"); |
|---|
| 84 | #endif |
|---|
| 85 | if (nord == 0 || nord > hits) { |
|---|
| 86 | hcur=hmfn=0; |
|---|
| 87 | if (nord == 0) |
|---|
| 88 | mfn=hits; /* returning value */ |
|---|
| 89 | else |
|---|
| 90 | mfn=(-1L); |
|---|
| 91 | } |
|---|
| 92 | else { |
|---|
| 93 | for (hcur=0, p=FIELDP(xdir_hcur), loop=DIRlen(xdir_hcur); loop--; p++) |
|---|
| 94 | hcur = hcur * 10 + (*p - '0'); |
|---|
| 95 | for (hmfn=0, p=FIELDP(xdir_hmfn), loop=DIRlen(xdir_hmfn); loop--; p++) |
|---|
| 96 | hmfn = hmfn * 10 + (*p - '0'); |
|---|
| 97 | for (hsiz=0, p=FIELDP(xdir_hsiz), loop=DIRlen(xdir_hsiz); loop--; p++) |
|---|
| 98 | hsiz = hsiz * 10 + (*p - '0'); |
|---|
| 99 | #if HITTRACx |
|---|
| 100 | printf("b6_hit - rec - hits=%"_LD_" hcur=%"_LD_" hsiz=%"_LD_" hmfn=%"_LD_"\n", |
|---|
| 101 | hits,hcur,hsiz,hmfn); |
|---|
| 102 | #endif |
|---|
| 103 | if (hcur == nord) |
|---|
| 104 | mfn=hmfn; |
|---|
| 105 | else { |
|---|
| 106 | if ((xdir_hmem=fieldx(irec,MFQTHMEM,1)) < 0) |
|---|
| 107 | #if CDROM |
|---|
| 108 | return(-10L); |
|---|
| 109 | #else |
|---|
| 110 | fatal("b6_hit/xdir_hmen"); |
|---|
| 111 | #endif |
|---|
| 112 | if (nord > hcur) { |
|---|
| 113 | #if UNIX |
|---|
| 114 | delta8 = 8; delta1 = 1; |
|---|
| 115 | #else |
|---|
| 116 | delta8 = +8; delta1 = +1; |
|---|
| 117 | #endif |
|---|
| 118 | } |
|---|
| 119 | else { |
|---|
| 120 | delta8 = -8; delta1 = -1; |
|---|
| 121 | } |
|---|
| 122 | #if CDUSP |
|---|
| 123 | mfn = (hcur == 0) ? 0 : hmfn+delta1; |
|---|
| 124 | #else |
|---|
| 125 | mfn = (hmfn == 0) ? 0 : hmfn+delta1; |
|---|
| 126 | #endif |
|---|
| 127 | offset=(mfn/8); |
|---|
| 128 | for (p=FIELDP(xdir_hmem)+offset; hcur != nord; ) { |
|---|
| 129 | loop=(nord > hcur) ? hsiz-(mfn/8) : (mfn/8); |
|---|
| 130 | #if CHKFOUND |
|---|
| 131 | found=0; |
|---|
| 132 | #endif |
|---|
| 133 | #if HITTRACx |
|---|
| 134 | printf("b6_hit - hcur=%"_LD_" nord=%"_LD_" mfn=%"_LD_" *p=%02x loop=%"_LD_" - hmfn=%"_LD_"\n", |
|---|
| 135 | hcur,nord,mfn,*p,loop,hmfn); |
|---|
| 136 | #endif |
|---|
| 137 | do { |
|---|
| 138 | if (!*p) { |
|---|
| 139 | p+=delta1; mfn+=delta8; |
|---|
| 140 | #if HITTRACx |
|---|
| 141 | printf("b6_hit - hcur=%"_LD_" nord=%"_LD_" mfn=%"_LD_" *p=%02x loop=%"_LD_" - continue\n", |
|---|
| 142 | hcur,nord,mfn,*p,loop); |
|---|
| 143 | #endif |
|---|
| 144 | continue; |
|---|
| 145 | } |
|---|
| 146 | if (nord > hcur) |
|---|
| 147 | loop2 = 8 - (mfn&BY8RMASK); |
|---|
| 148 | else |
|---|
| 149 | loop2 = (mfn&BY8RMASK) + 1; |
|---|
| 150 | for (; loop2--; mfn+=delta1) { |
|---|
| 151 | n=mfn&BY8RMASK; |
|---|
| 152 | #if HITTRACx |
|---|
| 153 | printf("b6_hit - hcur=%"_LD_" nord=%"_LD_" mfn=%"_LD_" *p=%02x loop=%"_LD_" loop2=%d n=%d\n", |
|---|
| 154 | hcur,nord,mfn,*p,loop,loop2,n); |
|---|
| 155 | #endif |
|---|
| 156 | if (*p & bitmask[n]) { |
|---|
| 157 | #if CHKFOUND |
|---|
| 158 | found=1; |
|---|
| 159 | #endif |
|---|
| 160 | hmfn=mfn; hcur+=delta1; |
|---|
| 161 | if (nord == hcur) |
|---|
| 162 | break; |
|---|
| 163 | } |
|---|
| 164 | } |
|---|
| 165 | #if CHKFOUND |
|---|
| 166 | if (found) { |
|---|
| 167 | #endif |
|---|
| 168 | if (nord > hcur) { |
|---|
| 169 | if (n == BY8RMASK) |
|---|
| 170 | p++; |
|---|
| 171 | } |
|---|
| 172 | else |
|---|
| 173 | if (n == 0) |
|---|
| 174 | p--; |
|---|
| 175 | break; |
|---|
| 176 | #if CHKFOUND |
|---|
| 177 | } |
|---|
| 178 | else |
|---|
| 179 | fatal("b6_hit/bug1"); |
|---|
| 180 | #endif |
|---|
| 181 | } while (--loop > 0); |
|---|
| 182 | #if CHKFOUND |
|---|
| 183 | if (!found) |
|---|
| 184 | fatal("b6_hit/bug2"); |
|---|
| 185 | #endif |
|---|
| 186 | } /* end for hcur != nord */ |
|---|
| 187 | } /* end else hcur == nord */ |
|---|
| 188 | } /* end else nord == 0 || nord > hits */ |
|---|
| 189 | /* store */ |
|---|
| 190 | sprintf(buffup,B5EDIT1,hcur); |
|---|
| 191 | memcpy(FIELDP(xdir_hcur),buffup,B5UPLEN); |
|---|
| 192 | sprintf(buffup,B5EDIT1,hmfn); |
|---|
| 193 | memcpy(FIELDP(xdir_hmfn),buffup,B5UPLEN); |
|---|
| 194 | #if HITTRACE |
|---|
| 195 | printf("b6_hit - mfn: %"_LD_"\n",mfn); |
|---|
| 196 | #endif |
|---|
| 197 | #if SHOWCORE |
|---|
| 198 | if (b60trace) showcore("b6_hit - exit"); |
|---|
| 199 | #endif |
|---|
| 200 | return(mfn); |
|---|
| 201 | } |
|---|
| 202 | |
|---|
| 203 | |
|---|
| 204 | LONGX b6_hsizh(irxp, nbytes, hsizp) |
|---|
| 205 | char *irxp; |
|---|
| 206 | LONGX nbytes; |
|---|
| 207 | LONGX *hsizp; |
|---|
| 208 | { |
|---|
| 209 | LONGX hits,hsiz,loop,mfn; |
|---|
| 210 | unsigned char *p1p; |
|---|
| 211 | int loop2; |
|---|
| 212 | hits=0; hsiz=0; |
|---|
| 213 | for (mfn=0, p1p=irxp, loop=nbytes; loop--; p1p++) { |
|---|
| 214 | if (!*p1p) { |
|---|
| 215 | mfn+=8; |
|---|
| 216 | continue; |
|---|
| 217 | } |
|---|
| 218 | for (loop2=8; loop2--; mfn++) |
|---|
| 219 | if (*p1p & bitmask[mfn&BY8RMASK]) { |
|---|
| 220 | hits++; |
|---|
| 221 | hsiz=mfn; |
|---|
| 222 | #if MFNTRACE |
|---|
| 223 | printf("%"_LD_" ",mfn); |
|---|
| 224 | #endif |
|---|
| 225 | } |
|---|
| 226 | } |
|---|
| 227 | #if MFNTRACE |
|---|
| 228 | printf("\n"); |
|---|
| 229 | #endif |
|---|
| 230 | *hsizp = hsiz; |
|---|
| 231 | return(hits); |
|---|
| 232 | } |
|---|
| 233 | #else /* BIGREC */ |
|---|
| 234 | #endif /* BIGREC */ |
|---|