blob: b82678dc23da622baf00ec5d17c86cc0964b9c91 [file] [log] [blame]
Erik Andersene49d5ec2000-02-08 19:58:47 +00001/* vi: set sw=4 ts=4: */
John Beppu3157b1f1999-12-10 07:42:50 +00002/*
3 * Mini head implementation for busybox
4 *
5 *
Erik Andersen61677fe2000-04-13 01:18:56 +00006 * Copyright (C) 1999,2000 by Lineo, inc.
Eric Andersencf536871999-12-10 08:29:20 +00007 * Written by John Beppu <beppu@lineo.com>
John Beppu3157b1f1999-12-10 07:42:50 +00008 *
9 * This program is free software; you can redistribute it and/or modify
10 * it under the terms of the GNU General Public License as published by
11 * the Free Software Foundation; either version 2 of the License, or
12 * (at your option) any later version.
13 *
14 * This program is distributed in the hope that it will be useful,
15 * but WITHOUT ANY WARRANTY; without even the implied warranty of
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
17 * General Public License for more details.
18 *
19 * You should have received a copy of the GNU General Public License
20 * along with this program; if not, write to the Free Software
21 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
22 *
23 */
24
25#include "internal.h"
26#include <errno.h>
27#include <stdio.h>
28
29const char head_usage[] =
Erik Andersen7ab9c7e2000-05-12 19:41:47 +000030 "head [OPTION] [FILE]...\n"
31#ifndef BB_FEATURE_TRIVIAL_HELP
32 "\nPrint first 10 lines of each FILE to standard output.\n"
Erik Andersene49d5ec2000-02-08 19:58:47 +000033 "With more than one FILE, precede each with a header giving the\n"
34 "file name. With no FILE, or when FILE is -, read standard input.\n\n"
John Beppu3157b1f1999-12-10 07:42:50 +000035
Erik Andersen7ab9c7e2000-05-12 19:41:47 +000036 "Options:\n" "\t-n NUM\t\tPrint first NUM lines instead of first 10\n"
37#endif
38 ;
Erik Andersene49d5ec2000-02-08 19:58:47 +000039
40int head(int len, FILE * src)
John Beppu3157b1f1999-12-10 07:42:50 +000041{
Erik Andersene49d5ec2000-02-08 19:58:47 +000042 int i;
43 char buffer[1024];
John Beppu3157b1f1999-12-10 07:42:50 +000044
Erik Andersene49d5ec2000-02-08 19:58:47 +000045 for (i = 0; i < len; i++) {
46 fgets(buffer, 1024, src);
47 if (feof(src)) {
48 break;
49 }
50 fputs(buffer, stdout);
51 }
52 return 0;
John Beppu3157b1f1999-12-10 07:42:50 +000053}
54
55/* BusyBoxed head(1) */
Erik Andersene49d5ec2000-02-08 19:58:47 +000056int head_main(int argc, char **argv)
John Beppu3157b1f1999-12-10 07:42:50 +000057{
Erik Andersene49d5ec2000-02-08 19:58:47 +000058 char opt;
59 int len = 10, tmplen, i;
John Beppu3157b1f1999-12-10 07:42:50 +000060
Erik Andersene49d5ec2000-02-08 19:58:47 +000061 /* parse argv[] */
62 for (i = 1; i < argc; i++) {
63 if (argv[i][0] == '-') {
64 opt = argv[i][1];
65 switch (opt) {
66 case 'n':
67 tmplen = 0;
68 if (++i < argc)
69 tmplen = atoi(argv[i]);
70 if (tmplen < 1)
71 usage(head_usage);
72 len = tmplen;
73 break;
74 case '-':
75 case 'h':
76 usage(head_usage);
77 default:
Matt Kraaid537a952000-07-14 01:51:25 +000078 errorMsg("invalid option -- %c\n", opt);
Erik Andersene49d5ec2000-02-08 19:58:47 +000079 usage(head_usage);
80 }
81 } else {
82 break;
83 }
84 }
85
86 /* get rest of argv[] or stdin if nothing's left */
87 if (i >= argc) {
88 head(len, stdin);
89
John Beppu3157b1f1999-12-10 07:42:50 +000090 } else {
Erik Andersene49d5ec2000-02-08 19:58:47 +000091 int need_headers = ((argc - i) > 1);
John Beppu3157b1f1999-12-10 07:42:50 +000092
Erik Andersene49d5ec2000-02-08 19:58:47 +000093 for (; i < argc; i++) {
94 FILE *src;
John Beppu3157b1f1999-12-10 07:42:50 +000095
Erik Andersene49d5ec2000-02-08 19:58:47 +000096 src = fopen(argv[i], "r");
97 if (!src) {
Matt Kraaid537a952000-07-14 01:51:25 +000098 errorMsg("%s: %s\n", argv[i], strerror(errno));
Erik Andersene49d5ec2000-02-08 19:58:47 +000099 } else {
100 /* emulating GNU behaviour */
101 if (need_headers) {
102 fprintf(stdout, "==> %s <==\n", argv[i]);
103 }
104 head(len, src);
105 if (i < argc - 1) {
106 fprintf(stdout, "\n");
107 }
108 }
John Beppu3157b1f1999-12-10 07:42:50 +0000109 }
John Beppu3157b1f1999-12-10 07:42:50 +0000110 }
Eric Andersenb6106152000-06-19 17:25:40 +0000111 return(0);
John Beppu3157b1f1999-12-10 07:42:50 +0000112}
113
Matt Kraaid537a952000-07-14 01:51:25 +0000114/* $Id: head.c,v 1.12 2000/07/14 01:51:25 kraai Exp $ */