- 论坛徽章:
- 2
|
给个纯C的解决方案:
- #include <string.h>
- #include <stdlib.h>
- #include <stdio.h>
- struct key_value_node
- {
- struct key_value_node *previous, *next;
- int key_offset, key_limit;
- int value_offset, value_limit;
- };
- int nstrchr(const char *s, int off, int lmt, int *o_off, int chr)
- {
- for (off; off < lmt; ++off) {
- if (s[off] == chr) {
- if (o_off != NULL) {
- *o_off = off;
- }
- return 0;
- }
- }
- return -1;
- }
- int skip_text(const char *s, int off, int lmt, int *o_off, const char *text, int text_len)
- {
- if (off + text_len <= lmt) {
- if (strncmp(s + off, text, text_len) == 0) {
- if (o_off != NULL) {
- *o_off = off + text_len;
- }
- return 0;
- }
- }
- return -1;
- }
- int skip_until_text(const char *s, int off, int lmt, int *o_off, const char *text, int text_len)
- {
- if (off + text_len <= lmt && strncmp(s + off, text, text_len) != 0) {
- do {
- ++off;
- }while (off + text_len <= lmt && strncmp(s + off, text, text_len) != 0);
- if (o_off != NULL) {
- *o_off = off + text_len;
- }
- return 0;
- }
- return -1;
- }
- int skip_charset(const char *s, int off, int lmt, int *o_off, const char *text, int text_len)
- {
- int i;
- if (off < lmt && nstrchr(text, 0, text_len, &i, s[off]) == 0) {
- do {
- ++off;
- }while (off < lmt && nstrchr(text, 0, text_len, &i, s[off]) == 0);
- if (o_off != NULL) {
- *o_off = off;
- }
- return i;
- }
- return -1;
- }
- int skip_until_charset(const char *s, int off, int lmt, int *o_off, const char *text, int text_len)
- {
- int i;
- if (off < lmt && nstrchr(text, 0, text_len, &i, s[off]) != 0) {
- do {
- ++off;
- }while (off < lmt && nstrchr(text, 0, text_len, &i, s[off]) != 0);
- if (o_off != NULL) {
- *o_off = off;
- }
- return i;
- }
- return -1;
- }
- int free_key_value_table(struct key_value_node *table)
- {
- struct key_value_node *node, *node_temp;
- if (table != NULL) {
- node = table;
- do {
- node_temp = node;
- node = node->next;
- free(node_temp);
- }while (node != table);
- }
- return 0;
- }
- struct key_value_node *get_key_value_table(const char *text, int text_len)
- {
- struct key_value_node *table, *node;
- int off;
- int key_off, key_lmt;
- int value_off, value_lmt;
- int retval;
- table = NULL;
- off = 0;
- skip_charset(text, off, text_len, &off, " \t\r\n", 4);
- if (skip_text(text, off, text_len, &off, "{", 1) == 0) {
- while (off < text_len) {
- skip_charset(text, off, text_len, &off, " \t\r\n", 4);
- if (skip_text(text, off, text_len, &off, "}", 1) == 0) {
- skip_charset(text, off, text_len, &off, " \t\r\n", 4);
- if (off == text_len) {
- return table;
- }
- break;
- }
- key_off = off;
- retval = skip_until_charset(text, off, text_len, &off, " \t\r\n=", 5);
- if (retval == 4) {
- key_lmt = off;
- ++off;
- }else if (retval >= 0) {
- key_lmt = off;
- skip_charset(text, off, text_len, &off, " \t\r\n", 4);
- retval = skip_text(text, off, text_len, &off, "=", 1);
- }
- if (retval != -1) {
- skip_charset(text, off, text_len, &off, " \t\r\n", 4);
- value_off = off;
- retval = skip_until_charset(text, off, text_len, &off, " \t\r\n,}", 6);
- if (retval >= 4) {
- value_lmt = off;
- if (retval == 4) {
- ++off;
- }
- }else if (retval >= 0) {
- value_lmt = off;
- skip_charset(text, off, text_len, &off, " \t\r\n", 4);
- retval = skip_until_charset(text, off, text_len, &off, ",}", 2);
- if (retval >= 0) {
- if (retval == 0) {
- ++off;
- }
- }
- }
- }
- if (retval == -1) {
- break;
- }else {
- node = (struct key_value_node *)malloc(sizeof(struct key_value_node));
- if (node == NULL) {
- break;
- }
- memset(node, 0, sizeof(struct key_value_node));
- node->key_offset = key_off;
- node->key_limit = key_lmt;
- node->value_offset = value_off;
- node->value_limit = value_lmt;
- if (table == NULL) {
- node->previous = node;
- node->next = node;
- table = node;
- }else {
- node->previous = table->previous;
- node->next = table;
- table->previous->next = node;
- table->previous = node;
- }
- }
- }
- free_key_value_table(table);
- }
- return NULL;
- }
- int print_key_value_table(struct key_value_node *table, const char *text, int text_len)
- {
- struct key_value_node *node;
- printf("{\n");
- if (table != NULL) {
- node = table;
- do {
- printf("\t%.*s = %.*s\n", node->key_limit - node->key_offset, text + node->key_offset
- , node->value_limit - node->value_offset, text + node->value_offset);
- node = node->next;
- }while (node != table);
- }
- printf("}\n");
- return 0;
- }
- int main(void)
- {
- const char *text = "{C_USER_NETWORK_TYPE=0,C_SUB_SALT=89EE043854C7ACCE,C_SMSAlertsFlag=1,C_IS_GROUP_MEMBER=0,C_MBB_NOTIFY_FLAG=2}";
- struct key_value_node *table;
- int text_len;
- text_len = strlen(text);
- table = get_key_value_table(text, text_len);
- if (table != NULL) {
- print_key_value_table(table, text, text_len);
- free_key_value_table(table);
- }
- return 0;
- }
复制代码 |
|