Refactor topic functions to common static library.

This commit is contained in:
Roger A. Light
2024-03-17 23:18:35 +00:00
parent 4498193331
commit 9065b579d0
2 changed files with 71 additions and 72 deletions

View File

@@ -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;
}

View File

@@ -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;
}