tail added
This commit is contained in:
parent
0306c4319b
commit
ea0004c11f
1
TODO
1
TODO
@ -52,3 +52,4 @@ FIX:
|
|||||||
xargs (-d)
|
xargs (-d)
|
||||||
echo (escape)
|
echo (escape)
|
||||||
que (unicode)
|
que (unicode)
|
||||||
|
ps (-o)
|
||||||
|
35
src/head.c
35
src/head.c
@ -1,5 +1,12 @@
|
|||||||
#define _HEAD_C
|
#define _HEAD_C
|
||||||
|
|
||||||
|
#ifdef _TAIL_C
|
||||||
|
#define PROG_NAME "tail"
|
||||||
|
#else
|
||||||
|
#define PROG_NAME "head"
|
||||||
|
#define _TAIL_C 0
|
||||||
|
#endif
|
||||||
|
|
||||||
#include <fcntl.h>
|
#include <fcntl.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
@ -16,10 +23,13 @@ static long parse_long(const char *str) {
|
|||||||
char *ptr;
|
char *ptr;
|
||||||
long ret = strtol(str, &ptr, 0);
|
long ret = strtol(str, &ptr, 0);
|
||||||
if (*ptr) {
|
if (*ptr) {
|
||||||
fprintf(stderr, "head: invalid number %s\n", ptr);
|
fprintf(stderr, "%s: invalid number %s\n", PROG_NAME, ptr);
|
||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (_TAIL_C && ret < 0)
|
||||||
|
ret *= -1;
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -31,7 +41,7 @@ static int print(const char *file, FILE *fp, long lines, long bytes) {
|
|||||||
long bcount = 0;
|
long bcount = 0;
|
||||||
|
|
||||||
/* If lines or bytes < 0 */
|
/* If lines or bytes < 0 */
|
||||||
if (lines < 0 || bytes < 0) {
|
if ((lines < 0 || bytes < 0) || _TAIL_C) {
|
||||||
long lmax = 0;
|
long lmax = 0;
|
||||||
long bmax = 0;
|
long bmax = 0;
|
||||||
|
|
||||||
@ -39,10 +49,11 @@ static int print(const char *file, FILE *fp, long lines, long bytes) {
|
|||||||
size_t buf_size = 0;
|
size_t buf_size = 0;
|
||||||
char *buf = malloc(1);
|
char *buf = malloc(1);
|
||||||
if (buf == NULL) {
|
if (buf == NULL) {
|
||||||
fprintf(stderr, "head: malloc: %s\n", strerror(errno));
|
fprintf(stderr, "%s: malloc: %s\n", PROG_NAME, strerror(errno));
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Fill buffer */
|
||||||
while (1) {
|
while (1) {
|
||||||
int c = getc(fp);
|
int c = getc(fp);
|
||||||
if (c == EOF)
|
if (c == EOF)
|
||||||
@ -50,7 +61,7 @@ static int print(const char *file, FILE *fp, long lines, long bytes) {
|
|||||||
|
|
||||||
char *tmp = realloc(buf, buf_size + 2);
|
char *tmp = realloc(buf, buf_size + 2);
|
||||||
if (tmp == NULL) {
|
if (tmp == NULL) {
|
||||||
fprintf(stderr, "head: realloc: %s\n", strerror(errno));
|
fprintf(stderr, "%s: realloc: %s\n", PROG_NAME, strerror(errno));
|
||||||
|
|
||||||
free(buf);
|
free(buf);
|
||||||
return 1;
|
return 1;
|
||||||
@ -72,9 +83,15 @@ static int print(const char *file, FILE *fp, long lines, long bytes) {
|
|||||||
lcount++;
|
lcount++;
|
||||||
|
|
||||||
bcount++;
|
bcount++;
|
||||||
putchar(buf[i]);
|
|
||||||
if ((n_flag && lcount == lmax + lines) || (c_flag && bcount == bmax + bytes))
|
if ((c_flag && bmax - bcount < bytes) || (n_flag && lmax - lcount < lines))
|
||||||
break;
|
putchar(buf[i]);
|
||||||
|
|
||||||
|
else if (!_TAIL_C) {
|
||||||
|
putchar(buf[i]);
|
||||||
|
if ((n_flag && lcount == lmax + lines) || (c_flag && bcount == bmax + bytes))
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
free(buf);
|
free(buf);
|
||||||
@ -121,7 +138,7 @@ int main(int argc, char **argv) {
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
puts("head [ncv] [file1 file2...]\n\t-n Print [-]N lines\n\t-c Print [-]N bytes\n\t-v Print headers");
|
printf("%s [ncv] [file1 file2...]\n\t-n Print [-]N lines\n\t-c Print [-]N bytes\n\t-v Print headers\n", PROG_NAME);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -142,7 +159,7 @@ int main(int argc, char **argv) {
|
|||||||
fp = fopen(argv[i], "r");
|
fp = fopen(argv[i], "r");
|
||||||
|
|
||||||
if (fp == NULL) {
|
if (fp == NULL) {
|
||||||
fprintf(stderr, "head: %s: %s\n", argv[i], strerror(errno));
|
fprintf(stderr, "%s: %s: %s\n", PROG_NAME, argv[i], strerror(errno));
|
||||||
|
|
||||||
ret = 1;
|
ret = 1;
|
||||||
continue;
|
continue;
|
||||||
|
2
src/tail.c
Normal file
2
src/tail.c
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
#define _TAIL_C 1
|
||||||
|
#include "head.c"
|
Loading…
Reference in New Issue
Block a user