本文共 1934 字,大约阅读时间需要 6 分钟。
涉及文件 sfutil/strvec.h|c
字符串类型的数组:默认构造, 数组为空,元素个数为0。调用增加接口时, 会调用realloc增加2个元素空间,与stl的内部实现略有不同。提供初始化、增加、获取、容器拷贝等。该工具在daq模块使用的时候使用。
数据结构定义
typedef struct { /* 字符串数组*/ char** v; /* 数组中下一个放置元素的索引*/ unsigned n;} StringVector;
/* 接口函数*/void* StringVector_New(void);void StringVector_Delete(void*);int StringVector_Add(void*, const char*);char* StringVector_Get(void*, unsigned index);int StringVector_AddVector(void* dst, void* src);const char** StringVector_GetVector(void*);
/* 创建一个空的字符串数组*/void* StringVector_New (void){ StringVector* sv = SnortAlloc(sizeof(*sv)); sv->v = SnortAlloc(sizeof(*sv->v)); sv->n = 0; return sv;}
/* 释放整个数组, 每一个字符串都是深拷贝, 需要迭代释放内存*/void StringVector_Delete (void* pv){ unsigned i; StringVector* sv = (StringVector*)pv; if ( !sv ) return; for ( i = 0; i < sv->n; i++ ) free(sv->v[i]); free(sv->v); free(sv);}
/* 添加元素, 末尾添加*/int StringVector_Add (void* pv, const char* s){ StringVector* sv = (StringVector*)pv; char** v; if ( !sv || !s ) return 0; /* 每次新增元素的时候增加2个字符串指针*/ v = realloc(sv->v, (sv->n+2) * sizeof(char*)); if ( !v ) return 0; /* 添加元素, 深拷贝*/ sv->v = v; sv->v[sv->n++] = SnortStrdup(s); /* 下一个元素赋值前的clean操作*/ sv->v[sv->n] = NULL; return 1;}
/* 根据index获取元素, 检查是否越界, 数组是否为空*/char* StringVector_Get (void* pv, unsigned index){ StringVector* sv = (StringVector*)pv; if ( !sv || index >= sv->n ) return NULL; return sv->v[index];}
/* * 将ps数组中的元素依次拷贝到pd中, 追加方式 */int StringVector_AddVector (void* pd, void* ps){ unsigned i = 0; const char* s = StringVector_Get(ps, i++); while ( s ) { if ( !StringVector_Add(pd, s) ) return 0; s = StringVector_Get(ps, i++); } return 1;}
/* * 获取pv的字符串数组指针 */const char** StringVector_GetVector (void* pv){ StringVector* sv = (StringVector*)pv; if ( !sv ) return NULL; return (const char**)sv->v;}
转载地址:http://evtmd.baihongyu.com/