From 3157b1fba9ee8a558b04e9025da9f77e4256c0ea Mon Sep 17 00:00:00 2001 From: John Beppu Date: Fri, 10 Dec 1999 07:42:50 +0000 Subject: [PATCH] Implemented head(1). tried to mimic GNU behaviour. --- applets/busybox.c | 3 ++ busybox.c | 3 ++ busybox.def.h | 1 + coreutils/head.c | 106 ++++++++++++++++++++++++++++++++++++++++++++++ head.c | 106 ++++++++++++++++++++++++++++++++++++++++++++++ internal.h | 1 + 6 files changed, 220 insertions(+) create mode 100644 coreutils/head.c create mode 100644 head.c diff --git a/applets/busybox.c b/applets/busybox.c index 4ac907665..f4573019b 100644 --- a/applets/busybox.c +++ b/applets/busybox.c @@ -75,6 +75,9 @@ static const struct Applet applets[] = { #ifdef BB_HALT //sbin {"halt", halt_main}, #endif +#ifdef BB_HEAD //bin + {"head", head_main}, +#endif #ifdef BB_HOSTNAME //bin {"hostname", hostname_main}, #endif diff --git a/busybox.c b/busybox.c index 4ac907665..f4573019b 100644 --- a/busybox.c +++ b/busybox.c @@ -75,6 +75,9 @@ static const struct Applet applets[] = { #ifdef BB_HALT //sbin {"halt", halt_main}, #endif +#ifdef BB_HEAD //bin + {"head", head_main}, +#endif #ifdef BB_HOSTNAME //bin {"hostname", hostname_main}, #endif diff --git a/busybox.def.h b/busybox.def.h index cd3447f15..1bdb9a429 100644 --- a/busybox.def.h +++ b/busybox.def.h @@ -24,6 +24,7 @@ #define BB_DEALLOCVT #define BB_GREP //#define BB_HALT +#define BB_HEAD #define BB_HOSTNAME #define BB_INIT #define BB_KILL diff --git a/coreutils/head.c b/coreutils/head.c new file mode 100644 index 000000000..930839de3 --- /dev/null +++ b/coreutils/head.c @@ -0,0 +1,106 @@ +/* + * Mini head implementation for busybox + * + * + * Copyright (C) 1999 by Lineo, inc. + * Written by John Beppu + * + * 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 + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#include "internal.h" +#include +#include + +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 i; + char buffer[1024]; + + for (i = 0; i < len; i++) { + fgets(buffer, 1024, src); + if (feof(src)) { break; } + fputs(buffer, stdout); + } + return 0; +} + +/* BusyBoxed head(1) */ +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; + } + + /* parse argv[] */ + for ( ; i < argc; i++) { + if (argv[i][0] == '-') { + opt = argv[i][1]; + switch (opt) { + case 'h': + usage(head_usage); + default: + fprintf(stderr, "head: invalid option -- %c\n", opt); + usage(head_usage); + } + } else { + break; + } + } + + /* get rest of argv[] or stdin if nothing's left */ + if (i >= argc) { + head(len, stdin); + + } 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]); + } + head(len, src); + if (i < argc - 1) { + fprintf(stdout, "\n"); + } + } + } + } + exit(0); +} + +/* $Id: head.c,v 1.1 1999/12/10 07:42:50 beppu Exp $ */ diff --git a/head.c b/head.c new file mode 100644 index 000000000..930839de3 --- /dev/null +++ b/head.c @@ -0,0 +1,106 @@ +/* + * Mini head implementation for busybox + * + * + * Copyright (C) 1999 by Lineo, inc. + * Written by John Beppu + * + * 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 + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#include "internal.h" +#include +#include + +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 i; + char buffer[1024]; + + for (i = 0; i < len; i++) { + fgets(buffer, 1024, src); + if (feof(src)) { break; } + fputs(buffer, stdout); + } + return 0; +} + +/* BusyBoxed head(1) */ +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; + } + + /* parse argv[] */ + for ( ; i < argc; i++) { + if (argv[i][0] == '-') { + opt = argv[i][1]; + switch (opt) { + case 'h': + usage(head_usage); + default: + fprintf(stderr, "head: invalid option -- %c\n", opt); + usage(head_usage); + } + } else { + break; + } + } + + /* get rest of argv[] or stdin if nothing's left */ + if (i >= argc) { + head(len, stdin); + + } 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]); + } + head(len, src); + if (i < argc - 1) { + fprintf(stdout, "\n"); + } + } + } + } + exit(0); +} + +/* $Id: head.c,v 1.1 1999/12/10 07:42:50 beppu Exp $ */ diff --git a/internal.h b/internal.h index 4bde46612..39b07b952 100644 --- a/internal.h +++ b/internal.h @@ -74,6 +74,7 @@ extern int find_main(int argc, char** argv); extern int free_main(int argc, char** argv); extern int grep_main(int argc, char** argv); extern int halt_main(int argc, char** argv); +extern int head_main(int argc, char** argv); extern int hostname_main(int argc, char** argv); extern int init_main(int argc, char** argv); extern int kill_main(int argc, char** argv); -- 2.25.1