ses.c 6.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254
  1. #include "ses.h"
  2. #include <stdio.h>
  3. #include <string.h>
  4. /* Returns true if the string is in an unusable state, false if not. */
  5. int ses_bad_p(char **me, size_t * size, size_t * space) {
  6. if (!me) return !0;
  7. if (!*me) return !0;
  8. if (!size) return !0;
  9. if (!space) return !0;
  10. return 0;
  11. }
  12. /* Makes the string an empty string by writing a nul character at positon 0
  13. * and setting size to 0. */
  14. char * ses_make_empty(char ** me, size_t * size, size_t * space) {
  15. if (ses_bad_p(me, size, space)) return NULL;
  16. if ((*space) < 1) return NULL;
  17. (*me)[0] = '\0';
  18. (*size) = 0;
  19. return (*me);
  20. }
  21. /* Ensures the string is NUL terminated. */
  22. char * ses_nul_terminate(char ** me, size_t * size, size_t * space) {
  23. if (ses_bad_p(me, size, space)) return NULL;
  24. if (((*size) + 1) > (*space)) {
  25. (*me)[(*space)] = '\0';
  26. (*size) = (*space) - 1;
  27. } else {
  28. (*me)[(*size)+1] = '\0';
  29. }
  30. return (*me);
  31. }
  32. /* allocates a new string buffer with init_space. If init_space == 0
  33. * uses 1024 in stead.*/
  34. char * ses_alloc(char ** me, size_t * size, size_t * space, size_t init_space) {
  35. if (!me) return NULL;
  36. if (!space) return NULL;
  37. if (!size) return NULL;
  38. if (init_space < 1) init_space = 1024;
  39. (*me) = calloc(init_space, 1);
  40. (*space) = init_space;
  41. if (!*me) return NULL;
  42. return ses_make_empty(me, size, space);
  43. }
  44. /* Grows the given string's space. */
  45. char * ses_grow(char ** me, size_t * size, size_t * space, size_t new_space) {
  46. char * aid;
  47. (void) size;
  48. if (!me) return NULL;
  49. if (!*me) return NULL;
  50. aid = realloc(*me, new_space);
  51. if (!aid) return NULL;
  52. (*space) = new_space;
  53. (*me) = aid;
  54. return (*me);
  55. }
  56. /* Makes sure there is enough space to add amount characters. */
  57. char * ses_ensure_space(char ** me, size_t * size, size_t * space, size_t grow_by) {
  58. if (!me) return NULL;
  59. if (!*me) return NULL;
  60. if (!size) return NULL;
  61. if (!space) return NULL;
  62. if ((*space) < ((*size) + grow_by)) {
  63. if (!ses_grow(me, size, space, (*space) + grow_by + 255)) return NULL;
  64. }
  65. return (*me);
  66. }
  67. char * ses_append_char(char ** me, size_t * size, size_t * space, char ch) {
  68. if (!ses_ensure_space(me, size, space, 1)) return NULL;
  69. (*me)[(*size)] = ch;
  70. (*size) = (*size) + 1;
  71. return (*me);
  72. }
  73. char * ses_append_buf(char ** me, size_t * size, size_t * space, char * buf, size_t bufsize) {
  74. if (!ses_ensure_space(me, size, space, bufsize + 1)) return NULL;
  75. strncpy((*me) + (*size), buf, bufsize);
  76. (*size) = (*size) + bufsize;
  77. return ses_nul_terminate(me, size, space);
  78. }
  79. char * ses_append_cstr(char ** me, size_t * size, size_t * space, char * str) {
  80. return ses_append_buf(me, size, space, str, strlen(str));
  81. }
  82. char * ses_init_buf(char ** me, size_t * size, size_t * space, char * buf, size_t bufsize) {
  83. if (!size) return NULL;
  84. if (!ses_make_empty(me, size, space)) return NULL;
  85. return ses_append_buf(me, size, space, buf, bufsize);
  86. }
  87. char * ses_init_cstr(char ** me, size_t * size, size_t * space, char * buf) {
  88. return ses_init_buf(me, size, space, buf, strlen(buf));
  89. }
  90. char * ses_new_buf(char **me, size_t * size, size_t * space, char * buf, size_t bufsize) {
  91. if (!ses_alloc(me, size, space, bufsize)) return NULL;
  92. return ses_init_buf(me, size, space, buf, bufsize);
  93. }
  94. /* Creates a new string with the given space and initialies it from init. */
  95. char * ses_new(char **me, size_t * size, size_t * space, char * init) {
  96. return ses_new_buf(me, size, space, init, strlen(init));
  97. }
  98. /* Creates a new empty string with enough space. */
  99. char * ses_new_empty(char **me, size_t * size, size_t * space) {
  100. return ses_new(me, size, space, "");
  101. }
  102. /* Frees the string and sets it to NULL. */
  103. char * ses_free(char ** me, size_t * size, size_t * space) {
  104. if (!me) return NULL;
  105. if (!*me) return NULL;
  106. free(*me);
  107. *me = NULL;
  108. *size = 0;
  109. *space = 0;
  110. return NULL;
  111. }
  112. /** Reads in a file into the buffer. */
  113. char * ses_read_file(char ** me, size_t * size, size_t * space, FILE * file) {
  114. char aid[1024];
  115. int read;
  116. if (ses_bad_p(me, size, space)) return NULL;
  117. if (!file) return NULL;
  118. while(!feof(file)) {
  119. read = fread(aid, 1, sizeof(aid), file);
  120. if (read > 0) {
  121. ses_append_buf(me, size, space, aid, read);
  122. }
  123. }
  124. return (*me);
  125. }
  126. /** Reads a named file into the buffer. */
  127. char * ses_read_filename(char ** me, size_t * size, size_t * space, char * fn) {
  128. char * res;
  129. FILE * file = fopen(fn, "r");
  130. res = ses_read_file(me, size, space, file);
  131. if (file) fclose(file);
  132. return res;
  133. }
  134. /** Deletes n bytes */
  135. #define SWIS_EXPAND(SWIS) &((SWIS)->text), &((SWIS)->size), &((SWIS)->space)
  136. int swis_bad_p(Swis * me) {
  137. return (ses_bad_p(SWIS_EXPAND(me)));
  138. }
  139. Swis * swis_make_empty(Swis * me) {
  140. if(!ses_make_empty(SWIS_EXPAND(me))) return NULL;
  141. return me;
  142. }
  143. Swis * swis_nul_terminate(Swis * me) {
  144. if(!ses_nul_terminate(SWIS_EXPAND(me))) return NULL;
  145. return me;
  146. }
  147. Swis * swis_alloc(Swis * me, size_t init_space) {
  148. if(!ses_alloc(SWIS_EXPAND(me), init_space)) return NULL;
  149. return me;
  150. }
  151. Swis * swis_grow(Swis * me, size_t new_space) {
  152. if(!ses_grow(SWIS_EXPAND(me), new_space)) return NULL;
  153. return me;
  154. }
  155. Swis * swis_ensure_space(Swis * me, size_t grow_by) {
  156. if(!ses_ensure_space(SWIS_EXPAND(me), grow_by)) return NULL;
  157. return me;
  158. }
  159. Swis * swis_append_char(Swis * me, char ch) {
  160. if(!ses_append_char(SWIS_EXPAND(me), ch)) return NULL;
  161. return me;
  162. }
  163. Swis * swis_append_buf(Swis * me, char * buf, size_t bufsize) {
  164. if(!ses_append_buf(SWIS_EXPAND(me), buf, bufsize)) return NULL;
  165. return me;
  166. }
  167. Swis * swis_append_cstr(Swis * me, char * str) {
  168. if(!ses_append_cstr(SWIS_EXPAND(me), str)) return NULL;
  169. return me;
  170. }
  171. Swis * swis_init_buf(Swis * me, char * buf, size_t bufsize) {
  172. if(!ses_init_buf(SWIS_EXPAND(me), buf, bufsize)) return NULL;
  173. return me;
  174. }
  175. Swis * swis_init_cstr(Swis * me, char * buf) {
  176. if(!ses_init_cstr(SWIS_EXPAND(me), buf)) return NULL;
  177. return me;
  178. }
  179. Swis * swis_new_buf(Swis * me, char * buf, size_t bufsize) {
  180. if(!ses_new_buf(SWIS_EXPAND(me), buf, bufsize)) return NULL;
  181. return me;
  182. }
  183. Swis * swis_new(Swis * me, char * init) {
  184. if(!ses_new(SWIS_EXPAND(me), init)) return NULL;
  185. return me;
  186. }
  187. Swis * swis_new_empty(Swis * me) {
  188. if(!ses_new_empty(SWIS_EXPAND(me))) return NULL;
  189. return me;
  190. }
  191. Swis * swis_free(Swis * me) {
  192. ses_free(SWIS_EXPAND(me));
  193. return NULL;
  194. }
  195. Swis * swis_read_file(Swis * me, FILE * file) {
  196. if(!ses_read_file(SWIS_EXPAND(me), file)) return NULL;
  197. return me;
  198. }
  199. Swis * swis_read_filename(Swis * me, char * fn) {
  200. if(!ses_read_filename(SWIS_EXPAND(me), fn)) return NULL;
  201. return me;
  202. }