博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
snort string vector 实现 源码分析
阅读量:2793 次
发布时间:2019-05-13

本文共 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/

你可能感兴趣的文章
协处理器和协处理器指令
查看>>
虚电路网络与数据报网络
查看>>
【7】深入理解计算机系统
查看>>
ldm/stm与栈的处理
查看>>
IP编址
查看>>
ARM汇编伪指令
查看>>
CIDR与路由聚合
查看>>
DHCP协议
查看>>
【CodeBlocks】Win32 GUI界面与控制台同时存在
查看>>
十进制小数转换成二进制的原理理解
查看>>
float在计算机的存储方式
查看>>
C语言 16进制转float
查看>>
WNDCLASSEX中hIcon与hiconSm的区别?
查看>>
VC的MFC里面控件的ID使用ID_XXXXX和IDR_XXXXX的区别
查看>>
Combo Box的简单使用(Win32)
查看>>
E: Unable to correct problems, you have held broken packages
查看>>
#ifdef __cplusplus extern C的功能
查看>>
STM32 USART1一键下载电路
查看>>
在vs2017中遇到“fatal error RC1015: cannot open include file 'winres.h'.”
查看>>
Select2插件的快速使用
查看>>