+/* 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 <beppu@lineo.com>
*
* This program is free software; you can redistribute it and/or modify
*
*/
-#include "internal.h"
+#include "busybox.h"
#include <errno.h>
#include <stdio.h>
+#include <getopt.h>
+#include <stdlib.h>
-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) {
+ 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.7 2000/02/07 05:29:42 erik Exp $ */
+ return status;
+}