COMP1721 - Higher Computing 1B
Higher Computing 1B - Week Laboratory Exercises
#include <stdio.h>
#include <string.h>
#include <ctype.h>
enum {
MAX_LINE_LENGTH = 256
};
int
match(char *line, char *pattern) {
return strstr(line, pattern) != NULL;
}
void
string_tolower(char *s) {
for (; *s != '\0'; s++)
*s = tolower(*s);
}
void
grep(char *filename, char *pattern, int print_line_numbers, int ignore_case) {
FILE *f;
int line_number;
char line[MAX_LINE_LENGTH+2];
char line_copy[MAX_LINE_LENGTH+2];
f = fopen(filename, "r");
if (f == NULL) {
fprintf(stderr, "grep: %s: ", filename);
perror("");
return;
}
line_number = 1;
while(fgets(line, MAX_LINE_LENGTH, f) != NULL) {
strcpy(line_copy, line);
if (ignore_case)
string_tolower(line_copy);
if (match(line_copy, pattern)) {
if (print_line_numbers)
printf("%d: ", line_number);
printf("%s", line);
}
line_number++;
}
fclose(f);
}
void
usage() {
fprintf(stderr, "Usage: grep [-n] [-i] ");
exit(1);
}
int
main(int argc, char *argv[]) {
int i, print_line_numbers = 0, ignore_case = 0;
char *pattern = NULL;
if (argc < 3)
usage();
for (i = 1; i < argc; i++) {
if (strcmp(argv[i], "-n") == 0) {
print_line_numbers = 1;
continue;
}
if (strcmp(argv[i], "-i") == 0) {
ignore_case = 1;
if (pattern != NULL)
string_tolower(pattern);
continue;
}
if (pattern == NULL) {
pattern = argv[i];
if (ignore_case)
string_tolower(pattern);
continue;
}
grep(argv[i], pattern, print_line_numbers, ignore_case);
}
return 0;
}
Andrew Taylor (andrewt@cse.unsw.edu.au)
Higher Computing 1B,
Computer Science & Engineering,
UNSW