zoukankan      html  css  js  c++  java
  • 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;
    }
  • 相关阅读:
    Linux 忘记root密码
    Linux 基础命令
    Linux 运行级别
    Oracle 体系结构
    Oracle 数据库启动过程
    数据库设计范式
    Oracle通过ROWID删除表中重复记录
    JACASCRIPT--的奇技技巧的44招
    css 的小细节,小总结
    关于我们DOM的知识点
  • 原文地址:https://www.cnblogs.com/Jawen/p/11264829.html
Copyright © 2011-2022 走看看