Add support for "grep -v"
This commit is contained in:
parent
5832d242b3
commit
a284c5b879
25
src/grep.c
25
src/grep.c
|
@ -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();
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue
Block a user