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_get_buf_tail(struct cirbuf * cbuf, char * c, cirbuf_uint size)
00032 {
00033 cirbuf_uint n = (size < CIRBUF_GET_LEN(cbuf)) ? size : CIRBUF_GET_LEN(cbuf);
00034
00035 if (!n)
00036 return 0;
00037
00038 if (cbuf->start <= cbuf->end) {
00039 dprintf("s[%d] -> d[%d] (%d)\n", cbuf->end - n + 1, 0, n);
00040 memcpy(c, cbuf->buf + cbuf->end - n + 1, n);
00041 }
00042 else {
00043 dprintf("s[%d] -> d[%d] (%d)\n", 0, cbuf->maxlen - cbuf->start, cbuf->end + 1);
00044 dprintf("s[%d] -> d[%d] (%d)\n", cbuf->maxlen - n + cbuf->end + 1, 0, n - cbuf->end - 1);
00045
00046 memcpy(c + cbuf->maxlen - cbuf->start, cbuf->buf, cbuf->end + 1);
00047 memcpy(c, cbuf->buf + cbuf->maxlen - n + cbuf->end +1, n - cbuf->end - 1);
00048 }
00049 return n;
00050 }
00051