/*****************************
/* grep.c file
/* ubios.c has the O_... in #define
/*****************************/
#include "ucode.c"
int putLineIntoBuffer(int fd, char* buffer, int bufSize)
{
int spaceLeft = bufSize;
int amtRead;
while(spaceLeft)
{
amtRead = read(fd,buffer,1);
if(0 == amtRead || -1 == amtRead)
{
return -1;
}/*end if read no more*/
else if('\n' == *buffer)
{
/* *buffer='\0';*/
*buffer=0;
break;
}/*end if pts to line break*/
spaceLeft--;
buffer++;
}/*end while space is left*/
return bufSize - spaceLeft;
}/*end int putLineIntoBuffer*/
int main(char* argLine)
{
int fd;
int i;
int amtRead;
char c;
char inputLine[1024];
char* linePlace;
char* pattern;
char* fileArg;
/*get rid of carriage returns, enter, tab and spaces
grabs first arg out*/
if(!strtok(argLine,"\r\n\t "))
{
return -1;
}
printf("^2 %s$\n\r", inputLine);
/*grab second and third arg, tokenized same as first*/
pattern = strtok(0, "\r\n\t ");
printf("^3 %s$\n\r", inputLine);
if(!pattern)
{
printf("grep: give me a pattern\n\r");
}
fileArg = strtok(0,"\r\n\t ");
if(fileArg)
{
/*invariant: happens at least once,
continues while there is more,
tokenized same as the first*/
do
{
fd=open(fileArg,O_RDONLY);
if(-1 < fd)
{
/*get a line into the buffer*/
while(-1 != putLineIntoBuffer(fd,inputLine,sizeof(inputLine)))
{
/*if exists inline, display*/
if(strstr(inputLine,pattern))
{
printf("%s: %s\n\r",fileArg,inputLine);
}/*end if exist, print the line*/
}/*while has characters, put to screen*/
}/*if have a valid fd*/
else
{
printf("grep error! %s caused error.\n\t",fileArg);
}
close(fd);
}while(fileArg = strtok(0,"\r\n\t "));
}/*end if second arg exists*/
else
{
/*no file exists...do on stdin?*/
/*get & display*/
while(read(0,&c,1))
{
putc(c);
if('\n'==c)
{
putc('\r');
}/*if newline, do hard return*/
}/*while has characters, put to screen*/
}/*end else: do from stdin*/
}/*end main*/