X-Git-Url: https://git.librecmc.org/?a=blobdiff_plain;f=head.c;h=0c8ef3d5907b8f020b90a7780c964fe281c4e905;hb=8a9b2c6448e32f16e4b65dbd4927d9108c007acc;hp=f4ebe05c9a66b27025fd84530e7793d1c7519d81;hpb=7ab9c7ee52db8759d457819f5480378fa3aa97cc;p=oweals%2Fbusybox.git diff --git a/head.c b/head.c index f4ebe05c9..0c8ef3d59 100644 --- a/head.c +++ b/head.c @@ -3,7 +3,7 @@ * Mini head implementation for busybox * * - * Copyright (C) 1999,2000 by Lineo, inc. + * Copyright (C) 1999,2000,2001 by Lineo, inc. * Written by John Beppu * * This program is free software; you can redistribute it and/or modify @@ -22,32 +22,23 @@ * */ -#include "internal.h" #include #include +#include +#include +#include +#include "busybox.h" -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) +static 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 +46,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: + show_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) { + printf("==> %s <==\n", argv[optind]); } + head(len, fp); + if (errno) { + perror_msg("%s", argv[optind]); + status = EXIT_FAILURE; + errno = 0; + } + if (optind < argc - 1) + putchar('\n'); + if (fp != stdin) + fclose(fp); } + optind++; } - exit(0); -} -/* $Id: head.c,v 1.10 2000/05/12 19:41:47 erik Exp $ */ + return status; +}