#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, char **_topic, size_t *head_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(strncmp(ptr, TOPIC_LIDENTIFIER, strlen(TOPIC_LIDENTIFIER)) == 0 ) { topic_start_ptr = ptr+strlen(TOPIC_LIDENTIFIER); while(strncmp(++ptr, TOPIC_RIDENTIFIER, strlen(TOPIC_RIDENTIFIER)) != 0) { if(ptr >= str_end_ptr) { return 0; } } topic_end_ptr = ptr; topic_len = topic_end_ptr - topic_start_ptr; ptr += strlen(TOPIC_RIDENTIFIER); } else { return 0; } } else { return 0; } char *topic = (char *)calloc(1, topic_len+1); strncpy(topic, topic_start_ptr, topic_len); *_topic = topic; char *action = (char *)calloc(1, action_len+1); strncpy(action, action_start_ptr, action_len); *_action = action; *head_len = ptr-str; return 1; } int main() { char *action; size_t action_len; char *topic; size_t head_len; char *str = "<**pub**>{经济}abcdef"; if(parse_pubsub_topic(str, &action, &topic, &head_len)) { printf("action:%s\n", action); printf("topic:%s\n", topic); printf("content:%s\n", str+head_len); free(action); free(topic); } else { printf("===========error==============\n"); } }