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_head(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->start + e) {
00041 dprintf("s[%d] -> d[%d] (%d)\n", 0, cbuf->start - n + e, n);
00042 memcpy(cbuf->buf + cbuf->start - n + e, c, n);
00043 }
00044 else {
00045 dprintf("s[%d] -> d[%d] (%d)\n", + n - (cbuf->start + e), 0, cbuf->start + e);
00046 dprintf("s[%d] -> d[%d] (%d)\n", cbuf->maxlen - n + (cbuf->start + e), 0, n - (cbuf->start + e));
00047 memcpy(cbuf->buf, c + n - (cbuf->start + e) , cbuf->start + e);
00048 memcpy(cbuf->buf + cbuf->maxlen - n + (cbuf->start + e), c, n - (cbuf->start + e));
00049 }
00050 cbuf->len += n;
00051 cbuf->start += (cbuf->maxlen - n + e);
00052 cbuf->start %= cbuf->maxlen;
00053 return n;
00054 }
00055