diff --git a/src/mm.c b/src/mm.c index a9c45b3..56b8c95 100644 --- a/src/mm.c +++ b/src/mm.c @@ -82,8 +82,7 @@ Files_append(struct Files *files, FILE *file, char *name) { * appropriate for an OS error. */ static int oserr(char *s, char *r) { - - fprintf(stderr, "%s: %s: %s\n", s, r, strerror(errno)); + (void)fprintf(stderr, "%s: %s: %s\n", s, r, strerror(errno)); return EX_OSERR; } @@ -100,11 +99,7 @@ usage(char *argv0) { } int main(int argc, char *argv[]) { - int c; struct Files files[2]; /* {read, write} */ - size_t i; - size_t j; - size_t k; /* loop index but also unbuffer status */ int retval; /* Initializes the files structs with their default values, standard @@ -112,39 +107,41 @@ int main(int argc, char *argv[]) { * these initial values will be overwritten, so to, say, use mm(1) * equivalently to tee(1p), -o - will need to be specified before * additional files to ensure standard output is still written. */ - for (i = 0; i < 2; ++i) { + for (size_t i = 0; i < 2; ++i) { files[i].a = 0; files[i].s = 0; files[i].mode = fmode[i]; files[i].files = NULL; files[i].names = NULL; - Files_append( - &files[i], - i == 0 ? stdin : stdout, - i == 0 ? stdin_name : stdout_name - ); + if (Files_append( + &files[i], + i == 0 ? stdin : stdout, + i == 0 ? stdin_name : stdout_name + ) == NULL) { + return oserr(program_name, i == 0 ? stdin_name : stdout_name); + } files[i].s = 0; } - k = 0; - if (argc > 0) { + int c; + char unbuffered = 0; + program_name = argv[0]; while ((c = getopt(argc, argv, "aehi:no:u")) != -1) { - switch (c){ + switch (c) { case 'a': /* "rb+" -> "ab" */ files[1].mode[0] = 'a'; files[1].mode[2] = '\0'; break; case 'e': - if (Files_append(&files[1], stderr, stderr_name) != NULL) { - break; + if (Files_append(&files[1], stderr, stderr_name) == NULL) { + return oserr(program_name, stderr_name); } - - return oserr(program_name, "-e"); + break; case 'i': if ( (strcmp(optarg, "-") == 0 @@ -171,16 +168,28 @@ int main(int argc, char *argv[]) { return oserr(program_name, optarg); case 'n': - if (signal(SIGINT, SIG_IGN) != SIG_ERR) { break; } + if (signal(SIGINT, SIG_IGN) == SIG_ERR) { + return oserr(program_name, "-n"); + } - return oserr(program_name, "-n"); - case 'u': - k = 1; break; - default: - return usage(program_name); + case 'u': unbuffered = 1; break; + default: return usage(program_name); } } + + if (unbuffered) { /* Unbuffer files. */ + for ( + size_t i = 0; + i < files[0].s; + setvbuf(files[0].files[i++], NULL, _IONBF, 0) + ); + for ( + size_t i = 0; + i < files[1].s; + setvbuf(files[1].files[i++], NULL, _IONBF, 0) + ); + } } if (optind != argc) { return usage(program_name); } @@ -188,26 +197,18 @@ int main(int argc, char *argv[]) { files[0].s += files[0].s == 0; files[1].s += files[1].s == 0; - /* Unbuffer files. */ - if (k) { - for ( - i = 0; i < files[0].s; setvbuf(files[0].files[i++], NULL, _IONBF, 0) - ); - for ( - i = 0; i < files[1].s; setvbuf(files[1].files[i++], NULL, _IONBF, 0) - ); - } retval = EX_OK; /* Actual program loop. */ - for (i = 0; i < files[0].s; ++i) { /* iterate ins */ + for (size_t i = 0; i < files[0].s; ++i) { /* iterate ins */ + int c; + while ((c = getc(files[0].files[i])) != EOF) { /* iterate chars */ - for (j = 0; j < files[1].s; ++j) { /* iterate outs */ - if (putc(c, files[1].files[j]) == EOF) { - /* notebook's full */ + for (size_t j = 0; j < files[1].s; ++j) { /* iterate outs */ + if (putc(c, files[1].files[j]) == EOF) { /* notebook's full */ retval = EX_IOERR; - fprintf( + (void)fprintf( stderr, "%s: %s: %s\n", program_name, @@ -216,7 +217,7 @@ int main(int argc, char *argv[]) { ); if (fclose(files[1].files[j]) == EOF) { - fprintf( + (void)fprintf( stderr, "%s: %s: %s\n", program_name, @@ -226,7 +227,7 @@ int main(int argc, char *argv[]) { } /* massage out the tense muscle */ - for(k = j--; k < files[1].s - 1; ++k){ + for(size_t k = j--; k < files[1].s - 1; ++k){ files[1].files[k] = files[1].files[k+1]; files[1].names[k] = files[1].names[k+1]; }