Add support for "grep -v"

This commit is contained in:
Pierre Pronchery 2017-01-31 23:07:17 +01:00
parent 5832d242b3
commit a284c5b879

View File

@ -35,6 +35,7 @@ typedef int Prefs;
#define GREP_PREFS_n 0x1 #define GREP_PREFS_n 0x1
#define GREP_PREFS_q 0x2 #define GREP_PREFS_q 0x2
#define GREP_PREFS_s 0x4 #define GREP_PREFS_s 0x4
#define GREP_PREFS_v 0x8
/* prototypes */ /* prototypes */
@ -144,8 +145,18 @@ static int _grep_stream(Prefs * prefs, regex_t * reg, FILE * fp,
int e; int e;
for(line = 1; fgets(buf, sizeof(buf), fp) != NULL; line++) for(line = 1; fgets(buf, sizeof(buf), fp) != NULL; line++)
if((e = regexec(reg, buf, 1, &match, 0)) == 0)
{ {
if((e = regexec(reg, buf, 1, &match, 0)) != 0
&& e != REG_NOMATCH)
{
regerror(e, reg, buf, sizeof(buf));
ret = -_grep_error(buf, 1);
continue;
}
if(prefs != NULL && *prefs & GREP_PREFS_v)
e = (e == 0) ? REG_NOMATCH : 0;
if(e == REG_NOMATCH)
continue;
if(prefs != NULL && !(*prefs & GREP_PREFS_q)) if(prefs != NULL && !(*prefs & GREP_PREFS_q))
{ {
if(filename != NULL && filename[0] != '\0') if(filename != NULL && filename[0] != '\0')
@ -157,11 +168,6 @@ static int _grep_stream(Prefs * prefs, regex_t * reg, FILE * fp,
if(ret == 1) if(ret == 1)
ret = 0; ret = 0;
} }
else if(e != REG_NOMATCH)
{
regerror(e, reg, buf, sizeof(buf));
ret = -_grep_error(buf, 1);
}
return ret; return ret;
} }
@ -169,7 +175,7 @@ static int _grep_stream(Prefs * prefs, regex_t * reg, FILE * fp,
/* usage */ /* usage */
static int _usage(void) static int _usage(void)
{ {
fputs("Usage: " PROGNAME " [-Einqs][file...]\n", stderr); fputs("Usage: " PROGNAME " [-Einqsv][file...]\n", stderr);
return 1; return 1;
} }
@ -183,7 +189,7 @@ int main(int argc, char * argv[])
Prefs prefs = 0; Prefs prefs = 0;
int flags = 0; int flags = 0;
while((o = getopt(argc, argv, "Einqs")) != -1) while((o = getopt(argc, argv, "Einqsv")) != -1)
switch(o) switch(o)
{ {
case 'E': case 'E':
@ -201,6 +207,9 @@ int main(int argc, char * argv[])
case 's': case 's':
prefs |= GREP_PREFS_s; prefs |= GREP_PREFS_s;
break; break;
case 'v':
prefs |= GREP_PREFS_v;
break;
default: default:
return _usage(); return _usage();
} }