#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");
|
}
|
|
|
|
}
|