#include "usg_common.h" #include "usg_typedef.h" #define ACTION_LIDENTIFIER "<**" #define ACTION_RIDENTIFIER "**>" #define TOPIC_LIDENTIFIER '{' #define TOPIC_RIDENTIFIER '}' int parse_pubsub_topic(char *str, char **_action, size_t *_action_len, char **_topic, size_t *_topic_len) { char *ptr = str; char *str_end_ptr = str + strlen(str); char *action_start_ptr; char *action_end_ptr; size_t action_len = 0; char *topic_start_ptr; char *topic_end_ptr; size_t topic_len = 0; // if (strlen(identifier) > strlen(str)) { // return 0; // } if (strncmp(ptr, ACTION_LIDENTIFIER, strlen(ACTION_LIDENTIFIER)) == 0) { ptr += strlen(ACTION_LIDENTIFIER); action_start_ptr = ptr; while(strncmp(++ptr, ACTION_RIDENTIFIER, strlen(ACTION_RIDENTIFIER)) != 0) { if(ptr >= str_end_ptr) { return 0; } } // printf("%s\n", ptr); action_end_ptr = ptr; action_len = action_end_ptr - action_start_ptr; ptr += strlen(ACTION_RIDENTIFIER); // printf("%s\n", ptr); // printf("%s\n", str_end_ptr-1); if( (*ptr == TOPIC_LIDENTIFIER) && (*(str_end_ptr-1) == TOPIC_RIDENTIFIER) ) { topic_start_ptr = ptr; topic_end_ptr = str_end_ptr; topic_len = topic_end_ptr - topic_start_ptr + 1; ptr++; // while(*(++ptr) != '}') { // length++; // } } else { return 0; } } else { return 0; } char *topic = (char *)calloc(1, topic_len+1); strncpy(topic, topic_start_ptr, topic_len); *_topic = topic; *_topic_len = topic_len; char *action = (char *)calloc(1, action_len+1); strncpy(action, action_start_ptr, action_len); *_action = action; *_action_len = action_len; return 1; } int main() { char *action; size_t action_len; char *topic; size_t topic_len; char *str = "<**subsdf**>{经济}"; if(parse_pubsub_topic(str, &action, &action_len, &topic, &topic_len)) { printf("action:%s\n", action); printf("topic:%s\n", topic); free(action); free(topic); } else { printf("===========error==============\n"); } }