+/* vi: set sw=4 ts=4: */
/*
* Mini head implementation for busybox
*
*
- * Copyright (C) 1999 by Lineo, inc.
- * Written by John Beppu <beppu@line.com>
+ * 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
* it under the terms of the GNU General Public License as published by
*
*/
-#include "internal.h"
#include <errno.h>
#include <stdio.h>
+#include <getopt.h>
+#include <stdlib.h>
+#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)
+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;
+}