X-Git-Url: https://git.librecmc.org/?a=blobdiff_plain;f=head.c;h=0c8ef3d5907b8f020b90a7780c964fe281c4e905;hb=f72f562b2f118d32d4ca49b6248805936a0cfa66;hp=930839de3bbc63665551aaf635f1f299983f2d37;hpb=3157b1fba9ee8a558b04e9025da9f77e4256c0ea;p=oweals%2Fbusybox.git diff --git a/head.c b/head.c index 930839de3..0c8ef3d59 100644 --- a/head.c +++ b/head.c @@ -1,9 +1,10 @@ +/* vi: set sw=4 ts=4: */ /* * Mini head implementation for busybox * * - * Copyright (C) 1999 by Lineo, inc. - * Written by John Beppu + * Copyright (C) 1999,2000,2001 by Lineo, inc. + * Written by John Beppu * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -21,86 +22,78 @@ * */ -#include "internal.h" #include #include +#include +#include +#include +#include "busybox.h" -const char head_usage[] = -"Usage: head [OPTION]... [FILE]...\n" -"Print first 10 lines of each FILE to standard output.\n" -"With more than one FILE, precede each with a header giving the file name.\n" -"With no FILE, or when FILE is -, read standard input.\n\n" -" -h display this help and exit\n"; - -int -head(int len, FILE *src) +static int head(int len, FILE *fp) { - int i; - char buffer[1024]; + int i; + char *input; - for (i = 0; i < len; i++) { - fgets(buffer, 1024, src); - if (feof(src)) { break; } - fputs(buffer, stdout); - } - return 0; + for (i = 0; i < len; i++) { + if ((input = get_line_from_file(fp)) == NULL) + break; + fputs(input, stdout); + free(input); + } + return 0; } /* BusyBoxed head(1) */ -int -head_main(int argc, char **argv) +int head_main(int argc, char **argv) { - int i = 1; - char opt; - int len = 10; - - /* 1st option is potentially special */ - if ((argv[1][0] == '-') && isDecimal(argv[1][1])) { - int tmplen = atoi(&argv[1][1]); - if (tmplen) { len = tmplen; } - i = 2; - } + FILE *fp; + int need_headers, opt, len = 10, status = EXIT_SUCCESS; - /* parse argv[] */ - for ( ; i < argc; i++) { - if (argv[i][0] == '-') { - opt = argv[i][1]; - switch (opt) { - case 'h': - usage(head_usage); + /* parse argv[] */ + while ((opt = getopt(argc, argv, "n:")) > 0) { + switch (opt) { + case 'n': + len = atoi(optarg); + if (len >= 1) + break; + /* fallthrough */ default: - fprintf(stderr, "head: invalid option -- %c\n", opt); - usage(head_usage); - } - } else { - break; + show_usage(); + } } - } - /* get rest of argv[] or stdin if nothing's left */ - if (i >= argc) { - head(len, stdin); + /* get rest of argv[] or stdin if nothing's left */ + 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]); + 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; } - head(len, src); - if (i < argc - 1) { - fprintf(stdout, "\n"); + 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.1 1999/12/10 07:42:50 beppu Exp $ */ + return status; +}