Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
xindoo
redis
提交
37fff074
R
redis
项目概览
xindoo
/
redis
通知
2
Star
2
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
R
redis
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
37fff074
编写于
5月 22, 2010
作者:
P
Pieter Noordhuis
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
move code from zip.c to ziplist.c
上级
af5f66fb
变更
2
隐藏空白更改
内联
并排
Showing
2 changed file
with
157 addition
and
160 deletion
+157
-160
zip.c
zip.c
+0
-158
ziplist.c
ziplist.c
+157
-2
未找到文件。
zip.c
已删除
100644 → 0
浏览文件 @
af5f66fb
#define ZIP_BIGLEN 254
#define ZIP_END 255
/* Entry encoding */
#define ZIP_ENC_RAW 0
#define ZIP_ENC_SHORT 1
#define ZIP_ENC_INT 2
#define ZIP_ENC_LLONG 3
#define ZIP_ENCODING(p) ((p)[0] >> 6)
/* Length encoding for raw entries */
#define ZIP_LEN_INLINE 0
#define ZIP_LEN_UINT16 1
#define ZIP_LEN_UINT32 2
static
unsigned
int
zipEncodingSize
(
char
encoding
)
{
if
(
encoding
==
ZIP_ENC_SHORT
)
{
return
sizeof
(
short
int
);
}
else
if
(
encoding
==
ZIP_ENC_INT
)
{
return
sizeof
(
int
);
}
else
if
(
encoding
==
ZIP_ENC_LLONG
)
{
return
sizeof
(
long
long
);
}
assert
(
NULL
);
}
/* Decode the encoded length pointed by 'p'. If a pointer to 'lensize' is
* provided, it is set to the number of bytes required to encode the length. */
static
unsigned
int
zipDecodeLength
(
unsigned
char
*
p
,
unsigned
int
*
lensize
)
{
unsigned
char
encoding
=
ZIP_ENCODING
(
p
),
lenenc
;
unsigned
int
len
;
if
(
encoding
==
ZIP_ENC_RAW
)
{
lenenc
=
(
p
[
0
]
>>
4
)
&
0x3
;
if
(
lenenc
==
ZIP_LEN_INLINE
)
{
len
=
p
[
0
]
&
0xf
;
if
(
lensize
)
*
lensize
=
1
;
}
else
if
(
lenenc
==
ZIP_LEN_UINT16
)
{
len
=
p
[
1
]
|
(
p
[
2
]
<<
8
);
if
(
lensize
)
*
lensize
=
3
;
}
else
{
len
=
p
[
1
]
|
(
p
[
2
]
<<
8
)
|
(
p
[
3
]
<<
16
)
|
(
p
[
4
]
<<
24
);
if
(
lensize
)
*
lensize
=
5
;
}
}
else
{
len
=
zipEncodingSize
(
encoding
);
if
(
lensize
)
*
lensize
=
1
;
}
return
len
;
}
/* Encode the length 'l' writing it in 'p'. If p is NULL it just returns
* the amount of bytes required to encode such a length. */
static
unsigned
int
zipEncodeLength
(
unsigned
char
*
p
,
char
encoding
,
unsigned
int
rawlen
)
{
unsigned
char
len
=
1
,
lenenc
,
buf
[
5
];
if
(
encoding
==
ZIP_ENC_RAW
)
{
if
(
rawlen
<=
0xf
)
{
if
(
!
p
)
return
len
;
lenenc
=
ZIP_LEN_INLINE
;
buf
[
0
]
=
rawlen
;
}
else
if
(
rawlen
<=
0xffff
)
{
len
+=
2
;
if
(
!
p
)
return
len
;
lenenc
=
ZIP_LEN_UINT16
;
buf
[
1
]
=
(
rawlen
)
&
0xff
;
buf
[
2
]
=
(
rawlen
>>
8
)
&
0xff
;
}
else
{
len
+=
4
;
if
(
!
p
)
return
len
;
lenenc
=
ZIP_LEN_UINT32
;
buf
[
1
]
=
(
rawlen
)
&
0xff
;
buf
[
2
]
=
(
rawlen
>>
8
)
&
0xff
;
buf
[
3
]
=
(
rawlen
>>
16
)
&
0xff
;
buf
[
4
]
=
(
rawlen
>>
24
)
&
0xff
;
}
buf
[
0
]
=
(
lenenc
<<
4
)
|
(
buf
[
0
]
&
0xf
);
}
if
(
!
p
)
return
len
;
/* Apparently we need to store the length in 'p' */
buf
[
0
]
=
(
encoding
<<
6
)
|
(
buf
[
0
]
&
0x3f
);
memcpy
(
p
,
buf
,
len
);
return
len
;
}
/* Check if string pointed to by 'entry' can be encoded as an integer.
* Stores the integer value in 'v' and its encoding in 'encoding'.
* Warning: this function requires a NULL-terminated string! */
static
int
zipTryEncoding
(
unsigned
char
*
entry
,
long
long
*
v
,
char
*
encoding
)
{
long
long
value
;
char
*
eptr
;
if
(
entry
[
0
]
==
'-'
||
(
entry
[
0
]
>=
'0'
&&
entry
[
0
]
<=
'9'
))
{
value
=
strtoll
(
entry
,
&
eptr
,
10
);
if
(
eptr
[
0
]
!=
'\0'
)
return
0
;
if
(
value
>=
SHRT_MIN
&&
value
<=
SHRT_MAX
)
{
*
encoding
=
ZIP_ENC_SHORT
;
}
else
if
(
value
>=
INT_MIN
&&
value
<=
INT_MAX
)
{
*
encoding
=
ZIP_ENC_INT
;
}
else
{
*
encoding
=
ZIP_ENC_LLONG
;
}
*
v
=
value
;
return
1
;
}
return
0
;
}
static
void
zipSaveInteger
(
unsigned
char
*
p
,
long
long
value
,
char
encoding
)
{
short
int
s
;
int
i
;
long
long
l
;
if
(
encoding
==
ZIP_ENC_SHORT
)
{
s
=
value
;
memcpy
(
p
,
&
s
,
sizeof
(
s
));
}
else
if
(
encoding
==
ZIP_ENC_INT
)
{
i
=
value
;
memcpy
(
p
,
&
i
,
sizeof
(
i
));
}
else
if
(
encoding
==
ZIP_ENC_LLONG
)
{
l
=
value
;
memcpy
(
p
,
&
l
,
sizeof
(
l
));
}
else
{
assert
(
NULL
);
}
}
static
long
long
zipLoadInteger
(
unsigned
char
*
p
,
char
encoding
)
{
short
int
s
;
int
i
;
long
long
l
,
ret
;
if
(
encoding
==
ZIP_ENC_SHORT
)
{
memcpy
(
&
s
,
p
,
sizeof
(
s
));
ret
=
s
;
}
else
if
(
encoding
==
ZIP_ENC_INT
)
{
memcpy
(
&
i
,
p
,
sizeof
(
i
));
ret
=
i
;
}
else
if
(
encoding
==
ZIP_ENC_LLONG
)
{
memcpy
(
&
l
,
p
,
sizeof
(
l
));
ret
=
l
;
}
else
{
assert
(
NULL
);
}
return
ret
;
}
/* Return the total amount used by an entry (encoded length + payload). */
static
unsigned
int
zipRawEntryLength
(
unsigned
char
*
p
)
{
unsigned
int
lensize
,
len
;
len
=
zipDecodeLength
(
p
,
&
lensize
);
return
lensize
+
len
;
}
/* Resize the zip* structure. */
static
unsigned
char
*
zipResize
(
unsigned
char
*
z
,
unsigned
int
len
)
{
z
=
zrealloc
(
z
,
len
);
z
[
len
-
1
]
=
ZIP_END
;
return
z
;
}
ziplist.c
浏览文件 @
37fff074
...
...
@@ -22,14 +22,168 @@
#include "zmalloc.h"
#include "sds.h"
#include "ziplist.h"
#include "zip.c"
#define ZIP_END 255
/* Entry encoding */
#define ZIP_ENC_RAW 0
#define ZIP_ENC_SHORT 1
#define ZIP_ENC_INT 2
#define ZIP_ENC_LLONG 3
#define ZIP_ENCODING(p) ((p)[0] >> 6)
/* Length encoding for raw entries */
#define ZIP_LEN_INLINE 0
#define ZIP_LEN_UINT16 1
#define ZIP_LEN_UINT32 2
/* Utility macros */
#define ZIPLIST_BYTES(zl) (*((unsigned int*)(zl)))
#define ZIPLIST_LENGTH(zl) (*((zl)+sizeof(unsigned int)))
#define ZIPLIST_HEADER_SIZE (sizeof(unsigned int)+1)
#define ZIPLIST_INCR_LENGTH(zl,incr) { \
if (ZIPLIST_LENGTH(zl) < (ZIP_END-1)) ZIPLIST_LENGTH(zl)+=incr; }
/* Return bytes needed to store integer encoded by 'encoding' */
static
unsigned
int
zipEncodingSize
(
char
encoding
)
{
if
(
encoding
==
ZIP_ENC_SHORT
)
{
return
sizeof
(
short
int
);
}
else
if
(
encoding
==
ZIP_ENC_INT
)
{
return
sizeof
(
int
);
}
else
if
(
encoding
==
ZIP_ENC_LLONG
)
{
return
sizeof
(
long
long
);
}
assert
(
NULL
);
}
/* Decode the encoded length pointed by 'p'. If a pointer to 'lensize' is
* provided, it is set to the number of bytes required to encode the length. */
static
unsigned
int
zipDecodeLength
(
unsigned
char
*
p
,
unsigned
int
*
lensize
)
{
unsigned
char
encoding
=
ZIP_ENCODING
(
p
),
lenenc
;
unsigned
int
len
;
if
(
encoding
==
ZIP_ENC_RAW
)
{
lenenc
=
(
p
[
0
]
>>
4
)
&
0x3
;
if
(
lenenc
==
ZIP_LEN_INLINE
)
{
len
=
p
[
0
]
&
0xf
;
if
(
lensize
)
*
lensize
=
1
;
}
else
if
(
lenenc
==
ZIP_LEN_UINT16
)
{
len
=
p
[
1
]
|
(
p
[
2
]
<<
8
);
if
(
lensize
)
*
lensize
=
3
;
}
else
{
len
=
p
[
1
]
|
(
p
[
2
]
<<
8
)
|
(
p
[
3
]
<<
16
)
|
(
p
[
4
]
<<
24
);
if
(
lensize
)
*
lensize
=
5
;
}
}
else
{
len
=
zipEncodingSize
(
encoding
);
if
(
lensize
)
*
lensize
=
1
;
}
return
len
;
}
/* Encode the length 'l' writing it in 'p'. If p is NULL it just returns
* the amount of bytes required to encode such a length. */
static
unsigned
int
zipEncodeLength
(
unsigned
char
*
p
,
char
encoding
,
unsigned
int
rawlen
)
{
unsigned
char
len
=
1
,
lenenc
,
buf
[
5
];
if
(
encoding
==
ZIP_ENC_RAW
)
{
if
(
rawlen
<=
0xf
)
{
if
(
!
p
)
return
len
;
lenenc
=
ZIP_LEN_INLINE
;
buf
[
0
]
=
rawlen
;
}
else
if
(
rawlen
<=
0xffff
)
{
len
+=
2
;
if
(
!
p
)
return
len
;
lenenc
=
ZIP_LEN_UINT16
;
buf
[
1
]
=
(
rawlen
)
&
0xff
;
buf
[
2
]
=
(
rawlen
>>
8
)
&
0xff
;
}
else
{
len
+=
4
;
if
(
!
p
)
return
len
;
lenenc
=
ZIP_LEN_UINT32
;
buf
[
1
]
=
(
rawlen
)
&
0xff
;
buf
[
2
]
=
(
rawlen
>>
8
)
&
0xff
;
buf
[
3
]
=
(
rawlen
>>
16
)
&
0xff
;
buf
[
4
]
=
(
rawlen
>>
24
)
&
0xff
;
}
buf
[
0
]
=
(
lenenc
<<
4
)
|
(
buf
[
0
]
&
0xf
);
}
if
(
!
p
)
return
len
;
/* Apparently we need to store the length in 'p' */
buf
[
0
]
=
(
encoding
<<
6
)
|
(
buf
[
0
]
&
0x3f
);
memcpy
(
p
,
buf
,
len
);
return
len
;
}
/* Check if string pointed to by 'entry' can be encoded as an integer.
* Stores the integer value in 'v' and its encoding in 'encoding'.
* Warning: this function requires a NULL-terminated string! */
static
int
zipTryEncoding
(
unsigned
char
*
entry
,
long
long
*
v
,
char
*
encoding
)
{
long
long
value
;
char
*
eptr
;
if
(
entry
[
0
]
==
'-'
||
(
entry
[
0
]
>=
'0'
&&
entry
[
0
]
<=
'9'
))
{
value
=
strtoll
(
entry
,
&
eptr
,
10
);
if
(
eptr
[
0
]
!=
'\0'
)
return
0
;
if
(
value
>=
SHRT_MIN
&&
value
<=
SHRT_MAX
)
{
*
encoding
=
ZIP_ENC_SHORT
;
}
else
if
(
value
>=
INT_MIN
&&
value
<=
INT_MAX
)
{
*
encoding
=
ZIP_ENC_INT
;
}
else
{
*
encoding
=
ZIP_ENC_LLONG
;
}
*
v
=
value
;
return
1
;
}
return
0
;
}
/* Store integer 'value' at 'p', encoded as 'encoding' */
static
void
zipSaveInteger
(
unsigned
char
*
p
,
long
long
value
,
char
encoding
)
{
short
int
s
;
int
i
;
long
long
l
;
if
(
encoding
==
ZIP_ENC_SHORT
)
{
s
=
value
;
memcpy
(
p
,
&
s
,
sizeof
(
s
));
}
else
if
(
encoding
==
ZIP_ENC_INT
)
{
i
=
value
;
memcpy
(
p
,
&
i
,
sizeof
(
i
));
}
else
if
(
encoding
==
ZIP_ENC_LLONG
)
{
l
=
value
;
memcpy
(
p
,
&
l
,
sizeof
(
l
));
}
else
{
assert
(
NULL
);
}
}
/* Read integer encoded as 'encoding' from 'p' */
static
long
long
zipLoadInteger
(
unsigned
char
*
p
,
char
encoding
)
{
short
int
s
;
int
i
;
long
long
l
,
ret
;
if
(
encoding
==
ZIP_ENC_SHORT
)
{
memcpy
(
&
s
,
p
,
sizeof
(
s
));
ret
=
s
;
}
else
if
(
encoding
==
ZIP_ENC_INT
)
{
memcpy
(
&
i
,
p
,
sizeof
(
i
));
ret
=
i
;
}
else
if
(
encoding
==
ZIP_ENC_LLONG
)
{
memcpy
(
&
l
,
p
,
sizeof
(
l
));
ret
=
l
;
}
else
{
assert
(
NULL
);
}
return
ret
;
}
/* Return the total amount used by an entry (encoded length + payload). */
static
unsigned
int
zipRawEntryLength
(
unsigned
char
*
p
)
{
unsigned
int
lensize
,
len
;
len
=
zipDecodeLength
(
p
,
&
lensize
);
return
lensize
+
len
;
}
/* Create a new empty ziplist. */
unsigned
char
*
ziplistNew
(
void
)
{
unsigned
int
bytes
=
ZIPLIST_HEADER_SIZE
+
1
;
...
...
@@ -40,8 +194,9 @@ unsigned char *ziplistNew(void) {
return
zl
;
}
/* Resize the ziplist. */
static
unsigned
char
*
ziplistResize
(
unsigned
char
*
zl
,
unsigned
int
len
)
{
zl
=
z
ipResize
(
zl
,
len
);
zl
=
z
realloc
(
zl
,
len
);
ZIPLIST_BYTES
(
zl
)
=
len
;
zl
[
len
-
1
]
=
ZIP_END
;
return
zl
;
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录