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