1
0
This commit is contained in:
dtb 2023-08-19 10:51:41 -04:00
parent d6909207df
commit 03b51b7b9b
2 changed files with 13 additions and 20 deletions

View File

@ -2,6 +2,6 @@ cat: cat.c
$(CC) -g -o cat cat.c $(CC) -g -o cat cat.c
clean: clean:
rm -f cat.c rm -f cat
.PHONY: clean .PHONY: clean

View File

@ -14,14 +14,12 @@ static char *default_argv[] = {
"-", "-",
(char *)NULL (char *)NULL
}; };
static char *stdout_name = "/dev/stdin"; static char *stdin_name = "/dev/stdin";
int main(int argc, char *argv[]){ int main(int argc, char *argv[]){
int arguing; char *argv0;
int c; int c;
extern int errno; extern int errno;
extern int opterr;
extern int optind;
struct stat fi; /* info */ struct stat fi; /* info */
char *fn; /* name */ char *fn; /* name */
FILE *fo; /* object */ FILE *fo; /* object */
@ -33,31 +31,27 @@ int main(int argc, char *argv[]){
default_argv[0] = argv[0]; default_argv[0] = argv[0];
argv = default_argv; argv = default_argv;
} }
arguing = 1;
opterr = 0; while((c = getopt(argc, argv, "hu")) != -1)
while(optind < argc){ switch(c){
if(arguing && (c = getopt(argc, argv, "hu")) != -1)
switch(c){
case 'u': case 'u':
setvbuf(stdout, NULL, _IONBF, 0); setvbuf(stdout, NULL, _IONBF, 0);
continue; continue;
case '-':
arguing = 0;
continue;
case 'h': default: usage: case 'h': default: usage:
fprintf(stderr, "Usage: %s (-h) (file...)\n", fprintf(stderr, "Usage: %s (-h) (file...)\n",
argv[0]); argv[0]);
return EX_USAGE; return EX_USAGE;
}
if(arguing && *argv[optind] == '-'){ /* "--" */
arguing = 0;
continue;
} }
if(*argv[optind] == '-' && argv[optind][1] == '\0'){ /* "-" */ argv0 = argv[0];
argc -= optind;
argv += optind;
while(argc --> 0){
if(argv[0][0] == '-' && argv[0][1] == '\0'){ /* "-" */
fn = stdin_name; fn = stdin_name;
fo = stdin; fo = stdin;
}else{ }else{
fn = argv[optind]; fn = argv[0];
if(stat(fn, &fi) == -1){ if(stat(fn, &fi) == -1){
switch(errno){ switch(errno){
case EFAULT: case ENOENT: case ENOTDIR: case EFAULT: case ENOENT: case ENOTDIR:
@ -105,7 +99,6 @@ int main(int argc, char *argv[]){
if(fo != stdin) if(fo != stdin)
fclose(fo); fclose(fo);
++optind;
} }
return EX_OK; return EX_OK;