objectmap.c 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147
  1. #include <stdio.h>
  2. #include "objectmap.h"
  3. #include "uthash.h"
  4. #include <zend_API.h>
  5. // static zend_function_entry g_funcs[MCN][MFN] = {0};
  6. // static zend_class_entry g_centries[MCN] = {0};
  7. // static zend_module_entry g_entry = {0};
  8. typedef struct _phpgo_function_map {
  9. const char *name;
  10. zend_function_entry *fe;
  11. int id;
  12. UT_hash_handle hh;
  13. } phpgo_function_map;
  14. typedef struct _phpgo_class_map {
  15. const char *name;
  16. zend_class_entry *ce;
  17. int id;
  18. UT_hash_handle hh;
  19. } phpgo_class_map;
  20. typedef struct _phpgo_module_map {
  21. const char *name;
  22. zend_module_entry *me;
  23. int id;
  24. UT_hash_handle hh;
  25. } phpgo_module_map;
  26. typedef struct _phpgo_callback_map {
  27. const char *name;
  28. int cbid;
  29. UT_hash_handle hh;
  30. } phpgo_callback_map;
  31. struct _phpgo_object_map {
  32. const char *name;
  33. void *obj;
  34. UT_hash_handle hh;
  35. };
  36. static phpgo_function_map *g_funcs_map = NULL;
  37. static phpgo_class_map *g_classes_map = NULL;
  38. static phpgo_callback_map *g_callbacks_map = NULL;
  39. void phpgo_function_map_add(const char *class_name, const char *func_name, zend_function_entry *fe)
  40. {
  41. int id = UTHASH_CNT(hh, g_funcs_map);
  42. phpgo_function_map *m = (phpgo_function_map*)malloc(sizeof(phpgo_function_map));
  43. char *key = (char*)calloc(1, class_name == NULL ? 0 : strlen(class_name) + strlen(func_name) + 2 + 1);
  44. sprintf(key, "%s::%s%c", class_name == NULL ? "" : class_name, func_name, '\0');
  45. m->name = key;
  46. m->fe = fe;
  47. m->id = id;
  48. UTHASH_ADD_KEYPTR(hh, g_funcs_map, key, strlen(key), m);
  49. }
  50. zend_function_entry* phpgo_function_map_get(const char *class_name, const char *func_name)
  51. {
  52. phpgo_function_map *m = NULL;
  53. char key[(class_name == NULL ? 0 : strlen(class_name)) + strlen(func_name) + 2 + 1];
  54. sprintf(key, "%s::%s%c", (class_name == NULL ? "" : class_name), func_name, '\0');
  55. UTHASH_FIND_STR(g_funcs_map, key, m);
  56. if (m == NULL) {
  57. return NULL;
  58. }
  59. return m->fe;
  60. }
  61. void phpgo_class_map_add(const char *class_name, zend_class_entry *ce)
  62. {
  63. int id = UTHASH_CNT(hh, g_classes_map);
  64. phpgo_class_map *m = (phpgo_class_map*)malloc(sizeof(phpgo_class_map));
  65. m->name = class_name;
  66. m->ce = ce;
  67. m->id = id;
  68. UTHASH_ADD_KEYPTR(hh, g_classes_map, class_name, strlen(class_name), m);
  69. }
  70. zend_class_entry* phpgo_class_map_get(const char *class_name)
  71. {
  72. phpgo_class_map *m = NULL;
  73. UTHASH_FIND_STR(g_classes_map, class_name, m);
  74. if (m == NULL) {
  75. return NULL;
  76. }
  77. return m->ce;
  78. }
  79. void phpgo_callback_map_add(const char *class_name, const char *func_name, int cbid)
  80. {
  81. int id = UTHASH_CNT(hh, g_callbacks_map);
  82. phpgo_callback_map *m = (phpgo_callback_map*)malloc(sizeof(phpgo_callback_map));
  83. char *key = (char*)calloc(1, class_name == NULL ? 0 : strlen(class_name) + strlen(func_name) + 2 + 1);
  84. sprintf(key, "%s::%s%c", class_name == NULL ? "" : class_name, func_name, '\0');
  85. m->name = key;
  86. m->cbid = cbid;
  87. UTHASH_ADD_KEYPTR(hh, g_callbacks_map, key, strlen(key), m);
  88. }
  89. int phpgo_callback_map_get(const char *class_name, const char *func_name)
  90. {
  91. phpgo_callback_map *m = NULL;
  92. char key[(class_name == NULL ? 0 : strlen(class_name)) + strlen(func_name) + 2 + 1];
  93. sprintf(key, "%s::%s%c", (class_name == NULL ? "" : class_name), func_name, '\0');
  94. UTHASH_FIND_STR(g_callbacks_map, key, m);
  95. if (m == NULL) {
  96. return -1;
  97. }
  98. return m->cbid;
  99. }
  100. phpgo_object_map* phpgo_object_map_new() {
  101. phpgo_object_map *om = (phpgo_object_map*)malloc(sizeof(phpgo_object_map));
  102. return om;
  103. }
  104. void phpgo_object_map_add(phpgo_object_map** om, const char *name, void* obj)
  105. {
  106. phpgo_object_map *m = (phpgo_object_map*)malloc(sizeof(phpgo_object_map));
  107. char *key = strdup(name);
  108. m->name = key;
  109. m->obj = obj;
  110. UTHASH_ADD_KEYPTR(hh, *om, key, strlen(key), m);
  111. }
  112. void* phpgo_object_map_get(phpgo_object_map* om, const char *name)
  113. {
  114. phpgo_object_map *m = NULL;
  115. const char *key = name;
  116. UTHASH_FIND_STR(om, key, m);
  117. if (m == NULL) {
  118. return NULL;
  119. }
  120. return m->obj;
  121. }
  122. int phpgo_object_map_count(phpgo_object_map* om) {
  123. return UTHASH_COUNT(om);
  124. }