comparison circbuffer.c @ 1054:c71df09bc610 nocircbuffer

Avoid copying data into circular buffer
author Matt Johnston <matt@ucc.asn.au>
date Sun, 01 Mar 2015 00:44:45 +0800
parents abd99ecd7ec2
children acf444bcb115
comparison
equal deleted inserted replaced
1053:fd3712d1ff7f 1054:c71df09bc610
108 } 108 }
109 109
110 return &cbuf->data[cbuf->readpos]; 110 return &cbuf->data[cbuf->readpos];
111 } 111 }
112 112
113 void cbuf_readptrs(circbuffer *cbuf,
114 unsigned char **p1, unsigned int *len1,
115 unsigned char **p2, unsigned int *len2) {
116 *p1 = &cbuf->data[cbuf->readpos];
117 *len1 = MIN(cbuf->used, cbuf->size - cbuf->readpos);
118
119 if (*len1 < cbuf->used) {
120 *p2 = cbuf->data;
121 *len2 = cbuf->used - *len1;
122 } else {
123 *p2 = NULL;
124 *len2 = 0;
125 }
126 }
127
113 unsigned char* cbuf_writeptr(circbuffer *cbuf, unsigned int len) { 128 unsigned char* cbuf_writeptr(circbuffer *cbuf, unsigned int len) {
114 129
115 if (len > cbuf_writelen(cbuf)) { 130 if (len > cbuf_writelen(cbuf)) {
116 dropbear_exit("Bad cbuf write"); 131 dropbear_exit("Bad cbuf write");
117 } 132 }
129 cbuf->writepos = (cbuf->writepos + len) % cbuf->size; 144 cbuf->writepos = (cbuf->writepos + len) % cbuf->size;
130 } 145 }
131 146
132 147
133 void cbuf_incrread(circbuffer *cbuf, unsigned int len) { 148 void cbuf_incrread(circbuffer *cbuf, unsigned int len) {
149 #if 0
134 if (len > cbuf_readlen(cbuf)) { 150 if (len > cbuf_readlen(cbuf)) {
135 dropbear_exit("Bad cbuf read"); 151 dropbear_exit("Bad cbuf read");
136 } 152 }
153 #endif
137 154
138 dropbear_assert(cbuf->used >= len); 155 dropbear_assert(cbuf->used >= len);
139 cbuf->used -= len; 156 cbuf->used -= len;
140 cbuf->readpos = (cbuf->readpos + len) % cbuf->size; 157 cbuf->readpos = (cbuf->readpos + len) % cbuf->size;
141 } 158 }