STATIC int indirect_find(pTHX_ SV *name_sv, const char *line_bufptr, STRLEN *name_pos) {
#define indirect_find(NSV, LBP, NP) indirect_find(aTHX_ (NSV), (LBP), (NP))
- STRLEN name_len, line_len;
- const char *name, *p, *t, *u;
+ STRLEN name_len, line_len;
+ const char *name, *name_end;
+ const char *line, *line_end;
+ const char *p, *t, *u;
+
+ line = SvPV_const(PL_linestr, line_len);
+ line_end = line + line_len;
name = SvPV_const(name_sv, name_len);
if (name_len >= 1 && *name == '$') {
++name;
--name_len;
- line_bufptr = strchr(line_bufptr, '$');
- if (!line_bufptr)
+ while (line_bufptr < line_end && *line_bufptr != '$')
+ ++line_bufptr;
+ if (line_bufptr >= line_end)
return 0;
}
+ name_end = name + name_len;
p = line_bufptr;
while (1) {
- p = strstr(p, name);
+ p = ninstr(p, line_end, name, name_end);
if (!p)
return 0;
if (!isALNUM(p[name_len]))
++p;
}
- t = SvPV_const(PL_linestr, line_len);
+ t = line;
u = t;
while (t <= p) {
STRLEN i = indirect_nextline(t, line_len);