finsh_var.c 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130
  1. #include <finsh.h>
  2. #include "finsh_var.h"
  3. struct finsh_var global_variable[FINSH_VARIABLE_MAX];
  4. struct finsh_sysvar_item* global_sysvar_list;
  5. int finsh_var_init()
  6. {
  7. memset(global_variable, 0, sizeof(global_variable));
  8. return 0;
  9. }
  10. int finsh_var_insert(const char* name, int type)
  11. {
  12. int i, empty;
  13. empty = -1;
  14. for (i = 0; i < FINSH_VARIABLE_MAX; i ++)
  15. {
  16. /* there is a same name variable exist. */
  17. if (strncmp(global_variable[i].name, name, FINSH_NAME_MAX) == 0)
  18. return -1;
  19. if (global_variable[i].type == finsh_type_unknown && empty == -1)
  20. {
  21. empty = i;
  22. }
  23. }
  24. /* there is no empty entry */
  25. if (empty == -1) return -1;
  26. /* insert entry */
  27. strncpy(global_variable[empty].name, name, FINSH_NAME_MAX);
  28. global_variable[empty].type = type;
  29. /* return the offset */
  30. return empty;
  31. }
  32. int finsh_var_delete(const char* name)
  33. {
  34. int i;
  35. for (i = 0; i < FINSH_VARIABLE_MAX; i ++)
  36. {
  37. if (strncpy(global_variable[i].name, name, FINSH_NAME_MAX) == 0)
  38. break;
  39. }
  40. /* can't find variable */
  41. if (i == FINSH_VARIABLE_MAX) return -1;
  42. memset(&global_variable[i], 0, sizeof(struct finsh_var));
  43. return 0;
  44. }
  45. struct finsh_var* finsh_var_lookup(const char* name)
  46. {
  47. int i;
  48. for (i = 0; i < FINSH_VARIABLE_MAX; i ++)
  49. {
  50. if (strncmp(global_variable[i].name, name, FINSH_NAME_MAX) == 0)
  51. break;
  52. }
  53. /* can't find variable */
  54. if (i == FINSH_VARIABLE_MAX) return NULL;
  55. return &global_variable[i];
  56. }
  57. #ifdef RT_USING_HEAP
  58. extern char *strdup(const char *s);
  59. void finsh_sysvar_append(const char* name, u_char type, void* var_addr)
  60. {
  61. /* create a sysvar */
  62. struct finsh_sysvar_item* item;
  63. item = (struct finsh_sysvar_item*) rt_malloc (sizeof(struct finsh_sysvar_item));
  64. if (item != NULL)
  65. {
  66. item->next = NULL;
  67. item->sysvar.name = strdup(name);
  68. item->sysvar.type = type;
  69. item->sysvar.var = var_addr;
  70. if (global_sysvar_list == NULL)
  71. {
  72. global_sysvar_list = item;
  73. }
  74. else
  75. {
  76. item->next = global_sysvar_list;
  77. global_sysvar_list->next = item;
  78. }
  79. }
  80. }
  81. #endif
  82. struct finsh_sysvar* finsh_sysvar_lookup(const char* name)
  83. {
  84. struct finsh_sysvar* index;
  85. struct finsh_sysvar_item* item;
  86. for (index = _sysvar_table_begin; index < _sysvar_table_end; index ++)
  87. {
  88. if (strcmp(index->name, name) == 0)
  89. return index;
  90. }
  91. /* find in sysvar list */
  92. item = global_sysvar_list;
  93. while (item != NULL)
  94. {
  95. if (strncmp(item->sysvar.name, name, strlen(name)) == 0)
  96. {
  97. return &(item->sysvar);
  98. }
  99. /* move to next item */
  100. item = item->next;
  101. }
  102. /* can't find variable */
  103. return NULL;
  104. }