language_hashmap.c 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297
  1. #include <stdlib.h>
  2. #include <string.h>
  3. #include "elog.h"
  4. #include "common.h"
  5. #include "language_hashmap.h"
  6. #if 1
  7. #define LOGD log_d
  8. #define LOGE log_e
  9. #define LOGW log_w
  10. #else
  11. #define LOGD printf
  12. #define LOGE printf
  13. #define LOGW printf
  14. #endif
  15. unsigned int _hash(HashTable *table,const char *key)
  16. {
  17. unsigned int hash = 0;
  18. while (*key) {
  19. hash = hash * 31 + *key++;
  20. }
  21. return hash % table->size; // 假设哈希表大小为101
  22. }
  23. HashTable *create_hash_table(int size)
  24. {
  25. HashTable *table = (HashTable *)malloc(sizeof(HashTable));
  26. if(table) {
  27. table->size = size;
  28. table->ptable = (HashEntry **)calloc(1, size*sizeof(HashEntry *));
  29. if(table->ptable==NULL) {
  30. free(table);
  31. return NULL;
  32. }
  33. }
  34. return table;
  35. }
  36. // 在哈希表中插入键值对
  37. int insert_Newhash(HashTable *table, const char *key, const char **value,int valuelens)
  38. {
  39. unsigned int index = _hash(table,key);
  40. if(table->ptable[index]) {
  41. //LOGW("hash value is repeat, index: %d, ___%s___, ___%s___\n", index, table->ptable[index]->key, key);
  42. return HASH_REPEAT;
  43. }
  44. HashEntry *entry = (HashEntry *)malloc(sizeof(HashEntry));
  45. if(entry==NULL) {
  46. return HASH_MALLOC_FAIL;
  47. }
  48. entry->key = strdup(key);
  49. entry->value = (char**)malloc(sizeof(char*)*valuelens);
  50. if(entry->value==NULL) {
  51. free(entry);
  52. return HASH_MALLOC_FAIL;
  53. }
  54. for (int i = 0; i < valuelens; i++)
  55. {
  56. entry->value[i] = strdup(value[i]);
  57. }
  58. entry->valueLength = valuelens;
  59. entry->next = table->ptable[index];
  60. table->ptable[index] = entry;
  61. //LOGD("___key: %s, index: %d\n", key, index);
  62. return HASH_OK;
  63. }
  64. // 在哈希表中查找键对应的值
  65. const HashEntry*find_hash(HashTable *table, const char *key) {
  66. unsigned int index = _hash(table,key);
  67. if(index>=table->size) {
  68. return NULL;
  69. }
  70. HashEntry *entry = table->ptable[index];
  71. while (entry && entry->key) {
  72. if (strcmp(entry->key, key) == 0) {
  73. return entry;
  74. }
  75. entry = entry->next;
  76. }
  77. return NULL;
  78. }
  79. // 释放哈希表占用的内存
  80. void free_hash_table(HashTable *table) {
  81. for (int i = 0; i < table->size; i++) {
  82. HashEntry *entry = table->ptable[i];
  83. while (entry) {
  84. HashEntry *temp = entry;
  85. entry = entry->next;
  86. free(temp->key);
  87. for (int i = 0; i < temp->valueLength; i++)
  88. {
  89. free(temp->value[i]);
  90. }
  91. free(temp->value);
  92. free(temp);
  93. }
  94. }
  95. free(table->ptable);
  96. free(table);
  97. }
  98. void replace_sequences(char *str, HashTable *table) {
  99. char *token = strtok(str, DELIMITER);
  100. char output[MAX_LEN] = "";
  101. int output_len = 0;
  102. int token_len;
  103. while (token != 0) {
  104. if (token[0] == '$' && token[1] != '\0' && token[strlen(token) - 1] == '$') {
  105. // 去除包裹的`$`符号,并查找替换值
  106. char *key = strdup(token + 1); // 跳过开头的`$`
  107. key[strlen(key) - 1] = '\0'; // 去除结尾的`$`
  108. const char *replacement=NULL;
  109. HashEntry* pEnty= (HashEntry*)find_hash(table, key);
  110. if (pEnty)
  111. {
  112. replacement=pEnty->value[__globalDeviceManage._globalDevInfo.product.language];
  113. }
  114. free(key); // 释放key占用的内存
  115. if (replacement) {
  116. // 将替换值追加到输出字符串中
  117. strncat(output, replacement, MAX_LEN - output_len - 1);
  118. output_len += strlen(replacement);
  119. } else {
  120. // 如果没有找到替换值,可以选择保留原序列或抛出一个错误
  121. // 这里选择保留原序列
  122. strncat(output, DELIMITER, MAX_LEN - output_len - 1);
  123. strncat(output, token, MAX_LEN - output_len - 1);
  124. strncat(output, DELIMITER, MAX_LEN - output_len - 1);
  125. output_len += strlen(token) + 2 * strlen(DELIMITER);
  126. }
  127. } else {
  128. // 不是`$xxxx$`格式,直接追加到输出字符串中
  129. strncat(output, token, MAX_LEN - output_len - 1);
  130. output_len += strlen(token);
  131. }
  132. token = strtok(0, DELIMITER); // 继续获取下一个token
  133. }
  134. // 将最终的输出字符串复制回原字符串
  135. strncpy(str, output, output_len + 1);
  136. str[output_len] = '\0'; // 确保字符串以null结尾
  137. }
  138. int init_hash_table(void)
  139. {
  140. int r,nMaxSize=LANG_ID_MAX;
  141. int retry=0,step=100,cnt;
  142. HashTable *table=NULL;
  143. GlobalDeviceManager *dm=&__globalDeviceManage;
  144. dm->alarmTab = NULL;
  145. retry:
  146. cnt = step*(retry+1);
  147. printf("___ hash table init, retry: %d, table size: %d\n", retry, cnt);
  148. table = create_hash_table(cnt);
  149. if(table==NULL) goto failed;
  150. r = insert_Newhash(table,(const char*)language_alarm_Ch[0],language_alarm_Ch,nMaxSize);
  151. if(r==HASH_REPEAT) goto repeat; else if(r<HASH_REPEAT) goto failed;
  152. r = insert_Newhash(table,(const char*)language_alarm_V[0],language_alarm_V,nMaxSize);
  153. if(r==HASH_REPEAT) goto repeat; else if(r<HASH_REPEAT) goto failed;
  154. r = insert_Newhash(table,(const char*)language_alarm_A[0],language_alarm_A,nMaxSize);
  155. if(r==HASH_REPEAT) goto repeat; else if(r<HASH_REPEAT) goto failed;
  156. r = insert_Newhash(table,(const char*)language_alarm_W[0],language_alarm_W,nMaxSize);
  157. if(r==HASH_REPEAT) goto repeat; else if(r<HASH_REPEAT) goto failed;
  158. r = insert_Newhash(table,(const char*)language_alarm_P[0],language_alarm_P,nMaxSize);
  159. if(r==HASH_REPEAT) goto repeat; else if(r<HASH_REPEAT) goto failed;
  160. r = insert_Newhash(table,(const char*)language_alarm_Up[0],language_alarm_Up,nMaxSize);
  161. if(r==HASH_REPEAT) goto repeat; else if(r<HASH_REPEAT) goto failed;
  162. r = insert_Newhash(table,(const char*)language_alarm_Down[0],language_alarm_Down,nMaxSize);
  163. if(r==HASH_REPEAT) goto repeat; else if(r<HASH_REPEAT) goto failed;
  164. r = insert_Newhash(table,(const char*)language_alarm_ctrl_Open[0],language_alarm_ctrl_Open,nMaxSize);
  165. if(r==HASH_REPEAT) goto repeat; else if(r<HASH_REPEAT) goto failed;
  166. r = insert_Newhash(table,(const char*)language_alarm_ctrl_Close[0],language_alarm_ctrl_Close,nMaxSize);
  167. if(r==HASH_REPEAT) goto repeat; else if(r<HASH_REPEAT) goto failed;
  168. r = insert_Newhash(table,(const char*)language_alarm_Ctrl_ALL[0],language_alarm_Ctrl_ALL,nMaxSize);
  169. if(r==HASH_REPEAT) goto repeat; else if(r<HASH_REPEAT) goto failed;
  170. r = insert_Newhash(table,(const char*)language_alarm_connect_ERROR[0],language_alarm_connect_ERROR,nMaxSize);
  171. if(r==HASH_REPEAT) goto repeat; else if(r<HASH_REPEAT) goto failed;
  172. r = insert_Newhash(table,(const char*)language_alarm_Init_Success[0],language_alarm_Init_Success,nMaxSize);
  173. if(r==HASH_REPEAT) goto repeat; else if(r<HASH_REPEAT) goto failed;
  174. r = insert_Newhash(table,(const char*)language_alarm_NULL_ERROR[0], language_alarm_NULL_ERROR, nMaxSize);
  175. if(r==HASH_REPEAT) goto repeat; else if(r<HASH_REPEAT) goto failed;
  176. //13
  177. r = insert_Newhash(table,(const char*)language_temperature[0], language_temperature, nMaxSize);
  178. if(r==HASH_REPEAT) goto repeat; else if(r<HASH_REPEAT) goto failed;
  179. r = insert_Newhash(table,(const char*)language_humidity[0], language_humidity, nMaxSize);
  180. if(r==HASH_REPEAT) goto repeat; else if(r<HASH_REPEAT) goto failed;
  181. r = insert_Newhash(table,(const char*)language_atmosphere_gas[0], language_atmosphere_gas, nMaxSize);
  182. if(r==HASH_REPEAT) goto repeat; else if(r<HASH_REPEAT) goto failed;
  183. r = insert_Newhash(table,(const char*)language_atmosphere_airflow[0], language_atmosphere_airflow, nMaxSize);
  184. if(r==HASH_REPEAT) goto repeat; else if(r<HASH_REPEAT) goto failed;
  185. r = insert_Newhash(table,(const char*)language_atmosphere_pressure[0], language_atmosphere_pressure, nMaxSize);
  186. if(r==HASH_REPEAT) goto repeat; else if(r<HASH_REPEAT) goto failed;
  187. //18
  188. r = insert_Newhash(table,(const char*)language_RS485_install[0], language_RS485_install, nMaxSize);
  189. if(r==HASH_REPEAT) goto repeat; else if(r<HASH_REPEAT) goto failed;
  190. r = insert_Newhash(table,(const char*)language_alarm_RS485_master[0], language_alarm_RS485_master, nMaxSize);
  191. if(r==HASH_REPEAT) goto repeat; else if(r<HASH_REPEAT) goto failed;
  192. r = insert_Newhash(table,(const char*)language_alarm_RS485_slave[0], language_alarm_RS485_slave, nMaxSize);
  193. if(r==HASH_REPEAT) goto repeat; else if(r<HASH_REPEAT) goto failed;
  194. r = insert_Newhash(table,(const char*)language_NTP_install[0], language_NTP_install, nMaxSize);
  195. if(r==HASH_REPEAT) goto repeat; else if(r<HASH_REPEAT) goto failed;
  196. //22
  197. r = insert_Newhash(table,(const char*)language_alarm_ctrl_OpenCH[0],language_alarm_ctrl_OpenCH,nMaxSize);
  198. if(r==HASH_REPEAT) goto repeat; else if(r<HASH_REPEAT) goto failed;
  199. r = insert_Newhash(table,(const char*)language_alarm_ctrl_CloseCH[0],language_alarm_ctrl_CloseCH,nMaxSize);
  200. if(r==HASH_REPEAT) goto repeat; else if(r<HASH_REPEAT) goto failed;
  201. r = insert_Newhash(table,(const char*)language_alarm_ctrl_Alarm[0],language_alarm_ctrl_Alarm,nMaxSize);
  202. if(r==HASH_REPEAT) goto repeat; else if(r<HASH_REPEAT) goto failed;
  203. //25
  204. r = insert_Newhash(table,(const char*)language_alarm_Type_Power[0],language_alarm_Type_Power,nMaxSize);
  205. if(r==HASH_REPEAT) goto repeat; else if(r<HASH_REPEAT) goto failed;
  206. r = insert_Newhash(table,(const char*)language_alarm_Type_Sensor[0],language_alarm_Type_Sensor,nMaxSize);
  207. if(r==HASH_REPEAT) goto repeat; else if(r<HASH_REPEAT) goto failed;
  208. r = insert_Newhash(table,(const char*)language_alarm_Type_Network[0],language_alarm_Type_Network,nMaxSize);
  209. if(r==HASH_REPEAT) goto repeat; else if(r<HASH_REPEAT) goto failed;
  210. //28
  211. r = insert_Newhash(table,(const char*)language_alarm_phaseA_lose[0], language_alarm_phaseA_lose, nMaxSize);
  212. if(r==HASH_REPEAT) goto repeat; else if(r<HASH_REPEAT) goto failed;
  213. r = insert_Newhash(table,(const char*)language_alarm_phaseB_lose[0], language_alarm_phaseB_lose, nMaxSize);
  214. if(r==HASH_REPEAT) goto repeat; else if(r<HASH_REPEAT) goto failed;
  215. r = insert_Newhash(table,(const char*)language_alarm_phaseC_lose[0], language_alarm_phaseC_lose, nMaxSize);
  216. if(r==HASH_REPEAT) goto repeat; else if(r<HASH_REPEAT) goto failed;
  217. //31
  218. //r = insert_Newhash(table,(const char*)language_alarm_MAC_changed[0], language_alarm_MAC_changed, nMaxSize);
  219. //if(r==HASH_REPEAT) goto repeat; else if(r<HASH_REPEAT) goto failed;
  220. r = insert_Newhash(table,(const char*)language_alarm[0], language_alarm_MAC_changed, nMaxSize);
  221. if(r==HASH_REPEAT) goto repeat; else if(r<HASH_REPEAT) goto failed;
  222. r = insert_Newhash(table,(const char*)language_sensor_leak[0], language_alarm_MAC_changed, nMaxSize);
  223. if(r==HASH_REPEAT) goto repeat; else if(r<HASH_REPEAT) goto failed;
  224. dm->alarmTab = table;
  225. log_d("___ hash table init OK, table size: %d\n", table->size);
  226. return 0;
  227. repeat:
  228. retry++;
  229. free_hash_table(table);
  230. goto retry;
  231. failed:
  232. free_hash_table(table);
  233. return -1;
  234. }