88 lines
2.1 KiB
C
88 lines
2.1 KiB
C
![]() |
/**
|
|||
|
* @file shell_companion.c
|
|||
|
* @author Letter (nevermindzzt@gmail.com)
|
|||
|
* @brief shell companion object support
|
|||
|
* @version 3.0.3
|
|||
|
* @date 2020-07-22
|
|||
|
*
|
|||
|
* @copyright (c) 2020 Letter
|
|||
|
*
|
|||
|
*/
|
|||
|
#include "shell.h"
|
|||
|
|
|||
|
#if SHELL_USING_COMPANION == 1
|
|||
|
/**
|
|||
|
* @brief shell添加伴生对象
|
|||
|
*
|
|||
|
* @param shell shell对象
|
|||
|
* @param id 伴生对象ID
|
|||
|
* @param object 伴生对象
|
|||
|
* @return signed char 0 添加成功 -1 添加失败
|
|||
|
*/
|
|||
|
signed char shellCompanionAdd(Shell *shell, int id, void *object)
|
|||
|
{
|
|||
|
ShellCompanionObj *companions = shell->info.companions;
|
|||
|
ShellCompanionObj *node = SHELL_MALLOC(sizeof(ShellCompanionObj));
|
|||
|
SHELL_ASSERT(node, return -1);
|
|||
|
node->id = id;
|
|||
|
node->obj = object;
|
|||
|
node->next = companions;
|
|||
|
shell->info.companions = node;
|
|||
|
return 0;
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* @brief shell删除伴生对象
|
|||
|
*
|
|||
|
* @param shell shell对象
|
|||
|
* @param id 伴生对象ID
|
|||
|
* @return signed char 0 删除成功 -1 无匹配对象
|
|||
|
*/
|
|||
|
signed char shellCompanionDel(Shell *shell, int id)
|
|||
|
{
|
|||
|
ShellCompanionObj *companions = shell->info.companions;
|
|||
|
ShellCompanionObj *front = companions;
|
|||
|
while (companions)
|
|||
|
{
|
|||
|
if (companions->id == id)
|
|||
|
{
|
|||
|
if (companions == shell->info.companions && !(companions->next))
|
|||
|
{
|
|||
|
shell->info.companions = (void *)0;
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
front->next = companions->next;
|
|||
|
}
|
|||
|
SHELL_FREE(companions);
|
|||
|
return 0;
|
|||
|
}
|
|||
|
front = companions;
|
|||
|
companions = companions->next;
|
|||
|
}
|
|||
|
return -1;
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* @brief shell获取伴生对象
|
|||
|
*
|
|||
|
* @param shell shell对象
|
|||
|
* @param id 伴生对象ID
|
|||
|
* @return void* 伴生对象,无匹配对象时返回NULL
|
|||
|
*/
|
|||
|
void *shellCompanionGet(Shell *shell, int id)
|
|||
|
{
|
|||
|
SHELL_ASSERT(shell, return (void *)0);
|
|||
|
ShellCompanionObj *companions = shell->info.companions;
|
|||
|
while (companions)
|
|||
|
{
|
|||
|
if (companions->id == id)
|
|||
|
{
|
|||
|
return companions->obj;
|
|||
|
}
|
|||
|
companions = companions->next;
|
|||
|
}
|
|||
|
return (void *)0;
|
|||
|
}
|
|||
|
#endif /** SHELL_USING_COMPANION == 1 */
|