#ifndef BUFFER_H #define BUFFER_H struct buffer { DA_DEF_STRUCT_ITEM(char, data); size_t cur; }; struct buffer buffer_create(void); void buffer_destroy(struct buffer buf); struct buffer buffer_mv_cur_letf(struct buffer buf); struct buffer buffer_mv_cur_right(struct buffer buf); struct buffer buffer_mv_cur_up(struct buffer buf); struct buffer buffer_mv_cur_down(struct buffer buf); struct buffer buffer_insert_char(struct buffer buf, size_t index, char c); struct buffer buffer_remove_char_mv_cur(struct buffer buf, size_t index); struct buffer buffer_remove_char(struct buffer buf, size_t index); struct buffer buffer_remove_between(struct buffer buf, size_t start, size_t end); size_t buffer_index_bw_word(struct buffer buf); #if defined(BUFFER_IMP) || defined(IMP) #include "da.h" struct buffer buffer_create(void) { struct buffer buf = {0}; DA_CREATE(buf.data, sizeof(char)); return buf; } void buffer_destroy(struct buffer buf) { free(buf.data.items); } struct buffer buffer_mv_cur_letf(struct buffer buf) { if ( buf.cur == 0 ) { return buf; } --buf.cur; return buf; } struct buffer buffer_mv_cur_right(struct buffer buf) { if ( buf.cur == buf.data.size ) { return buf; } ++buf.cur; return buf; } struct buffer buffer_mv_cur_up(struct buffer buf) { return buf; } struct buffer buffer_mv_cur_down(struct buffer buf) { return buf; } struct buffer buffer_insert_char(struct buffer buf, size_t index, char c) { if ( index > buf.data.size ) { DA_APPEND(buf.data, c); ++buf.cur; return buf; } DA_INSERT(buf.data, c, index); ++buf.cur; return buf; } struct buffer buffer_remove_char_mv_cur(struct buffer buf, size_t index) { if ( buf.data.size == 0 ) { return buf; } if ( index > buf.data.size ) { return buf; } if ( buf.data.size == index ) { buf.data.items[--buf.data.size] = 0; --buf.cur; return buf; } DA_DELETE(buf.data, index); --buf.cur; return buf; } struct buffer buffer_remove_char(struct buffer buf, size_t index) { if ( buf.data.size == 0 ) { return buf; } if ( index > buf.data.size ) { return buf; } if ( buf.data.size == index ) { buf.data.items[--buf.data.size] = 0; return buf; } DA_DELETE(buf.data, index); return buf; } struct buffer buffer_remove_between(struct buffer buf, size_t start, size_t end) { if ( buf.data.size == 0 ) { return buf; } if ( start == end ) { return buffer_remove_char(buf, start); } if ( start > end ) { return buf; } DA_DEF_STRUCT_ITEM(char, da); DA_ASSIGN(da, buf.data); /* There is no need to check start > buf.data.size, because */ /* we know that start < end */ if ( end > da.size ) { return buf; } size_t nrm = end - start; printf("%ld\n", nrm); memmove(da.items+start, da.items+end, da.size - nrm); da.size -= nrm; buf.cur -= nrm; return buf; } #include size_t buffer_index_bw_word(struct buffer buf) { if ( buf.data.size == 0 ) { return 0; } bool found_letter = false; size_t i = buf.cur; for ( ; i > 0; --i) { char c = buf.data.items[i]; if ( isalpha(c) ) { found_letter = true; } else if ( found_letter ) { return i+1; } } if ( i == 0 ) { char c = buf.data.items[i]; if ( isalpha(c) ) { found_letter = true; } else if ( found_letter ) { return i+1; } } return i; } #endif /* defined(BUFFER_IMP) || defined(IMP) */ #endif