2788.c 2.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. /**
  5. * Note: The returned array must be malloced, assume caller calls free().
  6. */
  7. char**
  8. splitWordsBySeparator(char** words, int wordsSize, char separator,
  9. int* returnSize)
  10. {
  11. struct {
  12. char **data;
  13. unsigned long cap;
  14. unsigned long size;
  15. } ret = {0};
  16. ret.cap = wordsSize;
  17. ret.data = calloc(ret.cap, sizeof(*ret.data));
  18. for ( int i = 0; i < wordsSize; ++i ) {
  19. char *cstr = words[i];
  20. unsigned long wsize = 0;
  21. unsigned long wcap = 32;
  22. while ( *cstr != '\0' ) {
  23. if ( *cstr == separator ) {
  24. if ( wsize > 0 ) {
  25. ret.data[ret.size][wsize++] = 0;
  26. ++ret.size;
  27. }
  28. wsize = 0;
  29. wcap = 32;
  30. if ( ret.size >= ret.cap ) {
  31. ret.cap *= 2;
  32. ret.data = realloc(ret.data, sizeof(*ret.data) * ret.cap);
  33. for ( unsigned long j = ret.size; j < ret.cap; ++j ) {
  34. ret.data[j] = NULL;
  35. }
  36. }
  37. ++cstr;
  38. continue;
  39. }
  40. if ( ret.data[ret.size] == NULL ) { ret.data[ret.size] = malloc(wcap); }
  41. ret.data[ret.size][wsize++] = *cstr;
  42. if ( wsize >= wcap ) {
  43. wcap *= 2;
  44. ret.data[ret.size] = realloc(ret.data[ret.size], wcap);
  45. }
  46. ++cstr;
  47. }
  48. if ( wsize != 0 ) {
  49. ret.data[ret.size++][wsize++] = 0;
  50. if ( ret.size >= ret.cap ) {
  51. ret.cap *= 2;
  52. ret.data = realloc(ret.data, sizeof(*ret.data) * ret.cap);
  53. for ( unsigned long j = ret.size; j < ret.cap; ++j ) {
  54. ret.data[j] = NULL;
  55. }
  56. }
  57. }
  58. }
  59. *returnSize = ret.size;
  60. return ret.data;
  61. }
  62. void
  63. r(char **ws, int s, char sep)
  64. {
  65. int ret_size = 0;
  66. char **ret = splitWordsBySeparator(ws, s, sep, &ret_size);
  67. printf("RetSize = %d\n", ret_size);
  68. if ( ret == NULL ) return;
  69. printf("Ret = [");
  70. while ( *ret != NULL ) {
  71. printf("\"%s\", ", *ret++);
  72. }
  73. printf("]\n");
  74. }
  75. int
  76. main(void)
  77. {
  78. char *words[] = {"one.two.three","four.five","six"};
  79. r(words, 3, '.');
  80. return 0;
  81. }