Rewrote head to perservere when it can't open a file, and share code

with cat.
This commit is contained in:
Matt Kraai 2000-09-27 04:09:22 +00:00
parent e7c1af1e0d
commit c0321f9bc6
5 changed files with 107 additions and 105 deletions

View File

@ -395,6 +395,7 @@ extern int print_file_by_name(char *filename);
extern char process_escape_sequence(char **ptr); extern char process_escape_sequence(char **ptr);
extern char *get_last_path_component(char *path); extern char *get_last_path_component(char *path);
extern void xregcomp(regex_t *preg, const char *regex, int cflags); extern void xregcomp(regex_t *preg, const char *regex, int cflags);
extern FILE *wfopen(const char *path, const char *mode);
extern FILE *xfopen(const char *path, const char *mode); extern FILE *xfopen(const char *path, const char *mode);
#ifndef DMALLOC #ifndef DMALLOC

View File

@ -26,17 +26,16 @@
#include <errno.h> #include <errno.h>
#include <stdio.h> #include <stdio.h>
int head(int len, FILE * src) int head(int len, FILE *fp)
{ {
int i; int i;
char buffer[1024]; char *input;
for (i = 0; i < len; i++) { for (i = 0; i < len; i++) {
fgets(buffer, 1024, src); if ((input = get_line_from_file(fp)) == NULL)
if (feof(src)) {
break; break;
} fputs(input, stdout);
fputs(buffer, stdout); free(input);
} }
return 0; return 0;
} }
@ -44,60 +43,54 @@ int head(int len, FILE * src)
/* BusyBoxed head(1) */ /* BusyBoxed head(1) */
int head_main(int argc, char **argv) int head_main(int argc, char **argv)
{ {
char opt; FILE *fp;
int len = 10, tmplen, i; int need_headers, opt, len = 10, status = EXIT_SUCCESS;
/* parse argv[] */ /* parse argv[] */
for (i = 1; i < argc; i++) { while ((opt = getopt(argc, argv, "n:")) > 0) {
if (argv[i][0] == '-') { switch (opt) {
opt = argv[i][1]; case 'n':
switch (opt) { len = atoi(optarg);
case 'n': if (len >= 1)
tmplen = 0;
if (++i < argc)
tmplen = atoi(argv[i]);
if (tmplen < 1)
usage(head_usage);
len = tmplen;
break; break;
case '-': /* fallthrough */
case 'h': default:
usage(head_usage); usage(head_usage);
default:
errorMsg("invalid option -- %c\n", opt);
usage(head_usage);
}
} else {
break;
} }
} }
/* get rest of argv[] or stdin if nothing's left */ /* get rest of argv[] or stdin if nothing's left */
if (i >= argc) { if (argv[optind] == NULL) {
head(len, stdin); head(len, stdin);
return status;
}
} else { need_headers = optind != (argc - 1);
int need_headers = ((argc - i) > 1); while (argv[optind]) {
if (strcmp(argv[optind], "-") == 0) {
for (; i < argc; i++) { fp = stdin;
FILE *src; argv[optind] = "standard input";
} else {
src = fopen(argv[i], "r"); if ((fp = wfopen(argv[optind], "r")) == NULL)
if (!src) { status = EXIT_FAILURE;
errorMsg("%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");
}
}
} }
if (fp) {
if (need_headers) {
fprintf(stdout, "==> %s <==\n", argv[optind]);
}
head(len, fp);
if (errno) {
errorMsg("%s: %s\n", argv[optind], strerror(errno));
status = EXIT_FAILURE;
errno = 0;
}
if (optind < argc - 1)
fprintf(stdout, "\n");
if (fp != stdin)
fclose(fp);
}
optind++;
} }
return(0);
}
/* $Id: head.c,v 1.14 2000/09/25 21:45:57 andersen Exp $ */ return status;
}

95
head.c
View File

@ -26,17 +26,16 @@
#include <errno.h> #include <errno.h>
#include <stdio.h> #include <stdio.h>
int head(int len, FILE * src) int head(int len, FILE *fp)
{ {
int i; int i;
char buffer[1024]; char *input;
for (i = 0; i < len; i++) { for (i = 0; i < len; i++) {
fgets(buffer, 1024, src); if ((input = get_line_from_file(fp)) == NULL)
if (feof(src)) {
break; break;
} fputs(input, stdout);
fputs(buffer, stdout); free(input);
} }
return 0; return 0;
} }
@ -44,60 +43,54 @@ int head(int len, FILE * src)
/* BusyBoxed head(1) */ /* BusyBoxed head(1) */
int head_main(int argc, char **argv) int head_main(int argc, char **argv)
{ {
char opt; FILE *fp;
int len = 10, tmplen, i; int need_headers, opt, len = 10, status = EXIT_SUCCESS;
/* parse argv[] */ /* parse argv[] */
for (i = 1; i < argc; i++) { while ((opt = getopt(argc, argv, "n:")) > 0) {
if (argv[i][0] == '-') { switch (opt) {
opt = argv[i][1]; case 'n':
switch (opt) { len = atoi(optarg);
case 'n': if (len >= 1)
tmplen = 0;
if (++i < argc)
tmplen = atoi(argv[i]);
if (tmplen < 1)
usage(head_usage);
len = tmplen;
break; break;
case '-': /* fallthrough */
case 'h': default:
usage(head_usage); usage(head_usage);
default:
errorMsg("invalid option -- %c\n", opt);
usage(head_usage);
}
} else {
break;
} }
} }
/* get rest of argv[] or stdin if nothing's left */ /* get rest of argv[] or stdin if nothing's left */
if (i >= argc) { if (argv[optind] == NULL) {
head(len, stdin); head(len, stdin);
return status;
}
} else { need_headers = optind != (argc - 1);
int need_headers = ((argc - i) > 1); while (argv[optind]) {
if (strcmp(argv[optind], "-") == 0) {
for (; i < argc; i++) { fp = stdin;
FILE *src; argv[optind] = "standard input";
} else {
src = fopen(argv[i], "r"); if ((fp = wfopen(argv[optind], "r")) == NULL)
if (!src) { status = EXIT_FAILURE;
errorMsg("%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");
}
}
} }
if (fp) {
if (need_headers) {
fprintf(stdout, "==> %s <==\n", argv[optind]);
}
head(len, fp);
if (errno) {
errorMsg("%s: %s\n", argv[optind], strerror(errno));
status = EXIT_FAILURE;
errno = 0;
}
if (optind < argc - 1)
fprintf(stdout, "\n");
if (fp != stdin)
fclose(fp);
}
optind++;
} }
return(0);
}
/* $Id: head.c,v 1.14 2000/09/25 21:45:57 andersen Exp $ */ return status;
}

View File

@ -395,6 +395,7 @@ extern int print_file_by_name(char *filename);
extern char process_escape_sequence(char **ptr); extern char process_escape_sequence(char **ptr);
extern char *get_last_path_component(char *path); extern char *get_last_path_component(char *path);
extern void xregcomp(regex_t *preg, const char *regex, int cflags); extern void xregcomp(regex_t *preg, const char *regex, int cflags);
extern FILE *wfopen(const char *path, const char *mode);
extern FILE *xfopen(const char *path, const char *mode); extern FILE *xfopen(const char *path, const char *mode);
#ifndef DMALLOC #ifndef DMALLOC

View File

@ -1634,12 +1634,14 @@ extern void print_file(FILE *file)
extern int print_file_by_name(char *filename) extern int print_file_by_name(char *filename)
{ {
FILE *file; FILE *file;
file = fopen(filename, "r"); if ((file = wfopen(filename, "r")) == NULL)
if (file == NULL) { return FALSE;
print_file(file);
if (errno) {
errorMsg("%s: %s\n", filename, strerror(errno)); errorMsg("%s: %s\n", filename, strerror(errno));
errno = 0;
return FALSE; return FALSE;
} }
print_file(file);
return TRUE; return TRUE;
} }
#endif /* BB_CAT */ #endif /* BB_CAT */
@ -1719,6 +1721,18 @@ void xregcomp(regex_t *preg, const char *regex, int cflags)
} }
#endif #endif
#if defined BB_CAT || defined BB_HEAD
FILE *wfopen(const char *path, const char *mode)
{
FILE *fp;
if ((fp = fopen(path, mode)) == NULL) {
errorMsg("%s: %s\n", path, strerror(errno));
errno = 0;
}
return fp;
}
#endif
#if defined BB_HOSTNAME || defined BB_LOADACM || defined BB_MORE || defined BB_SED || defined BB_SH || defined BB_UNIQ || defined BB_WC #if defined BB_HOSTNAME || defined BB_LOADACM || defined BB_MORE || defined BB_SED || defined BB_SH || defined BB_UNIQ || defined BB_WC
FILE *xfopen(const char *path, const char *mode) FILE *xfopen(const char *path, const char *mode)
{ {