OSDN Git Service

(none)
[hos/hos-v4a.git] / aplfw / system / command / command.c
1
2 #include <string.h>
3 #include "command.h"
4 #include "system/sysapi/sysapi.h"
5 #include "library/container/assoc/assoc.h"
6
7
8 C_ASSOC Command_Assoc;
9
10
11 void Command_Initialize(void)
12 {
13         /* システムメモリを使う連想配列を生成 */
14         Assoc_CreateEx(&Command_Assoc, SysMem_GetMemIf());
15 }
16
17 /* コマンドを登録する */
18 void Command_AddCommand(const char *pszName, COMMAND_FUNC pfncMain)
19 {
20         Assoc_Add(&Command_Assoc, pszName, &pfncMain, sizeof(pfncMain));
21 }
22
23
24 /* コマンドを実行する */
25 COMMAND_ERR Command_Execute(const char *pszCommandLine, int *piExitCode)
26 {
27         const COMMAND_FUNC *ppfncMain;
28         COMMAND_ERR Ret = COMMAND_ERR_NG;
29         int  iExitCode;
30         char *pszBuf;
31         char **ppszArgv;
32         int  iLen;
33         int  iArgc = 0;
34         int  i;
35         
36         /* メモリ確保 */
37         iLen = strlen(pszCommandLine);
38         if ( (pszBuf = (char *)SysMem_Alloc(iLen+1)) == NULL )
39         {
40                 return COMMAND_ERR_NG;
41         }
42         if ( (ppszArgv = (char **)SysMem_Alloc((iLen/2+1) * sizeof(char *))) == NULL )
43         {
44                 SysMem_Free(pszBuf);
45                 return COMMAND_ERR_NG;
46         }
47
48         /* パラメータ分解 */
49         strcpy(pszBuf, pszCommandLine);
50         for ( i = 0; ; )
51         {
52                 /* 空白読み飛ばし */
53                 while ( pszBuf[i] == ' ' )
54                 {
55                         i++;
56                 }
57
58                 if ( pszBuf[i] == '\0' )
59                 {
60                         break;
61                 }
62                 
63                 /* パラメータ設定 */
64                 ppszArgv[iArgc++] = &pszBuf[i];
65
66                 /* 空白読み飛ばし */
67                 while ( pszBuf[i] != ' ' && pszBuf[i] != '\0' )
68                 {
69                         i++;
70                 }
71                 
72                 if ( pszBuf[i] == '\0' )
73                 {
74                         break;
75                 }
76
77                 pszBuf[i++] = '\0';
78         }
79         ppszArgv[iArgc] = NULL;
80         
81         if ( iArgc > 0 )
82         {
83                 ppfncMain = (const COMMAND_FUNC *)Assoc_Get(&Command_Assoc, ppszArgv[0]);
84                 if ( ppfncMain != NULL )
85                 {
86                         iExitCode = (*ppfncMain)(iArgc, ppszArgv);
87                         if ( piExitCode != NULL )
88                         {
89                                 *piExitCode = iExitCode;
90                         }
91                         Ret = COMMAND_ERR_OK;
92                 }
93         }
94
95         SysMem_Free(pszBuf);
96         SysMem_Free(ppszArgv);
97
98         return Ret;
99 }
100
101
102 COMMAND_PTR Command_GetFirstCommand(void)
103 {
104         ASSOC_POS Pos;
105         
106         Pos = Assoc_GetFirst(&Command_Assoc);
107         
108         return (COMMAND_PTR)Pos;
109 }
110
111
112 COMMAND_PTR Command_GetNextCommand(COMMAND_PTR Ptr, const char **ppszName)
113 {
114         ASSOC_POS Pos;
115         
116         Pos = (ASSOC_POS)Ptr;
117         
118         Assoc_GetAt(&Command_Assoc, Pos, ppszName);
119         
120         Pos = Assoc_GetNext(&Command_Assoc, Pos);
121
122         return (COMMAND_PTR)Pos;
123 }
124
125
126 COMMAND_FUNC Command_GetCommandAddr(const char *pszName)
127 {
128         const COMMAND_FUNC *ppfncMain;
129
130         ppfncMain = (const COMMAND_FUNC *)Assoc_Get(&Command_Assoc, pszName);
131         
132         return *ppfncMain;
133 }
134
135
136