Missing stdio features.

karl at haddock karl at haddock
Tue Sep 9 04:54:00 AEST 1986


umcp-cs!chris (Chris Torek) writes:
>In article <86900034 at haddock> karl at haddock writes:
>>>>FILE *fopenfxn(int (*fxn)(), char *mode)
>>Actually, the function argument should probably be analogous to read/write
>>rather than getc/putc.  But there should be one more argument to fopenfxn(),
>>viz. a (void *) argument to be passed to fxn() to distinguish streams.
>
>Indeed, there would be a certain symmetry to the whole thing if one
>could write
>    reader(f, buf, len) FILE *f; { return (read(fileno(f), buf, len)); }
>    FILE *f = fopenrf(reader, "r");
>    fileno(f) = fd;
>instead of
>    FILE *f = fdopen(fd, "r");

As I mentioned, I think it has to be (void *) in general, thus
   reader(void *v, char *buf, int len) {
       return (read(*(int *)v, buf, len));
   }
   FILE *f = fopenrf(&fd, reader, "r");
so that the more general cases could be supported, e.g. read from string:
   typedef struct { char *t_start, *t_end; } tbuf;
   reader(void *v, char *buf, int len) {
       register tbuf *t = (tbuf *)v;
       len = min(len, t->t_end - t->t_start);
       memcpy(buf, t->t_start, len);
       t->start += len;
       return (len);
   }
   FILE *f = fopenrf(&t, reader, "r");

You could get away with having the first arg to reader() be "FILE *", but in
any case "void *_id" needs to replace or supplement the existing "int _file"
in the FILE structure.

If there are separate functions fopenrf() and fopenwf(), is there any need
for the third argument?

Karl W. Z. Heuer (ima!haddock!karl; karl at haddock.isc.com), The Walking Lint



More information about the Comp.lang.c mailing list