On Wed, Dec 15, 2021 at 11:51:48AM +0000, Ricardo Mestre wrote:
>
> [...]
>
> the filename parameter on cook_buf is just used to show a warning, but it
> should
> be "stdin" instead of "(stdin)" to keep the same old behaviour.
Yep, fixed.
> additionally, please add a blank line after the pledge/err lines you added to
> help grepability.
I don't know why this would help, but sure, added a blank line.
> with those changed I have no objections to the diff, check if there's anyone
> else complaining :)
6 week bump.
To recap:
- Refactor the open/close portions of cook_args() and raw_args() into a
single function, cat_file().
- Push the flag-check branch in main() down into cat_file().
- Pull the argv loop in cat_file() up into main().
Once we've done that, we can then:
- Drop the "rpath" promise in the no-file case in main().
Any objections?
Index: cat.c
===================================================================
RCS file: /cvs/src/bin/cat/cat.c,v
retrieving revision 1.32
diff -u -p -r1.32 cat.c
--- cat.c 24 Oct 2021 21:24:21 -0000 1.32
+++ cat.c 1 Feb 2022 15:58:25 -0000
@@ -50,9 +50,8 @@
int bflag, eflag, nflag, sflag, tflag, vflag;
int rval;
-void cook_args(char *argv[]);
+void cat_file(const char *);
void cook_buf(FILE *, const char *);
-void raw_args(char *argv[]);
void raw_cat(int, const char *);
int
@@ -92,40 +91,62 @@ main(int argc, char *argv[])
return 1;
}
}
+ argc -= optind;
argv += optind;
- if (bflag || eflag || nflag || sflag || tflag || vflag)
- cook_args(argv);
- else
- raw_args(argv);
+ if (argc == 0) {
+ if (pledge("stdio", NULL) == -1)
+ err(1, "pledge");
+
+ cat_file(NULL);
+ } else {
+ for (; *argv != NULL; argv++)
+ cat_file(*argv);
+ }
if (fclose(stdout))
err(1, "stdout");
return rval;
}
void
-cook_args(char **argv)
+cat_file(const char *path)
{
+ const char *name;
FILE *fp;
+ int fd;
- if (*argv == NULL) {
- cook_buf(stdin, "stdin");
- return;
- }
-
- for (; *argv != NULL; argv++) {
- if (!strcmp(*argv, "-")) {
- cook_buf(stdin, "stdin");
- clearerr(stdin);
- continue;
+ if (bflag || eflag || nflag || sflag || tflag || vflag) {
+ if (path == NULL || strcmp(path, "-") == 0) {
+ name = "stdin";
+ fp = stdin;
+ } else {
+ name = path;
+ if ((fp = fopen(name, "r")) == NULL) {
+ warn("%s", name);
+ rval = 1;
+ return;
+ }
}
- if ((fp = fopen(*argv, "r")) == NULL) {
- warn("%s", *argv);
- rval = 1;
- continue;
+ cook_buf(fp, name);
+ if (fp == stdin)
+ clearerr(stdin);
+ else
+ fclose(fp);
+ } else {
+ if (path == NULL || strcmp(path, "-") == 0) {
+ name = "stdin";
+ fd = STDIN_FILENO;
+ } else {
+ name = path;
+ if ((fd = open(name, O_RDONLY)) == -1) {
+ warn("%s", name);
+ rval = 1;
+ return;
+ }
}
- cook_buf(fp, *argv);
- fclose(fp);
+ raw_cat(fd, name);
+ if (fd != STDIN_FILENO)
+ close(fd);
}
}
@@ -191,31 +212,6 @@ cook_buf(FILE *fp, const char *filename)
}
if (ferror(stdout))
err(1, "stdout");
-}
-
-void
-raw_args(char **argv)
-{
- int fd;
-
- if (*argv == NULL) {
- raw_cat(fileno(stdin), "stdin");
- return;
- }
-
- for (; *argv != NULL; argv++) {
- if (!strcmp(*argv, "-")) {
- raw_cat(fileno(stdin), "stdin");
- continue;
- }
- if ((fd = open(*argv, O_RDONLY)) == -1) {
- warn("%s", *argv);
- rval = 1;
- continue;
- }
- raw_cat(fd, *argv);
- close(fd);
- }
}
void