mirror of
https://github.com/eclipse-mosquitto/mosquitto.git
synced 2026-02-06 02:52:07 +08:00
Refactor topic functions to common static library.
This commit is contained in:
@@ -336,75 +336,3 @@ bool mosquitto_want_write(struct mosquitto *mosq)
|
||||
{
|
||||
return mosq->out_packet || mosq->want_write;
|
||||
}
|
||||
|
||||
|
||||
int mosquitto_sub_topic_tokenise(const char *subtopic, char ***topics, int *count)
|
||||
{
|
||||
size_t len;
|
||||
size_t hier_count = 1;
|
||||
size_t start, stop;
|
||||
size_t hier;
|
||||
size_t tlen;
|
||||
size_t i, j;
|
||||
|
||||
if(!subtopic || !topics || !count) return MOSQ_ERR_INVAL;
|
||||
|
||||
len = strlen(subtopic);
|
||||
|
||||
for(i=0; i<len; i++){
|
||||
if(subtopic[i] == '/'){
|
||||
if(i > len-1){
|
||||
/* Separator at end of line */
|
||||
}else{
|
||||
hier_count++;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
(*topics) = mosquitto_calloc(hier_count, sizeof(char *));
|
||||
if(!(*topics)) return MOSQ_ERR_NOMEM;
|
||||
|
||||
start = 0;
|
||||
hier = 0;
|
||||
|
||||
for(i=0; i<len+1; i++){
|
||||
if(subtopic[i] == '/' || subtopic[i] == '\0'){
|
||||
stop = i;
|
||||
if(start != stop){
|
||||
tlen = stop-start + 1;
|
||||
(*topics)[hier] = mosquitto_calloc(tlen, sizeof(char));
|
||||
if(!(*topics)[hier]){
|
||||
for(j=0; j<hier; j++){
|
||||
mosquitto_FREE((*topics)[j]);
|
||||
}
|
||||
mosquitto_FREE((*topics));
|
||||
return MOSQ_ERR_NOMEM;
|
||||
}
|
||||
for(j=start; j<stop; j++){
|
||||
(*topics)[hier][j-start] = subtopic[j];
|
||||
}
|
||||
}
|
||||
start = i+1;
|
||||
hier++;
|
||||
}
|
||||
}
|
||||
|
||||
*count = (int)hier_count;
|
||||
|
||||
return MOSQ_ERR_SUCCESS;
|
||||
}
|
||||
|
||||
int mosquitto_sub_topic_tokens_free(char ***topics, int count)
|
||||
{
|
||||
int i;
|
||||
|
||||
if(!topics || !(*topics) || count<1) return MOSQ_ERR_INVAL;
|
||||
|
||||
for(i=0; i<count; i++){
|
||||
mosquitto_FREE((*topics)[i]);
|
||||
}
|
||||
mosquitto_FREE(*topics);
|
||||
|
||||
return MOSQ_ERR_SUCCESS;
|
||||
}
|
||||
|
||||
|
||||
@@ -637,3 +637,74 @@ BROKER_EXPORT int mosquitto_topic_matches_sub2(const char *sub, size_t sublen, c
|
||||
|
||||
return MOSQ_ERR_SUCCESS;
|
||||
}
|
||||
|
||||
|
||||
int mosquitto_sub_topic_tokenise(const char *subtopic, char ***topics, int *count)
|
||||
{
|
||||
size_t len;
|
||||
size_t hier_count = 1;
|
||||
size_t start, stop;
|
||||
size_t hier;
|
||||
size_t tlen;
|
||||
size_t i, j;
|
||||
|
||||
if(!subtopic || !topics || !count) return MOSQ_ERR_INVAL;
|
||||
|
||||
len = strlen(subtopic);
|
||||
|
||||
for(i=0; i<len; i++){
|
||||
if(subtopic[i] == '/'){
|
||||
if(i > len-1){
|
||||
/* Separator at end of line */
|
||||
}else{
|
||||
hier_count++;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
(*topics) = mosquitto_calloc(hier_count, sizeof(char *));
|
||||
if(!(*topics)) return MOSQ_ERR_NOMEM;
|
||||
|
||||
start = 0;
|
||||
hier = 0;
|
||||
|
||||
for(i=0; i<len+1; i++){
|
||||
if(subtopic[i] == '/' || subtopic[i] == '\0'){
|
||||
stop = i;
|
||||
if(start != stop){
|
||||
tlen = stop-start + 1;
|
||||
(*topics)[hier] = mosquitto_calloc(tlen, sizeof(char));
|
||||
if(!(*topics)[hier]){
|
||||
for(j=0; j<hier; j++){
|
||||
mosquitto_FREE((*topics)[j]);
|
||||
}
|
||||
mosquitto_FREE((*topics));
|
||||
return MOSQ_ERR_NOMEM;
|
||||
}
|
||||
for(j=start; j<stop; j++){
|
||||
(*topics)[hier][j-start] = subtopic[j];
|
||||
}
|
||||
}
|
||||
start = i+1;
|
||||
hier++;
|
||||
}
|
||||
}
|
||||
|
||||
*count = (int)hier_count;
|
||||
|
||||
return MOSQ_ERR_SUCCESS;
|
||||
}
|
||||
|
||||
int mosquitto_sub_topic_tokens_free(char ***topics, int count)
|
||||
{
|
||||
int i;
|
||||
|
||||
if(!topics || !(*topics) || count<1) return MOSQ_ERR_INVAL;
|
||||
|
||||
for(i=0; i<count; i++){
|
||||
mosquitto_FREE((*topics)[i]);
|
||||
}
|
||||
mosquitto_FREE(*topics);
|
||||
|
||||
return MOSQ_ERR_SUCCESS;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user