blob: 82a73de2a2e35b7fe2d766057b98e305b8ce6fcf [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 *
6 * Copyright (C) 1999 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 Andersene49d5ec2000-02-08 19:58:47 +000030 "head [OPTION] [FILE]...\n\n"
31 "Print first 10 lines of each FILE to standard output.\n"
32 "With more than one FILE, precede each with a header giving the\n"
33 "file name. With no FILE, or when FILE is -, read standard input.\n\n"
John Beppu3157b1f1999-12-10 07:42:50 +000034
Erik Andersene49d5ec2000-02-08 19:58:47 +000035 "Options:\n" "\t-n NUM\t\tPrint first NUM lines instead of first 10\n";
36
37int head(int len, FILE * src)
John Beppu3157b1f1999-12-10 07:42:50 +000038{
Erik Andersene49d5ec2000-02-08 19:58:47 +000039 int i;
40 char buffer[1024];
John Beppu3157b1f1999-12-10 07:42:50 +000041
Erik Andersene49d5ec2000-02-08 19:58:47 +000042 for (i = 0; i < len; i++) {
43 fgets(buffer, 1024, src);
44 if (feof(src)) {
45 break;
46 }
47 fputs(buffer, stdout);
48 }
49 return 0;
John Beppu3157b1f1999-12-10 07:42:50 +000050}
51
52/* BusyBoxed head(1) */
Erik Andersene49d5ec2000-02-08 19:58:47 +000053int head_main(int argc, char **argv)
John Beppu3157b1f1999-12-10 07:42:50 +000054{
Erik Andersene49d5ec2000-02-08 19:58:47 +000055 char opt;
56 int len = 10, tmplen, i;
John Beppu3157b1f1999-12-10 07:42:50 +000057
Erik Andersene49d5ec2000-02-08 19:58:47 +000058 /* parse argv[] */
59 for (i = 1; i < argc; i++) {
60 if (argv[i][0] == '-') {
61 opt = argv[i][1];
62 switch (opt) {
63 case 'n':
64 tmplen = 0;
65 if (++i < argc)
66 tmplen = atoi(argv[i]);
67 if (tmplen < 1)
68 usage(head_usage);
69 len = tmplen;
70 break;
71 case '-':
72 case 'h':
73 usage(head_usage);
74 default:
75 fprintf(stderr, "head: invalid option -- %c\n", opt);
76 usage(head_usage);
77 }
78 } else {
79 break;
80 }
81 }
82
83 /* get rest of argv[] or stdin if nothing's left */
84 if (i >= argc) {
85 head(len, stdin);
86
John Beppu3157b1f1999-12-10 07:42:50 +000087 } else {
Erik Andersene49d5ec2000-02-08 19:58:47 +000088 int need_headers = ((argc - i) > 1);
John Beppu3157b1f1999-12-10 07:42:50 +000089
Erik Andersene49d5ec2000-02-08 19:58:47 +000090 for (; i < argc; i++) {
91 FILE *src;
John Beppu3157b1f1999-12-10 07:42:50 +000092
Erik Andersene49d5ec2000-02-08 19:58:47 +000093 src = fopen(argv[i], "r");
94 if (!src) {
95 fprintf(stderr, "head: %s: %s\n", argv[i],
96 strerror(errno));
97 } else {
98 /* emulating GNU behaviour */
99 if (need_headers) {
100 fprintf(stdout, "==> %s <==\n", argv[i]);
101 }
102 head(len, src);
103 if (i < argc - 1) {
104 fprintf(stdout, "\n");
105 }
106 }
John Beppu3157b1f1999-12-10 07:42:50 +0000107 }
John Beppu3157b1f1999-12-10 07:42:50 +0000108 }
Erik Andersene49d5ec2000-02-08 19:58:47 +0000109 exit(0);
John Beppu3157b1f1999-12-10 07:42:50 +0000110}
111
Erik Andersene49d5ec2000-02-08 19:58:47 +0000112/* $Id: head.c,v 1.8 2000/02/08 19:58:47 erik Exp $ */