/* ** 'clear_refs' is called to restore all the line number and case table tokens ** to their 'no address' versions. This is needed when a program is edited. ** The code also clears such tokens in installed libraries as any case tables ** built for statements in the libraries will have been put on the Basic heap. */ static void clear_refs(void) { byte *bp; library *lp; if (basicvars.runflags.has_variables) { clear_varlists(); clear_heap(); clear_strings(); } if (basicvars.runflags.has_offsets) { bp = basicvars.start; while (!AT_PROGEND(bp)) { clear_linerefs(bp); bp+=get_linelen(bp); } lp = basicvars.installist; /* Now clear the pointers in any installed libraries */ while (lp!=NIL) { bp = lp->libstart; while (!AT_PROGEND(bp)) { clear_linerefs(bp); bp = bp+GET_LINELEN(bp); } lp = lp->libflink; } } basicvars.liblist = NIL; basicvars.runflags.has_offsets = FALSE; basicvars.runflags.has_variables = FALSE; }
/* ** 'list_if' deals with the 'LISTIF' command. It lists each line ** where there is at least one occurence of the string following ** the 'LISTIF' command. */ static void list_if(void) { byte *p, *tp; int32 targetlen, statelen; char first, *sp; boolean more; p = tp = get_srcaddr(basicvars.current); /* Get address of string to search for */ basicvars.current+=1+OFFSIZE; check_ateol(); while (*p != NUL) p++; /* Find the end of the string */ targetlen = p-tp; /* Number of characters in search string */ if (targetlen == 0) return; /* End if search string is empty */ p = basicvars.start; more = TRUE; first = *tp; while (more && !AT_PROGEND(p)) { reset_indent(); expand(p, basicvars.stringwork); sp = basicvars.stringwork; statelen = strlen(basicvars.stringwork); do { sp++; while (statelen>=targetlen && *sp != first) { statelen--; sp++; } } while(statelen>=targetlen && memcmp(sp, tp, targetlen) != 0); if (statelen>=targetlen) { /* Can only be true if the string was found */ if (basicvars.debug_flags.tokens) emulate_printf("%08p %s\r\n", p, basicvars.stringwork); else { emulate_printf("%s\r\n", basicvars.stringwork); } } p+=GET_LINELEN(p); } }