diff --git a/.gitignore b/.gitignore index bdc5af0..62b545e 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,3 @@ *~ build +vgcore* diff --git a/src/cat.c b/src/cat.c index a7a9874..1c8fee2 100644 --- a/src/cat.c +++ b/src/cat.c @@ -1,18 +1,50 @@ #include +#include +#include +#include +#include + +int usage(char *argv0) { + printf("Usage: %s [-u] [file ...]\n", argv0); + return 2; +} int main(int argc, char *argv[]){ char ch; - for (int i = 1; i < argc; i++) { - FILE *file = fopen(argv[i], "r"); - if (file == NULL ) { - printf("Cannot find file: %s\n", argv[1]); - return 1; - } + int opt; + FILE *file = stdin; + while ((opt = getopt(argc, argv, ":u")) != -1) { + switch (opt) { + case 'u': + break; + case '?': + fprintf(stderr, "%s: invalid option -- '%c'\n", argv[0], optopt); + return usage(argv[0]); + } + } - while ((ch = fgetc(file)) != EOF) - { - putchar(ch); - } - fclose(file); - } + if (optind == argc) { // FIXME: this code is not clean + goto READ_STDIN; + } + + for (; optind < argc; optind++) { + if (strcmp(argv[optind], "-")) { + file = fopen(argv[optind], "r"); + if (file == NULL) { + fprintf(stderr, "%s: ", argv[0]); + perror(argv[optind]); + return -1; + } + } else { + file = stdin; + } +READ_STDIN: + while ((ch = fgetc(file)) != EOF) { + putchar(ch); + } + if (file != NULL && file != stdin) { + fclose(file); + } + } + return 0; }