apache avro analyzed

analyzed apace avro c code

////////////////////////////////////////////////////////////
// Apache Avro c实现代码分析
// 
// By matrix207 2015-08-03 at home
// 
////////////////////////////////////////////////////////////

/////////////////////// Part 1 /////////////////////////////
文件                             功能
--------------------------------------------------------------------------
allocation.c allocation.h   一个提供申请、追加和释放内存功能的接口实现
                            参考Lua的解析器实现
array.c
avroappend.c                例子?
avrocat.c                   例子?
avro_generic_internal.h
avro.h                      include一些头文件
avromod.c                   应该是测试压缩一个schema文件的例子?
avropipe.c                  例子?
avro_private.h              一些宏,感觉没有特别用处
codec.h codec.c             编码器, 支持三种压缩算法:DEFLATE、LZMA和SNAPPY
consume-binary.c
consumer.h consumer.c       消费者???
datafile.c
datum.h datum.c             
datum_equal.c
datum_read.c
datum_size.c
datum_skip.c
datum_validate.c
datum_value.c
datum_write.c
dump.c
dump.h
encoding_binary.c
encoding.h
errors.h errors.c           错误信息,支持设置和提取功能,支持在已有的错误信息前插入新的错误信息.
generic.h generic.c         内容很多,还要继续研究????
io.h io.c                   io类型,包含文件io和内存io
map.c                       map数据操作的实现
memoize.c                   avro_memoize_t数据类型操作的实现
resolved-reader.c
resolved-writer.c
resolver.h resolver.c
schema.h schema.c
schema_equal.c
schema_specific.c
st.h st.c                   通用hash表实现
string.c                    使用wrapper buffer的方式创建一个类似string的数据avro_raw_string_t
                            这里主要实现相关操作
value.h value.c
value-hash.c                value的hash操作,功能是??
value-json.c                把二进制格式数据(datum)转化为支持UTF-8的JSON格式数据(avrocat中有使用)
value-read.c                定义方法avro_value_read, 供datafile.c使用,avro_file_writer_open用到
value-sizeof.c              定义方法avro_value_sizeof, 没有找到使用者???
value-write.c               定义方法avro_value_write,供datum_write.c和datafile.c使用
wrapped-buffer.c            buffer操作

msinttypes.h                windows平台文件
platform.h                  平台文件, 针对不同平台include不同的头文件
basics.h                    简单和复杂数据类型的枚举型定义、schema和datum类型定义、对象类型定义
                            各种宏来判断数据类型(简单和复杂类型)
data.h                      各种数据类型的结构体定义(array、Maps、Wrapped buffer、strings、Memoization
legacy.h                    为了兼容旧接口而保留的接口(新代码不会使用)
msstdint.h                  windows平台文件
refcount.h                  引用计数
schema.h                    一些函数声明而已

////////////////////////////////////////////////////////////
重点,理解这些代码, from encoding_binary.c

static int write_long(avro_writer_t writer, int64_t l)
{
    char buf[MAX_VARINT_BUF_SIZE];
    uint8_t bytes_written = 0;
    uint64_t n = (l << 1) ^ (l >> 63);
    while (n & ~0x7F) {
        buf[bytes_written++] = (char)((((uint8_t) n) & 0x7F) | 0x80);
        n >>= 7;
    }
    buf[bytes_written++] = (char)n;
    AVRO_WRITE(writer, buf, bytes_written);
    return 0;
}