array.c 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
  1. #include <stdlib.h>
  2. #include <string.h>
  3. #include "array.h"
  4. void ArrayTest() {
  5. char *names[] = { "John", "Mary", "George", "Bob" };
  6. Array *array = ArrayNew(1);
  7. int i;
  8. for (i=0; i<4; i++)
  9. ArrayAdd(array, names[i]);
  10. ArrayEach(array, strPrintln);
  11. printf("ArrayPop()=%s\n", (char *)ArrayPop(array));
  12. printf("ArrayLast()=%s\n",(char *) ArrayLast(array));
  13. for (i=0; i<4; i++) {
  14. int arrayIdx = ArrayFind(array, names[i], strcmp);
  15. printf("ArrayFind(%s)=%d\n", names[i], arrayIdx);
  16. }
  17. ArrayEach(array, strPrintln);
  18. ArrayFree(array, NULL);
  19. }
  20. Array* ArrayNew(int size) {
  21. Array *array = ObjNew(Array, 1);
  22. array->count = 0;
  23. array->size = size;
  24. array->item = ObjNew(void*, array->size);
  25. return array;
  26. }
  27. void ArrayFree(Array *array, FuncPtr1 freeFuncPtr) {
  28. if (array == NULL) return;
  29. if (freeFuncPtr != NULL)
  30. ArrayEach(array, freeFuncPtr);
  31. ObjFree(array->item);
  32. ObjFree(array);
  33. }
  34. void ArrayAdd(Array *array, void *item) {
  35. ASSERT(array->count <= array->size);
  36. if (array->count == array->size) {
  37. int newSize = array->size*2;
  38. void **newItems = ObjNew(void*, newSize);
  39. memcpy(newItems, array->item, array->size*sizeof(void*));
  40. // printf("array grow from %d to %d\n", array->count, newSize);
  41. ObjFree(array->item);
  42. array->item = newItems;
  43. array->size = newSize;
  44. }
  45. array->item[array->count++] = item;
  46. //printf("add item = %s\n", item);
  47. }
  48. void ArrayPush(Array *array, void *item) {
  49. ArrayAdd(array, item);
  50. }
  51. void* ArrayPop(Array *array) {
  52. ASSERT(array->count>0);
  53. return array->item[--(array->count)];
  54. }
  55. void* ArrayPeek(Array *array) {
  56. return ArrayLast(array);
  57. }
  58. void* ArrayLast(Array *array) {
  59. ASSERT(array->count > 0);
  60. return array->item[array->count-1];
  61. }
  62. Array* strsplit(char *str, char *spliter, SplitMode mode) {
  63. Array *tokens = ArrayNew(10);
  64. int si, tokenCount=0;
  65. int begin=0, ti = 0;
  66. for (si=0; si<=strlen(str); si++) {
  67. if (str[si]=='\0' || strMember(str[si], spliter)) {
  68. int len = si-begin;
  69. if (len > 0)
  70. ArrayAdd(tokens, newSubstr(str, begin, len));
  71. if (mode == KEEP_SPLITER)
  72. ArrayAdd(tokens, newSubstr(str, si, 1));
  73. // printf("token1=%s token2=%s\n", tokens->item[ti-2], tokens->item[ti-1]);
  74. begin = si+1;
  75. }
  76. }
  77. return tokens;
  78. }
  79. int ArrayFind(Array *array, void *data, FuncPtr2 fcmp) {
  80. int i;
  81. for (i=0; i<array->count; i++)
  82. if (fcmp(array->item[i], data)==0)
  83. return i;
  84. return -1;
  85. }
  86. void ArrayEach(Array *array, FuncPtr1 f) {
  87. int i;
  88. for (i=0; i<array->count; i++)
  89. f(array->item[i]);
  90. }