Add support for "grep -n"
This commit is contained in:
parent
c1c15e768b
commit
97cdc17553
45
src/grep.c
45
src/grep.c
|
@ -29,8 +29,14 @@
|
||||||
|
|
||||||
/* grep */
|
/* grep */
|
||||||
/* private */
|
/* private */
|
||||||
|
/* types */
|
||||||
|
/* Prefs */
|
||||||
|
typedef int Prefs;
|
||||||
|
#define GREP_PREFS_n 0x1
|
||||||
|
|
||||||
/* prototypes */
|
/* prototypes */
|
||||||
static int _grep(int flags, char const * pattern, int filec, char * filev[]);
|
static int _grep(Prefs * prefs, int flags, char const * pattern,
|
||||||
|
int filec, char * filev[]);
|
||||||
|
|
||||||
static int _usage(void);
|
static int _usage(void);
|
||||||
|
|
||||||
|
@ -38,10 +44,12 @@ static int _usage(void);
|
||||||
/* functions */
|
/* functions */
|
||||||
/* grep */
|
/* grep */
|
||||||
static int _grep_error(char const * message, int ret);
|
static int _grep_error(char const * message, int ret);
|
||||||
static int _grep_files(regex_t * reg, int filec, char * filev[]);
|
static int _grep_files(Prefs * prefs, regex_t * reg, int filec, char * filev[]);
|
||||||
static int _grep_stream(regex_t * reg, FILE * fp, char const * filename);
|
static int _grep_stream(Prefs * prefs, regex_t * reg, FILE * fp,
|
||||||
|
char const * filename);
|
||||||
|
|
||||||
static int _grep(int flags, char const * pattern, int filec, char * filev[])
|
static int _grep(Prefs * prefs, int flags, char const * pattern,
|
||||||
|
int filec, char * filev[])
|
||||||
{
|
{
|
||||||
int ret;
|
int ret;
|
||||||
regex_t reg;
|
regex_t reg;
|
||||||
|
@ -59,9 +67,9 @@ static int _grep(int flags, char const * pattern, int filec, char * filev[])
|
||||||
return _grep_error(buf, 2);
|
return _grep_error(buf, 2);
|
||||||
}
|
}
|
||||||
if(filec == 0)
|
if(filec == 0)
|
||||||
ret = _grep_stream(®, stdin, NULL);
|
ret = _grep_stream(prefs, ®, stdin, NULL);
|
||||||
else
|
else
|
||||||
ret = _grep_files(®, filec, filev);
|
ret = _grep_files(prefs, ®, filec, filev);
|
||||||
regfree(®);
|
regfree(®);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
@ -72,7 +80,7 @@ static int _grep_error(char const * message, int ret)
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int _grep_files(regex_t * reg, int filec, char * filev[])
|
static int _grep_files(Prefs * prefs, regex_t * reg, int filec, char * filev[])
|
||||||
{
|
{
|
||||||
int ret = 1;
|
int ret = 1;
|
||||||
int i;
|
int i;
|
||||||
|
@ -88,8 +96,8 @@ static int _grep_files(regex_t * reg, int filec, char * filev[])
|
||||||
ret = _grep_error(buf, 2);
|
ret = _grep_error(buf, 2);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
if(_grep_stream(reg, fp, (filec > 1) ? filev[i] : NULL) == 0
|
if(_grep_stream(prefs, reg, fp, (filec > 1) ? filev[i] : NULL)
|
||||||
&& ret == 1)
|
== 0 && ret == 1)
|
||||||
ret = 0;
|
ret = 0;
|
||||||
if(fclose(fp) != 0)
|
if(fclose(fp) != 0)
|
||||||
{
|
{
|
||||||
|
@ -101,18 +109,22 @@ static int _grep_files(regex_t * reg, int filec, char * filev[])
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int _grep_stream(regex_t * reg, FILE * fp, char const * filename)
|
static int _grep_stream(Prefs * prefs, regex_t * reg, FILE * fp,
|
||||||
|
char const * filename)
|
||||||
{
|
{
|
||||||
int ret = 1;
|
int ret = 1;
|
||||||
|
size_t line;
|
||||||
char buf[BUFSIZ];
|
char buf[BUFSIZ];
|
||||||
regmatch_t match;
|
regmatch_t match;
|
||||||
int e;
|
int e;
|
||||||
|
|
||||||
while(fgets(buf, sizeof(buf), fp) != NULL)
|
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)
|
||||||
{
|
{
|
||||||
if(filename != NULL)
|
if(filename != NULL)
|
||||||
printf("%s:", filename);
|
printf("%s:", filename);
|
||||||
|
if(prefs != NULL && *prefs & GREP_PREFS_n)
|
||||||
|
printf("%zd:", line);
|
||||||
printf("%s", buf);
|
printf("%s", buf);
|
||||||
if(ret == 1)
|
if(ret == 1)
|
||||||
ret = 0;
|
ret = 0;
|
||||||
|
@ -129,7 +141,7 @@ static int _grep_stream(regex_t * reg, FILE * fp, char const * filename)
|
||||||
/* usage */
|
/* usage */
|
||||||
static int _usage(void)
|
static int _usage(void)
|
||||||
{
|
{
|
||||||
fputs("Usage: " PROGNAME " [-Ei][file...]\n", stderr);
|
fputs("Usage: " PROGNAME " [-Ein][file...]\n", stderr);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -140,9 +152,10 @@ static int _usage(void)
|
||||||
int main(int argc, char * argv[])
|
int main(int argc, char * argv[])
|
||||||
{
|
{
|
||||||
int o;
|
int o;
|
||||||
|
Prefs prefs = 0;
|
||||||
int flags = 0;
|
int flags = 0;
|
||||||
|
|
||||||
while((o = getopt(argc, argv, "Ei")) != -1)
|
while((o = getopt(argc, argv, "Ein")) != -1)
|
||||||
switch(o)
|
switch(o)
|
||||||
{
|
{
|
||||||
case 'E':
|
case 'E':
|
||||||
|
@ -151,10 +164,14 @@ int main(int argc, char * argv[])
|
||||||
case 'i':
|
case 'i':
|
||||||
flags |= REG_ICASE;
|
flags |= REG_ICASE;
|
||||||
break;
|
break;
|
||||||
|
case 'n':
|
||||||
|
prefs |= GREP_PREFS_n;
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
return _usage();
|
return _usage();
|
||||||
}
|
}
|
||||||
if(optind == argc)
|
if(optind == argc)
|
||||||
return _usage();
|
return _usage();
|
||||||
return _grep(flags, argv[optind], argc - optind - 1, &argv[optind + 1]);
|
return _grep(&prefs, flags, argv[optind], argc - optind - 1,
|
||||||
|
&argv[optind + 1]);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue
Block a user