root/trunk/b6x.c

Revision 389, 6.4 kB (checked in by heitor.barbieri, 3 weeks ago)

essage first commit

Line 
1LONGX 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                                                                      */
13LONGX irec;          /* indice de vrecp, para info/store */
14LONGX nord;          /* numero de ordem do hit a analisar */
15char *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
204LONGX b6_hsizh(irxp, nbytes, hsizp)
205char *irxp;
206LONGX nbytes;
207LONGX *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 */
Note: See TracBrowser for help on using the browser.