2017-1-15-libubox analysis
2017-1-15-libubox analysis
utils.h
提供了一些简单的实用工具函数。比如大小端转换,位图操作,编译器属性的封装,连续内存申请函数calloc_a,静态计算数组大小的宏,断言/调试的实用工具,苹果兼容的时钟获取时间的封装,base64编解码。
- /*
- *
- * calloc_a(size_t len, [void **addr, size_t len,...], NULL)
- * 申请一个足够大内存块来保存多个对齐的对象。
- * 返回一个指针,指针指向全部对象(以第一个块开始)注意:释放这个指针将释放所有全部对象的内存
- * 所有其它指针被保存在额外的addr参数指向的位置。
- * 最后一个参数必须是NULL指针
- */
- #define calloc_a(len, ...) __calloc_a(len, ##__VA_ARGS__, NULL)
- void *__calloc_a(size_t len, ...);
calloc_a示例:
- #include <string.h>
- #include <libubox/utils.h>
- struct sleeper {
- int aa;
- int bb;
- };
- #define NAME_LEN 32
- int main(int argc, char **argv)
- {
- struct sleeper *s;
- char *name;
- int *a1;
- s = (struct sleeper *)calloc_a(sizeof(*s), &name, NAME_LEN, &a1, sizeof(*a1));
- s->aa = 0x10101010;
- s->bb = 0x20202020;
- strncpy(name, "SSSSSSSSSSSSSSSSSSSSSSSS", NAME_LEN-1);
- name[NAME_LEN-1] = '\0';
- *a1 = 0xaaaaaaaa;
- free(s);
- return 0;
- }
- (gdb) x/20x s
- 0x602010: 0x10101010 0x20202020 0x53535353 0x53535353
- 0x602020: 0x53535353 0x53535353 0x53535353 0x53535353
- 0x602030: 0x00000000 0x00000000 0xaaaaaaaa 0x00000000

- /*
- * 计算数组大小
- */
- #ifndef ARRAY_SIZE
- #define ARRAY_SIZE(arr) (sizeof(arr) / sizeof((arr)[0]))
- #endif
- /*
- * BUILD_BUG_ON基于一个GCC不支持负数数组,在编译时报错
- * 但是4.4后GCC支持变长数组,不会引起编译器报错。
- * 加入GCC优化选项后,编译时不会错,但是链接时会有找不到符号__BUILD_BUG_ON_CONDITION_FAILED的错误
- */
- #define __BUILD_BUG_ON(condition) ((void)sizeof(char[1 - 2*!!(condition)]))
- #ifdef __OPTIMIZE__
- extern int __BUILD_BUG_ON_CONDITION_FAILED;
- #define BUILD_BUG_ON(condition) \
- do { \
- __BUILD_BUG_ON(condition); \
- if (condition) \
- __BUILD_BUG_ON_CONDITION_FAILED = 1; \
- } while(0)
- #else
- #define BUILD_BUG_ON __BUILD_BUG_ON
- #endif
FIXUP for BUILD_BUG_ON:
- /* Force a compilation error if condition is true */
- -#define BUILD_BUG_ON(condition) ((void)sizeof(char[1 - 2*!!(condition)]))
- +#define BUILD_BUG_ON(condition) ((void)BUILD_BUG_ON_ZERO(condition))
- +
- +/* Force a compilation error if condition is constant and true */
- +#define MAYBE_BUILD_BUG_ON(cond) ((void)sizeof(char[1 - 2 * !!(cond)]))
- /* Force a compilation error if condition is true, but also produce a
- result (of value 0 and type size_t), so the expression can be used
- e.g. in a structure initializer (or where-ever else comma expressions
- aren't permitted). */
- -#define BUILD_BUG_ON_ZERO(e) (sizeof(char[1 - 2 * !!(e)]) - 1)
- +#define BUILD_BUG_ON_ZERO(e) (sizeof(struct { int:-!!(e); }))
- +#define BUILD_BUG_ON_NULL(e) ((void *)sizeof(struct { int:-!!(e); }))
- /*
- */
- #ifdef __APPLE__
- #define CLOCK_REALTIME 0
- #define CLOCK_MONOTONIC 1
- void clock_gettime(int type, struct timespec *tv);
- #endif
- #ifdef __GNUC__
- #define _GNUC_MIN_VER(maj, min) (((__GNUC__ << 8) + __GNUC_MINOR__) >= (((maj) << 8) + (min)))
- #else
- #define _GNUC_MIN_VER(maj, min) 0
- #endif
- #if defined(__linux__) || defined(__CYGWIN__)
- #include <byteswap.h>
- #include <endian.h>
- #elif defined(__APPLE__)
- #include <machine/endian.h>
- #include <machine/byte_order.h>
- #define bswap_32(x) OSSwapInt32(x)
- #define bswap_64(x) OSSwapInt64(x)
- #elif defined(__FreeBSD__)
- #include <sys/endian.h>
- #define bswap_32(x) bswap32(x)
- #define bswap_64(x) bswap64(x)
- #else
- #include <machine/endian.h>
- #define bswap_32(x) swap32(x)
- #define bswap_64(x) swap64(x)
- #endif
- #ifndef __BYTE_ORDER
- #define __BYTE_ORDER BYTE_ORDER
- #endif
- #ifndef __BIG_ENDIAN
- #define __BIG_ENDIAN BIG_ENDIAN
- #endif
- #ifndef __LITTLE_ENDIAN
- #define __LITTLE_ENDIAN LITTLE_ENDIAN
- #endif
- #define __u_bswap16(x) ({ uint16_t val = (x); ((uint16_t)(((val >> 8) & 0xffu) | ((val & 0xffu) << 8))); })
- #if _GNUC_MIN_VER(4, 2)
- #define __u_bswap32(x) __builtin_bswap32(x)
- #define __u_bswap64(x) __builtin_bswap64(x)
- #else
- #define __u_bswap32(x) bswap_32(x)
- #define __u_bswap64(x) bswap_64(x)
- #endif
- #if __BYTE_ORDER == __LITTLE_ENDIAN
- #define cpu_to_be64(x) __u_bswap64(x)
- #define cpu_to_be32(x) __u_bswap32(x)
- #define cpu_to_be16(x) __u_bswap16((uint16_t) (x))
- #define be64_to_cpu(x) __u_bswap64(x)
- #define be32_to_cpu(x) __u_bswap32(x)
- #define be16_to_cpu(x) __u_bswap16((uint16_t) (x))
- #define cpu_to_le64(x) (x)
- #define cpu_to_le32(x) (x)
- #define cpu_to_le16(x) (x)
- #define le64_to_cpu(x) (x)
- #define le32_to_cpu(x) (x)
- #define le16_to_cpu(x) (x)
- #else /* __BYTE_ORDER == __LITTLE_ENDIAN */
- #define cpu_to_le64(x) __u_bswap64(x)
- #define cpu_to_le32(x) __u_bswap32(x)
- #define cpu_to_le16(x) __u_bswap16((uint16_t) (x))
- #define le64_to_cpu(x) __u_bswap64(x)
- #define le32_to_cpu(x) __u_bswap32(x)
- #define le16_to_cpu(x) __u_bswap16((uint16_t) (x))
- #define cpu_to_be64(x) (x)
- #define cpu_to_be32(x) (x)
- #define cpu_to_be16(x) (x)
- #define be64_to_cpu(x) (x)
- #define be32_to_cpu(x) (x)
- #define be16_to_cpu(x) (x)
- #endif
- #ifndef __packed
- #define __packed __attribute__((packed))
- #endif
- #ifndef BITS_PER_LONG
- #define BITS_PER_LONG (8 * sizeof(unsigned long))
- #endif
- static inline void bitfield_set(unsigned long *bits, int bit)
- {
- bits[bit / BITS_PER_LONG] |= (1UL << (bit % BITS_PER_LONG));
- }
- static inline bool bitfield_test(unsigned long *bits, int bit)
- {
- return !!(bits[bit / BITS_PER_LONG] & (1UL << (bit % BITS_PER_LONG)));
- }
- #endif
2017-1-15-libubox analysis的更多相关文章
- Visual Studio 2017 发布 15.5 版本,百度网盘离线安装包下载。
Visual Studio 2017 15.5 版本已正式发布,同时发布的还有 Visual Studio for Mac 7.3 .此次更新包含主要性能改进,新特性以及 bug 修复.发行说明中文版 ...
- Visual Studio 2017 版本 15.5.5
Visual Studio 2017 版本 15.5.5 已修复的问题 (1)Xamarin 应用会引发“Cannot access a disposed object. Object name: ' ...
- 2017.11.15 String、StringBuffer、StringBuilder的比较(todo)
参考来自:http://blog.csdn.net/jeffleo/article/details/52194433 1.速度 一般来说,三者的速度是:StringBuilder > Strin ...
- 2017.2.15 开涛shiro教程-第二十一章-授予身份与切换身份(二) controller
原博客地址:http://jinnianshilongnian.iteye.com/blog/2018398 根据下载的pdf学习. 开涛shiro教程-第二十一章-授予身份与切换身份(二) 1.回顾 ...
- 2017.2.15 开涛shiro教程-第二十一章-授予身份与切换身份(一) table、entity、service、dao
原博客地址:http://jinnianshilongnian.iteye.com/blog/2018398 根据下载的pdf学习. 第二十一章 授予身份与切换身份(一) 1.使用场景 某个领导因为某 ...
- CUDA 9.1/9.2 与 Visual Studio 2017 (VS2017 15.6.4) 的不兼容问题
2018年7月9日更新: CUDA已推出9.2版本,最高支持MSVC++ 14.13 _MSC_VER == 1913 (Visual Studio 2017 version 15.6). 然而最新版 ...
- Visual Studio 2017版本15.9现在可用
本文转自 https://blogs.msdn.microsoft.com/visualstudio/2018/11/19/visual-studio-2017-version-15-9-now-av ...
- Codeforces Educational Codeforces Round 15 E - Analysis of Pathes in Functional Graph
E. Analysis of Pathes in Functional Graph time limit per test 2 seconds memory limit per test 512 me ...
- April 11 2017 Week 15 Tuesday
Love is hard to get into, but harder to get out of. 相爱不易,相忘更难. The past are hurt, but I think we can ...
- 2017.5.15 markdown简明教程
0.说明 markdown是一种书写格式,html是一种发布格式.markdown的语法种类只对应html标记的一小部分(只涵盖纯文本). 不在markdown涵盖范围的标签,都可以直接在文档里用ht ...
随机推荐
- Android RecyclerView完全解析
RecyclerView完全解析 (一) 前言 话说RecyclerView已经面市很久,也在很多应用中得到广泛的使用,在整个开发者圈子里面也拥有很不错的口碑,那说明RecyclerView拥有比Li ...
- 前端工具 - 15个最佳的 JavaScript 表单验证库
客户端验证在任何项目都是不够的,因为 JavaScript 可以直接忽略,人们可以提交请求到服务器. 然而这并不意味着客户端验证都没必要了,很多时候我们需要在用户提交到服务器之前给予提示.JavaSc ...
- JAVA多线程实现的两种方式
java多线程实现方式主要有两种:继承Thread类.实现Runnable接口 1.继承Thread类实现多线程 继承Thread类的方法尽管被我列为一种多线程实现方式,但Thread本质上也是实现了 ...
- JavaEE XML XSL转换(XSLT)
XSL转换(XSLT) @author ixenos 定义: XSL转换机制可以指定将XML文档转换为其他格式的规则,例如,txt纯文本.XHTML或其他任何XML格式. 用途: XSLT通常用来将某 ...
- 分离JavaScript
分离JavaScript类似于使用style属性,在HTML文档里使用诸如onclick之类的属性也是一种既没有效率又容易引发问题的做法.如果我们用一个"挂钩",就像CSS机制中的 ...
- asp.net mvc 上传附件验证
1.使用验证特性 [RequiredCollection] public ICollection<IFormFile> Attachments { get; set; } 2.自定义验证特 ...
- Jquery 操作DropDownList 根据条件选中
$("#<%=DDLCounty.ClientID%> option").each(function () { if ($(this).text() == $(&quo ...
- app兼容性测试的几种方案
1.统计自己的应用被使用的数据 通过友盟或Flurry等在应用嵌入,得到应用在哪些机型上被安装了,排名前十的就是测试的重点机型 2.可参考兼容性测试平台的测试结果 比如Testin或百度的MTC平台, ...
- 【Java】ArrayList 的 toArray() 方法抛出 ClassCastException 异常
第一次用这个方法,结果冒出个莫名其妙的异常来: String[] names = (String[]) mTags.toArray(); 结果会抛出 java.lang.ClassCastExcept ...
- CodeForces 670D Magic Powder
二分. 二分一下答案,然后验证一下. #pragma comment(linker, "/STACK:1024000000,1024000000") #include<cst ...