00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023 #include <string.h>
00024
00025 #include <cirbuf.h>
00026
00027
00028
00029
00030 cirbuf_int
00031 cirbuf_add_buf_tail(struct cirbuf * cbuf, const char * c, cirbuf_uint n)
00032 {
00033 cirbuf_uint e;
00034
00035 if (!n || n > CIRBUF_GET_FREELEN(cbuf))
00036 return -EINVAL;
00037
00038 e = CIRBUF_IS_EMPTY(cbuf) ? 1 : 0;
00039
00040 if (n < cbuf->maxlen - cbuf->end - 1 + e) {
00041 dprintf("s[%d] -> d[%d] (%d)\n", 0, cbuf->end + !e, n);
00042 memcpy(cbuf->buf + cbuf->end + !e, c, n);
00043 }
00044 else {
00045 dprintf("s[%d] -> d[%d] (%d)\n", cbuf->end + !e, 0, cbuf->maxlen - cbuf->end - 1 + e);
00046 dprintf("s[%d] -> d[%d] (%d)\n", cbuf->maxlen - cbuf->end - 1 + e, 0, n - cbuf->maxlen + cbuf->end + 1 - e);
00047 memcpy(cbuf->buf + cbuf->end + !e, c, cbuf->maxlen - cbuf->end - 1 + e);
00048 memcpy(cbuf->buf, c + cbuf->maxlen - cbuf->end - 1 + e, n - cbuf->maxlen + cbuf->end + 1 - e);
00049 }
00050 cbuf->len += n;
00051 cbuf->end += n - e;
00052 cbuf->end %= cbuf->maxlen;
00053 return n;
00054 }
00055