From 3d4af3eee6a4deed770512b8c96554ff1e492750 Mon Sep 17 00:00:00 2001 From: Zhenhua Zhang Date: Fri, 19 Mar 2010 17:44:39 +0800 Subject: [PATCH] Add framework of server parser a. The parser fetch and parse one command per loop. The prefix is the command prefix without parameter. For example, the prefix of "AT+CLIP=1" is "+CLIP". b. Search registered notification node in command_list. Invoke the callback if found. c. Termiate the execution if the result is an error. Otherwise, parse next command. --- gatchat/gatserver.c | 46 ++++++++++++++++++++++++++-------------------- 1 file changed, 26 insertions(+), 20 deletions(-) diff --git a/gatchat/gatserver.c b/gatchat/gatserver.c index 4df3f06..8e7955c 100644 --- a/gatchat/gatserver.c +++ b/gatchat/gatserver.c @@ -197,42 +197,48 @@ static gboolean is_basic_command_prefix(const char *buf) return FALSE; } -static void parse_extended_command(GAtServer *server, char *buf) +static void parse_extended_command(GAtServer *server, char *buf, + unsigned int *len) { g_at_server_send_final(server, G_AT_SERVER_RESULT_ERROR); } -static void parse_basic_command(GAtServer *server, char *buf) +static void parse_basic_command(GAtServer *server, char *buf, + unsigned int *len) { g_at_server_send_final(server, G_AT_SERVER_RESULT_ERROR); } static void server_parse_line(GAtServer *server, char *line) { - gsize i = 0; - char c; - - if (line == NULL) { - g_at_server_send_final(server, G_AT_SERVER_RESULT_ERROR); - goto done; - } + char *buf = line; - if (line[0] == '\0') { + if (*buf == '\0') { g_at_server_send_final(server, G_AT_SERVER_RESULT_OK); goto done; } - c = line[i]; - /* skip semicolon */ - if (c == ';') - c = line[++i]; + while (*buf) { + unsigned int len = 0; + char c = *buf; - if (is_extended_command_prefix(c)) - parse_extended_command(server, line + i); - else if (is_basic_command_prefix(line + i)) - parse_basic_command(server, line + i); - else - g_at_server_send_final(server, G_AT_SERVER_RESULT_ERROR); + /* skip semicolon */ + if (c == ';') + c = *(++buf); + + if (c == '\0') + break; + + if (is_extended_command_prefix(c)) + parse_extended_command(server, buf, &len); + else if (is_basic_command_prefix(buf)) + parse_basic_command(server, buf, &len); + + if (len == 0) + break; + + buf += len; + } done: g_free(line); -- 2.7.4