I've got it to accept flags and no flags.
Here's the code:
Code:
#include <stdio.h>
#include <stdint.h>
#include <string.h>
#include <unistd.h>
void CookedCatArgs(char **argv);
void CookedBuffer(FILE *fp);
void GoingRaw(char **argv);
void RawCat(FILE *fp);
char *FileName;
uint8_t eFlag, sFlag, tFlag, seFlag;
int main(int argc, char **argv) {
int8_t GetOptions;
eFlag = sFlag = tFlag = seFlag = 0;
while((GetOptions = getopt(argc, argv, "est")) != -1)
switch(GetOptions) {
case 'e':
eFlag = 1;
break;
case 's':
sFlag = 1;
break;
case 't':
tFlag = 1;
break;
default:
fprintf(stderr, "Usage: cat [-est] [file ...]\n");
return 1;
}
argv += optind;
if(eFlag || sFlag || tFlag || seFlag) {
CookedCatArgs(argv);
}
else
GoingRaw(argv);
return 0;
}
void CookedCatArgs(char **argv) {
FILE *cooked_fp;
cooked_fp = stdin;
FileName = "stdin";
do {
if(*argv) {
if(!strcmp(*argv, "-"))
cooked_fp = stdin;
else if((cooked_fp = fopen(*argv, "r")) == NULL) {
fprintf(stderr, "%s not found.\n", *argv);
++argv;
continue;
}
FileName = *argv++;
}
CookedBuffer(cooked_fp);
if(cooked_fp == stdin)
clearerr(cooked_fp);
else
fclose(cooked_fp);
}
while(*argv);
}
void CookedBuffer(FILE *fp) {
int8_t CharacterChecker, NewLineInit, NewLineDetector;
NewLineDetector = 0;
for(NewLineInit = '\n'; (CharacterChecker = getc(fp)) != EOF; NewLineInit = CharacterChecker) {
if(NewLineInit == '\n') {
if(sFlag) {
if(CharacterChecker == '\n') {
if(NewLineDetector)
continue;
NewLineDetector = 1;
}
else
NewLineDetector = 0;
}
}
if(CharacterChecker == '\n') {
if(eFlag && putchar('$') == EOF)
break;
}
else if(CharacterChecker == '\t') {
if(tFlag) {
if(putchar('^') == EOF || putchar('I') == EOF)
break;
continue;
}
}
if(putchar(CharacterChecker) == EOF)
break;
}
}
void GoingRaw(char **argv) {
int8_t ForInit;
char Character;
FILE *fp;
fp = stdin;
FileName = "stdin";
do {
if(*argv) {
if((fp = fopen(*argv, "r")) == NULL) {
fprintf(stderr, "%s not found.\n", *argv);
++argv;
continue;
}
FileName = *argv++;
}
for(ForInit = 0; (Character = getc(fp)) != EOF; ForInit = Character)
printf("%c", Character);
}
while(*argv);
}