ZPL:(差不多)C99 Powerkit

2021-03-20 23:04:48

它'已经创建以简化C / C ++语言下的开发过程,并提供C开发人员经常重新发明或搜索库的常用功能集。除了替换/扩展C标准库的辅助方法外,该工具包还包括在特定专业领域非常有用的模块,例如Graph Culling算法,JSON5 Parser,OpenGL友好的数学库以及OpenGL帮助器模块和许多更多的...

图书馆是跨平台,目前在I386,AMD64和一些ARM架构上工作。它已经在Windows,Unix的系统,iOS,Emscripten和Android.we&#39上进行了测试。Re试图扩展兼容性,但我们需要您的帮助!如果您有一个您想要测试ZPL的设备,请随时让我们了解您的经验,我们可以尝试使其共同努力。

*此平台'与完全支持的平台相比,可能缺乏一些功能或功能程度。请参阅平台债务,了解您的平台遗漏了哪些功能。

Pirlg - 自2017年以来制作多人更简单。纯C99中的单头跨平台世界复制库。

导航到ZPL存储库的版本页面,只需选择要使用的版本。每个版本包含ZPL的分布式版本,供您轻松使用。

只需按下克隆或下载按钮即可克隆存储库,或者只需使用终端即可克隆:

我们使用此方法以开发ZPL,因为它包含易于修改和扩展的所有开发源,但它不适合供应商。

ZPL由包装到各种分布的模块组成。默认情况下,ZPL提供了来自Go的大部分模块。它还提供仅由构成图书馆基础的基本零件组成的纳米分布,其中:

宏助手 - 此模块包含许多有用的宏,有助于调试以及开发本身。

集合 - 由C ++ - 模板 - 模板 - 类似于任何类型的容器的模板宏组成。所有这些系列都是C友好,使用的参考或[]运营商可以访问。这些是:缓冲区,数组,链接列表,环形缓冲区。

String - 提供C字符串操作的方法,但也是一个字符串库,即C字符串只读兼容。

文件 - 文件I / O操作以及路径和文件夹结构操作方法。启用线程,它还提供异步读/写方法。

Memory Streamer - 允许我们使用文件API来操纵内存。 (例如,从内存解析媒体文件,将JSON5对象导出为字符串,......)

在不同精度下以多种形式检索当前时间的时间 - 辅助方法。

排序 - 使用快速/合并排序组合或基数排序对阵列进行排序的方法。它还包含简单的二进制搜索实现,以及易于使用的API来定义自己的比较器。

杂项 - 不属于任何地方,但在许多场合都仍然非常有用。

我们还从中制作了一种Pico分发,只包含:宏助手,内存和集合模块。在嵌入式环境中有用,您可以确切地了解您想要使用哪些模块。一如既往,您可以轻松启用额外的模块与您' d喜欢,请注意,并非所有组合都已测试,甚至可能会在启用Pico分布时导致问题。然而,在Pico分配中没有能够在微微分配内启用特定的核心子模块,请考虑在这种情况下使用纳米分布。

线程 - 此模块具有通用的线程和阻塞原理。它包含基于STB_Sync的线程合并操作,以及CPU亲和管理。

正则表达式 - GB_Regex的端口应用了多个错误修正。这是一个简单的regex库,快速执行。

DLL - 加载动态库的帮助方法。它还提供装载过程地址的能力。

散列 - 在许多域中有用的几种散列方法。包含:Base64,Adler32,CRC32 / 64,FNV32 / 64 / A和Murmur32 / 64

JSON5 Parser - 易于使用,非常快速的JSON5解析器,可以轻松加载50兆字节的JSON内容下半秒。它还包含简单的JSON5编写器,并作为处理配置文件的好库。

Opts - Opts是一个CLI选项解析器,它可以从命令行解析标志,切换和参数,并提供一种简单的方法来表达输入错误以及显示帮助屏幕的能力。

进程 - 为您提供创建新进程的功能,等待它结束或终止它。它还通过可配置选项公开标准I / O.

Jobs系统 - 可以设置一批使用线程池模式的工人,以处理无需不必要的线索开销的异步任务。

在此示例中,I' LL仅向您展示如何使用ZPL来编写简单的JSON5基准工具。

首先,我建议从版本查看zpl.h标题文件,介绍如何使用库。现在您知道,在项目中使用ZPL.h,您必须在包括zpl.h文件本身以成功嵌入它之前在一个源文件中完全定义zpl_implingation。

之后,我们需要处理文件加载,只需导航到代码文件夹并查找相应的模块文件.H

如您所见,每个模块都包含在其自己的标题/源文件中。这些都在每个释放上捆绑在一起。当我们开发ZPL时,我们包含代码/ ZPL.H,因为它允许我们在编码库时具有完整的语法和语义支持。但是,作为最终用户,您可以使用ZPL从发布页面中,因为它包含捆绑在一起并准备在项目中使用的所有内容。

文件模块负责处理必要的文件I / O操作。编写一个代码读取test.json5文件(您可以使用zpl_file_read_contents)并尝试打印其内容(使用libc' s printf或print.h)检查代码/ apps文件夹以获取代码示例。

完毕?伟大的!现在我们需要解析这个文件,但怎么样?猜猜是什么,json.h正是你'重新寻找!现在你可能想知道,你可以解析json5文件......

但是如果它没有,它是基准工具的使用是什么,如果它'甚至让你知道这个过程拍了多长时间?它是访问时间的时间(双关语)现在,捕获2时间戳,一个以前,操作发生后另一个,差异是您可以显示给用户的时间。或者只是在测试文件夹中查看代码示例。

什么'左边?我们可以阅读特定的JSON5文件,解析它并显示所需的时间。我说了吗?具体吗?我们如何让用户在命令行上自定义选项?

访问opts.h并了解它。与始终一样,测试文件夹在这种情况下非常有用。

#define zpl_implementation#define zpl_nano#define zpl_enable_opts#include zpl_enable_opts#include< zpl.h> int main(int argc,char ** argv){zpl_opts opts = {0}; zpl_opts_init(& opts,zpl_heap(),argv [0]); zpl_opts_add(&选择,&#34 ;???;,"帮助&#34 ;,#34;帮助部分",zpl_opts_flag); zpl_opts_add(&选择," f&#34 ;," foo&#34 ;,"测试* foo *条目。",zpl_opts_string); zpl_opts_add(&选择," p"" pi&#34 ;," pi值重新定义!!!",zpl_opts_float); zpl_opts_add(&选择," 4" 4" 4pay&#34 ;,"嗯; hmmmm",zpl_opts_int); zpl_opts_add(&选择," e&#34 ;," enabengfx&#34 ;,"启用高清资源包",zpl_opts_flag); zpl_opts_positional_add(&选择," 4pay"); zpl_b32确定= zpl_opts_compile(& opts,argc,argv); if(ok&& zpl_opts_positionals_fluited(& opts)){zpl_b32 help = zpl_opts_has_arg(& opts,"帮助"); if(帮助){zpl_opts_print_help(&选择);返回0; } zpl_string foo = zpl_opts_string(&选择," foo","错误!"); zpl_f64 some_num = zpl_opts_real(& opts," pi" 0.0); zpl_i32右=(zpl_i32)zpl_opts_integer(& opts," 4pay",42); zpl_printf(" arg是%s \ npi值是:%f \ nright:%d?\ n",foo,some_num,右); zpl_b32 gfx = zpl_opts_has_arg(& opts," enabengfx"); if(gfx){zpl_printf("您想要高清图形?这里:\ n \ n"); for(int i = 0; i< 5; ++ i){zpl_printf(" iiiii \ n"); }} else {zpl_opts_print_errors(&选择); zpl_opts_print_help(&选择); }返回0;}

我个人发现它相当繁琐,可以在C语言中重新实施常用功能。 我曾经使用过他人' 图书馆依靠这些功能。 但是,我曾开始通过我自己的模块扩展这些库,打破原始库的样式。 感谢FOSS,I' ve决定@ gingerbill' s库并将其调整为我的个人风格和需求,同时还返回错误修正和一些功能。 ZPL后来成为独立的,它自己的东西,添加了新功能,代码结构和QOL的变化。 确实是的。 根据许可证,这个项目是双重许可的,您可以自由地叉,为您提供贡献甚至销售它。 图书馆的大多数部分都用纯C99编写。 然而,有些附加组件需要C11(特别是在穿线模块中)。 只要您使用最小版本(ZPL_NANO),并且手动启用模块,C99支持应该是正常的。