X-Git-Url: https://git.librecmc.org/?a=blobdiff_plain;f=head.c;h=92b43bae2f75bfaf47e0bc2a500b80389db4ce86;hb=69229a6c92a2d73bcee7c06eb79bd0a4f40d4e16;hp=f42f4837d323a6bddad94ea6cc6cd41a7a7675ea;hpb=b610615be9aedfac07d1e01f12575707fa3a227c;p=oweals%2Fbusybox.git diff --git a/head.c b/head.c index f42f4837d..92b43bae2 100644 --- a/head.c +++ b/head.c @@ -22,32 +22,20 @@ * */ -#include "internal.h" +#include "busybox.h" #include #include -const char head_usage[] = - "head [OPTION] [FILE]...\n" -#ifndef BB_FEATURE_TRIVIAL_HELP - "\nPrint first 10 lines of each FILE to standard output.\n" - "With more than one FILE, precede each with a header giving the\n" - "file name. With no FILE, or when FILE is -, read standard input.\n\n" - - "Options:\n" "\t-n NUM\t\tPrint first NUM lines instead of first 10\n" -#endif - ; - -int head(int len, FILE * src) +int head(int len, FILE *fp) { int i; - char buffer[1024]; + char *input; for (i = 0; i < len; i++) { - fgets(buffer, 1024, src); - if (feof(src)) { + if ((input = get_line_from_file(fp)) == NULL) break; - } - fputs(buffer, stdout); + fputs(input, stdout); + free(input); } return 0; } @@ -55,61 +43,54 @@ int head(int len, FILE * src) /* BusyBoxed head(1) */ int head_main(int argc, char **argv) { - char opt; - int len = 10, tmplen, i; + FILE *fp; + int need_headers, opt, len = 10, status = EXIT_SUCCESS; /* parse argv[] */ - for (i = 1; i < argc; i++) { - if (argv[i][0] == '-') { - opt = argv[i][1]; - switch (opt) { - case 'n': - tmplen = 0; - if (++i < argc) - tmplen = atoi(argv[i]); - if (tmplen < 1) - usage(head_usage); - len = tmplen; + while ((opt = getopt(argc, argv, "n:")) > 0) { + switch (opt) { + case 'n': + len = atoi(optarg); + if (len >= 1) break; - case '-': - case 'h': - usage(head_usage); - default: - fprintf(stderr, "head: invalid option -- %c\n", opt); - usage(head_usage); - } - } else { - break; + /* fallthrough */ + default: + usage(head_usage); } } /* get rest of argv[] or stdin if nothing's left */ - if (i >= argc) { + if (argv[optind] == NULL) { head(len, stdin); + return status; + } - } else { - int need_headers = ((argc - i) > 1); - - for (; i < argc; i++) { - FILE *src; - - src = fopen(argv[i], "r"); - if (!src) { - fprintf(stderr, "head: %s: %s\n", argv[i], - strerror(errno)); - } else { - /* emulating GNU behaviour */ - if (need_headers) { - fprintf(stdout, "==> %s <==\n", argv[i]); - } - head(len, src); - if (i < argc - 1) { - fprintf(stdout, "\n"); - } + need_headers = optind != (argc - 1); + while (argv[optind]) { + if (strcmp(argv[optind], "-") == 0) { + fp = stdin; + argv[optind] = "standard input"; + } else { + if ((fp = wfopen(argv[optind], "r")) == NULL) + status = EXIT_FAILURE; + } + if (fp) { + if (need_headers) { + fprintf(stdout, "==> %s <==\n", argv[optind]); } + head(len, fp); + if (errno) { + errorMsg("%s: %s\n", argv[optind], strerror(errno)); + status = EXIT_FAILURE; + errno = 0; + } + if (optind < argc - 1) + fprintf(stdout, "\n"); + if (fp != stdin) + fclose(fp); } + optind++; } - return(0); -} -/* $Id: head.c,v 1.11 2000/06/19 17:25:39 andersen Exp $ */ + return status; +}