美文网首页
字符串结构

字符串结构

作者: 剑雪封侯之 | 来源:发表于2018-12-13 23:46 被阅读0次

sds.h文件

#ifndef __SDS_H
#define __SDS_H
//最大分配空间 1M
#define SDS_MAX_PREALLOC (1024*1024)

#include <sys/types.h>
#include <stdarg.h>
//声明sds是一种char * 类型。
typedef char *sds;

struct sdshdr {
    //字符长度
    unsigned int len;
    //可用空间
    unsigned int free;
    //存放字符的buff
    char buf[];
};
//返回字符串的长度
static inline size_t sdslen(const sds s) {
    struct sdshdr *sh = (void*)(s-(sizeof(struct sdshdr)));
    return sh->len;
}
//返回字符串的可用长度
static inline size_t sdsavail(const sds s) {
    struct sdshdr *sh = (void*)(s-(sizeof(struct sdshdr)));
    return sh->free;
}
//按照给定的长度,生成一个sds结构
sds sdsnewlen(const void *init, size_t initlen);

sds sdsnew(const char *init);
sds sdsempty(void);

size_t sdslen(const sds s);
//复制sds
sds sdsdup(const sds s);
//释放sds
void sdsfree(sds s);
//返回sds可用的长度
size_t sdsavail(const sds s);
//扩展字符串到指定长度
sds sdsgrowzero(sds s, size_t len);

sds sdscatlen(sds s, const void *t, size_t len);
//追加指定的字符串
sds sdscat(sds s, const char *t);
sds sdscatsds(sds s, const sds t);

//字符串复制
sds sdscpylen(sds s, const char *t, size_t len);
sds sdscpy(sds s, const char *t);
//字符串格式化输出,使用现有的snprintf,效率不如下面自己写的
sds sdscatvprintf(sds s, const char *fmt, va_list ap);

#ifdef __GNUC__
sds sdscatprintf(sds s, const char *fmt, ...)
    __attribute__((format(printf, 2, 3)));
#else
sds sdscatprintf(sds s, const char *fmt, ...);
#endif

sds sdscatfmt(sds s, char const *fmt, ...);
//字符串缩减函数
sds sdstrim(sds s, const char *cset);
//字符串截取
void sdsrange(sds s, int start, int end);
//更新字符串长度
void sdsupdatelen(sds s);
//清空字符串
void sdsclear(sds s);
//字符串比较函数
int sdscmp(const sds s1, const sds s2);
//字符串分割字符串
sds *sdssplitlen(const char *s, int len, const char *sep, int seplen, int *count);
//释放了字符串
void sdsfreesplitres(sds *tokens, int count);
//字符串变小写
void sdstolower(sds s);
//字符串变大写
void sdstoupper(sds s);
//生出数字字符串
sds sdsfromlonglong(long long value);
sds sdscatrepr(sds s, const char *p, size_t len);
sds *sdssplitargs(const char *line, int *argc);
sds sdsmapchars(sds s, const char *from, const char *to, size_t setlen);
sds sdsjoin(char **argv, int argc, char *sep);

/* Low level functions exposed to the user API */
//开放给使用者的api
sds sdsMakeRoomFor(sds s, size_t addlen);
void sdsIncrLen(sds s, int incr);
sds sdsRemoveFreeSpace(sds s);
size_t sdsAllocSize(sds s);

#endif

sds.c

sds sdsnewlen(const void *init, size_t initlen) {
    struct sdshdr *sh;

    if (init) {
        sh = zmalloc(sizeof(struct sdshdr)+initlen+1);
    } else {
        //当init函数为null时,调用zcalloc
        sh = zcalloc(sizeof(struct sdshdr)+initlen+1);
    }
    if (sh == NULL) return NULL;
    sh->len = initlen;
    sh->free = 0;
    if (initlen && init)
        memcpy(sh->buf, init, initlen);
    sh->buf[initlen] = '\0';
    return (char*)sh->buf;
}


相关文章

  • 深入Lua - 字符串

    字符串结构定义 Lua中字符串结构体定义: 字符串缓存 在创建字符串时,首先会从global_State的strc...

  • redis 内部数据结构(1.1)-字符串

    简单动态字符串 sds 数据结构 与 C 中字符串结构不同的是,C语言需要遍历字符串以确认字符串结束的位置(On)...

  • 第二章:API 的理解和使用-字符串

    2.2 字符串 字符串类型是Redis最基础的数据结构。首先键都是字符串类型,而且其他几种数据结构都是在字符串类型...

  • 5-遍历、公共方法、引用

    遍历 通过for ... in ...:的语法结构,可以遍历字符串、列表、元组、字典,集合等数据结构。 字符串遍历...

  • redis1-sds

    sds用于存储字符串的结构体, 几种不同的存储结构, 类型值如下。 根据字符串长度分配不同格式的sds结构。 使用...

  • 01-redis数据结构与对象

    3. redis数据结构与对象 redis对外支持数据结构 字符串 (string) 字符串列表(list) 字符...

  • golang json 序列化、反序列化 字符串反序列化成 m

    json.Unmarshl 反序列化 : 将 json 字符串转为结构体 需求:将 json 字符串转为结构体1)...

  • Redis

    字符串 构造方法 不同长度的字符串采用不同数据结构记录其长度 字符串追加方法 列表 通过链表结构实现,高插入、删除...

  • Swift基础篇——控制流

    顺序结构 循环结构 选择结构 一、循环结构 for-in遍历区间、字符串、数组、字典 for while do-w...

  • Redis学习笔记:String内部编码及其应用场景

    一、概述 字符串类型是Redis最基础的数据结构,Redis中的键都是字符串类型,其他几种数据结构都是在字符串基础...

网友评论

      本文标题:字符串结构

      本文链接:https://www.haomeiwen.com/subject/vzvihqtx.html