perl 5.0 alpha 3
[p5sagit/p5-mst-13.2.git] / do / study
CommitLineData
79072805 1int /*SUPPRESS 590*/
2do_study(TARG,arg,gimme,arglast)
3STR *TARG;
4ARG *arg;
5int gimme;
6int *arglast;
7{
8 register unsigned char *s;
9 register int pos = TARG->str_cur;
10 register int ch;
11 register int *sfirst;
12 register int *snext;
13 int retval;
14 int retarg = arglast[0] + 1;
15
16#ifndef lint
17 s = (unsigned char*)(str_get(TARG));
18#else
19 s = Null(unsigned char*);
20#endif
21 if (lastscream)
22 lastscream->str_pok &= ~SP_STUDIED;
23 lastscream = TARG;
24 if (pos <= 0) {
25 retval = 0;
26 goto ret;
27 }
28 if (pos > maxscream) {
29 if (maxscream < 0) {
30 maxscream = pos + 80;
31 New(301,screamfirst, 256, int);
32 New(302,screamnext, maxscream, int);
33 }
34 else {
35 maxscream = pos + pos / 4;
36 Renew(screamnext, maxscream, int);
37 }
38 }
39
40 sfirst = screamfirst;
41 snext = screamnext;
42
43 if (!sfirst || !snext)
44 fatal("do_study: out of memory");
45
46 for (ch = 256; ch; --ch)
47 *sfirst++ = -1;
48 sfirst -= 256;
49
50 while (--pos >= 0) {
51 ch = s[pos];
52 if (sfirst[ch] >= 0)
53 snext[pos] = sfirst[ch] - pos;
54 else
55 snext[pos] = -pos;
56 sfirst[ch] = pos;
57
58 /* If there were any case insensitive searches, we must assume they
59 * all are. This speeds up insensitive searches much more than
60 * it slows down sensitive ones.
61 */
62 if (sawi)
63 sfirst[fold[ch]] = pos;
64 }
65
66 TARG->str_pok |= SP_STUDIED;
67 retval = 1;
68 ret:
69 str_numset(ARGTARG,(double)retval);
70 stack->ary_array[retarg] = ARGTARG;
71 return retarg;
72}
73