#include <ctype.h>
-#if ( defined BB_GREP || defined BB_FIND )
+#if ( defined BB_GREP || defined BB_SED)
/* This also tries to find a needle in a haystack, but uses
* real regular expressions.... The fake regular expression
return( status);
}
+#if defined BB_SED
+/* This performs substitutions after a regexp match has been found.
+ * The new string is returned. It is malloc'ed, and do must be freed. */
+extern int replace_match(char *haystack, char *needle, char *newNeedle, int ignoreCase)
+{
+ int status;
+ struct regexp* re;
+ char *s, buf[BUF_SIZE], *d = buf;
+
+ re = regcomp( needle);
+ status = regexec(re, haystack, FALSE, ignoreCase);
+ if (status==TRUE) {
+ s=haystack;
+
+ do {
+ /* copy stuff from before the match */
+ while (s < re->startp[0])
+ *d++ = *s++;
+ /* substitute for the matched part */
+ regsub(re, newNeedle, d);
+ s = re->endp[0];
+ d += strlen(d);
+ } while (regexec(re, s, FALSE, ignoreCase) == TRUE);
+ /* copy stuff from after the match */
+ while ( (*d++ = *s++) ) {}
+ d[0] = '\0';
+ strcpy(haystack, buf);
+ }
+ free( re);
+ return( status);
+}
+#endif
+
/* code swiped from elvis-tiny 1.4 (a clone of vi) and adjusted to
* suit the needs of busybox by Erik Andersen.
static char *previous; /* the previous regexp, used when null regexp is given */
+#if defined BB_SED
static char *previous1; /* a copy of the text from the previous substitution for regsub()*/
+#endif
/* These are used to classify or recognize meta-characters */
/* error-handling stuff */
jmp_buf errorhandler;
-#define FAIL(why) fprintf(stderr, why); longjmp(errorhandler, 1)
+#define FAIL(why) do {fprintf(stderr, why); longjmp(errorhandler, 1);} while (0)
if (re->program[1 + 32 * (token - M_CLASS(0)) + (ch >> 3)] & (1 << (ch & 7)))
return 0;
}
- else if (ch == token
- || (ignoreCase==TRUE && isupper(ch) && tolower(ch) == token))
+//fprintf(stderr, "match1: ch='%c' token='%c': ", ch, token);
+ if (ch == token
+ || (ignoreCase==TRUE && tolower(ch) == tolower(token)))
{
+//fprintf(stderr, "match\n");
return 0;
}
+//fprintf(stderr, "no match\n");
return 1;
}
int token;
int peek;
char *build;
- regexp *re;
+ regexp *re; // Ignore compiler whining. If we longjmp, we don't use re anymore.
/* prepare for error handling */
-
+#if defined BB_SED
/* This performs substitutions after a regexp match has been found. */
extern void regsub(regexp* re, char* src, char* dst)
{
if (previous1)
strcpy(previous1, start);
}
-
+#endif
#endif /* BB_REGEXP */