(Something I should have done in the previous checkin...) Also broke out

substitution command execution from do_sed_command() and put it in it's own
do_subst_command() function.
This commit is contained in:
Mark Whitley 2000-07-13 20:01:58 +00:00
parent 06f3529ada
commit 4f7fe77d07
2 changed files with 86 additions and 74 deletions

View File

@ -340,6 +340,47 @@ static void load_cmd_file(char *filename)
} }
} }
static int do_subst_command(const struct sed_cmd *sed_cmd, const char *line)
{
int altered = 0;
/* we only substitute if the substitution 'search' expression matches */
if (regexec(sed_cmd->sub_match, line, 0, NULL, 0) == 0) {
regmatch_t regmatch;
int i;
char *ptr = (char *)line;
while (*ptr) {
/* if we can match the search string... */
if (regexec(sed_cmd->sub_match, ptr, 1, &regmatch, 0) == 0) {
/* print everything before the match, */
for (i = 0; i < regmatch.rm_so; i++)
fputc(ptr[i], stdout);
/* then print the substitution in its place */
fputs(sed_cmd->replace, stdout);
/* then advance past the match */
ptr += regmatch.rm_eo;
/* and let the calling function know that something
* has been changed */
altered++;
/* if we're not doing this globally... */
if (!sed_cmd->sub_g)
break;
}
/* if we COULD NOT match the search string (meaning we've gone past
* all previous instances), get out */
else
break;
}
/* is there anything left to print? */
if (*ptr)
fputs(ptr, stdout);
}
return altered;
}
static int do_sed_command(const struct sed_cmd *sed_cmd, const char *line) static int do_sed_command(const struct sed_cmd *sed_cmd, const char *line)
{ {
@ -355,43 +396,8 @@ static int do_sed_command(const struct sed_cmd *sed_cmd, const char *line)
altered++; altered++;
break; break;
case 's': /* oo, a fun one :-) */ case 's':
altered = do_subst_command(sed_cmd, line);
/* we only substitute if the substitution 'search' expression matches */
if (regexec(sed_cmd->sub_match, line, 0, NULL, 0) == 0) {
regmatch_t regmatch;
int i;
char *ptr = (char *)line;
while (*ptr) {
/* if we can match the search string... */
if (regexec(sed_cmd->sub_match, ptr, 1, &regmatch, 0) == 0) {
/* print everything before the match, */
for (i = 0; i < regmatch.rm_so; i++)
fputc(ptr[i], stdout);
/* then print the substitution in its place */
fputs(sed_cmd->replace, stdout);
/* then advance past the match */
ptr += regmatch.rm_eo;
/* and let the calling function know that something
* has been changed */
altered++;
/* if we're not doing this globally... */
if (!sed_cmd->sub_g)
break;
}
/* if we COULD NOT match the search string (meaning we've gone past
* all previous instances), get out */
else
break;
}
/* is there anything left to print? */
if (*ptr)
fputs(ptr, stdout);
}
break; break;
} }

80
sed.c
View File

@ -340,6 +340,47 @@ static void load_cmd_file(char *filename)
} }
} }
static int do_subst_command(const struct sed_cmd *sed_cmd, const char *line)
{
int altered = 0;
/* we only substitute if the substitution 'search' expression matches */
if (regexec(sed_cmd->sub_match, line, 0, NULL, 0) == 0) {
regmatch_t regmatch;
int i;
char *ptr = (char *)line;
while (*ptr) {
/* if we can match the search string... */
if (regexec(sed_cmd->sub_match, ptr, 1, &regmatch, 0) == 0) {
/* print everything before the match, */
for (i = 0; i < regmatch.rm_so; i++)
fputc(ptr[i], stdout);
/* then print the substitution in its place */
fputs(sed_cmd->replace, stdout);
/* then advance past the match */
ptr += regmatch.rm_eo;
/* and let the calling function know that something
* has been changed */
altered++;
/* if we're not doing this globally... */
if (!sed_cmd->sub_g)
break;
}
/* if we COULD NOT match the search string (meaning we've gone past
* all previous instances), get out */
else
break;
}
/* is there anything left to print? */
if (*ptr)
fputs(ptr, stdout);
}
return altered;
}
static int do_sed_command(const struct sed_cmd *sed_cmd, const char *line) static int do_sed_command(const struct sed_cmd *sed_cmd, const char *line)
{ {
@ -355,43 +396,8 @@ static int do_sed_command(const struct sed_cmd *sed_cmd, const char *line)
altered++; altered++;
break; break;
case 's': /* oo, a fun one :-) */ case 's':
altered = do_subst_command(sed_cmd, line);
/* we only substitute if the substitution 'search' expression matches */
if (regexec(sed_cmd->sub_match, line, 0, NULL, 0) == 0) {
regmatch_t regmatch;
int i;
char *ptr = (char *)line;
while (*ptr) {
/* if we can match the search string... */
if (regexec(sed_cmd->sub_match, ptr, 1, &regmatch, 0) == 0) {
/* print everything before the match, */
for (i = 0; i < regmatch.rm_so; i++)
fputc(ptr[i], stdout);
/* then print the substitution in its place */
fputs(sed_cmd->replace, stdout);
/* then advance past the match */
ptr += regmatch.rm_eo;
/* and let the calling function know that something
* has been changed */
altered++;
/* if we're not doing this globally... */
if (!sed_cmd->sub_g)
break;
}
/* if we COULD NOT match the search string (meaning we've gone past
* all previous instances), get out */
else
break;
}
/* is there anything left to print? */
if (*ptr)
fputs(ptr, stdout);
}
break; break;
} }