X-Git-Url: https://git.librecmc.org/?a=blobdiff_plain;f=head.c;h=0c8ef3d5907b8f020b90a7780c964fe281c4e905;hb=8a9b2c6448e32f16e4b65dbd4927d9108c007acc;hp=a9d024e6216858c4282276c013d57d36bba5c270;hpb=25ab6534576eb0dbb636867ff992ab3a69ae06bc;p=oweals%2Fbusybox.git diff --git a/head.c b/head.c index a9d024e62..0c8ef3d59 100644 --- a/head.c +++ b/head.c @@ -1,8 +1,9 @@ +/* vi: set sw=4 ts=4: */ /* * Mini head implementation for busybox * * - * Copyright (C) 1999 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 @@ -21,87 +22,78 @@ * */ -#include "internal.h" #include #include +#include +#include +#include +#include "busybox.h" -const char head_usage[] = -"Usage: head [FILE]...\n\n" -"Print 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"; - -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 ((argc > 1) && (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 '-': - break; - 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.3 1999/12/15 19:29:09 beppu Exp $ */ + return status; +}