2023 work
This commit is contained in:
parent
e5ebf44fbc
commit
eec81218d9
45
Wip/dj/dj.c
45
Wip/dj/dj.c
@ -8,6 +8,16 @@
|
|||||||
|
|
||||||
#define ARGV0 (argv[0] == NULL ? "<no argv[0]>" : argv[0])
|
#define ARGV0 (argv[0] == NULL ? "<no argv[0]>" : argv[0])
|
||||||
|
|
||||||
|
/* read(2) but with a second chance if it returns zero */
|
||||||
|
static int
|
||||||
|
_read(int fd, void *b, size_t bs){
|
||||||
|
int retval;
|
||||||
|
|
||||||
|
return ((retval = read(fd, buf, bs)) == 0)
|
||||||
|
? read(fd, buf, bs)
|
||||||
|
: retval;
|
||||||
|
}
|
||||||
|
|
||||||
static int /* on error returns -1, else returns non-negative */
|
static int /* on error returns -1, else returns non-negative */
|
||||||
parse(char *s){
|
parse(char *s){
|
||||||
int r;
|
int r;
|
||||||
@ -27,6 +37,28 @@ oserr(char *argv0, char *s){
|
|||||||
return EX_OSERR;
|
return EX_OSERR;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
struct Io *
|
||||||
|
output(struct Io io[2]){
|
||||||
|
|
||||||
|
fprintf(stderr, "%d:%d / %d:%d\n",
|
||||||
|
io[0].rec, io[0].prec, io[1].rec, io[1].prec);;
|
||||||
|
return io;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
terminate(struct Io io[2]){
|
||||||
|
|
||||||
|
for(;; ++io){
|
||||||
|
if(io->fd != STDIN_FILENO && io->fd != STDOUT_FILENO)
|
||||||
|
close(io->fd);
|
||||||
|
free(io->buf);
|
||||||
|
if(io->index == 1)
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
return EX_OK;
|
||||||
|
}
|
||||||
|
|
||||||
static int
|
static int
|
||||||
usage(char *argv0){
|
usage(char *argv0){
|
||||||
fprintf(stderr, "Usage: %s (-f) (-c [count]\n"
|
fprintf(stderr, "Usage: %s (-f) (-c [count]\n"
|
||||||
@ -42,6 +74,7 @@ static char stdout_name = "<stdout>";
|
|||||||
|
|
||||||
int main(int argc, char *argv[]){
|
int main(int argc, char *argv[]){
|
||||||
struct Io{
|
struct Io{
|
||||||
|
size_t index;
|
||||||
char align;
|
char align;
|
||||||
char *fn;
|
char *fn;
|
||||||
int rec;
|
int rec;
|
||||||
@ -67,6 +100,8 @@ int main(int argc, char *argv[]){
|
|||||||
io[0].fn = stdin_name;
|
io[0].fn = stdin_name;
|
||||||
io[1].fd = STDOUT_FILENO;
|
io[1].fd = STDOUT_FILENO;
|
||||||
io[1].fn = stdout_name;
|
io[1].fn = stdout_name;
|
||||||
|
io[0].index = 0;
|
||||||
|
io[1].index = 1;
|
||||||
io[0].seek = io[1].seek = 0;
|
io[0].seek = io[1].seek = 0;
|
||||||
|
|
||||||
if(argc > 0)
|
if(argc > 0)
|
||||||
@ -113,13 +148,11 @@ int main(int argc, char *argv[]){
|
|||||||
}else if(io[p].seek > 0){ /* seek */
|
}else if(io[p].seek > 0){ /* seek */
|
||||||
if(io[p].fd == STDIN_FILENO){
|
if(io[p].fd == STDIN_FILENO){
|
||||||
do{ io[p].seek -= (io[p].bufuse
|
do{ io[p].seek -= (io[p].bufuse
|
||||||
= read(io[p].fd, io[p].buf, io[p].ibs));
|
= _read(io[p].fd, io[p].buf,
|
||||||
|
io[p].bs < io[p].seek ? io[p].bs : io[p].seek));
|
||||||
if(io[p].bufuse == 0)
|
if(io[p].bufuse == 0)
|
||||||
while(io[p].seek > 0);
|
return terminate(output(io));
|
||||||
|
}while(io[p].seek > 0);
|
||||||
}
|
|
||||||
for(i = 0; i < io[p].seek; ++i)
|
|
||||||
(void)getc(io[p].f);
|
|
||||||
else if(io[p].f == stdout)
|
else if(io[p].f == stdout)
|
||||||
for(i = 0; i < io[p].seek; ++i)
|
for(i = 0; i < io[p].seek; ++i)
|
||||||
putc('\0', io[p].f;
|
putc('\0', io[p].f;
|
||||||
|
Loading…
Reference in New Issue
Block a user