aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Changelog4
-rw-r--r--editors/sed.c250
-rw-r--r--find.c8
-rw-r--r--findutils/find.c8
-rw-r--r--sed.c250
5 files changed, 258 insertions, 262 deletions
diff --git a/Changelog b/Changelog
index 42ec29618..f9ed33845 100644
--- a/Changelog
+++ b/Changelog
@@ -86,6 +86,10 @@
- added "skip" and "seek" to dd.
* swapoff -a was not working. Now it is.
* init did not cleanly unmount filesystems on reboot. Now it does.
+ * "sed -ne s/foo/bar/" worked but "sed -n -e s/foo/bar/" didn't.
+ Now both work.
+ * Some architectures (PowerPc) assume chars are unsigned, so they could
+ not distinguish between EOF and '\0xFF' in sed. Sed now uses ints.
-Erik Andersen
diff --git a/editors/sed.c b/editors/sed.c
index 3a7737e2f..608f86813 100644
--- a/editors/sed.c
+++ b/editors/sed.c
@@ -82,7 +82,7 @@ static inline int at_last(FILE * fp)
if (feof(fp))
return 1;
else {
- char ch;
+ int ch;
if ((ch = fgetc(fp)) == EOF)
res++;
@@ -183,129 +183,131 @@ extern int sed_main(int argc, char **argv)
usage(sed_usage);
}
- if (**argv == '-') {
- argc--;
- cp = *argv++;
- stopNow = FALSE;
-
- while (*++cp && stopNow == FALSE) {
- switch (*cp) {
- case 'n':
- quietFlag = TRUE;
- break;
- case 'e':
- if (*(cp + 1) == 0 && --argc < 0) {
- usage(sed_usage);
- }
- if (*++cp != 's')
- cp = *argv++;
-
- /* Read address if present */
- SKIPSPACES(cp);
- if (*cp == '$') {
- addr_line = LAST_LINE;
- cp++;
- } else {
- if (isdigit(*cp)) { /* LINE ADDRESS */
- line_s = cp;
- while (isdigit(*cp))
- cp++;
- if (cp > line_s) {
- /* numeric line */
- saved = *cp;
- *cp = '\0';
- addr_line = atoi(line_s);
- *cp = saved;
- }
- } else if (*cp == '/') { /* PATTERN ADDRESS */
- pos = addr_pattern = cp + 1;
- pos = strchr(pos, '/');
- if (!pos)
- usage(sed_usage);
- *pos = '\0';
- cp = pos + 1;
- }
- }
-
- SKIPSPACES(cp);
- if (*cp == '!') {
- negated++;
- cp++;
- }
-
- /* Read command */
-
- SKIPSPACES(cp);
- switch (*cp) {
- case 's': /* REPLACE */
- if (strlen(cp) <= 3 || *(cp + 1) != '/')
- break;
- sed_f = f_replace;
-
- pos = needle = cp + 2;
-
- for (;;) {
- pos = strchr(pos, '/');
- if (pos == NULL) {
- usage(sed_usage);
- }
- if (*(pos - 1) == '\\') {
- pos++;
- continue;
- }
- break;
- }
- *pos = 0;
- newNeedle = ++pos;
- for (;;) {
- pos = strchr(pos, '/');
- if (pos == NULL) {
- usage(sed_usage);
- }
- if (*(pos - 1) == '\\') {
- pos++;
- continue;
- }
- break;
- }
- *pos = 0;
- if (pos + 2 != 0) {
- while (*++pos) {
- switch (*pos) {
- case 'i':
- ignoreCase = TRUE;
- break;
- case 'p':
- printFlag = TRUE;
- break;
- case 'g':
- break;
- default:
- usage(sed_usage);
- }
- }
- }
- cp = pos;
- /* fprintf(stderr, "replace '%s' with '%s'\n", needle, newNeedle); */
- break;
-
- case 'a': /* APPEND */
- if (strlen(cp) < 2)
- break;
- sed_f = f_append;
- appendline = ++cp;
- /* fprintf(stderr, "append '%s'\n", appendline); */
- break;
- }
-
- stopNow = TRUE;
- break;
-
- default:
- usage(sed_usage);
- }
- }
- }
+ while (argc > 1) {
+ if (**argv == '-') {
+ argc--;
+ cp = *argv++;
+ stopNow = FALSE;
+
+ while (*++cp && stopNow == FALSE) {
+ switch (*cp) {
+ case 'n':
+ quietFlag = TRUE;
+ break;
+ case 'e':
+ if (*(cp + 1) == 0 && --argc < 0) {
+ usage(sed_usage);
+ }
+ if (*++cp != 's')
+ cp = *argv++;
+
+ /* Read address if present */
+ SKIPSPACES(cp);
+ if (*cp == '$') {
+ addr_line = LAST_LINE;
+ cp++;
+ } else {
+ if (isdigit(*cp)) { /* LINE ADDRESS */
+ line_s = cp;
+ while (isdigit(*cp))
+ cp++;
+ if (cp > line_s) {
+ /* numeric line */
+ saved = *cp;
+ *cp = '\0';
+ addr_line = atoi(line_s);
+ *cp = saved;
+ }
+ } else if (*cp == '/') { /* PATTERN ADDRESS */
+ pos = addr_pattern = cp + 1;
+ pos = strchr(pos, '/');
+ if (!pos)
+ usage(sed_usage);
+ *pos = '\0';
+ cp = pos + 1;
+ }
+ }
+
+ SKIPSPACES(cp);
+ if (*cp == '!') {
+ negated++;
+ cp++;
+ }
+
+ /* Read command */
+
+ SKIPSPACES(cp);
+ switch (*cp) {
+ case 's': /* REPLACE */
+ if (strlen(cp) <= 3 || *(cp + 1) != '/')
+ break;
+ sed_f = f_replace;
+
+ pos = needle = cp + 2;
+
+ for (;;) {
+ pos = strchr(pos, '/');
+ if (pos == NULL) {
+ usage(sed_usage);
+ }
+ if (*(pos - 1) == '\\') {
+ pos++;
+ continue;
+ }
+ break;
+ }
+ *pos = 0;
+ newNeedle = ++pos;
+ for (;;) {
+ pos = strchr(pos, '/');
+ if (pos == NULL) {
+ usage(sed_usage);
+ }
+ if (*(pos - 1) == '\\') {
+ pos++;
+ continue;
+ }
+ break;
+ }
+ *pos = 0;
+ if (pos + 2 != 0) {
+ while (*++pos) {
+ switch (*pos) {
+ case 'i':
+ ignoreCase = TRUE;
+ break;
+ case 'p':
+ printFlag = TRUE;
+ break;
+ case 'g':
+ break;
+ default:
+ usage(sed_usage);
+ }
+ }
+ }
+ cp = pos;
+ /* fprintf(stderr, "replace '%s' with '%s'\n", needle, newNeedle); */
+ break;
+
+ case 'a': /* APPEND */
+ if (strlen(cp) < 2)
+ break;
+ sed_f = f_append;
+ appendline = ++cp;
+ /* fprintf(stderr, "append '%s'\n", appendline); */
+ break;
+ }
+
+ stopNow = TRUE;
+ break;
+
+ default:
+ usage(sed_usage);
+ }
+ }
+ }
+ }
if (argc == 0) {
switch (sed_f) {
diff --git a/find.c b/find.c
index 6346d454f..2c1039b53 100644
--- a/find.c
+++ b/find.c
@@ -39,13 +39,7 @@ static const char find_usage[] = "find [PATH...] [EXPRESSION]\n\n"
"\nEXPRESSION may consist of:\n"
"\t-follow\n\t\tDereference symbolic links.\n"
"\t-name PATTERN\n\t\tFile name (with leading directories removed) matches PATTERN.\n"
- "\t-print\n\t\tprint the full file name followed by a newline to stdout.\n\n"
-#if defined BB_REGEXP
- "This version of find matches full regular expresions.\n";
-#else
- "This version of find matches strings (not regular expresions).\n";
-#endif
-
+ "\t-print\n\t\tprint the full file name followed by a newline to stdout.\n";
static int fileAction(const char *fileName, struct stat *statbuf)
diff --git a/findutils/find.c b/findutils/find.c
index 6346d454f..2c1039b53 100644
--- a/findutils/find.c
+++ b/findutils/find.c
@@ -39,13 +39,7 @@ static const char find_usage[] = "find [PATH...] [EXPRESSION]\n\n"
"\nEXPRESSION may consist of:\n"
"\t-follow\n\t\tDereference symbolic links.\n"
"\t-name PATTERN\n\t\tFile name (with leading directories removed) matches PATTERN.\n"
- "\t-print\n\t\tprint the full file name followed by a newline to stdout.\n\n"
-#if defined BB_REGEXP
- "This version of find matches full regular expresions.\n";
-#else
- "This version of find matches strings (not regular expresions).\n";
-#endif
-
+ "\t-print\n\t\tprint the full file name followed by a newline to stdout.\n";
static int fileAction(const char *fileName, struct stat *statbuf)
diff --git a/sed.c b/sed.c
index 3a7737e2f..608f86813 100644
--- a/sed.c
+++ b/sed.c
@@ -82,7 +82,7 @@ static inline int at_last(FILE * fp)
if (feof(fp))
return 1;
else {
- char ch;
+ int ch;
if ((ch = fgetc(fp)) == EOF)
res++;
@@ -183,129 +183,131 @@ extern int sed_main(int argc, char **argv)
usage(sed_usage);
}
- if (**argv == '-') {
- argc--;
- cp = *argv++;
- stopNow = FALSE;
-
- while (*++cp && stopNow == FALSE) {
- switch (*cp) {
- case 'n':
- quietFlag = TRUE;
- break;
- case 'e':
- if (*(cp + 1) == 0 && --argc < 0) {
- usage(sed_usage);
- }
- if (*++cp != 's')
- cp = *argv++;
-
- /* Read address if present */
- SKIPSPACES(cp);
- if (*cp == '$') {
- addr_line = LAST_LINE;
- cp++;
- } else {
- if (isdigit(*cp)) { /* LINE ADDRESS */
- line_s = cp;
- while (isdigit(*cp))
- cp++;
- if (cp > line_s) {
- /* numeric line */
- saved = *cp;
- *cp = '\0';
- addr_line = atoi(line_s);
- *cp = saved;
- }
- } else if (*cp == '/') { /* PATTERN ADDRESS */
- pos = addr_pattern = cp + 1;
- pos = strchr(pos, '/');
- if (!pos)
- usage(sed_usage);
- *pos = '\0';
- cp = pos + 1;
- }
- }
-
- SKIPSPACES(cp);
- if (*cp == '!') {
- negated++;
- cp++;
- }
-
- /* Read command */
-
- SKIPSPACES(cp);
- switch (*cp) {
- case 's': /* REPLACE */
- if (strlen(cp) <= 3 || *(cp + 1) != '/')
- break;
- sed_f = f_replace;
-
- pos = needle = cp + 2;
-
- for (;;) {
- pos = strchr(pos, '/');
- if (pos == NULL) {
- usage(sed_usage);
- }
- if (*(pos - 1) == '\\') {
- pos++;
- continue;
- }
- break;
- }
- *pos = 0;
- newNeedle = ++pos;
- for (;;) {
- pos = strchr(pos, '/');
- if (pos == NULL) {
- usage(sed_usage);
- }
- if (*(pos - 1) == '\\') {
- pos++;
- continue;
- }
- break;
- }
- *pos = 0;
- if (pos + 2 != 0) {
- while (*++pos) {
- switch (*pos) {
- case 'i':
- ignoreCase = TRUE;
- break;
- case 'p':
- printFlag = TRUE;
- break;
- case 'g':
- break;
- default:
- usage(sed_usage);
- }
- }
- }
- cp = pos;
- /* fprintf(stderr, "replace '%s' with '%s'\n", needle, newNeedle); */
- break;
-
- case 'a': /* APPEND */
- if (strlen(cp) < 2)
- break;
- sed_f = f_append;
- appendline = ++cp;
- /* fprintf(stderr, "append '%s'\n", appendline); */
- break;
- }
-
- stopNow = TRUE;
- break;
-
- default:
- usage(sed_usage);
- }
- }
- }
+ while (argc > 1) {
+ if (**argv == '-') {
+ argc--;
+ cp = *argv++;
+ stopNow = FALSE;
+
+ while (*++cp && stopNow == FALSE) {
+ switch (*cp) {
+ case 'n':
+ quietFlag = TRUE;
+ break;
+ case 'e':
+ if (*(cp + 1) == 0 && --argc < 0) {
+ usage(sed_usage);
+ }
+ if (*++cp != 's')
+ cp = *argv++;
+
+ /* Read address if present */
+ SKIPSPACES(cp);
+ if (*cp == '$') {
+ addr_line = LAST_LINE;
+ cp++;
+ } else {
+ if (isdigit(*cp)) { /* LINE ADDRESS */
+ line_s = cp;
+ while (isdigit(*cp))
+ cp++;
+ if (cp > line_s) {
+ /* numeric line */
+ saved = *cp;
+ *cp = '\0';
+ addr_line = atoi(line_s);
+ *cp = saved;
+ }
+ } else if (*cp == '/') { /* PATTERN ADDRESS */
+ pos = addr_pattern = cp + 1;
+ pos = strchr(pos, '/');
+ if (!pos)
+ usage(sed_usage);
+ *pos = '\0';
+ cp = pos + 1;
+ }
+ }
+
+ SKIPSPACES(cp);
+ if (*cp == '!') {
+ negated++;
+ cp++;
+ }
+
+ /* Read command */
+
+ SKIPSPACES(cp);
+ switch (*cp) {
+ case 's': /* REPLACE */
+ if (strlen(cp) <= 3 || *(cp + 1) != '/')
+ break;
+ sed_f = f_replace;
+
+ pos = needle = cp + 2;
+
+ for (;;) {
+ pos = strchr(pos, '/');
+ if (pos == NULL) {
+ usage(sed_usage);
+ }
+ if (*(pos - 1) == '\\') {
+ pos++;
+ continue;
+ }
+ break;
+ }
+ *pos = 0;
+ newNeedle = ++pos;
+ for (;;) {
+ pos = strchr(pos, '/');
+ if (pos == NULL) {
+ usage(sed_usage);
+ }
+ if (*(pos - 1) == '\\') {
+ pos++;
+ continue;
+ }
+ break;
+ }
+ *pos = 0;
+ if (pos + 2 != 0) {
+ while (*++pos) {
+ switch (*pos) {
+ case 'i':
+ ignoreCase = TRUE;
+ break;
+ case 'p':
+ printFlag = TRUE;
+ break;
+ case 'g':
+ break;
+ default:
+ usage(sed_usage);
+ }
+ }
+ }
+ cp = pos;
+ /* fprintf(stderr, "replace '%s' with '%s'\n", needle, newNeedle); */
+ break;
+
+ case 'a': /* APPEND */
+ if (strlen(cp) < 2)
+ break;
+ sed_f = f_append;
+ appendline = ++cp;
+ /* fprintf(stderr, "append '%s'\n", appendline); */
+ break;
+ }
+
+ stopNow = TRUE;
+ break;
+
+ default:
+ usage(sed_usage);
+ }
+ }
+ }
+ }
if (argc == 0) {
switch (sed_f) {