mirror of
https://github.com/sheumann/hush.git
synced 2024-12-22 14:30:31 +00:00
Rewrote head to perservere when it can't open a file, and share code
with cat.
This commit is contained in:
parent
e7c1af1e0d
commit
c0321f9bc6
@ -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
|
||||||
|
@ -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
95
head.c
@ -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;
|
||||||
|
}
|
||||||
|
@ -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
|
||||||
|
20
utility.c
20
utility.c
@ -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)
|
||||||
{
|
{
|
||||||
|
Loading…
Reference in New Issue
Block a user