zsv 1.3.1 → 1.4.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (229) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +13 -0
  3. data/README.md +41 -3
  4. data/ext/zsv/extconf.rb +1 -1
  5. data/lib/zsv/version.rb +1 -1
  6. metadata +6 -226
  7. data/ext/zsv/vendor/zsv-1.3.0/app/2db.c +0 -756
  8. data/ext/zsv/vendor/zsv-1.3.0/app/2json.c +0 -381
  9. data/ext/zsv/vendor/zsv-1.3.0/app/2tsv.c +0 -228
  10. data/ext/zsv/vendor/zsv-1.3.0/app/builtin/help.c +0 -123
  11. data/ext/zsv/vendor/zsv-1.3.0/app/builtin/license.c +0 -39
  12. data/ext/zsv/vendor/zsv-1.3.0/app/builtin/register.c +0 -104
  13. data/ext/zsv/vendor/zsv-1.3.0/app/builtin/thirdparty.c +0 -41
  14. data/ext/zsv/vendor/zsv-1.3.0/app/builtin/unregister.c +0 -1
  15. data/ext/zsv/vendor/zsv-1.3.0/app/builtin/version.c +0 -14
  16. data/ext/zsv/vendor/zsv-1.3.0/app/check/simdutf_wrapper.h +0 -19
  17. data/ext/zsv/vendor/zsv-1.3.0/app/check/utf8.c +0 -116
  18. data/ext/zsv/vendor/zsv-1.3.0/app/check.c +0 -194
  19. data/ext/zsv/vendor/zsv-1.3.0/app/cli.c +0 -796
  20. data/ext/zsv/vendor/zsv-1.3.0/app/cli_const.h +0 -41
  21. data/ext/zsv/vendor/zsv-1.3.0/app/cli_export.h +0 -16
  22. data/ext/zsv/vendor/zsv-1.3.0/app/cli_ini.c +0 -280
  23. data/ext/zsv/vendor/zsv-1.3.0/app/cli_internal.h +0 -36
  24. data/ext/zsv/vendor/zsv-1.3.0/app/compare.c +0 -913
  25. data/ext/zsv/vendor/zsv-1.3.0/app/compare.h +0 -23
  26. data/ext/zsv/vendor/zsv-1.3.0/app/compare_added_column.c +0 -20
  27. data/ext/zsv/vendor/zsv-1.3.0/app/compare_internal.h +0 -140
  28. data/ext/zsv/vendor/zsv-1.3.0/app/compare_sort.c +0 -91
  29. data/ext/zsv/vendor/zsv-1.3.0/app/compare_unique_colname.c +0 -81
  30. data/ext/zsv/vendor/zsv-1.3.0/app/count-pull.c +0 -82
  31. data/ext/zsv/vendor/zsv-1.3.0/app/count.c +0 -404
  32. data/ext/zsv/vendor/zsv-1.3.0/app/desc.c +0 -569
  33. data/ext/zsv/vendor/zsv-1.3.0/app/echo.c +0 -365
  34. data/ext/zsv/vendor/zsv-1.3.0/app/ext_example/my_extension.c +0 -366
  35. data/ext/zsv/vendor/zsv-1.3.0/app/ext_example/mysheet_extension.c +0 -341
  36. data/ext/zsv/vendor/zsv-1.3.0/app/ext_template/YOUR_EXTENSION_zsvext.c +0 -263
  37. data/ext/zsv/vendor/zsv-1.3.0/app/external/inih/ini.c +0 -298
  38. data/ext/zsv/vendor/zsv-1.3.0/app/external/inih/ini.h +0 -157
  39. data/ext/zsv/vendor/zsv-1.3.0/app/external/json_writer-1.01/json_numeric.c +0 -177
  40. data/ext/zsv/vendor/zsv-1.3.0/app/external/json_writer-1.01/jsonwriter.c +0 -444
  41. data/ext/zsv/vendor/zsv-1.3.0/app/external/json_writer-1.01/jsonwriter.h +0 -145
  42. data/ext/zsv/vendor/zsv-1.3.0/app/external/json_writer-1.01/utils.c +0 -110
  43. data/ext/zsv/vendor/zsv-1.3.0/app/external/memfile-1.0/include/memfile.h +0 -15
  44. data/ext/zsv/vendor/zsv-1.3.0/app/external/memfile-1.0/src/memfile.c +0 -64
  45. data/ext/zsv/vendor/zsv-1.3.0/app/external/sglib/sglib.h +0 -1955
  46. data/ext/zsv/vendor/zsv-1.3.0/app/external/simdutf/simdutf.h +0 -6802
  47. data/ext/zsv/vendor/zsv-1.3.0/app/external/sqlite3/sqlite3.c +0 -230517
  48. data/ext/zsv/vendor/zsv-1.3.0/app/external/sqlite3/sqlite3.h +0 -12174
  49. data/ext/zsv/vendor/zsv-1.3.0/app/external/sqlite3/sqlite3_and_csv_vtab.c +0 -2
  50. data/ext/zsv/vendor/zsv-1.3.0/app/external/sqlite3/sqlite3_csv_vtab-mem.c +0 -142
  51. data/ext/zsv/vendor/zsv-1.3.0/app/external/sqlite3/sqlite3_csv_vtab-mem.h +0 -49
  52. data/ext/zsv/vendor/zsv-1.3.0/app/external/sqlite3/sqlite3_csv_vtab-zsv.c +0 -485
  53. data/ext/zsv/vendor/zsv-1.3.0/app/external/sqlite3/sqlite3_csv_vtab.c +0 -1015
  54. data/ext/zsv/vendor/zsv-1.3.0/app/external/sqlite3/sqlite3ext.h +0 -663
  55. data/ext/zsv/vendor/zsv-1.3.0/app/external/sqlite3/vtab_helper.c +0 -85
  56. data/ext/zsv/vendor/zsv-1.3.0/app/external/yajl/build/yajl-2.1.1/include/yajl/yajl_common.h +0 -75
  57. data/ext/zsv/vendor/zsv-1.3.0/app/external/yajl/build/yajl-2.1.1/include/yajl/yajl_gen.h +0 -167
  58. data/ext/zsv/vendor/zsv-1.3.0/app/external/yajl/build/yajl-2.1.1/include/yajl/yajl_parse.h +0 -228
  59. data/ext/zsv/vendor/zsv-1.3.0/app/external/yajl/build/yajl-2.1.1/include/yajl/yajl_tree.h +0 -186
  60. data/ext/zsv/vendor/zsv-1.3.0/app/external/yajl/build/yajl-2.1.1/include/yajl/yajl_version.h +0 -23
  61. data/ext/zsv/vendor/zsv-1.3.0/app/external/yajl/src/api/yajl_common.h +0 -76
  62. data/ext/zsv/vendor/zsv-1.3.0/app/external/yajl/src/api/yajl_gen.h +0 -167
  63. data/ext/zsv/vendor/zsv-1.3.0/app/external/yajl/src/api/yajl_parse.h +0 -238
  64. data/ext/zsv/vendor/zsv-1.3.0/app/external/yajl/src/api/yajl_tree.h +0 -186
  65. data/ext/zsv/vendor/zsv-1.3.0/app/external/yajl/src/yajl.c +0 -184
  66. data/ext/zsv/vendor/zsv-1.3.0/app/external/yajl/src/yajl_alloc.c +0 -52
  67. data/ext/zsv/vendor/zsv-1.3.0/app/external/yajl/src/yajl_alloc.h +0 -34
  68. data/ext/zsv/vendor/zsv-1.3.0/app/external/yajl/src/yajl_buf.c +0 -103
  69. data/ext/zsv/vendor/zsv-1.3.0/app/external/yajl/src/yajl_buf.h +0 -57
  70. data/ext/zsv/vendor/zsv-1.3.0/app/external/yajl/src/yajl_bytestack.h +0 -69
  71. data/ext/zsv/vendor/zsv-1.3.0/app/external/yajl/src/yajl_encode.c +0 -220
  72. data/ext/zsv/vendor/zsv-1.3.0/app/external/yajl/src/yajl_encode.h +0 -34
  73. data/ext/zsv/vendor/zsv-1.3.0/app/external/yajl/src/yajl_gen.c +0 -362
  74. data/ext/zsv/vendor/zsv-1.3.0/app/external/yajl/src/yajl_lex.c +0 -764
  75. data/ext/zsv/vendor/zsv-1.3.0/app/external/yajl/src/yajl_lex.h +0 -117
  76. data/ext/zsv/vendor/zsv-1.3.0/app/external/yajl/src/yajl_parser.c +0 -508
  77. data/ext/zsv/vendor/zsv-1.3.0/app/external/yajl/src/yajl_parser.h +0 -78
  78. data/ext/zsv/vendor/zsv-1.3.0/app/external/yajl/src/yajl_tree.c +0 -505
  79. data/ext/zsv/vendor/zsv-1.3.0/app/external/yajl/src/yajl_version.c +0 -7
  80. data/ext/zsv/vendor/zsv-1.3.0/app/external/yajl_helper/yajl_helper/json_value.h +0 -59
  81. data/ext/zsv/vendor/zsv-1.3.0/app/external/yajl_helper/yajl_helper/yajl_helper.h +0 -208
  82. data/ext/zsv/vendor/zsv-1.3.0/app/external/yajl_helper/yajl_helper.c +0 -795
  83. data/ext/zsv/vendor/zsv-1.3.0/app/external/yajl_helper/yajl_helper_internal.h +0 -28
  84. data/ext/zsv/vendor/zsv-1.3.0/app/flatten.c +0 -851
  85. data/ext/zsv/vendor/zsv-1.3.0/app/jq.c +0 -106
  86. data/ext/zsv/vendor/zsv-1.3.0/app/jq.h +0 -6
  87. data/ext/zsv/vendor/zsv-1.3.0/app/mv.c +0 -113
  88. data/ext/zsv/vendor/zsv-1.3.0/app/noop.c +0 -90
  89. data/ext/zsv/vendor/zsv-1.3.0/app/overwrite.c +0 -295
  90. data/ext/zsv/vendor/zsv-1.3.0/app/paste.c +0 -175
  91. data/ext/zsv/vendor/zsv-1.3.0/app/pretty.c +0 -693
  92. data/ext/zsv/vendor/zsv-1.3.0/app/prop.c +0 -980
  93. data/ext/zsv/vendor/zsv-1.3.0/app/rm.c +0 -131
  94. data/ext/zsv/vendor/zsv-1.3.0/app/select/fixed.c +0 -130
  95. data/ext/zsv/vendor/zsv-1.3.0/app/select/internal.h +0 -118
  96. data/ext/zsv/vendor/zsv-1.3.0/app/select/parallel.c +0 -45
  97. data/ext/zsv/vendor/zsv-1.3.0/app/select/parallel.h +0 -41
  98. data/ext/zsv/vendor/zsv-1.3.0/app/select/processing.c +0 -107
  99. data/ext/zsv/vendor/zsv-1.3.0/app/select/rand.c +0 -20
  100. data/ext/zsv/vendor/zsv-1.3.0/app/select/regex.c +0 -61
  101. data/ext/zsv/vendor/zsv-1.3.0/app/select/search.c +0 -14
  102. data/ext/zsv/vendor/zsv-1.3.0/app/select/selection.c +0 -192
  103. data/ext/zsv/vendor/zsv-1.3.0/app/select/usage.c +0 -72
  104. data/ext/zsv/vendor/zsv-1.3.0/app/select-pull.c +0 -812
  105. data/ext/zsv/vendor/zsv-1.3.0/app/select.c +0 -753
  106. data/ext/zsv/vendor/zsv-1.3.0/app/serialize.c +0 -372
  107. data/ext/zsv/vendor/zsv-1.3.0/app/sheet/curses.h +0 -15
  108. data/ext/zsv/vendor/zsv-1.3.0/app/sheet/cursor.c +0 -119
  109. data/ext/zsv/vendor/zsv-1.3.0/app/sheet/errors.c +0 -45
  110. data/ext/zsv/vendor/zsv-1.3.0/app/sheet/file.c +0 -63
  111. data/ext/zsv/vendor/zsv-1.3.0/app/sheet/file.h +0 -12
  112. data/ext/zsv/vendor/zsv-1.3.0/app/sheet/filter.c +0 -166
  113. data/ext/zsv/vendor/zsv-1.3.0/app/sheet/handlers.c +0 -214
  114. data/ext/zsv/vendor/zsv-1.3.0/app/sheet/handlers_internal.h +0 -128
  115. data/ext/zsv/vendor/zsv-1.3.0/app/sheet/help.c +0 -43
  116. data/ext/zsv/vendor/zsv-1.3.0/app/sheet/index.c +0 -81
  117. data/ext/zsv/vendor/zsv-1.3.0/app/sheet/index.h +0 -25
  118. data/ext/zsv/vendor/zsv-1.3.0/app/sheet/key-bindings.c +0 -325
  119. data/ext/zsv/vendor/zsv-1.3.0/app/sheet/key-bindings.h +0 -73
  120. data/ext/zsv/vendor/zsv-1.3.0/app/sheet/lexer.c +0 -203
  121. data/ext/zsv/vendor/zsv-1.3.0/app/sheet/newline_handler.c +0 -7
  122. data/ext/zsv/vendor/zsv-1.3.0/app/sheet/pivot.c +0 -318
  123. data/ext/zsv/vendor/zsv-1.3.0/app/sheet/procedure.c +0 -134
  124. data/ext/zsv/vendor/zsv-1.3.0/app/sheet/procedure.h +0 -119
  125. data/ext/zsv/vendor/zsv-1.3.0/app/sheet/read-data.c +0 -322
  126. data/ext/zsv/vendor/zsv-1.3.0/app/sheet/screen_buffer.c +0 -203
  127. data/ext/zsv/vendor/zsv-1.3.0/app/sheet/screen_buffer.h +0 -36
  128. data/ext/zsv/vendor/zsv-1.3.0/app/sheet/sheet-sql.c +0 -167
  129. data/ext/zsv/vendor/zsv-1.3.0/app/sheet/sheet_internal.h +0 -36
  130. data/ext/zsv/vendor/zsv-1.3.0/app/sheet/sqlfilter.c +0 -153
  131. data/ext/zsv/vendor/zsv-1.3.0/app/sheet/terminfo.c +0 -32
  132. data/ext/zsv/vendor/zsv-1.3.0/app/sheet/transformation.c +0 -312
  133. data/ext/zsv/vendor/zsv-1.3.0/app/sheet/transformation.h +0 -29
  134. data/ext/zsv/vendor/zsv-1.3.0/app/sheet/ui_buffer.c +0 -266
  135. data/ext/zsv/vendor/zsv-1.3.0/app/sheet/usage.c +0 -9
  136. data/ext/zsv/vendor/zsv-1.3.0/app/sheet/utf8-width.c +0 -60
  137. data/ext/zsv/vendor/zsv-1.3.0/app/sheet.c +0 -1007
  138. data/ext/zsv/vendor/zsv-1.3.0/app/sql.c +0 -453
  139. data/ext/zsv/vendor/zsv-1.3.0/app/sql_internal.c +0 -101
  140. data/ext/zsv/vendor/zsv-1.3.0/app/sql_internal.h +0 -49
  141. data/ext/zsv/vendor/zsv-1.3.0/app/stack.c +0 -393
  142. data/ext/zsv/vendor/zsv-1.3.0/app/utils/arg.c +0 -322
  143. data/ext/zsv/vendor/zsv-1.3.0/app/utils/cache.c +0 -228
  144. data/ext/zsv/vendor/zsv-1.3.0/app/utils/cat.c +0 -91
  145. data/ext/zsv/vendor/zsv-1.3.0/app/utils/chunk.c +0 -240
  146. data/ext/zsv/vendor/zsv-1.3.0/app/utils/chunk.h +0 -63
  147. data/ext/zsv/vendor/zsv-1.3.0/app/utils/clock.c +0 -57
  148. data/ext/zsv/vendor/zsv-1.3.0/app/utils/db.c +0 -148
  149. data/ext/zsv/vendor/zsv-1.3.0/app/utils/dirs-no-jq.c +0 -2
  150. data/ext/zsv/vendor/zsv-1.3.0/app/utils/dirs.c +0 -427
  151. data/ext/zsv/vendor/zsv-1.3.0/app/utils/dirs_from_json.c +0 -253
  152. data/ext/zsv/vendor/zsv-1.3.0/app/utils/dirs_to_json.c +0 -121
  153. data/ext/zsv/vendor/zsv-1.3.0/app/utils/dl.c +0 -20
  154. data/ext/zsv/vendor/zsv-1.3.0/app/utils/emcc/fs_api.c +0 -159
  155. data/ext/zsv/vendor/zsv-1.3.0/app/utils/err.c +0 -24
  156. data/ext/zsv/vendor/zsv-1.3.0/app/utils/file-mem.c +0 -180
  157. data/ext/zsv/vendor/zsv-1.3.0/app/utils/file.c +0 -256
  158. data/ext/zsv/vendor/zsv-1.3.0/app/utils/index.c +0 -197
  159. data/ext/zsv/vendor/zsv-1.3.0/app/utils/index.h +0 -49
  160. data/ext/zsv/vendor/zsv-1.3.0/app/utils/jq.c +0 -400
  161. data/ext/zsv/vendor/zsv-1.3.0/app/utils/json.c +0 -120
  162. data/ext/zsv/vendor/zsv-1.3.0/app/utils/mem.c +0 -18
  163. data/ext/zsv/vendor/zsv-1.3.0/app/utils/memmem.c +0 -132
  164. data/ext/zsv/vendor/zsv-1.3.0/app/utils/os.c +0 -178
  165. data/ext/zsv/vendor/zsv-1.3.0/app/utils/overwrite.c +0 -258
  166. data/ext/zsv/vendor/zsv-1.3.0/app/utils/overwrite_writer.c +0 -246
  167. data/ext/zsv/vendor/zsv-1.3.0/app/utils/pcre2-8/pcre2-8-test.c +0 -123
  168. data/ext/zsv/vendor/zsv-1.3.0/app/utils/pcre2-8/pcre2-8.c +0 -153
  169. data/ext/zsv/vendor/zsv-1.3.0/app/utils/pcre2-8/pcre2-8.h +0 -54
  170. data/ext/zsv/vendor/zsv-1.3.0/app/utils/prop.c +0 -267
  171. data/ext/zsv/vendor/zsv-1.3.0/app/utils/signal.c +0 -53
  172. data/ext/zsv/vendor/zsv-1.3.0/app/utils/string.c +0 -357
  173. data/ext/zsv/vendor/zsv-1.3.0/app/utils/win/dir_exists_longpath.c +0 -83
  174. data/ext/zsv/vendor/zsv-1.3.0/app/utils/win/dl.c +0 -33
  175. data/ext/zsv/vendor/zsv-1.3.0/app/utils/win/fopen_longpath.c +0 -184
  176. data/ext/zsv/vendor/zsv-1.3.0/app/utils/win/foreach_dirent_longpath.c +0 -292
  177. data/ext/zsv/vendor/zsv-1.3.0/app/utils/win/io.c +0 -259
  178. data/ext/zsv/vendor/zsv-1.3.0/app/utils/win/io.h +0 -13
  179. data/ext/zsv/vendor/zsv-1.3.0/app/utils/win/mkdir_longpath.c +0 -255
  180. data/ext/zsv/vendor/zsv-1.3.0/app/utils/win/remove_longpath.c +0 -96
  181. data/ext/zsv/vendor/zsv-1.3.0/app/utils/writer.c +0 -361
  182. data/ext/zsv/vendor/zsv-1.3.0/app/zsv_command.h +0 -40
  183. data/ext/zsv/vendor/zsv-1.3.0/app/zsv_command_standalone.c +0 -16
  184. data/ext/zsv/vendor/zsv-1.3.0/app/zsv_main.h +0 -44
  185. data/ext/zsv/vendor/zsv-1.3.0/examples/js/zsv_parser_api_dummy.c +0 -3
  186. data/ext/zsv/vendor/zsv-1.3.0/examples/lib/parse_by_chunk.c +0 -100
  187. data/ext/zsv/vendor/zsv-1.3.0/examples/lib/print_my_column.c +0 -143
  188. data/ext/zsv/vendor/zsv-1.3.0/examples/lib/pull.c +0 -89
  189. data/ext/zsv/vendor/zsv-1.3.0/examples/lib/simple.c +0 -123
  190. data/ext/zsv/vendor/zsv-1.3.0/fuzz/fuzz.c +0 -16
  191. data/ext/zsv/vendor/zsv-1.3.0/include/zsv/api.h +0 -336
  192. data/ext/zsv/vendor/zsv-1.3.0/include/zsv/common.h +0 -361
  193. data/ext/zsv/vendor/zsv-1.3.0/include/zsv/ext/implementation.h +0 -62
  194. data/ext/zsv/vendor/zsv-1.3.0/include/zsv/ext/implementation_private.h +0 -113
  195. data/ext/zsv/vendor/zsv-1.3.0/include/zsv/ext/sheet.h +0 -73
  196. data/ext/zsv/vendor/zsv-1.3.0/include/zsv/ext.h +0 -329
  197. data/ext/zsv/vendor/zsv-1.3.0/include/zsv/utils/arg.h +0 -90
  198. data/ext/zsv/vendor/zsv-1.3.0/include/zsv/utils/cache.h +0 -49
  199. data/ext/zsv/vendor/zsv-1.3.0/include/zsv/utils/clock.h +0 -36
  200. data/ext/zsv/vendor/zsv-1.3.0/include/zsv/utils/compiler.h +0 -58
  201. data/ext/zsv/vendor/zsv-1.3.0/include/zsv/utils/db.h +0 -19
  202. data/ext/zsv/vendor/zsv-1.3.0/include/zsv/utils/dirs.h +0 -147
  203. data/ext/zsv/vendor/zsv-1.3.0/include/zsv/utils/dl.h +0 -22
  204. data/ext/zsv/vendor/zsv-1.3.0/include/zsv/utils/emcc/fs_api.h +0 -28
  205. data/ext/zsv/vendor/zsv-1.3.0/include/zsv/utils/err.h +0 -22
  206. data/ext/zsv/vendor/zsv-1.3.0/include/zsv/utils/file-mem.h +0 -17
  207. data/ext/zsv/vendor/zsv-1.3.0/include/zsv/utils/file.h +0 -99
  208. data/ext/zsv/vendor/zsv-1.3.0/include/zsv/utils/jq.h +0 -65
  209. data/ext/zsv/vendor/zsv-1.3.0/include/zsv/utils/json.h +0 -19
  210. data/ext/zsv/vendor/zsv-1.3.0/include/zsv/utils/mem.h +0 -19
  211. data/ext/zsv/vendor/zsv-1.3.0/include/zsv/utils/memmem.h +0 -13
  212. data/ext/zsv/vendor/zsv-1.3.0/include/zsv/utils/os.h +0 -54
  213. data/ext/zsv/vendor/zsv-1.3.0/include/zsv/utils/overwrite.h +0 -71
  214. data/ext/zsv/vendor/zsv-1.3.0/include/zsv/utils/overwrite_writer.h +0 -53
  215. data/ext/zsv/vendor/zsv-1.3.0/include/zsv/utils/prop.h +0 -107
  216. data/ext/zsv/vendor/zsv-1.3.0/include/zsv/utils/signal.h +0 -18
  217. data/ext/zsv/vendor/zsv-1.3.0/include/zsv/utils/sql.h +0 -11
  218. data/ext/zsv/vendor/zsv-1.3.0/include/zsv/utils/string.h +0 -148
  219. data/ext/zsv/vendor/zsv-1.3.0/include/zsv/utils/utf8.h +0 -41
  220. data/ext/zsv/vendor/zsv-1.3.0/include/zsv/utils/win/dl.h +0 -25
  221. data/ext/zsv/vendor/zsv-1.3.0/include/zsv/utils/writer.h +0 -101
  222. data/ext/zsv/vendor/zsv-1.3.0/include/zsv/zsv_export.h +0 -33
  223. data/ext/zsv/vendor/zsv-1.3.0/include/zsv.h +0 -20
  224. data/ext/zsv/vendor/zsv-1.3.0/src/vector_delim.c +0 -60
  225. data/ext/zsv/vendor/zsv-1.3.0/src/zsv.c +0 -484
  226. data/ext/zsv/vendor/zsv-1.3.0/src/zsv_internal.c +0 -731
  227. data/ext/zsv/vendor/zsv-1.3.0/src/zsv_scan_delim.c +0 -285
  228. data/ext/zsv/vendor/zsv-1.3.0/src/zsv_scan_fixed.c +0 -88
  229. data/ext/zsv/vendor/zsv-1.3.0/src/zsv_strencode.c +0 -51
@@ -1,157 +0,0 @@
1
- /* inih -- simple .INI file parser
2
-
3
- SPDX-License-Identifier: BSD-3-Clause
4
-
5
- Copyright (C) 2009-2020, Ben Hoyt
6
-
7
- inih is released under the New BSD license (see LICENSE.txt). Go to the project
8
- home page for more info:
9
-
10
- https://github.com/benhoyt/inih
11
-
12
- */
13
-
14
- #ifndef INI_H
15
- #define INI_H
16
-
17
- /* Make this header file easier to include in C++ code */
18
- #ifdef __cplusplus
19
- extern "C" {
20
- #endif
21
-
22
- #include <stdio.h>
23
-
24
- /* Nonzero if ini_handler callback should accept lineno parameter. */
25
- #ifndef INI_HANDLER_LINENO
26
- #define INI_HANDLER_LINENO 0
27
- #endif
28
-
29
- /* Typedef for prototype of handler function. */
30
- #if INI_HANDLER_LINENO
31
- typedef int (*ini_handler)(void* user, const char* section,
32
- const char* name, const char* value,
33
- int lineno);
34
- #else
35
- typedef int (*ini_handler)(void* user, const char* section,
36
- const char* name, const char* value);
37
- #endif
38
-
39
- /* Typedef for prototype of fgets-style reader function. */
40
- typedef char* (*ini_reader)(char* str, int num, void* stream);
41
-
42
- /* Parse given INI-style file. May have [section]s, name=value pairs
43
- (whitespace stripped), and comments starting with ';' (semicolon). Section
44
- is "" if name=value pair parsed before any section heading. name:value
45
- pairs are also supported as a concession to Python's configparser.
46
-
47
- For each name=value pair parsed, call handler function with given user
48
- pointer as well as section, name, and value (data only valid for duration
49
- of handler call). Handler should return nonzero on success, zero on error.
50
-
51
- Returns 0 on success, line number of first error on parse error (doesn't
52
- stop on first error), -1 on file open error, or -2 on memory allocation
53
- error (only when INI_USE_STACK is zero).
54
- */
55
- int ini_parse(const char* filename, ini_handler handler, void* user);
56
-
57
- /* Same as ini_parse(), but takes a FILE* instead of filename. This doesn't
58
- close the file when it's finished -- the caller must do that. */
59
- int ini_parse_file(FILE* file, ini_handler handler, void* user);
60
-
61
- /* Same as ini_parse(), but takes an ini_reader function pointer instead of
62
- filename. Used for implementing custom or string-based I/O (see also
63
- ini_parse_string). */
64
- int ini_parse_stream(ini_reader reader, void* stream, ini_handler handler,
65
- void* user);
66
-
67
- /* Same as ini_parse(), but takes a zero-terminated string with the INI data
68
- instead of a file. Useful for parsing INI data from a network socket or
69
- already in memory. */
70
- int ini_parse_string(const char* string, ini_handler handler, void* user);
71
-
72
- /* Nonzero to allow multi-line value parsing, in the style of Python's
73
- configparser. If allowed, ini_parse() will call the handler with the same
74
- name for each subsequent line parsed. */
75
- #ifndef INI_ALLOW_MULTILINE
76
- #define INI_ALLOW_MULTILINE 1
77
- #endif
78
-
79
- /* Nonzero to allow a UTF-8 BOM sequence (0xEF 0xBB 0xBF) at the start of
80
- the file. See https://github.com/benhoyt/inih/issues/21 */
81
- #ifndef INI_ALLOW_BOM
82
- #define INI_ALLOW_BOM 1
83
- #endif
84
-
85
- /* Chars that begin a start-of-line comment. Per Python configparser, allow
86
- both ; and # comments at the start of a line by default. */
87
- #ifndef INI_START_COMMENT_PREFIXES
88
- #define INI_START_COMMENT_PREFIXES ";#"
89
- #endif
90
-
91
- /* Nonzero to allow inline comments (with valid inline comment characters
92
- specified by INI_INLINE_COMMENT_PREFIXES). Set to 0 to turn off and match
93
- Python 3.2+ configparser behaviour. */
94
- #ifndef INI_ALLOW_INLINE_COMMENTS
95
- #define INI_ALLOW_INLINE_COMMENTS 1
96
- #endif
97
- #ifndef INI_INLINE_COMMENT_PREFIXES
98
- #define INI_INLINE_COMMENT_PREFIXES ";"
99
- #endif
100
-
101
- /* Nonzero to use stack for line buffer, zero to use heap (malloc/free). */
102
- #ifndef INI_USE_STACK
103
- #define INI_USE_STACK 1
104
- #endif
105
-
106
- /* Maximum line length for any line in INI file (stack or heap). Note that
107
- this must be 3 more than the longest line (due to '\r', '\n', and '\0'). */
108
- #ifndef INI_MAX_LINE
109
- #define INI_MAX_LINE 200
110
- #endif
111
-
112
- /* Nonzero to allow heap line buffer to grow via realloc(), zero for a
113
- fixed-size buffer of INI_MAX_LINE bytes. Only applies if INI_USE_STACK is
114
- zero. */
115
- #ifndef INI_ALLOW_REALLOC
116
- #define INI_ALLOW_REALLOC 0
117
- #endif
118
-
119
- /* Initial size in bytes for heap line buffer. Only applies if INI_USE_STACK
120
- is zero. */
121
- #ifndef INI_INITIAL_ALLOC
122
- #define INI_INITIAL_ALLOC 200
123
- #endif
124
-
125
- /* Stop parsing on first error (default is to keep parsing). */
126
- #ifndef INI_STOP_ON_FIRST_ERROR
127
- #define INI_STOP_ON_FIRST_ERROR 0
128
- #endif
129
-
130
- /* Nonzero to call the handler at the start of each new section (with
131
- name and value NULL). Default is to only call the handler on
132
- each name=value pair. */
133
- #ifndef INI_CALL_HANDLER_ON_NEW_SECTION
134
- #define INI_CALL_HANDLER_ON_NEW_SECTION 0
135
- #endif
136
-
137
- /* Nonzero to allow a name without a value (no '=' or ':' on the line) and
138
- call the handler with value NULL in this case. Default is to treat
139
- no-value lines as an error. */
140
- #ifndef INI_ALLOW_NO_VALUE
141
- #define INI_ALLOW_NO_VALUE 0
142
- #endif
143
-
144
- /* Nonzero to use custom ini_malloc, ini_free, and ini_realloc memory
145
- allocation functions (INI_USE_STACK must also be 0). These functions must
146
- have the same signatures as malloc/free/realloc and behave in a similar
147
- way. ini_realloc is only needed if INI_ALLOW_REALLOC is set. */
148
- #ifndef INI_CUSTOM_ALLOCATOR
149
- #define INI_CUSTOM_ALLOCATOR 0
150
- #endif
151
-
152
-
153
- #ifdef __cplusplus
154
- }
155
- #endif
156
-
157
- #endif /* INI_H */
@@ -1,177 +0,0 @@
1
- #include <stdbool.h> // For bool, true, false
2
- #include <stddef.h> // For size_t
3
- #include <ctype.h> // For isdigit
4
-
5
- /**
6
- * @brief Checks if a buffer segment represents a valid JSON number (RFC 8259 compliant).
7
- *
8
- * Follows RFC 8259 Section 6 rules strictly. Numbers MUST have an integer part.
9
- * Operates on a character buffer `str` of explicit `length`.
10
- * Assumes `str` is NOT null-terminated and reads exactly `length` bytes.
11
- * Accessing memory beyond `str + length - 1` is avoided.
12
- *
13
- * JSON Number Format (RFC 8259):
14
- * number = [ minus ] int [ frac ] [ exp ]
15
- * int = zero / ( digit1-9 *DIGIT )
16
- * frac = decimal-point 1*DIGIT
17
- * exp = e [ minus / plus ] 1*DIGIT
18
- *
19
- * @param str Pointer to the start of the character buffer.
20
- * @param length The exact number of characters in the buffer segment to validate.
21
- * @return true if the buffer segment [str, str + length) is a valid JSON number
22
- * per RFC 8259, false otherwise.
23
- */
24
- bool is_valid_json_number(const char *str, size_t length) {
25
- // 1. Handle NULL pointer or Zero Length
26
- if (str == NULL || length == 0) {
27
- return false;
28
- }
29
-
30
- const char *p = str;
31
- const char * const end = str + length; // Pointer to one position *after* the last valid char
32
-
33
- // 2. Optional Minus Sign
34
- // Check bounds before dereferencing
35
- if (p < end && *p == '-') {
36
- p++; // Advance pointer
37
- }
38
-
39
- // 3. Integer Part (Mandatory per RFC 8259)
40
- // Check if we are already at the end (e.g., input was "-" or empty after sign)
41
- if (p >= end) {
42
- return false;
43
- }
44
-
45
- if (*p == '0') {
46
- p++; // Consumed '0'
47
- // Check bounds *before* looking at the next character for leading zero violation
48
- if (p < end && isdigit((unsigned char)*p)) {
49
- return false; // Leading zero rule violation (e.g., "01")
50
- }
51
- // '0' must be followed by '.', 'e', 'E', or the end of the buffer.
52
- } else if (isdigit((unsigned char)*p)) { // Starts with 1-9
53
- p++; // Consume the first digit (1-9)
54
- // Consume subsequent digits, checking bounds in the loop
55
- while (p < end && isdigit((unsigned char)*p)) {
56
- p++;
57
- }
58
- } else {
59
- // Did not start with '0' or '1'-'9' after optional sign. Invalid.
60
- // Correctly rejects ".2", "-.2" etc. even with length check.
61
- return false;
62
- }
63
- // If we reached here, a valid integer part was parsed up to the current 'p'.
64
-
65
- // 4. Optional Fractional Part
66
- // Check bounds before checking for '.'
67
- if (p < end && *p == '.') {
68
- p++; // Consumed '.'
69
- // Check bounds *before* looking for the mandatory digit after '.'
70
- if (p >= end || !isdigit((unsigned char)*p)) {
71
- // Reached end immediately after '.', or next char not a digit (e.g., "1.", "0.")
72
- return false;
73
- }
74
- p++; // Consumed the first digit after '.'
75
- // Consume subsequent digits, checking bounds in the loop
76
- while (p < end && isdigit((unsigned char)*p)) {
77
- p++;
78
- }
79
- }
80
-
81
- // 5. Optional Exponent Part
82
- // Check bounds before checking for 'e'/'E'
83
- if (p < end && (*p == 'e' || *p == 'E')) {
84
- p++; // Consumed 'e' or 'E'
85
- // Check bounds before checking for optional sign
86
- if (p < end && (*p == '+' || *p == '-')) {
87
- p++; // Consumed optional sign
88
- }
89
- // Check bounds *before* looking for the mandatory digit after exponent part
90
- if (p >= end || !isdigit((unsigned char)*p)) {
91
- // Reached end immediately after 'e'/'E'/sign, or next char not a digit (e.g., "1e", "1E+")
92
- return false;
93
- }
94
- p++; // Consumed the first digit after exponent part
95
- // Consume subsequent digits, checking bounds in the loop
96
- while (p < end && isdigit((unsigned char)*p)) {
97
- p++;
98
- }
99
- }
100
-
101
- // 6. Final Check: Must have consumed exactly 'length' characters
102
- // If p == end, we successfully processed all characters from str to str + length - 1
103
- // according to the JSON number rules.
104
- return p == end;
105
- }
106
-
107
- #ifdef JSON_NUMERIC_TEST
108
-
109
- // --- Example Usage ---
110
- #include <stdio.h>
111
- #include <string.h> // For strlen in test driver ONLY
112
-
113
- // Updated test function to use length
114
- void test_json_number_len(const char* str, size_t len) {
115
- // Create a temporary non-null terminated buffer for printing if needed,
116
- // or just print the pointer and length. Be careful printing non-terminated strings.
117
- // Using printf("%.*s", (int)len, str) is safer for printing.
118
- printf("\"%.*s\" (len %zu) -> %s\n", (int)len, str ? str : "(null)", len,
119
- is_valid_json_number(str, len) ? "VALID" : "INVALID");
120
- }
121
-
122
- // Helper for testing null-terminated strings using the length-based function
123
- void test_json_number_nul(const char* str) {
124
- if (str == NULL) {
125
- printf("NULL (len 0) -> %s\n", is_valid_json_number(NULL, 0) ? "VALID" : "INVALID");
126
- return;
127
- }
128
- size_t len = strlen(str); // Use strlen JUST for the test case driver
129
- test_json_number_len(str, len);
130
- }
131
-
132
-
133
- int main() {
134
- printf("--- Testing with NUL-terminated strings ---\n");
135
- printf("--- Valid Examples (RFC 8259 Compliant) ---\n");
136
- test_json_number_nul("0");
137
- test_json_number_nul("1");
138
- test_json_number_nul("-1");
139
- test_json_number_nul("12345");
140
- test_json_number_nul("0.5");
141
- test_json_number_nul("1.234");
142
- test_json_number_nul("1e5");
143
- test_json_number_nul("1E-5");
144
- test_json_number_nul("1.2E+10");
145
- test_json_number_nul("-0.123e-4");
146
-
147
- printf("\n--- Invalid Examples (RFC 8259 Compliant) ---\n");
148
- test_json_number_nul(NULL);
149
- test_json_number_nul("");
150
- test_json_number_nul("-");
151
- test_json_number_nul(".");
152
- test_json_number_nul(".2");
153
- test_json_number_nul("1.");
154
- test_json_number_nul("01");
155
- test_json_number_nul("1e");
156
- test_json_number_nul("1e+");
157
- test_json_number_nul("1.2a");
158
- test_json_number_nul("1.2e5 "); // Trailing space
159
-
160
- printf("\n--- Testing with specific lengths ---\n");
161
- test_json_number_len("12345", 3); // "123" -> VALID (Consumes exactly 3)
162
- test_json_number_len("12a45", 2); // "12" -> VALID (Consumes exactly 2)
163
- test_json_number_len("12a45", 3); // "12a" -> INVALID (a is not part of num, doesn't consume exactly 3 as num)
164
- test_json_number_len("1.5x", 3); // "1.5" -> VALID (Consumes exactly 3)
165
- test_json_number_len("1.5x", 4); // "1.5x" -> INVALID (x is extra)
166
- test_json_number_len("1.", 1); // "1" -> VALID (Consumes exactly 1)
167
- test_json_number_len("1.", 2); // "1." -> INVALID (Needs digit after .)
168
- test_json_number_len("-", 1); // "-" -> INVALID (No digits)
169
- test_json_number_len("-1", 1); // "-" -> INVALID (Only consumes 1, needs the digit too)
170
- test_json_number_len("-1", 2); // "-1" -> VALID (Consumes exactly 2)
171
- test_json_number_len("0", 1); // "0" -> VALID
172
- test_json_number_len("0", 0); // "" -> INVALID (Zero length handled)
173
- test_json_number_len(NULL, 0); // NULL -> INVALID
174
-
175
- return 0;
176
- }
177
- #endif