• redis源码笔记(持续更新)


    1.重置字符串

    void sdsclear(sds s) {
    
        // 取出 sdshdr
        struct sdshdr *sh = (void*) (s-(sizeof(struct sdshdr)));
    
        // 重新计算属性
        sh->free += sh->len;
        sh->len = 0;
    
        // 将结束符放到最前面(相当于惰性地删除 buf 中的内容)
        sh->buf[0] = '';
    }

    2.移动字符串

    /*
     * 对 sds 左右两端进行修剪,清除其中 cset 指定的所有字符
     *
     * 比如 sdsstrim(xxyyabcyyxy, "xy") 将返回 "abc"
     *
     * 复杂性:
     *  T = O(M*N),M 为 SDS 长度, N 为 cset 长度。
     */
    sds sdstrim(sds s, const char *cset) {
        struct sdshdr *sh = (void*) (s-(sizeof(struct sdshdr)));
        char *start, *end, *sp, *ep;
        size_t len;
    
        // 设置和记录指针
        sp = start = s;
        ep = end = s+sdslen(s)-1;
    
        // 修剪, T = O(N^2)
        while(sp <= end && strchr(cset, *sp)) sp++;
        while(ep > start && strchr(cset, *ep)) ep--;
    
        // 计算 trim 完毕之后剩余的字符串长度
        len = (sp > ep) ? 0 : ((ep-sp)+1);
        
        // 如果有需要,前移字符串内容
        // T = O(N)
        if (sh->buf != sp) memmove(sh->buf, sp, len);
    
        // 添加终结符
        sh->buf[len] = '';
    
        // 更新属性
        sh->free = sh->free+(sh->len-len);
        sh->len = len;
    
        // 返回修剪后的 sds
        return s;
    }

    3.截取字符串

    void sdsrange(sds s, int start, int end) {
        struct sdshdr *sh = (void*) (s-(sizeof(struct sdshdr)));
        size_t newlen, len = sdslen(s);
    
        if (len == 0) return;
        if (start < 0) {
            start = len+start;
            if (start < 0) start = 0;
        }
        if (end < 0) {
            end = len+end;
            if (end < 0) end = 0;
        }
        newlen = (start > end) ? 0 : (end-start)+1;
        if (newlen != 0) {
            if (start >= (signed)len) {
                newlen = 0;
            } else if (end >= (signed)len) {
                end = len-1;
                newlen = (start > end) ? 0 : (end-start)+1;
            }
        } else {
            start = 0;
        }
    
        // 如果有需要,对字符串进行移动
        // T = O(N)
        if (start && newlen) memmove(sh->buf, sh->buf+start, newlen);
    
        // 添加终结符
        sh->buf[newlen] = 0;
    
        // 更新属性
        sh->free = sh->free+(sh->len-newlen);
        sh->len = newlen;
    }
  • 相关阅读:
    Android App Bundle 使用指南
    Homebrew国内源
    Mac下配置环境变量不生效问题
    CocosCreator1.x配置打包Android App Bundle
    Android读取Json文件的工具类
    Cocos Creator 坐标转换
    XCode真机调试不了,提示"Please reconnect the device"
    Canvas: trying to draw too large(134374464bytes) bitmap.
    Modbus主从关系几点记录
    当前时间加上几天
  • 原文地址:https://www.cnblogs.com/Jawen/p/11264829.html
Copyright © 2020-2023  润新知