#ifndef __FEEDER_STDIO_C__

/*****************************************************************************/
/* stdin feeder */

#define FEEDSTDIO_BUFSIZE       4096
#define FEEDSTDIO_MAXBYTES      1

static int
feed_stdio_set(struct pcm_feeder *f, int what, int value)
{
        switch (what) {
        case FEEDSTDIO_MAXBYTES:
                f->data = (void *)(uintptr_t)value;
                break;
        default:
                return (-1);
                break;
        }

        return (0);
}

static int
feed_stdin(struct pcm_feeder    *f,
           struct pcm_channel  *c,
           uint8_t             *b,
           uint32_t             count,
           void                        *source __unused)
{
    size_t got;
    
    if ((uintptr_t)f->data != 0) {
        got = fread(b, 1, min(count, (uintptr_t)f->data), c->in_fp);
        f->data = (void *)((uintptr_t)f->data - got);
    } else
        got = fread(b, 1, count, c->in_fp);

    return (int)got;
}

static struct pcm_feederdesc feeder_stdin_desc[] = {
    { FEEDER_STDIO, 0, 0, 0, 0 },
    { 0, 0, 0, 0, 0 }
};

static kobj_method_t feeder_stdin_methods[] = {
    KOBJMETHOD(feeder_set, feed_stdio_set),
    KOBJMETHOD(feeder_feed, feed_stdin),
    { NULL, NULL }
};

FEEDER_DECLARE(feeder_stdin, 0);

/*****************************************************************************/
/* stdout feeder */

static int
feed_stdout(struct pcm_feeder   *f,
            struct pcm_channel *c,
            uint8_t            *b,
            uint32_t            count,
            void               *source)
{
    size_t  done;

    done = FEEDER_FEED(f->source, c, b, count, source);
    if (done > 0)
        done = fwrite(b, 1, done, c->out_fp);
    return done;
}

static struct pcm_feederdesc feeder_stdout_desc[] = {
    { FEEDER_STDIO, 0, 0, 0, 0 },
    { 0, 0, 0, 0, 0 }
};

static kobj_method_t feeder_stdout_methods[] = {
    KOBJMETHOD(feeder_set, feed_stdio_set),
    KOBJMETHOD(feeder_feed, feed_stdout),
    { NULL, NULL }
};

FEEDER_DECLARE(feeder_stdout, 0);

#endif  /* __FEEDER_STDIO_C__ */