X-Git-Url: https://git.librecmc.org/?a=blobdiff_plain;ds=sidebyside;f=head.c;h=92b43bae2f75bfaf47e0bc2a500b80389db4ce86;hb=69229a6c92a2d73bcee7c06eb79bd0a4f40d4e16;hp=b80d065801e899980140ea18785595015f768cc8;hpb=fac10d7c59f7db0facd5fb94de273310b9ec86e6;p=oweals%2Fbusybox.git diff --git a/head.c b/head.c index b80d06580..92b43bae2 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 by Lineo, inc. * Written by John Beppu * * This program is free software; you can redistribute it and/or modify @@ -21,88 +22,75 @@ * */ -#include "internal.h" +#include "busybox.h" #include #include -const char head_usage[] = -"head [OPTION] [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\n" -"Options:\n" -"\t-n NUM\t\tPrint first NUM lines instead of first 10\n"; - -int -head(int len, FILE *src) +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) { - 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) { + /* parse argv[] */ + while ((opt = getopt(argc, argv, "n:")) > 0) { + switch (opt) { case 'n': - tmplen = 0; - if (++i < argc) - tmplen = atoi(argv[i]); - if (tmplen < 1) - usage(head_usage); - len = tmplen; - break; - case '-': - case 'h': - usage(head_usage); + len = atoi(optarg); + if (len >= 1) + break; + /* fallthrough */ default: - fprintf(stderr, "head: invalid option -- %c\n", opt); - usage(head_usage); - } - } else { - break; + usage(head_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) { + 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++; } - } - exit(0); -} -/* $Id: head.c,v 1.7 2000/02/07 05:29:42 erik Exp $ */ + return status; +}