var_export_cmd.c 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166
  1. /*
  2. * Copyright (c) 2006-2021, RT-Thread Development Team
  3. *
  4. * SPDX-License-Identifier: Apache-2.0
  5. *
  6. * Change Logs:
  7. * Date Author Notes
  8. * 2021-06-05 WillianChan first version
  9. */
  10. #include <var_export.h>
  11. static int ve_cmd_help(int argc, char **argv);
  12. static int ve_find_module(int argc, char **argv);
  13. static int ve_find_value(int argc, char **argv);
  14. struct ve_cmd_des
  15. {
  16. const char *cmd;
  17. int (*fun)(int argc, char **argv);
  18. };
  19. /* dcm cmd table */
  20. static const struct ve_cmd_des cmd_tab[] =
  21. {
  22. {"module", ve_find_module},
  23. {"value", ve_find_value},
  24. };
  25. static int ve_cmd_help(int argc, char **argv)
  26. {
  27. rt_kprintf("Usage:\n");
  28. rt_kprintf("ve_find module <module> - Find by module name\n");
  29. rt_kprintf("ve_find value <module> <identifier> - Find accurately\n");
  30. return RT_EOK;
  31. }
  32. rt_inline void ve_object_split(int len)
  33. {
  34. while (len--) rt_kprintf("-");
  35. }
  36. static int ve_find_module(int argc, char **argv)
  37. {
  38. ve_iterator_t iter;
  39. const ve_exporter_t *exporter;
  40. ve_module_t module;
  41. int maxlen = (RT_NAME_MAX * 2);
  42. const char *item_title = "ve_module";
  43. rt_kprintf("%-*.s identifier value\n", maxlen, item_title); ve_object_split(maxlen);
  44. rt_kprintf(" ---------------- -----\n");
  45. if (!ve_module_init(&module, argv[2]))
  46. {
  47. ve_iter_init(&module, &iter);
  48. }
  49. else
  50. {
  51. return -RT_ERROR;
  52. }
  53. while (1)
  54. {
  55. exporter = ve_iter_next(&iter);
  56. if (exporter == RT_NULL)
  57. {
  58. return -RT_ERROR;
  59. }
  60. else
  61. {
  62. rt_kprintf("%-*.s %-*.s %d\n",
  63. maxlen, exporter->module,
  64. maxlen, exporter->identifier,
  65. exporter->value);
  66. }
  67. }
  68. }
  69. static int ve_find_value(int argc, char **argv)
  70. {
  71. ve_iterator_t iter;
  72. const ve_exporter_t *exporter;
  73. ve_module_t module;
  74. int maxlen = (RT_NAME_MAX * 2);
  75. const char *item_title = "ve_module";
  76. rt_kprintf("%-*.s identifier value\n", maxlen, item_title); ve_object_split(maxlen);
  77. rt_kprintf(" ---------------- -----\n");
  78. if (!ve_module_init(&module, argv[2]))
  79. {
  80. ve_iter_init(&module, &iter);
  81. }
  82. else
  83. {
  84. return -RT_ERROR;
  85. }
  86. while (1)
  87. {
  88. exporter = ve_iter_next(&iter);
  89. if (exporter == RT_NULL)
  90. {
  91. return -RT_ERROR;
  92. }
  93. else
  94. {
  95. if (!rt_strcmp(exporter->identifier, argv[3]))
  96. {
  97. rt_kprintf("%-*.s %-*.s %d\n",
  98. maxlen, exporter->module,
  99. maxlen, exporter->identifier,
  100. exporter->value);
  101. return RT_EOK;
  102. }
  103. }
  104. }
  105. }
  106. static int ve_find(int argc, char **argv)
  107. {
  108. int i, resule = RT_EOK;
  109. const struct ve_cmd_des *run_cmd = RT_NULL;
  110. if (argc == 1)
  111. {
  112. ve_cmd_help(argc, argv);
  113. return RT_EOK;
  114. }
  115. /* find command function */
  116. for (i = 0; i < sizeof(cmd_tab) / sizeof(cmd_tab[0]); i++)
  117. {
  118. if (rt_strcmp(cmd_tab[i].cmd, argv[1]) == 0)
  119. {
  120. run_cmd = &cmd_tab[i];
  121. break;
  122. }
  123. }
  124. /* not find command function, print help information */
  125. if (run_cmd == RT_NULL)
  126. {
  127. rt_kprintf("There is no command option named %s.\n", argv[1]);
  128. ve_cmd_help(argc, argv);
  129. return RT_EOK;
  130. }
  131. /* run command function */
  132. if (run_cmd->fun != RT_NULL)
  133. {
  134. resule = run_cmd->fun(argc, argv);
  135. }
  136. if (resule)
  137. {
  138. ve_cmd_help(argc, argv);
  139. }
  140. return RT_EOK;
  141. }
  142. MSH_CMD_EXPORT(ve_find, find the specified export variable);