URI: 
       fix ring buffer - ploot - simple plotting tools
  HTML git clone git://bitreich.org/ploot git://enlrupgkhuxnvlhsf6lc3fziv5h2hhfrinws65d7roiv6bfj7d652fid.onion/ploot
   DIR Log
   DIR Files
   DIR Refs
   DIR Tags
   DIR README
   DIR LICENSE
       ---
   DIR commit 413abf823787458e35396a700f9acf1af53ef239
   DIR parent 30b3f9c326b35c196f98d905c6e57afbc057c63b
  HTML Author: Josuah Demangeon <mail@josuah.net>
       Date:   Tue,  6 Feb 2018 11:36:00 +0100
       
       fix ring buffer
       
       Diffstat:
         M ploot.c                             |      82 +++++++++++++++++--------------
         D ploot.core                          |       0 
       
       2 files changed, 45 insertions(+), 37 deletions(-)
       ---
   DIR diff --git a/ploot.c b/ploot.c
       @@ -14,6 +14,27 @@
        #define MIN(x, y)        ((x) < (y) ? (x) : (y))
        #define LEN(x)                (sizeof(x) / sizeof(*x))
        
       +
       +/*
       + * Add `val' at the current position `pos' of the `ring' buffer and set pos to
       + * the next postion.
       + */
       +#define RING_ADD(rbuf, len, pos, val)                                        \
       +do {                                                                        \
       +        rbuf[pos] = val;                                                \
       +        pos = (pos + 1 < len) ? (pos + 1) : (0);                        \
       +} while (0)
       +
       +/*
       + * Copy the ring buffer `rbuf' content with current position `pos' into the
       + * buffer `buf'.  Both buffer of length `len'.
       + */
       +#define RING_COPY(buf, rbuf, len, pos)                                        \
       +do {                                                                        \
       +        memcpy(buf, rbuf + pos, (len - pos) * sizeof(*rbuf));                \
       +        memcpy(buf + (len - pos), rbuf, pos * sizeof(*rbuf));                \
       +} while (0)
       +
        int        flag_h = 20;
        char        *flag_t = NULL;
        
       @@ -134,29 +155,6 @@ plot(int height, double *beg, double *end, char *str)
        }
        
        /*
       - * Add `val' at the current position `pos' of the `ring' buffer and return the
       - * next postion.
       - */
       -size_t
       -ring_add(double *rbuf, size_t len, size_t pos, double val)
       -{
       -        *rbuf = val;
       -
       -        return (pos + 1 < len) ? (pos + 1) : (0);
       -}
       -
       -/*
       - * Copy the ring buffer `rbuf' content with current position `pos' into the
       - * buffer `buf'.  Both buffer of length `len'.
       - */
       -void
       -ring_copy(double *buf, double *rbuf, size_t len, size_t pos)
       -{
       -        memcpy(buf, rbuf + pos, (len - pos) * sizeof(*rbuf));
       -        memcpy(buf + (len - pos), rbuf, pos * sizeof(*rbuf));
       -}
       -
       -/*
         * Read a simple format with one double per line and save the last `MAX_WIDTH'
         * values into `buf' which must be at least MAX_VAL wide and return a pointer
         * to the last element or NULL if the input contains error.
       @@ -169,32 +167,39 @@ read_simple(double buf[MAX_VAL])
        
                len = LEN(rbuf);
                for (p = pos = 0; scanf("%lf\n", &val) > 0; p++)
       -                pos = ring_add(rbuf + pos, len, pos, val);
       +                RING_ADD(rbuf, len, pos, val);
                len = MIN(len, p);
                pos = MIN(pos, p);
        
       -        ring_copy(buf, rbuf, len, pos);
       +        RING_COPY(buf, rbuf, len, pos);
        
                return buf + len;
        }
        
        /*
         * Read a format with blank-separated time_t-double pairs, one per line and save
       - * the last `MAX_WIDTH' values into `timev' and `valv' which must both be at
       - * least MAX_VAL wide and return a pointer to the last element or NULL if the
       + * the last `MAX_WIDTH' values into `tbuf' and `vbuf' which must both be at
       + * least MAX_VAL wide and return a pointer to the last element of `vbuf' or NULL if the
         * input contains error.
         */
        double *
       -read_time_series(double *valv, time_t *timev)
       +read_time_series(double *vbuf, time_t *tbuf)
        {
       -        time_t        time_rbuf[MAX_VAL];
       -        double        val_rbuf[MAX_VAL];
       +        size_t        p, pos, len;
       +        double        vrbuf[MAX_VAL], vval;
       +        time_t        trbuf[MAX_VAL], tval;
        
       -        (void)time_rbuf;
       -        (void)val_rbuf;
       -        (void)timev;
       +        len = LEN(vrbuf);
       +        for (p = pos = 0; scanf("%zd %lf\n", &tval, &vval) > 0; p++)
       +                RING_ADD(trbuf, len, pos, tval);
       +                RING_ADD(vrbuf, len, pos, vval);
       +        len = MIN(len, p);
       +        pos = MIN(pos, p);
       +
       +        RING_COPY(tbuf, trbuf, len, pos);
       +        RING_COPY(vbuf, vrbuf, len, pos);
        
       -        return valv;
       +        return vbuf + len;
        }
        
        void
       @@ -207,7 +212,10 @@ usage(void)
        int
        main(int argc, char **argv)
        {
       -        double        val[MAX_VAL], *end;
       +/*
       +        time_t        tbuf[MAX_VAL];
       +*/
       +        double        vbuf[MAX_VAL], *vend;
                char        c;
        
                while ((c = getopt(argc, argv, "h:t:")) != -1) {
       @@ -226,7 +234,7 @@ main(int argc, char **argv)
                        }
                }
        
       -        end = read_simple(val);
       -        plot(flag_h, val, end, flag_t);
       +        vend = read_simple(vbuf);
       +        plot(flag_h, vbuf, vend, flag_t);
                return 0;
        }
   DIR diff --git a/ploot.core b/ploot.core
       Binary files differ.