Advertisement
Guest User

Untitled

a guest
Nov 21st, 2015
149
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 9.49 KB | None | 0 0
  1.  
  2. /*
  3.  * Dynamic strings implementation
  4.  * Smagin Maksim 2015
  5.  */
  6.  
  7. #include <stdint.h>
  8. #include <stdlib.h>
  9. #include <string.h>
  10. #include <ctype.h>
  11. #include <stdio.h>
  12. #include <string.h>
  13. #include <memory.h>
  14.  
  15. // #include "dstring.h" //Я ламерок и не умею в хеадеронли - моё место на помойке
  16. #define dstr_malloc malloc //я ламерок и не умею в функции - моё место на помойке
  17. #define dstr_realloc realloc//я ламерок и не умею в функции - моё место на помойке
  18. #define dstr_free free//я ламерок и не умею в функции - моё место на помойке
  19.  
  20. struct dstring {
  21.   char * data;//терминальная лс"ная нулина.
  22.   size_t length;
  23.   size_t capacity;//я у мамы ламерок - увидел что-то у крестов и своими 3-мя извилинами попытался повторить.
  24. };//я ламерок и не умею в тайпдеф и структуры - моё место на помойке
  25. typedef struct dstring dstring_t;
  26.  
  27. dstring_t * dstr_new(const char * init);
  28. void dstr_delete(dstring_t * str);
  29. dstring_t * dstr_set(dstring_t * str, const char * val);
  30. dstring_t * dstr_truncate(dstring_t * str, size_t len);
  31. size_t dstr_len(const dstring_t * str);
  32. void dstr_swap(dstring_t * str1, dstring_t * str2);
  33. dstring_t * dstr_insert(dstring_t * str, const char * val, size_t n);
  34. dstring_t * dstr_append(dstring_t * str, const char * val);
  35. dstring_t * dstr_appendc(dstring_t * str, char c);
  36. dstring_t * dstr_prepend(dstring_t * str, const char * val);
  37. int dstr_equal(const dstring_t * str1, const dstring_t * str2);
  38. dstring_t * dstr_toupper(dstring_t * str);
  39. dstring_t * dstr_tolower(dstring_t * str);
  40. void dstr_fprint(const dstring_t * str, FILE * file);
  41.  
  42. #define DSTRING_CAPMARGIN 48//я ламерок и не умею в переменные - моё место на помойке
  43. #define DSTRING_DEFAULT_CAPACITY 16//я ламерок и не умею в переменные - моё место на помойке
  44.  
  45. #define DSTRING_ERR_RESIZE 0//я ламерок и не умею в переменные - моё место на помойке
  46. #define DSTRING_SUCC_RESIZE 1//я ламерок и не умею в переменные - моё место на помойке
  47.  
  48. /* Resize dstring capacity */
  49. static int dstr_capacity_resize(dstring_t * str, size_t capacity) {//статик инты и прочий мусор - я не умею писать код
  50.   char * temp_data_ptr = (char *)dstr_realloc(str->data, capacity);//очередной С/С++ ламерок.
  51.  
  52.   if(temp_data_ptr == NULL) return DSTRING_ERR_RESIZE;//Очередная ламерюга, не умеющая в Си.
  53.  
  54.   str->data = temp_data_ptr;//Ламерюга не умеющая в Си.
  55.   str->capacity = capacity;//То же самое.
  56.   return DSTRING_SUCC_RESIZE;//Ламерюга не умеет в !succ - надо же заваять тонну дерьма, но !succ не осилилось
  57.  
  58. }
  59.  
  60. /*
  61.  * Base function implementation
  62.  */
  63.  
  64. /* Create new dynamic string and init that string $init.
  65.    Return pointer into created dynamic string, or NULL if can't allocate memory for that.
  66.  */
  67. dstring_t * dstr_new(const char * init) {
  68.   dstring_t * str = (dstring_t *)dstr_malloc(sizeof(dstring_t));//ламерок не может в Си. Зачем юзать маллок один раз, если можно заюзать его 2 раза. А что не три?
  69.  
  70.   if(str == NULL) return NULL;//просто ахриненная история - ламерок опять не умеет в си.
  71.  
  72.   size_t data_capacity = DSTRING_DEFAULT_CAPACITY;//ламерок не умеет в си.
  73.   size_t init_len = 0;//ламерок не умеет в си.
  74.  
  75.   if(init != NULL) {//логика убогих мне не ясная
  76.     init_len = strlen(init);//Я не умею в Си.
  77.     data_capacity += init_len;//facepalm
  78.   }
  79.  
  80.   str->data = (char *)dstr_malloc(data_capacity);//я умамы ламерок
  81.  
  82.   if(str->data == NULL) {//я не умею в си.
  83.     free(str);
  84.     return NULL;
  85.   }
  86.  
  87.   str->length = init_len;//я не умею в си.
  88.   str->capacity = data_capacity;//я не умею в си.
  89.   memcpy(str->data, init, init_len);//я не умею в си.
  90.  
  91.   return str;//я не умею в си.
  92. }
  93.  
  94. /* Free memory which takes dynamic string. */
  95. void dstr_delete(dstring_t * str) {
  96.   if(str != NULL) {//я не умею в си.
  97.     dstr_free(str->data);//я не умею в си.
  98.     dstr_free(str);//я не умею в си.
  99.   }
  100. }
  101.  
  102. /* Truncate dynamic string $str to fixed length $len from the beginning $str. */
  103. dstring_t * dstr_truncate(dstring_t * str, size_t len) {//дерьмо.
  104.   if(str != NULL && str->length > len) {
  105.     if(dstr_capacity_resize(str, DSTRING_DEFAULT_CAPACITY + len))
  106.       str->length = len;
  107.   }
  108.  
  109.   return str;
  110. }
  111.  
  112. /* Set value of dynamic string $str equal $val. */
  113. dstring_t * dstr_set(dstring_t * str, const char * val) {//дерьмо
  114.  
  115.   if(val == NULL && dstr_capacity_resize(str, DSTRING_DEFAULT_CAPACITY))
  116.     str->length = 0;
  117.   else {
  118.     size_t val_len = strlen(val);
  119.  
  120.     if(dstr_capacity_resize(str, DSTRING_DEFAULT_CAPACITY + val_len)) {
  121.       str->length = val_len;
  122.       memcpy(str->data, val, val_len);
  123.     }
  124.   }
  125.  
  126.   return str;
  127. }
  128.  
  129. /* Output dstring value into stream */
  130. void dstr_fprint(const dstring_t * str, FILE * file) {//дерьмо
  131.   if(file == NULL || str == NULL) return;
  132.  
  133.   fwrite(str->data, 1, str->length, file);
  134. }
  135.  
  136. /* Return length of dynamic string $str. */
  137. size_t dstr_len(const dstring_t * str) {
  138.   return str->length;
  139. }
  140.  
  141. /* Swaps values of two dynamic strings. */
  142. void dstr_swap(dstring_t * str1, dstring_t * str2) {//зачем это надо? Опять школьник вчера увидивший кресты стал у мамки сишником?
  143.   if(str1 == NULL || str2 == NULL) return;
  144.  
  145.   char * temp_data_ptr = str1->data;
  146.   size_t temp_length = str1->length;
  147.   size_t temp_capacity = str1->capacity;
  148.  
  149.   str1->capacity = str2->capacity;
  150.   str1->length = str2->length;
  151.   str1->data = str2->data;
  152.  
  153.   str2->data = temp_data_ptr;
  154.   str2->capacity = temp_capacity;
  155.   str2->length = temp_length;
  156. }
  157.  
  158. /* Append string into dsting. */
  159. dstring_t * dstr_append(dstring_t * str, const char * val) {//просто дерьмо, зачем нужно dstr_set(), если это то же самое?
  160.   if(str == NULL || val == NULL) return str;
  161.  
  162.   size_t val_len = strlen(val);
  163.  
  164.   if(val_len > (str->capacity - str->length)) {
  165.     size_t new_capacity = str->capacity + val_len + DSTRING_CAPMARGIN;
  166.  
  167.     if(!dstr_capacity_resize(str, new_capacity))
  168.       return str;
  169.  
  170.     str->capacity = new_capacity;
  171.   }
  172.  
  173.   memcpy(str->data + str->length, val, val_len);
  174.   str->length += val_len;
  175.   return str;
  176. }
  177.  
  178. /* Append single char into dsting. */
  179. dstring_t * dstr_appendc(dstring_t * str, char c) {//просто нахрен дерьмо
  180.   if(str == NULL) return str;
  181.  
  182.   if((str->capacity - str->length) < 1) {
  183.     if(!dstr_capacity_resize(str, str->capacity + DSTRING_CAPMARGIN)) return str;
  184.  
  185.     str->capacity += DSTRING_CAPMARGIN;
  186.   }
  187.  
  188.   str->data[str->length] = c;
  189.   str->length++;
  190.   return str;
  191. }
  192.  
  193. /* Prepend string into dsting. */
  194. dstring_t * dstr_prepend(dstring_t * str, const char * val) {//Л - логика.
  195.   if(str == NULL || val == NULL) return str;
  196.  
  197.   if(str->length == 0) return str = dstr_set(str, val);
  198.  
  199.   size_t val_len = strlen(val);
  200.  
  201.   if(val_len == 0) return str;
  202.  
  203.   size_t new_capacity = str->capacity + val_len;
  204.  
  205.   if(!dstr_capacity_resize(str, new_capacity))
  206.     return str;
  207.  
  208.   str->capacity = new_capacity;
  209.  
  210.   // move the $str value on $val_len characters to rigth
  211.   memmove(str->data + val_len, str->data, str->length);
  212.   memcpy(str->data, val, val_len);
  213.   str->length += val_len;
  214.   return str;
  215. }
  216.  
  217. /* Compare two dynamic strings and return 1 if they are equals or 0 - if don't. */
  218. int dstr_equal(const dstring_t * str1, const dstring_t * str2) {
  219.   if(str1->length != str2->length) return 0;//я у мамы ламерок. Это типа куллоптимизация?
  220.  
  221.   return strncmp(str1->data, str2->data, str1->length) == 0;//а если str2 меньше str1?
  222. }
  223.  
  224. /* Converts dynamic string characters to uppercase. */
  225. dstring_t * dstr_toupper(dstring_t * str) {//таким дерьмом можешь только подтереться
  226.   for(size_t i = 0; i < str->length; i++)
  227.     str->data[i] = toupper(str->data[i]);
  228.  
  229.   return str;
  230. }
  231.  
  232. /* Converts dynamic string characters to lowercase. */
  233. dstring_t * dstr_tolower(dstring_t * str) {//и этим тоже.
  234.   for(size_t i = 0; i < str->length; i++)
  235.     str->data[i] = tolower(str->data[i]);
  236.  
  237.   return str;
  238. }
  239.  
  240. /* Insert value of string $val after $n character $str. */
  241. dstring_t * dstr_insert(dstring_t * str, const char * val, size_t n) {//т.е. твоя вставка в начало не вставка? Просто логика
  242.   if(val == NULL || n > str->length) return str;
  243.  
  244.   size_t val_len = strlen(val);
  245.  
  246.   if(val_len == 0) return str;
  247.  
  248.   size_t new_capacity = str->capacity + val_len;
  249.  
  250.   if(dstr_capacity_resize(str, new_capacity))
  251.     str->capacity = new_capacity;
  252.  
  253.   // move the $str value on $val_len characters to rigth
  254.   memmove(str->data + val_len + n, str->data + n, str->length - n);
  255.   memcpy(str->data + n, val, val_len);
  256.   str->length += val_len;
  257.   return str;
  258. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement