主要是对 tpl文档 中的数组表示进行说明以及代码测试
关于文档后面的 peek jot hook gather 内容 我也没有详细阅读 代码里也就没有相关测试了
数组主要分为两种 固定数组 fixed-length-array 以及 变长数组 variable-length-array
- 固定数组表示为 i# 或者 c# 等等
- 变长数组表示为 A(i) 或者 A© 等等 (关于字符串类型s的使用不在这里描述)
关于这两种不同表示的pack和unpack是不一样的
- 固定数组是一次pack完毕的 tpl_pack(tn, 0) unpack也是一次解压
- 变长数组是一次pack一个数据 tpl_pack(tn, 1) unpack也是多次解压
关于上面pack时的参数 0 和 1 的 index 说明 (是我自己看完文档之后自己的解释)
- 当使用了类型A时 这个参数时index才有意义 没有A类型时 全部都是一次压缩和解压都使用 index 0
- 有类型 A 存在时 index 仅仅按照顺序表示每一个 A 中的元素 与是否嵌套或者其他关系无法 只和顺序有关
若在 A(…) 之外存在其他类型字段时那么 0 表示其他非 A(…) 的全部字段 - A(A(i)) index 1 表示第一个A index 2 表示第二个 A 在 pack 时需要根据嵌套关系先压 index2 的数据 在压 index1 的数据
testVariableLengthArrayPack2 函数是对 类型 A(A(i)) 的测试 - icA(A(i))i 此时除了 index 1 和 2 以外 还需要压一次 index 为 0 的数据 将开头的 ic 和 末尾的 i 数据进行压入
使用 tpl_Alen 函数可以在 unpack 之前得到变长数组的长度 在 testVariableLengthArrayUnpackChar2 中可以看到这个函数的用法
关于以上数组的说明请自行阅读一下几个函数弄清楚区别
testFixedLengthArrayPackChar
testFixedLengthArrayUnpackChar
testVariableLengthArrayPackChar
testVariableLengthArrayUnpackChar
#include <stdio.h>
#include <stdlib.h>
#include <sys/time.h>
#include "../extra/tpl.h"
int storing(int argc, char *argv[])
{
tpl_node *tn;
int id = 0;
char *name, *names[] = {
"joe", "bob", "cary"};
tn = tpl_map("A(is)", &id, &name);
for (name = names[0]; id < 3; name = names[++id])
{
tpl_pack(tn, 1);
}
tpl_dump(tn, TPL_FILE, "users.tpl");
tpl_free(tn);
}
int reloading(int argc, char *argv[])
{
tpl_node *tn;
int id;
char *name;
tn = tpl_map("A(is)", &id, &name);
tpl_load(tn, TPL_FILE, "users.tpl");
while (tpl_unpack(tn, 1) > 0)
{
printf("id %d, user %s\n", id, name);
free(name);
}
tpl_free(tn);
}
// --------------------------------------------------------------------
// 数字数组
int testFixedLengthArrayPack(int argc, char *argv[])
{
tpl_node *tn;
int x[] = {
0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
tn = tpl_map("i#", x, 10);
tpl_pack(tn, 0); /* pack all 10 elements at once */
tpl_dump(tn, TPL_FILE, "fixed.tpl");
tpl_free(tn);
}
int testVariableLengthArrayPack(int argc, char *argv[])
{
tpl_node *tn;
int x;
tn = tpl_map("A(i)", &x);
for (x = 0; x < 10; x++)
{
tpl_pack(tn, 1); /* pack one element at a time */
}
tpl_dump(tn, TPL_FILE, "variable.tpl");
tpl_free(tn);
}
int testFixedLengthArrayUnpack(int argc, char *argv[])
{
tpl_node *tn;
int x[10];
tn = tpl_map("i#", x, 10);
tpl_load(tn, TPL_FILE, "fixed.tpl");
tpl_unpack(tn, 0); /* unpack all 10 elements at once */
tpl_free(tn);
for (int i = 0; i < 10; ++i)
{
printf("%d ", x[i]); /* unpack one by one */
}
printf("\n");
/* now do something with x[0]...x[9].. (not shown) */
}
int testVariableLengthArrayUnpack(int argc, char *argv[])
{
tpl_node *tn;
int x;
tn = tpl_map("A(i)", &x);
tpl_load(tn, TPL_FILE, "variable.tpl");
while (tpl_unpack(tn, 1) > 0)
{
printf("%d ", x); /* unpack one by one */
}
printf("\n");
tpl_free(tn);
}
// --------------------------------------------------------------------
// 字符数组 字符串
int testFixedLengthArrayPackChar(int argc, char *argv[])
{
tpl_node *tn;
char x[] = {
'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j'};
tn = tpl_map("c#", x, 10);
tpl_pack(tn