buffer.h 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203
  1. #ifndef BUFFER_H
  2. #define BUFFER_H
  3. struct buffer {
  4. DA_DEF_STRUCT_ITEM(char, data);
  5. size_t cur;
  6. };
  7. struct buffer buffer_create(void);
  8. void buffer_destroy(struct buffer buf);
  9. struct buffer buffer_mv_cur_letf(struct buffer buf);
  10. struct buffer buffer_mv_cur_right(struct buffer buf);
  11. struct buffer buffer_mv_cur_up(struct buffer buf);
  12. struct buffer buffer_mv_cur_down(struct buffer buf);
  13. struct buffer buffer_insert_char(struct buffer buf, size_t index, char c);
  14. struct buffer buffer_remove_char_mv_cur(struct buffer buf, size_t index);
  15. struct buffer buffer_remove_char(struct buffer buf, size_t index);
  16. struct buffer buffer_remove_between(struct buffer buf,
  17. size_t start, size_t end);
  18. size_t buffer_index_bw_word(struct buffer buf);
  19. #if defined(BUFFER_IMP) || defined(IMP)
  20. #include "da.h"
  21. struct buffer
  22. buffer_create(void)
  23. {
  24. struct buffer buf = {0};
  25. DA_CREATE(buf.data, sizeof(char));
  26. return buf;
  27. }
  28. void
  29. buffer_destroy(struct buffer buf)
  30. {
  31. free(buf.data.items);
  32. }
  33. struct buffer
  34. buffer_mv_cur_letf(struct buffer buf)
  35. {
  36. if ( buf.cur == 0 ) {
  37. return buf;
  38. }
  39. --buf.cur;
  40. return buf;
  41. }
  42. struct buffer
  43. buffer_mv_cur_right(struct buffer buf)
  44. {
  45. if ( buf.cur == buf.data.size ) {
  46. return buf;
  47. }
  48. ++buf.cur;
  49. return buf;
  50. }
  51. struct buffer
  52. buffer_mv_cur_up(struct buffer buf)
  53. {
  54. return buf;
  55. }
  56. struct buffer
  57. buffer_mv_cur_down(struct buffer buf)
  58. {
  59. return buf;
  60. }
  61. struct buffer
  62. buffer_insert_char(struct buffer buf, size_t index, char c)
  63. {
  64. if ( index > buf.data.size ) {
  65. DA_APPEND(buf.data, c);
  66. ++buf.cur;
  67. return buf;
  68. }
  69. DA_INSERT(buf.data, c, index);
  70. ++buf.cur;
  71. return buf;
  72. }
  73. struct buffer
  74. buffer_remove_char_mv_cur(struct buffer buf, size_t index)
  75. {
  76. if ( buf.data.size == 0 ) {
  77. return buf;
  78. }
  79. if ( index > buf.data.size ) {
  80. return buf;
  81. }
  82. if ( buf.data.size == index ) {
  83. buf.data.items[--buf.data.size] = 0;
  84. --buf.cur;
  85. return buf;
  86. }
  87. DA_DELETE(buf.data, index);
  88. --buf.cur;
  89. return buf;
  90. }
  91. struct buffer
  92. buffer_remove_char(struct buffer buf, size_t index)
  93. {
  94. if ( buf.data.size == 0 ) {
  95. return buf;
  96. }
  97. if ( index > buf.data.size ) {
  98. return buf;
  99. }
  100. if ( buf.data.size == index ) {
  101. buf.data.items[--buf.data.size] = 0;
  102. return buf;
  103. }
  104. DA_DELETE(buf.data, index);
  105. return buf;
  106. }
  107. struct buffer
  108. buffer_remove_between(struct buffer buf, size_t start, size_t end)
  109. {
  110. if ( buf.data.size == 0 ) {
  111. return buf;
  112. }
  113. if ( start == end ) {
  114. return buffer_remove_char(buf, start);
  115. }
  116. if ( start > end ) {
  117. return buf;
  118. }
  119. DA_DEF_STRUCT_ITEM(char, da);
  120. DA_ASSIGN(da, buf.data);
  121. /* There is no need to check start > buf.data.size, because */
  122. /* we know that start < end */
  123. if ( end > da.size ) {
  124. return buf;
  125. }
  126. size_t nrm = end - start;
  127. printf("%ld\n", nrm);
  128. memmove(da.items+start, da.items+end, da.size - nrm);
  129. da.size -= nrm;
  130. buf.cur -= nrm;
  131. return buf;
  132. }
  133. #include <ctype.h>
  134. size_t
  135. buffer_index_bw_word(struct buffer buf)
  136. {
  137. if ( buf.data.size == 0 ) {
  138. return 0;
  139. }
  140. bool found_letter = false;
  141. size_t i = buf.cur;
  142. for ( ; i > 0; --i) {
  143. char c = buf.data.items[i];
  144. if ( isalpha(c) ) {
  145. found_letter = true;
  146. } else if ( found_letter ) {
  147. return i+1;
  148. }
  149. }
  150. if ( i == 0 ) {
  151. char c = buf.data.items[i];
  152. if ( isalpha(c) ) {
  153. found_letter = true;
  154. } else if ( found_letter ) {
  155. return i+1;
  156. }
  157. }
  158. return i;
  159. }
  160. #endif /* defined(BUFFER_IMP) || defined(IMP) */
  161. #endif