| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203 |
- #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 <ctype.h>
- 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
|