You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@nuttx.apache.org by xi...@apache.org on 2020/11/28 05:53:24 UTC
[incubator-nuttx-apps] branch master updated: irtest: use global
arrays instead of __attributes__((section)) organization
This is an automated email from the ASF dual-hosted git repository.
xiaoxiang pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/incubator-nuttx-apps.git
The following commit(s) were added to refs/heads/master by this push:
new b506600 irtest: use global arrays instead of __attributes__((section)) organization
b506600 is described below
commit b506600c5b10bd1ed41d89dd3ffdce7556ed06db
Author: dongjiuzhu <do...@xiaomi.com>
AuthorDate: Fri Nov 27 22:09:21 2020 +0800
irtest: use global arrays instead of __attributes__((section)) organization
N/A
fix __attribute__((section)) syntax issues on linux and mac
Change-Id: Ie8b5f52e552280bf3435b5bac03ffd8aed4d9e02
Signed-off-by: dongjiuzhu <do...@xiaomi.com>
---
testing/irtest/{cmdLirc.cpp => cmd.cpp} | 207 +++++++++++++++++++++++++++-
testing/irtest/cmd.hpp | 155 ++++++++++-----------
testing/irtest/cmdGeneral.cpp | 194 --------------------------
testing/irtest/{enumDefine.cpp => enum.cpp} | 16 ++-
testing/irtest/enum.hpp | 49 +++----
testing/irtest/main.cpp | 87 +-----------
6 files changed, 316 insertions(+), 392 deletions(-)
diff --git a/testing/irtest/cmdLirc.cpp b/testing/irtest/cmd.cpp
similarity index 68%
rename from testing/irtest/cmdLirc.cpp
rename to testing/irtest/cmd.cpp
index 8616509..c7472e4 100644
--- a/testing/irtest/cmdLirc.cpp
+++ b/testing/irtest/cmd.cpp
@@ -1,5 +1,5 @@
/****************************************************************************
- * testing/irtest/cmdLirc.cpp
+ * testing/irtest/cmd.cpp
*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
@@ -25,8 +25,12 @@
#include <nuttx/lirc.h>
#include <sys/ioctl.h>
#include <sys/types.h>
+#include <sys/time.h>
+#include <pthread.h>
+#include <stdio.h>
#include <fcntl.h>
+#include "enum.hpp"
#include "cmd.hpp"
/****************************************************************************
@@ -39,16 +43,155 @@
* Private Data
****************************************************************************/
+static pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
+static pthread_cond_t cond = PTHREAD_COND_INITIALIZER;
static int g_irdevs[CONFIG_TESTING_IRTEST_MAX_NIRDEV];
/****************************************************************************
- * Public Functions
+ * Private Functions
****************************************************************************/
-void init_device()
+static void wake(int)
{
- for (int i = 0; i < CONFIG_TESTING_IRTEST_MAX_NIRDEV; i++)
- g_irdevs[i] = -1;
+ pthread_mutex_lock(&mutex);
+ pthread_cond_broadcast(&cond);
+ pthread_mutex_unlock(&mutex);
+}
+
+static void print_cmd(const cmd *cmd)
+{
+ printf("%s(", cmd->name);
+ for (int i = 0; cmd->args[i].name; i++)
+ {
+ printf(i ? ", %s" : "%s", cmd->args[i].name);
+ }
+
+ printf(")\n");
+}
+
+static int print_cmd(const char *name)
+{
+ for (int i = 0; g_cmd_table[i]; i++)
+ {
+ if (strcmp(name, g_cmd_table[i]->name) == 0)
+ {
+ print_cmd(g_cmd_table[i]);
+ return 0;
+ }
+ }
+
+ return -ENOENT;
+}
+
+static void print_all_cmds()
+{
+ for (int i = 0; g_cmd_table[i]; i++)
+ {
+ print_cmd(g_cmd_table[i]);
+ }
+}
+
+static void print_enum(const enum_type *e)
+{
+ printf("%s\n", e->type);
+ for (int i = 0; e->value[i].name; i++)
+ {
+ printf(e->fmt, e->value[i].value);
+ printf(" %s\n", e->value[i].name);
+ }
+}
+
+static int print_enum(const char *type)
+{
+ for (int i = 0; g_enum_table[i]; i++)
+ {
+ if (strcmp(type, g_enum_table[i]->type) == 0)
+ {
+ print_enum(g_enum_table[i]);
+ return 0;
+ }
+ }
+
+ return -ENOENT;
+}
+
+static void print_all_enums()
+{
+ for (int i = 0; g_enum_table[i]; i++)
+ {
+ print_enum(g_enum_table[i]);
+ }
+}
+
+static void print_cmd_and_enum(const cmd *cmd)
+{
+ print_cmd(cmd);
+ for (int i = 0; cmd->args[i].type; i++)
+ {
+ print_enum(cmd->args[i].type);
+ }
+}
+
+static int print_cmd_and_enum(const char *name)
+{
+ for (int i = 0; g_cmd_table[i]; i++)
+ {
+ if (strcmp(name, g_cmd_table[i]->name) == 0)
+ {
+ print_cmd_and_enum(g_cmd_table[i]);
+ return 0;
+ }
+ }
+
+ return -ENOENT;
+}
+
+CMD0(quit)
+{
+ exit(0);
+ return 0;
+}
+
+CMD1(sleep, float, seconds)
+{
+ int ret;
+
+ pthread_mutex_lock(&mutex);
+ signal(SIGINT, wake);
+ if (seconds)
+ {
+ struct timeval now;
+ struct timespec ts;
+
+ gettimeofday(&now, NULL);
+ ts.tv_sec = now.tv_sec + seconds;
+ ts.tv_nsec = now.tv_usec * 1000;
+ ret = pthread_cond_timedwait(&cond, &mutex, &ts);
+ }
+ else
+ {
+ ret = pthread_cond_wait(&cond, &mutex);
+ }
+
+ pthread_mutex_unlock(&mutex);
+ signal(SIGINT, SIG_DFL);
+ return ret == ETIMEDOUT ? 0 : ret;
+}
+
+CMD1(help, const char *, name)
+{
+ int r = 0;
+ if (name != 0 && *name != 0)
+ {
+ r = print_cmd_and_enum(name);
+ }
+ else
+ {
+ print_all_enums();
+ print_all_cmds();
+ }
+
+ return r;
}
CMD1(open_device, const char *, file_name)
@@ -375,3 +518,57 @@ CMD2(set_rec_carrier_range, size_t, index, unsigned int, carrier)
return ioctl(g_irdevs[index], LIRC_SET_REC_CARRIER_RANGE, &carrier);
}
+
+/****************************************************************************
+ * Public Functions
+ ****************************************************************************/
+
+void init_device()
+{
+ for (int i = 0; i < CONFIG_TESTING_IRTEST_MAX_NIRDEV; i++)
+ g_irdevs[i] = -1;
+}
+
+/****************************************************************************
+ * Public Data
+ ****************************************************************************/
+
+const struct cmd *g_cmd_table[] =
+{
+ /* CMD0 */
+
+ &g_quit_cmd,
+
+ /* CMD1 */
+
+ &g_sleep_cmd,
+ &g_help_cmd,
+ &g_open_device_cmd,
+ &g_close_device_cmd,
+ &g_write_data_cmd,
+ &g_get_features_cmd,
+ &g_get_send_mode_cmd,
+ &g_get_rec_mode_cmd,
+ &g_get_rec_resolution_cmd,
+ &g_get_min_timeout_cmd,
+ &g_get_max_timeout_cmd,
+ &g_get_length_cmd,
+
+ /* CMD2 */
+
+ &g_read_data_cmd,
+ &g_set_send_mode_cmd,
+ &g_set_rec_mode_cmd,
+ &g_set_send_carrier_cmd,
+ &g_set_rec_carrier_cmd,
+ &g_set_send_duty_cycle_cmd,
+ &g_set_transmitter_mask_cmd,
+ &g_set_rec_timeout_cmd,
+ &g_set_rec_timeout_reports_cmd,
+ &g_set_measure_carrier_mode_cmd,
+ &g_set_rec_carrier_range_cmd,
+
+ /* CMD3 */
+
+ NULL,
+};
diff --git a/testing/irtest/cmd.hpp b/testing/irtest/cmd.hpp
index d5864a1..72dcb66 100644
--- a/testing/irtest/cmd.hpp
+++ b/testing/irtest/cmd.hpp
@@ -30,6 +30,80 @@
#include <string.h>
/****************************************************************************
+ * Pre-processor Definitions
+ ****************************************************************************/
+
+#define CMD0(func) \
+ static int func(); \
+ static const arg g_##func##_args[] = \
+ { \
+ {0, 0} \
+ }; \
+ static struct cmd g_##func##_cmd = \
+ { \
+ #func, g_##func##_args, func \
+ }; \
+ static int func()
+
+#define CMD1(func, type1, arg1) \
+ static int func(type1 arg1); \
+ static int func##_exec() \
+ { \
+ type1 arg1 = get_next_arg<type1>(); \
+ return func(arg1); \
+ } \
+ static const arg g_##func##_args[] = \
+ { \
+ {#type1, #arg1}, \
+ {0, 0} \
+ }; \
+ static struct cmd g_##func##_cmd = \
+ { \
+ #func, g_##func##_args, func##_exec \
+ }; \
+ static int func(type1 arg1)
+
+#define CMD2(func, type1, arg1, type2, arg2) \
+ static int func(type1 arg1, type2 arg2); \
+ static int func##_exec() \
+ { \
+ type1 arg1 = get_next_arg<type1>(); \
+ type2 arg2 = get_next_arg<type2>(); \
+ return func(arg1, arg2); \
+ } \
+ static const arg g_##func##_args[] = { \
+ {#type1, #arg1}, \
+ {#type2, #arg2}, \
+ {0, 0} \
+ }; \
+ static struct cmd g_##func##_cmd = \
+ { \
+ #func, g_##func##_args, func##_exec \
+ }; \
+ static int func(type1 arg1, type2 arg2)
+
+#define CMD3(func, type1, arg1, type2, arg2, type3, arg3) \
+ static int func(type1 arg1, type2 arg2, type3 arg3); \
+ static int func##_exec() \
+ { \
+ type1 arg1 = get_next_arg<type1>(); \
+ type2 arg2 = get_next_arg<type2>(); \
+ type3 arg3 = get_next_arg<type3>(); \
+ return func(arg1, arg2, arg3); \
+ } \
+ static const arg g_##func##_args[] = { \
+ {#type1, #arg1}, \
+ {#type2, #arg2}, \
+ {#type3, #arg3}, \
+ {0, 0} \
+ }; \
+ static struct cmd g_##func##_cmd = \
+ { \
+ #func, func##_args, func##_exec \
+ }; \
+ static int func(type1 arg1, type2 arg2, type3 arg3)
+
+/****************************************************************************
* Public Types
****************************************************************************/
@@ -50,12 +124,7 @@ struct cmd
* Public Data
****************************************************************************/
-/* Note: All commands put into cmds section, these two symbols
- * are automatically defined by linker for the section boundary
- */
-
-extern const cmd __start_cmds;
-extern const cmd __stop_cmds;
+extern const struct cmd *g_cmd_table[];
/****************************************************************************
* Inline Functions
@@ -103,80 +172,6 @@ inline float get_next_arg()
}
/****************************************************************************
- * Pre-processor Definitions
- ****************************************************************************/
-
-#define CMD0(func) \
- static int func(); \
- static const arg func##_args[] = \
- { \
- {0, 0} \
- }; \
- struct cmd func##_cmd __attribute__((section("cmds"))) = \
- { \
- #func, func##_args, func \
- }; \
- static int func()
-
-#define CMD1(func, type1, arg1) \
- static int func(type1 arg1); \
- static int func##_exec() \
- { \
- type1 arg1 = get_next_arg<type1>(); \
- return func(arg1); \
- } \
- static const arg func##_args[] = \
- { \
- {#type1, #arg1}, \
- {0, 0} \
- }; \
- struct cmd func##_cmd __attribute__((section("cmds"))) = \
- { \
- #func, func##_args, func##_exec \
- }; \
- static int func(type1 arg1)
-
-#define CMD2(func, type1, arg1, type2, arg2) \
- static int func(type1 arg1, type2 arg2); \
- static int func##_exec() \
- { \
- type1 arg1 = get_next_arg<type1>(); \
- type2 arg2 = get_next_arg<type2>(); \
- return func(arg1, arg2); \
- } \
- static const arg func##_args[] = { \
- {#type1, #arg1}, \
- {#type2, #arg2}, \
- {0, 0} \
- }; \
- struct cmd func##_cmd __attribute__((section("cmds"))) = \
- { \
- #func, func##_args, func##_exec \
- }; \
- static int func(type1 arg1, type2 arg2)
-
-#define CMD3(func, type1, arg1, type2, arg2, type3, arg3) \
- static int func(type1 arg1, type2 arg2, type3 arg3); \
- static int func##_exec() \
- { \
- type1 arg1 = get_next_arg<type1>(); \
- type2 arg2 = get_next_arg<type2>(); \
- type3 arg3 = get_next_arg<type3>(); \
- return func(arg1, arg2, arg3); \
- } \
- static const arg func##_args[] = { \
- {#type1, #arg1}, \
- {#type2, #arg2}, \
- {#type3, #arg3}, \
- {0, 0} \
- }; \
- struct cmd func##_cmd __attribute__((section("cmds"))) = \
- { \
- #func, func##_args, func##_exec \
- }; \
- static int func(type1 arg1, type2 arg2, type3 arg3)
-
-/****************************************************************************
* Public Function Prototypes
****************************************************************************/
diff --git a/testing/irtest/cmdGeneral.cpp b/testing/irtest/cmdGeneral.cpp
deleted file mode 100644
index 7a49b27..0000000
--- a/testing/irtest/cmdGeneral.cpp
+++ /dev/null
@@ -1,194 +0,0 @@
-/****************************************************************************
- * testing/irtest/cmdGeneral.cpp
- *
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership. The
- * ASF licenses this file to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance with the
- * License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations
- * under the License.
- *
- ****************************************************************************/
-
-/****************************************************************************
- * Included Files
- ****************************************************************************/
-
-#include <sys/ioctl.h>
-#include <sys/time.h>
-#include <pthread.h>
-#include <stdio.h>
-
-#include "enum.hpp"
-#include "cmd.hpp"
-
-/****************************************************************************
- * Private Data
- ****************************************************************************/
-
-static pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
-static pthread_cond_t cond = PTHREAD_COND_INITIALIZER;
-
-/****************************************************************************
- * Private Functions
- ****************************************************************************/
-
-static void wake(int)
-{
- pthread_mutex_lock(&mutex);
- pthread_cond_broadcast(&cond);
- pthread_mutex_unlock(&mutex);
-}
-
-static void print_cmd(const cmd *cmd)
-{
- printf("%s(", cmd->name);
- for (int i = 0; cmd->args[i].name; i++)
- {
- printf(i ? ", %s" : "%s", cmd->args[i].name);
- }
-
- printf(")\n");
-}
-
-static int print_cmd(const char *name)
-{
- const cmd *cmd = &__start_cmds;
- for (; cmd < &__stop_cmds; cmd++)
- {
- if (strcmp(name, cmd->name) == 0)
- {
- print_cmd(cmd);
- return 0;
- }
- }
-
- return -ENOENT;
-}
-
-static void print_all_cmds()
-{
- const cmd *cmd = &__stop_cmds - 1;
- for (; cmd >= &__start_cmds; cmd--)
- {
- print_cmd(cmd);
- }
-}
-
-static void print_enum(const enum_type *e)
-{
- printf("%s\n", e->type);
- for (int i = 0; e->value[i].name; i++)
- {
- printf(e->fmt, e->value[i].value);
- printf(" %s\n", e->value[i].name);
- }
-}
-
-static int print_enum(const char *type)
-{
- const enum_type *e = &__start_enums;
- for (; e < &__stop_enums; e++)
- {
- if (strcmp(type, e->type) == 0)
- {
- print_enum(e);
- return 0;
- }
- }
-
- return -ENOENT;
-}
-
-static void print_all_enums()
-{
- const enum_type *e = &__stop_enums - 1;
- for (; e >= &__start_enums; e--)
- {
- print_enum(e);
- }
-}
-
-static void print_cmd_and_enum(const cmd *cmd)
-{
- print_cmd(cmd);
- for (int i = 0; cmd->args[i].type; i++)
- {
- print_enum(cmd->args[i].type);
- }
-}
-
-static int print_cmd_and_enum(const char *name)
-{
- const cmd *cmd = &__start_cmds;
- for (; cmd < &__stop_cmds; cmd++)
- {
- if (strcmp(name, cmd->name) == 0)
- {
- print_cmd_and_enum(cmd);
- return 0;
- }
- }
-
- return -ENOENT;
-}
-
-/****************************************************************************
- * Public Functions
- ****************************************************************************/
-
-CMD0(quit)
-{
- exit(0);
- return 0;
-}
-
-CMD1(sleep, float, seconds)
-{
- int ret;
-
- pthread_mutex_lock(&mutex);
- signal(SIGINT, wake);
- if (seconds)
- {
- struct timeval now;
- struct timespec ts;
-
- gettimeofday(&now, NULL);
- ts.tv_sec = now.tv_sec + seconds;
- ts.tv_nsec = now.tv_usec * 1000;
- ret = pthread_cond_timedwait(&cond, &mutex, &ts);
- }
- else
- {
- ret = pthread_cond_wait(&cond, &mutex);
- }
-
- pthread_mutex_unlock(&mutex);
- signal(SIGINT, SIG_DFL);
- return ret == ETIMEDOUT ? 0 : ret;
-}
-
-CMD1(help, const char *, name)
-{
- int r = 0;
- if (name != 0 && *name != 0)
- {
- r = print_cmd_and_enum(name);
- }
- else
- {
- print_all_enums();
- print_all_cmds();
- }
-
- return r;
-}
diff --git a/testing/irtest/enumDefine.cpp b/testing/irtest/enum.cpp
similarity index 89%
rename from testing/irtest/enumDefine.cpp
rename to testing/irtest/enum.cpp
index b618e5b..8c805e6 100644
--- a/testing/irtest/enumDefine.cpp
+++ b/testing/irtest/enum.cpp
@@ -1,5 +1,5 @@
/****************************************************************************
- * testing/irtest/enumDefine.cpp
+ * testing/irtest/enum.cpp
*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
@@ -24,9 +24,10 @@
#include "enum.hpp"
#include <nuttx/lirc.h>
+#include <stdio.h>
/****************************************************************************
- * Public Data
+ * Private Data
****************************************************************************/
ENUM_START(mode_t)
@@ -64,5 +65,16 @@ ENUM_START(features_t)
ENUM_END(features_t, "0x%08x")
/****************************************************************************
+ * Public Data
+ ****************************************************************************/
+
+const struct enum_type *g_enum_table[] =
+{
+ &g_mode_t_type,
+ &g_features_t_type,
+ NULL,
+};
+
+/****************************************************************************
* Public Functions
****************************************************************************/
diff --git a/testing/irtest/enum.hpp b/testing/irtest/enum.hpp
index 8182a10..43d9621 100644
--- a/testing/irtest/enum.hpp
+++ b/testing/irtest/enum.hpp
@@ -26,6 +26,27 @@
****************************************************************************/
/****************************************************************************
+ * Pre-processor Definitions
+ ****************************************************************************/
+
+/* macro to define the enum object */
+
+#define ENUM_START(type) \
+ static const enum_value g_##type##_value[] = \
+ {
+
+#define ENUM_VALUE(value) \
+ {#value, value},
+
+#define ENUM_END(type, fmt) \
+ {0, 0} \
+ }; \
+ static struct enum_type g_##type##_type = \
+ { \
+ #type, fmt, g_##type##_value \
+ }; \
+
+/****************************************************************************
* Public Types
****************************************************************************/
@@ -46,32 +67,6 @@ struct enum_type
* Public Data
****************************************************************************/
-/* Note: All enum type put into enums section, these two symbols
- * are automatically defined by linker for the section boundary
- */
-
-extern const enum_type __start_enums;
-extern const enum_type __stop_enums;
-
-/****************************************************************************
- * Pre-processor Definitions
- ****************************************************************************/
-
-/* macro to define the enum object */
-
-#define ENUM_START(type) \
- static const enum_value type##_value[] = \
- {
-
-#define ENUM_VALUE(value) \
- {#value, value},
-
-#define ENUM_END(type, fmt) \
- {0, 0} \
- }; \
- struct enum_type type##_type __attribute__((section("enums"))) = \
- { \
- #type, fmt, type##_value \
- }; \
+extern const struct enum_type *g_enum_table[];
#endif /* __APPS_TESTING_IRTEST_ENUM_H */
diff --git a/testing/irtest/main.cpp b/testing/irtest/main.cpp
index 7a60132..d6c26bb 100644
--- a/testing/irtest/main.cpp
+++ b/testing/irtest/main.cpp
@@ -26,86 +26,6 @@
#include "system/readline.h"
#include "cmd.hpp"
-#include "enum.hpp"
-
-/****************************************************************************
- * Public Data
- ****************************************************************************/
-
-extern cmd *quit_cmd;
-extern cmd *sleep_cmd;
-extern cmd *help_cmd;
-extern cmd *open_device_cmd;
-extern cmd *close_device_cmd;
-extern cmd *write_data_cmd;
-extern cmd *get_features_cmd;
-extern cmd *get_send_mode_cmd;
-extern cmd *get_rec_mode_cmd;
-extern cmd *get_rec_resolution_cmd;
-extern cmd *get_min_timeout_cmd;
-extern cmd *get_max_timeout_cmd;
-extern cmd *get_length_cmd;
-extern cmd *read_data_cmd;
-extern cmd *set_send_mode_cmd;
-extern cmd *set_rec_mode_cmd;
-extern cmd *set_send_carrier_cmd;
-extern cmd *set_rec_carrier_cmd;
-extern cmd *set_send_duty_cycle_cmd;
-extern cmd *set_transmitter_mask_cmd;
-extern cmd *set_rec_timeout_cmd;
-extern cmd *set_rec_timeout_reports_cmd;
-extern cmd *set_measure_carrier_mode_cmd;
-extern cmd *set_rec_carrier_range_cmd;
-extern enum_type *mode_t_type;
-extern enum_type *features_t_type;
-
-/****************************************************************************
- * Private Data
- ****************************************************************************/
-
-static const struct enum_type *g_enum_table[] =
-{
- mode_t_type,
- features_t_type,
-};
-
-static const struct cmd *g_cmd_table[] =
-{
- /* CMD0 */
-
- quit_cmd,
-
- /* CMD1 */
-
- sleep_cmd,
- help_cmd,
- open_device_cmd,
- close_device_cmd,
- write_data_cmd,
- get_features_cmd,
- get_send_mode_cmd,
- get_rec_mode_cmd,
- get_rec_resolution_cmd,
- get_min_timeout_cmd,
- get_max_timeout_cmd,
- get_length_cmd,
-
- /* CMD2 */
-
- read_data_cmd,
- set_send_mode_cmd,
- set_rec_mode_cmd,
- set_send_carrier_cmd,
- set_rec_carrier_cmd,
- set_send_duty_cycle_cmd,
- set_transmitter_mask_cmd,
- set_rec_timeout_cmd,
- set_rec_timeout_reports_cmd,
- set_measure_carrier_mode_cmd,
- set_rec_carrier_range_cmd,
-
- /* CMD3 */
-};
/****************************************************************************
* Private Functions
@@ -136,12 +56,11 @@ int main(int argc, char *argv[])
if (name != 0 && *name != 0)
{
int res = -ENOSYS;
- const cmd *cmd = &__start_cmds;
- for (; cmd < &__stop_cmds; cmd++)
+ for (int i = 0; g_cmd_table[i]; i++)
{
- if (strcmp(name, cmd->name) == 0)
+ if (strcmp(name, g_cmd_table[i]->name) == 0)
{
- res = cmd->exec();
+ res = g_cmd_table[i]->exec();
break;
}
}