shell_companion.c 2.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  1. /**
  2. * @file shell_companion.c
  3. * @author Letter (nevermindzzt@gmail.com)
  4. * @brief shell companion object support
  5. * @version 3.0.3
  6. * @date 2020-07-22
  7. *
  8. * @copyright (c) 2020 Letter
  9. *
  10. */
  11. #include "shell.h"
  12. #if SHELL_USING_COMPANION == 1
  13. /**
  14. * @brief shell添加伴生对象
  15. *
  16. * @param shell shell对象
  17. * @param id 伴生对象ID
  18. * @param object 伴生对象
  19. * @return signed char 0 添加成功 -1 添加失败
  20. */
  21. signed char shellCompanionAdd(Shell *shell, int id, void *object)
  22. {
  23. ShellCompanionObj *companions = shell->info.companions;
  24. ShellCompanionObj *node = SHELL_MALLOC(sizeof(ShellCompanionObj));
  25. SHELL_ASSERT(node, return -1);
  26. node->id = id;
  27. node->obj = object;
  28. node->next = companions;
  29. shell->info.companions = node;
  30. return 0;
  31. }
  32. /**
  33. * @brief shell删除伴生对象
  34. *
  35. * @param shell shell对象
  36. * @param id 伴生对象ID
  37. * @return signed char 0 删除成功 -1 无匹配对象
  38. */
  39. signed char shellCompanionDel(Shell *shell, int id)
  40. {
  41. ShellCompanionObj *companions = shell->info.companions;
  42. ShellCompanionObj *front = companions;
  43. while (companions)
  44. {
  45. if (companions->id == id)
  46. {
  47. if (companions == shell->info.companions && !(companions->next))
  48. {
  49. shell->info.companions = (void *)0;
  50. }
  51. else
  52. {
  53. front->next = companions->next;
  54. }
  55. SHELL_FREE(companions);
  56. return 0;
  57. }
  58. front = companions;
  59. companions = companions->next;
  60. }
  61. return -1;
  62. }
  63. /**
  64. * @brief shell获取伴生对象
  65. *
  66. * @param shell shell对象
  67. * @param id 伴生对象ID
  68. * @return void* 伴生对象,无匹配对象时返回NULL
  69. */
  70. void *shellCompanionGet(Shell *shell, int id)
  71. {
  72. SHELL_ASSERT(shell, return (void *)0);
  73. ShellCompanionObj *companions = shell->info.companions;
  74. while (companions)
  75. {
  76. if (companions->id == id)
  77. {
  78. return companions->obj;
  79. }
  80. companions = companions->next;
  81. }
  82. return (void *)0;
  83. }
  84. #endif /** SHELL_USING_COMPANION == 1 */