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 *get_last_path_component(char *path);
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);
#ifndef DMALLOC

View File

@ -26,17 +26,16 @@
#include <errno.h>
#include <stdio.h>
int head(int len, FILE * src)
int head(int len, FILE *fp)
{
int i;
char buffer[1024];
char *input;
for (i = 0; i < len; i++) {
fgets(buffer, 1024, src);
if (feof(src)) {
if ((input = get_line_from_file(fp)) == NULL)
break;
}
fputs(buffer, stdout);
fputs(input, stdout);
free(input);
}
return 0;
}
@ -44,60 +43,54 @@ int head(int len, FILE * src)
/* BusyBoxed head(1) */
int head_main(int argc, char **argv)
{
char opt;
int len = 10, tmplen, i;
FILE *fp;
int need_headers, opt, len = 10, status = EXIT_SUCCESS;
/* parse argv[] */
for (i = 1; i < argc; i++) {
if (argv[i][0] == '-') {
opt = argv[i][1];
switch (opt) {
case 'n':
tmplen = 0;
if (++i < argc)
tmplen = atoi(argv[i]);
if (tmplen < 1)
usage(head_usage);
len = tmplen;
while ((opt = getopt(argc, argv, "n:")) > 0) {
switch (opt) {
case 'n':
len = atoi(optarg);
if (len >= 1)
break;
case '-':
case 'h':
usage(head_usage);
default:
errorMsg("invalid option -- %c\n", opt);
usage(head_usage);
}
} else {
break;
/* fallthrough */
default:
usage(head_usage);
}
}
/* get rest of argv[] or stdin if nothing's left */
if (i >= argc) {
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) {
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");
}
}
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;
}
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 <stdio.h>
int head(int len, FILE * src)
int head(int len, FILE *fp)
{
int i;
char buffer[1024];
char *input;
for (i = 0; i < len; i++) {
fgets(buffer, 1024, src);
if (feof(src)) {
if ((input = get_line_from_file(fp)) == NULL)
break;
}
fputs(buffer, stdout);
fputs(input, stdout);
free(input);
}
return 0;
}
@ -44,60 +43,54 @@ int head(int len, FILE * src)
/* BusyBoxed head(1) */
int head_main(int argc, char **argv)
{
char opt;
int len = 10, tmplen, i;
FILE *fp;
int need_headers, opt, len = 10, status = EXIT_SUCCESS;
/* parse argv[] */
for (i = 1; i < argc; i++) {
if (argv[i][0] == '-') {
opt = argv[i][1];
switch (opt) {
case 'n':
tmplen = 0;
if (++i < argc)
tmplen = atoi(argv[i]);
if (tmplen < 1)
usage(head_usage);
len = tmplen;
while ((opt = getopt(argc, argv, "n:")) > 0) {
switch (opt) {
case 'n':
len = atoi(optarg);
if (len >= 1)
break;
case '-':
case 'h':
usage(head_usage);
default:
errorMsg("invalid option -- %c\n", opt);
usage(head_usage);
}
} else {
break;
/* fallthrough */
default:
usage(head_usage);
}
}
/* get rest of argv[] or stdin if nothing's left */
if (i >= argc) {
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) {
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");
}
}
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;
}
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 *get_last_path_component(char *path);
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);
#ifndef DMALLOC

View File

@ -1634,12 +1634,14 @@ extern void print_file(FILE *file)
extern int print_file_by_name(char *filename)
{
FILE *file;
file = fopen(filename, "r");
if (file == NULL) {
if ((file = wfopen(filename, "r")) == NULL)
return FALSE;
print_file(file);
if (errno) {
errorMsg("%s: %s\n", filename, strerror(errno));
errno = 0;
return FALSE;
}
print_file(file);
return TRUE;
}
#endif /* BB_CAT */
@ -1719,6 +1721,18 @@ void xregcomp(regex_t *preg, const char *regex, int cflags)
}
#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
FILE *xfopen(const char *path, const char *mode)
{