diff options
Diffstat (limited to 'buf.c')
-rw-r--r-- | buf.c | 36 |
1 files changed, 21 insertions, 15 deletions
@@ -52,28 +52,34 @@ void shortenbuf(buf* buffer){ buf_node* tmp = buffer->tail; buffer->tail = buffer->tail->next; free(tmp); - buffer->pop = 0; } char popchrbuf(buf* buffer){ - if (buffer->pop == buffer->cap) shortenbuf(buffer); + if (buffer->pop == buffer->cap){ + shortenbuf(buffer); + buffer->pop = 0; + } buffer->pop++; return buffer->tail->text[buffer->pop-1]; } char* popstrbuf(buf* buffer, size_t ct){ char* str = malloc((ct+1)*sizeof(char)); str[ct] = 0; - size_t rem; - for (size_t loc = 0; ct>loc; loc += rem){ - if (buffer->pop == buffer->cap) shortenbuf(buffer); - rem = min(buffer->cap, ct-loc); - memcpy(str+loc, buffer->tail->text+buffer->pop, rem); - buffer->pop += rem; - } /* probably some inefficiencies here*/ + memcpy(str, buffer->tail->text+buffer->pop, + min(ct, buffer->cap-buffer->pop)); + size_t loc; + for (loc = buffer->cap - buffer->pop; loc < ct; loc += buffer->cap){ + shortenbuf(buffer); + memcpy(str+loc, buffer->tail->text, min(ct-loc, buffer->cap)); + } + buffer->pop = ct - loc + buffer->cap; return str; } void inschrbuf(buf* buffer, char chr){ - if (buffer->ins == buffer->cap) extendbuf(buffer); + if (buffer->ins == buffer->cap){ + extendbuf(buffer); + buffer->ins = 0; + } buffer->ins++; buffer->head->text[buffer->ins-1] = chr; } @@ -81,12 +87,11 @@ void insstrbuf(buf* buffer, char* str){ size_t len = strlen(str); size_t tgt = min(len, buffer->cap - buffer->ins); memcpy(buffer->head->text+buffer->ins, str, tgt); - buffer->ins += len; - buffer->ins %= buffer->cap; for (;tgt<len; tgt += buffer->cap){ extendbuf(buffer); memcpy(buffer->head->text, str+tgt, min(len-tgt, buffer->cap)); } + buffer->ins = len - tgt + buffer->cap; } char* peekstrbuf(buf* buffer, size_t loc, size_t len){ @@ -96,9 +101,10 @@ char* peekstrbuf(buf* buffer, size_t loc, size_t len){ loc += buffer->pop; for (start = buffer->tail; loc>buffer->cap; loc -= buffer->cap) start = start->next; // start,loc is where one starts streaming - while (len > 0){ - memcpy(str, start->text+loc, min(buffer->cap-loc, len)); - len -= min(buffer->cap - loc, len); + size_t bytect; + for (size_t tgt = 0; len > 0; len -= bytect, tgt += bytect){ + bytect = min(buffer->cap - loc, len); + memcpy(str+tgt, start->text+loc, bytect); loc = 0; } return str; |