zsv 1.3.0

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 (240) hide show
  1. checksums.yaml +7 -0
  2. data/CHANGELOG.md +36 -0
  3. data/LICENSE +21 -0
  4. data/README.md +311 -0
  5. data/ext/zsv/common.h +34 -0
  6. data/ext/zsv/extconf.rb +137 -0
  7. data/ext/zsv/options.c +126 -0
  8. data/ext/zsv/options.h +31 -0
  9. data/ext/zsv/options_internal.h +8 -0
  10. data/ext/zsv/parser.c +300 -0
  11. data/ext/zsv/parser.h +62 -0
  12. data/ext/zsv/row.c +122 -0
  13. data/ext/zsv/row.h +39 -0
  14. data/ext/zsv/vendor/zsv-1.3.0/app/2db.c +756 -0
  15. data/ext/zsv/vendor/zsv-1.3.0/app/2json.c +381 -0
  16. data/ext/zsv/vendor/zsv-1.3.0/app/2tsv.c +228 -0
  17. data/ext/zsv/vendor/zsv-1.3.0/app/builtin/help.c +123 -0
  18. data/ext/zsv/vendor/zsv-1.3.0/app/builtin/license.c +39 -0
  19. data/ext/zsv/vendor/zsv-1.3.0/app/builtin/register.c +104 -0
  20. data/ext/zsv/vendor/zsv-1.3.0/app/builtin/thirdparty.c +41 -0
  21. data/ext/zsv/vendor/zsv-1.3.0/app/builtin/unregister.c +1 -0
  22. data/ext/zsv/vendor/zsv-1.3.0/app/builtin/version.c +14 -0
  23. data/ext/zsv/vendor/zsv-1.3.0/app/check/simdutf_wrapper.h +19 -0
  24. data/ext/zsv/vendor/zsv-1.3.0/app/check/utf8.c +116 -0
  25. data/ext/zsv/vendor/zsv-1.3.0/app/check.c +194 -0
  26. data/ext/zsv/vendor/zsv-1.3.0/app/cli.c +796 -0
  27. data/ext/zsv/vendor/zsv-1.3.0/app/cli_const.h +41 -0
  28. data/ext/zsv/vendor/zsv-1.3.0/app/cli_export.h +16 -0
  29. data/ext/zsv/vendor/zsv-1.3.0/app/cli_ini.c +280 -0
  30. data/ext/zsv/vendor/zsv-1.3.0/app/cli_internal.h +36 -0
  31. data/ext/zsv/vendor/zsv-1.3.0/app/compare.c +913 -0
  32. data/ext/zsv/vendor/zsv-1.3.0/app/compare.h +23 -0
  33. data/ext/zsv/vendor/zsv-1.3.0/app/compare_added_column.c +20 -0
  34. data/ext/zsv/vendor/zsv-1.3.0/app/compare_internal.h +140 -0
  35. data/ext/zsv/vendor/zsv-1.3.0/app/compare_sort.c +91 -0
  36. data/ext/zsv/vendor/zsv-1.3.0/app/compare_unique_colname.c +81 -0
  37. data/ext/zsv/vendor/zsv-1.3.0/app/count-pull.c +82 -0
  38. data/ext/zsv/vendor/zsv-1.3.0/app/count.c +404 -0
  39. data/ext/zsv/vendor/zsv-1.3.0/app/desc.c +569 -0
  40. data/ext/zsv/vendor/zsv-1.3.0/app/echo.c +365 -0
  41. data/ext/zsv/vendor/zsv-1.3.0/app/ext_example/my_extension.c +366 -0
  42. data/ext/zsv/vendor/zsv-1.3.0/app/ext_example/mysheet_extension.c +341 -0
  43. data/ext/zsv/vendor/zsv-1.3.0/app/ext_template/YOUR_EXTENSION_zsvext.c +263 -0
  44. data/ext/zsv/vendor/zsv-1.3.0/app/external/inih/ini.c +298 -0
  45. data/ext/zsv/vendor/zsv-1.3.0/app/external/inih/ini.h +157 -0
  46. data/ext/zsv/vendor/zsv-1.3.0/app/external/json_writer-1.01/json_numeric.c +177 -0
  47. data/ext/zsv/vendor/zsv-1.3.0/app/external/json_writer-1.01/jsonwriter.c +444 -0
  48. data/ext/zsv/vendor/zsv-1.3.0/app/external/json_writer-1.01/jsonwriter.h +145 -0
  49. data/ext/zsv/vendor/zsv-1.3.0/app/external/json_writer-1.01/utils.c +110 -0
  50. data/ext/zsv/vendor/zsv-1.3.0/app/external/memfile-1.0/include/memfile.h +15 -0
  51. data/ext/zsv/vendor/zsv-1.3.0/app/external/memfile-1.0/src/memfile.c +64 -0
  52. data/ext/zsv/vendor/zsv-1.3.0/app/external/sglib/sglib.h +1955 -0
  53. data/ext/zsv/vendor/zsv-1.3.0/app/external/simdutf/simdutf.h +6802 -0
  54. data/ext/zsv/vendor/zsv-1.3.0/app/external/sqlite3/sqlite3.c +230517 -0
  55. data/ext/zsv/vendor/zsv-1.3.0/app/external/sqlite3/sqlite3.h +12174 -0
  56. data/ext/zsv/vendor/zsv-1.3.0/app/external/sqlite3/sqlite3_and_csv_vtab.c +2 -0
  57. data/ext/zsv/vendor/zsv-1.3.0/app/external/sqlite3/sqlite3_csv_vtab-mem.c +142 -0
  58. data/ext/zsv/vendor/zsv-1.3.0/app/external/sqlite3/sqlite3_csv_vtab-mem.h +49 -0
  59. data/ext/zsv/vendor/zsv-1.3.0/app/external/sqlite3/sqlite3_csv_vtab-zsv.c +485 -0
  60. data/ext/zsv/vendor/zsv-1.3.0/app/external/sqlite3/sqlite3_csv_vtab.c +1015 -0
  61. data/ext/zsv/vendor/zsv-1.3.0/app/external/sqlite3/sqlite3ext.h +663 -0
  62. data/ext/zsv/vendor/zsv-1.3.0/app/external/sqlite3/vtab_helper.c +85 -0
  63. data/ext/zsv/vendor/zsv-1.3.0/app/external/yajl/build/yajl-2.1.1/include/yajl/yajl_common.h +75 -0
  64. data/ext/zsv/vendor/zsv-1.3.0/app/external/yajl/build/yajl-2.1.1/include/yajl/yajl_gen.h +167 -0
  65. data/ext/zsv/vendor/zsv-1.3.0/app/external/yajl/build/yajl-2.1.1/include/yajl/yajl_parse.h +228 -0
  66. data/ext/zsv/vendor/zsv-1.3.0/app/external/yajl/build/yajl-2.1.1/include/yajl/yajl_tree.h +186 -0
  67. data/ext/zsv/vendor/zsv-1.3.0/app/external/yajl/build/yajl-2.1.1/include/yajl/yajl_version.h +23 -0
  68. data/ext/zsv/vendor/zsv-1.3.0/app/external/yajl/src/api/yajl_common.h +76 -0
  69. data/ext/zsv/vendor/zsv-1.3.0/app/external/yajl/src/api/yajl_gen.h +167 -0
  70. data/ext/zsv/vendor/zsv-1.3.0/app/external/yajl/src/api/yajl_parse.h +238 -0
  71. data/ext/zsv/vendor/zsv-1.3.0/app/external/yajl/src/api/yajl_tree.h +186 -0
  72. data/ext/zsv/vendor/zsv-1.3.0/app/external/yajl/src/yajl.c +184 -0
  73. data/ext/zsv/vendor/zsv-1.3.0/app/external/yajl/src/yajl_alloc.c +52 -0
  74. data/ext/zsv/vendor/zsv-1.3.0/app/external/yajl/src/yajl_alloc.h +34 -0
  75. data/ext/zsv/vendor/zsv-1.3.0/app/external/yajl/src/yajl_buf.c +103 -0
  76. data/ext/zsv/vendor/zsv-1.3.0/app/external/yajl/src/yajl_buf.h +57 -0
  77. data/ext/zsv/vendor/zsv-1.3.0/app/external/yajl/src/yajl_bytestack.h +69 -0
  78. data/ext/zsv/vendor/zsv-1.3.0/app/external/yajl/src/yajl_encode.c +220 -0
  79. data/ext/zsv/vendor/zsv-1.3.0/app/external/yajl/src/yajl_encode.h +34 -0
  80. data/ext/zsv/vendor/zsv-1.3.0/app/external/yajl/src/yajl_gen.c +362 -0
  81. data/ext/zsv/vendor/zsv-1.3.0/app/external/yajl/src/yajl_lex.c +764 -0
  82. data/ext/zsv/vendor/zsv-1.3.0/app/external/yajl/src/yajl_lex.h +117 -0
  83. data/ext/zsv/vendor/zsv-1.3.0/app/external/yajl/src/yajl_parser.c +508 -0
  84. data/ext/zsv/vendor/zsv-1.3.0/app/external/yajl/src/yajl_parser.h +78 -0
  85. data/ext/zsv/vendor/zsv-1.3.0/app/external/yajl/src/yajl_tree.c +505 -0
  86. data/ext/zsv/vendor/zsv-1.3.0/app/external/yajl/src/yajl_version.c +7 -0
  87. data/ext/zsv/vendor/zsv-1.3.0/app/external/yajl_helper/yajl_helper/json_value.h +59 -0
  88. data/ext/zsv/vendor/zsv-1.3.0/app/external/yajl_helper/yajl_helper/yajl_helper.h +208 -0
  89. data/ext/zsv/vendor/zsv-1.3.0/app/external/yajl_helper/yajl_helper.c +795 -0
  90. data/ext/zsv/vendor/zsv-1.3.0/app/external/yajl_helper/yajl_helper_internal.h +28 -0
  91. data/ext/zsv/vendor/zsv-1.3.0/app/flatten.c +851 -0
  92. data/ext/zsv/vendor/zsv-1.3.0/app/jq.c +106 -0
  93. data/ext/zsv/vendor/zsv-1.3.0/app/jq.h +6 -0
  94. data/ext/zsv/vendor/zsv-1.3.0/app/mv.c +113 -0
  95. data/ext/zsv/vendor/zsv-1.3.0/app/noop.c +90 -0
  96. data/ext/zsv/vendor/zsv-1.3.0/app/overwrite.c +295 -0
  97. data/ext/zsv/vendor/zsv-1.3.0/app/paste.c +175 -0
  98. data/ext/zsv/vendor/zsv-1.3.0/app/pretty.c +693 -0
  99. data/ext/zsv/vendor/zsv-1.3.0/app/prop.c +980 -0
  100. data/ext/zsv/vendor/zsv-1.3.0/app/rm.c +131 -0
  101. data/ext/zsv/vendor/zsv-1.3.0/app/select/fixed.c +130 -0
  102. data/ext/zsv/vendor/zsv-1.3.0/app/select/internal.h +118 -0
  103. data/ext/zsv/vendor/zsv-1.3.0/app/select/parallel.c +45 -0
  104. data/ext/zsv/vendor/zsv-1.3.0/app/select/parallel.h +41 -0
  105. data/ext/zsv/vendor/zsv-1.3.0/app/select/processing.c +107 -0
  106. data/ext/zsv/vendor/zsv-1.3.0/app/select/rand.c +20 -0
  107. data/ext/zsv/vendor/zsv-1.3.0/app/select/regex.c +61 -0
  108. data/ext/zsv/vendor/zsv-1.3.0/app/select/search.c +14 -0
  109. data/ext/zsv/vendor/zsv-1.3.0/app/select/selection.c +192 -0
  110. data/ext/zsv/vendor/zsv-1.3.0/app/select/usage.c +72 -0
  111. data/ext/zsv/vendor/zsv-1.3.0/app/select-pull.c +812 -0
  112. data/ext/zsv/vendor/zsv-1.3.0/app/select.c +753 -0
  113. data/ext/zsv/vendor/zsv-1.3.0/app/serialize.c +372 -0
  114. data/ext/zsv/vendor/zsv-1.3.0/app/sheet/curses.h +15 -0
  115. data/ext/zsv/vendor/zsv-1.3.0/app/sheet/cursor.c +119 -0
  116. data/ext/zsv/vendor/zsv-1.3.0/app/sheet/errors.c +45 -0
  117. data/ext/zsv/vendor/zsv-1.3.0/app/sheet/file.c +63 -0
  118. data/ext/zsv/vendor/zsv-1.3.0/app/sheet/file.h +12 -0
  119. data/ext/zsv/vendor/zsv-1.3.0/app/sheet/filter.c +166 -0
  120. data/ext/zsv/vendor/zsv-1.3.0/app/sheet/handlers.c +214 -0
  121. data/ext/zsv/vendor/zsv-1.3.0/app/sheet/handlers_internal.h +128 -0
  122. data/ext/zsv/vendor/zsv-1.3.0/app/sheet/help.c +43 -0
  123. data/ext/zsv/vendor/zsv-1.3.0/app/sheet/index.c +81 -0
  124. data/ext/zsv/vendor/zsv-1.3.0/app/sheet/index.h +25 -0
  125. data/ext/zsv/vendor/zsv-1.3.0/app/sheet/key-bindings.c +325 -0
  126. data/ext/zsv/vendor/zsv-1.3.0/app/sheet/key-bindings.h +73 -0
  127. data/ext/zsv/vendor/zsv-1.3.0/app/sheet/lexer.c +203 -0
  128. data/ext/zsv/vendor/zsv-1.3.0/app/sheet/newline_handler.c +7 -0
  129. data/ext/zsv/vendor/zsv-1.3.0/app/sheet/pivot.c +318 -0
  130. data/ext/zsv/vendor/zsv-1.3.0/app/sheet/procedure.c +134 -0
  131. data/ext/zsv/vendor/zsv-1.3.0/app/sheet/procedure.h +119 -0
  132. data/ext/zsv/vendor/zsv-1.3.0/app/sheet/read-data.c +322 -0
  133. data/ext/zsv/vendor/zsv-1.3.0/app/sheet/screen_buffer.c +203 -0
  134. data/ext/zsv/vendor/zsv-1.3.0/app/sheet/screen_buffer.h +36 -0
  135. data/ext/zsv/vendor/zsv-1.3.0/app/sheet/sheet-sql.c +167 -0
  136. data/ext/zsv/vendor/zsv-1.3.0/app/sheet/sheet_internal.h +36 -0
  137. data/ext/zsv/vendor/zsv-1.3.0/app/sheet/sqlfilter.c +153 -0
  138. data/ext/zsv/vendor/zsv-1.3.0/app/sheet/terminfo.c +32 -0
  139. data/ext/zsv/vendor/zsv-1.3.0/app/sheet/transformation.c +312 -0
  140. data/ext/zsv/vendor/zsv-1.3.0/app/sheet/transformation.h +29 -0
  141. data/ext/zsv/vendor/zsv-1.3.0/app/sheet/ui_buffer.c +266 -0
  142. data/ext/zsv/vendor/zsv-1.3.0/app/sheet/usage.c +9 -0
  143. data/ext/zsv/vendor/zsv-1.3.0/app/sheet/utf8-width.c +60 -0
  144. data/ext/zsv/vendor/zsv-1.3.0/app/sheet.c +1007 -0
  145. data/ext/zsv/vendor/zsv-1.3.0/app/sql.c +453 -0
  146. data/ext/zsv/vendor/zsv-1.3.0/app/sql_internal.c +101 -0
  147. data/ext/zsv/vendor/zsv-1.3.0/app/sql_internal.h +49 -0
  148. data/ext/zsv/vendor/zsv-1.3.0/app/stack.c +393 -0
  149. data/ext/zsv/vendor/zsv-1.3.0/app/utils/arg.c +322 -0
  150. data/ext/zsv/vendor/zsv-1.3.0/app/utils/cache.c +228 -0
  151. data/ext/zsv/vendor/zsv-1.3.0/app/utils/cat.c +91 -0
  152. data/ext/zsv/vendor/zsv-1.3.0/app/utils/chunk.c +240 -0
  153. data/ext/zsv/vendor/zsv-1.3.0/app/utils/chunk.h +63 -0
  154. data/ext/zsv/vendor/zsv-1.3.0/app/utils/clock.c +57 -0
  155. data/ext/zsv/vendor/zsv-1.3.0/app/utils/db.c +148 -0
  156. data/ext/zsv/vendor/zsv-1.3.0/app/utils/dirs-no-jq.c +2 -0
  157. data/ext/zsv/vendor/zsv-1.3.0/app/utils/dirs.c +427 -0
  158. data/ext/zsv/vendor/zsv-1.3.0/app/utils/dirs_from_json.c +253 -0
  159. data/ext/zsv/vendor/zsv-1.3.0/app/utils/dirs_to_json.c +121 -0
  160. data/ext/zsv/vendor/zsv-1.3.0/app/utils/dl.c +20 -0
  161. data/ext/zsv/vendor/zsv-1.3.0/app/utils/emcc/fs_api.c +159 -0
  162. data/ext/zsv/vendor/zsv-1.3.0/app/utils/err.c +24 -0
  163. data/ext/zsv/vendor/zsv-1.3.0/app/utils/file-mem.c +180 -0
  164. data/ext/zsv/vendor/zsv-1.3.0/app/utils/file.c +256 -0
  165. data/ext/zsv/vendor/zsv-1.3.0/app/utils/index.c +197 -0
  166. data/ext/zsv/vendor/zsv-1.3.0/app/utils/index.h +49 -0
  167. data/ext/zsv/vendor/zsv-1.3.0/app/utils/jq.c +400 -0
  168. data/ext/zsv/vendor/zsv-1.3.0/app/utils/json.c +120 -0
  169. data/ext/zsv/vendor/zsv-1.3.0/app/utils/mem.c +18 -0
  170. data/ext/zsv/vendor/zsv-1.3.0/app/utils/memmem.c +132 -0
  171. data/ext/zsv/vendor/zsv-1.3.0/app/utils/os.c +178 -0
  172. data/ext/zsv/vendor/zsv-1.3.0/app/utils/overwrite.c +258 -0
  173. data/ext/zsv/vendor/zsv-1.3.0/app/utils/overwrite_writer.c +246 -0
  174. data/ext/zsv/vendor/zsv-1.3.0/app/utils/pcre2-8/pcre2-8-test.c +123 -0
  175. data/ext/zsv/vendor/zsv-1.3.0/app/utils/pcre2-8/pcre2-8.c +153 -0
  176. data/ext/zsv/vendor/zsv-1.3.0/app/utils/pcre2-8/pcre2-8.h +54 -0
  177. data/ext/zsv/vendor/zsv-1.3.0/app/utils/prop.c +267 -0
  178. data/ext/zsv/vendor/zsv-1.3.0/app/utils/signal.c +53 -0
  179. data/ext/zsv/vendor/zsv-1.3.0/app/utils/string.c +357 -0
  180. data/ext/zsv/vendor/zsv-1.3.0/app/utils/win/dir_exists_longpath.c +83 -0
  181. data/ext/zsv/vendor/zsv-1.3.0/app/utils/win/dl.c +33 -0
  182. data/ext/zsv/vendor/zsv-1.3.0/app/utils/win/fopen_longpath.c +184 -0
  183. data/ext/zsv/vendor/zsv-1.3.0/app/utils/win/foreach_dirent_longpath.c +292 -0
  184. data/ext/zsv/vendor/zsv-1.3.0/app/utils/win/io.c +259 -0
  185. data/ext/zsv/vendor/zsv-1.3.0/app/utils/win/io.h +13 -0
  186. data/ext/zsv/vendor/zsv-1.3.0/app/utils/win/mkdir_longpath.c +255 -0
  187. data/ext/zsv/vendor/zsv-1.3.0/app/utils/win/remove_longpath.c +96 -0
  188. data/ext/zsv/vendor/zsv-1.3.0/app/utils/writer.c +361 -0
  189. data/ext/zsv/vendor/zsv-1.3.0/app/zsv_command.h +40 -0
  190. data/ext/zsv/vendor/zsv-1.3.0/app/zsv_command_standalone.c +16 -0
  191. data/ext/zsv/vendor/zsv-1.3.0/app/zsv_main.h +44 -0
  192. data/ext/zsv/vendor/zsv-1.3.0/examples/js/zsv_parser_api_dummy.c +3 -0
  193. data/ext/zsv/vendor/zsv-1.3.0/examples/lib/parse_by_chunk.c +100 -0
  194. data/ext/zsv/vendor/zsv-1.3.0/examples/lib/print_my_column.c +143 -0
  195. data/ext/zsv/vendor/zsv-1.3.0/examples/lib/pull.c +89 -0
  196. data/ext/zsv/vendor/zsv-1.3.0/examples/lib/simple.c +123 -0
  197. data/ext/zsv/vendor/zsv-1.3.0/fuzz/fuzz.c +16 -0
  198. data/ext/zsv/vendor/zsv-1.3.0/include/zsv/api.h +336 -0
  199. data/ext/zsv/vendor/zsv-1.3.0/include/zsv/common.h +361 -0
  200. data/ext/zsv/vendor/zsv-1.3.0/include/zsv/ext/implementation.h +62 -0
  201. data/ext/zsv/vendor/zsv-1.3.0/include/zsv/ext/implementation_private.h +113 -0
  202. data/ext/zsv/vendor/zsv-1.3.0/include/zsv/ext/sheet.h +73 -0
  203. data/ext/zsv/vendor/zsv-1.3.0/include/zsv/ext.h +329 -0
  204. data/ext/zsv/vendor/zsv-1.3.0/include/zsv/utils/arg.h +90 -0
  205. data/ext/zsv/vendor/zsv-1.3.0/include/zsv/utils/cache.h +49 -0
  206. data/ext/zsv/vendor/zsv-1.3.0/include/zsv/utils/clock.h +36 -0
  207. data/ext/zsv/vendor/zsv-1.3.0/include/zsv/utils/compiler.h +58 -0
  208. data/ext/zsv/vendor/zsv-1.3.0/include/zsv/utils/db.h +19 -0
  209. data/ext/zsv/vendor/zsv-1.3.0/include/zsv/utils/dirs.h +147 -0
  210. data/ext/zsv/vendor/zsv-1.3.0/include/zsv/utils/dl.h +22 -0
  211. data/ext/zsv/vendor/zsv-1.3.0/include/zsv/utils/emcc/fs_api.h +28 -0
  212. data/ext/zsv/vendor/zsv-1.3.0/include/zsv/utils/err.h +22 -0
  213. data/ext/zsv/vendor/zsv-1.3.0/include/zsv/utils/file-mem.h +17 -0
  214. data/ext/zsv/vendor/zsv-1.3.0/include/zsv/utils/file.h +99 -0
  215. data/ext/zsv/vendor/zsv-1.3.0/include/zsv/utils/jq.h +65 -0
  216. data/ext/zsv/vendor/zsv-1.3.0/include/zsv/utils/json.h +19 -0
  217. data/ext/zsv/vendor/zsv-1.3.0/include/zsv/utils/mem.h +19 -0
  218. data/ext/zsv/vendor/zsv-1.3.0/include/zsv/utils/memmem.h +13 -0
  219. data/ext/zsv/vendor/zsv-1.3.0/include/zsv/utils/os.h +54 -0
  220. data/ext/zsv/vendor/zsv-1.3.0/include/zsv/utils/overwrite.h +71 -0
  221. data/ext/zsv/vendor/zsv-1.3.0/include/zsv/utils/overwrite_writer.h +53 -0
  222. data/ext/zsv/vendor/zsv-1.3.0/include/zsv/utils/prop.h +107 -0
  223. data/ext/zsv/vendor/zsv-1.3.0/include/zsv/utils/signal.h +18 -0
  224. data/ext/zsv/vendor/zsv-1.3.0/include/zsv/utils/sql.h +11 -0
  225. data/ext/zsv/vendor/zsv-1.3.0/include/zsv/utils/string.h +148 -0
  226. data/ext/zsv/vendor/zsv-1.3.0/include/zsv/utils/utf8.h +41 -0
  227. data/ext/zsv/vendor/zsv-1.3.0/include/zsv/utils/win/dl.h +25 -0
  228. data/ext/zsv/vendor/zsv-1.3.0/include/zsv/utils/writer.h +101 -0
  229. data/ext/zsv/vendor/zsv-1.3.0/include/zsv/zsv_export.h +33 -0
  230. data/ext/zsv/vendor/zsv-1.3.0/include/zsv.h +20 -0
  231. data/ext/zsv/vendor/zsv-1.3.0/src/vector_delim.c +60 -0
  232. data/ext/zsv/vendor/zsv-1.3.0/src/zsv.c +484 -0
  233. data/ext/zsv/vendor/zsv-1.3.0/src/zsv_internal.c +731 -0
  234. data/ext/zsv/vendor/zsv-1.3.0/src/zsv_scan_delim.c +285 -0
  235. data/ext/zsv/vendor/zsv-1.3.0/src/zsv_scan_fixed.c +88 -0
  236. data/ext/zsv/vendor/zsv-1.3.0/src/zsv_strencode.c +51 -0
  237. data/ext/zsv/zsv_ext.c +343 -0
  238. data/lib/zsv/version.rb +5 -0
  239. data/lib/zsv.rb +81 -0
  240. metadata +340 -0
@@ -0,0 +1,693 @@
1
+ /*
2
+ * Copyright (C) 2021 Liquidaty and zsv contributors. All rights reserved.
3
+ *
4
+ * This file is part of zsv/lib, distributed under the MIT license as defined at
5
+ * https://opensource.org/licenses/MIT
6
+ */
7
+
8
+ #include <utf8proc.h>
9
+ #include <stdio.h>
10
+ #include <stdlib.h>
11
+ #include <string.h>
12
+ #include <math.h>
13
+
14
+ #define ZSV_COMMAND pretty
15
+ #include "zsv_command.h"
16
+ #include <zsv/utils/string.h>
17
+
18
+ #define ZSV_PRETTY_DEFAULT_LINE_MAX_WIDTH 160
19
+ #define ZSV_PRETTY_DEFAULT_COLUMN_MAX_WIDTH 35
20
+ #define ZSV_PRETTY_DEFAULT_COLUMN_MIN_WIDTH 2
21
+
22
+ #define ZSV_PRETTY_DEFAULT_CACHE_MAX 100
23
+
24
+ struct zsv_pretty_opts {
25
+ size_t line_width_max;
26
+ size_t column_width_min;
27
+ size_t column_width_max;
28
+ size_t cache_max_rows;
29
+
30
+ FILE *out;
31
+
32
+ unsigned char ignore_header_lengths : 1;
33
+ unsigned char markdown : 1;
34
+ unsigned char markdown_pad : 1;
35
+ unsigned char no_align : 1;
36
+ unsigned char dummy : 4;
37
+ };
38
+
39
+ enum zsv_pretty_status {
40
+ zsv_pretty_status_ok = 0,
41
+ zsv_pretty_status_error,
42
+ zsv_pretty_status_memory,
43
+ zsv_pretty_status_cache_updated,
44
+ zsv_pretty_status_cache_full,
45
+ // ...
46
+ zsv_pretty_status_end
47
+ };
48
+
49
+ #ifdef WIN32
50
+ #include <windows.h>
51
+ static size_t get_console_width(void) {
52
+ CONSOLE_SCREEN_BUFFER_INFO csbi;
53
+ int ret;
54
+ ret = GetConsoleScreenBufferInfo(GetStdHandle(STD_OUTPUT_HANDLE), &csbi);
55
+ if (ret)
56
+ return csbi.dwSize.X;
57
+ return 0;
58
+ }
59
+ #else
60
+ #include <sys/ioctl.h>
61
+ #include <stdio.h>
62
+ #include <stdlib.h>
63
+
64
+ #ifndef HAVE_TGETENT
65
+ static size_t get_console_width(void) {
66
+ return 0;
67
+ }
68
+
69
+ #else
70
+ #include <termcap.h>
71
+ static size_t get_console_width(void) {
72
+ char termbuf[2048];
73
+ char *termtype = getenv("TERM");
74
+ if (tgetent(termbuf, termtype) < 0)
75
+ return 0;
76
+
77
+ int columns = tgetnum("co");
78
+ return columns > 0 ? columns : 0;
79
+ }
80
+ #endif // HAVE_TGETENT
81
+
82
+ #endif // WIN32-else
83
+
84
+ const unsigned char UTF8_ELLIPSIS[] = {226, 128, 166, '\0'}; // e2 80 a6
85
+
86
+ struct zsv_cached_row {
87
+ struct zsv_cached_row *next;
88
+ unsigned char **values;
89
+ unsigned int count;
90
+ };
91
+
92
+ static struct zsv_cell zsv_pretty_get_cell(zsv_parser parser, struct zsv_cached_row *r, unsigned ix) {
93
+ struct zsv_cell c;
94
+ memset(&c, 0, sizeof(c));
95
+ if (r) {
96
+ if (ix < r->count)
97
+ c.str = r->values[ix];
98
+ if (!c.str)
99
+ c.str = (unsigned char *)"";
100
+ c.len = strlen((char *)c.str);
101
+ } else
102
+ c = zsv_get_cell(parser, ix);
103
+ return c;
104
+ }
105
+
106
+ static void zsv_cached_rows_delete(struct zsv_cached_row *first) {
107
+ for (struct zsv_cached_row *next, *e = first; e; e = next) {
108
+ next = e->next;
109
+ for (unsigned int i = 0; i < e->count; i++)
110
+ free(e->values[i]);
111
+ free(e->values);
112
+ free(e);
113
+ }
114
+ }
115
+
116
+ static struct zsv_cached_row *zsv_pretty_dupe_row(zsv_parser parser) {
117
+ unsigned col_count = zsv_cell_count(parser);
118
+ if (col_count) {
119
+ struct zsv_cached_row *r = calloc(1, sizeof(*r));
120
+ if (r) {
121
+ r->count = col_count;
122
+ r->values = calloc(r->count, sizeof(*r->values));
123
+ if (!r->values) {
124
+ fprintf(stderr, "Error: out of memory\n");
125
+ free(r);
126
+ return NULL;
127
+ }
128
+
129
+ for (unsigned int i = 0; i < r->count; i++) {
130
+ struct zsv_cell cell = zsv_get_cell(parser, i);
131
+ cell.str = (unsigned char *)zsv_strtrim(cell.str, &cell.len);
132
+ if ((r->values[i] = malloc(cell.len + 1))) {
133
+ memcpy(r->values[i], cell.str, cell.len);
134
+ r->values[i][cell.len] = '\0';
135
+ }
136
+ }
137
+ return r;
138
+ }
139
+ }
140
+ return NULL;
141
+ }
142
+
143
+ struct zsv_pretty_data {
144
+ int err;
145
+ size_t row_ix;
146
+ zsv_parser parser;
147
+ enum zsv_status parser_status;
148
+
149
+ size_t (*write)(const void *, size_t, size_t, void *);
150
+ void *write_arg;
151
+
152
+ struct {
153
+ size_t printed;
154
+ size_t max;
155
+ } line;
156
+
157
+ struct {
158
+ struct zsv_cached_row *c_rows;
159
+ struct zsv_cached_row **next;
160
+ size_t count;
161
+ size_t max;
162
+ char full;
163
+ } cache;
164
+
165
+ struct {
166
+ size_t *values;
167
+ size_t allocated;
168
+ size_t used;
169
+ size_t min, max;
170
+ } widths;
171
+
172
+ size_t current_table_lines_written;
173
+
174
+ size_t first_column_count;
175
+
176
+ unsigned char no_trim : 1;
177
+ unsigned char verbose : 1;
178
+ unsigned char ignore_header_lengths : 1;
179
+ unsigned char markdown : 1;
180
+ unsigned char markdown_pad : 1;
181
+ unsigned char no_align : 1;
182
+ unsigned char dummy : 2;
183
+ };
184
+
185
+ static size_t zsv_pretty_get_width(struct zsv_pretty_data *data, size_t ix) {
186
+ if (ix < data->widths.used)
187
+ return data->widths.values[ix];
188
+ return 0;
189
+ }
190
+
191
+ static size_t zsv_pretty_get_row_count(struct zsv_pretty_data *data, struct zsv_cached_row *r) {
192
+ return r ? r->count : zsv_cell_count(data->parser);
193
+ }
194
+
195
+ static void zsv_pretty_output_lineend(struct zsv_pretty_data *data, struct zsv_cached_row *r) {
196
+ size_t columns_used = zsv_pretty_get_row_count(data, r);
197
+ // size_t columns_used = zsv_row_cells_count(r);
198
+ char empty_line = columns_used == 0 || (columns_used == 1 && zsv_pretty_get_cell(data->parser, r, 0).len == 0);
199
+
200
+ if (empty_line)
201
+ data->current_table_lines_written = 0;
202
+ else if (columns_used > 1) {
203
+ data->current_table_lines_written++;
204
+ if (data->markdown || data->markdown_pad) {
205
+ if (data->current_table_lines_written == 1) {
206
+ data->write("|\n", 1, 2, data->write_arg);
207
+ size_t printed = 0;
208
+ for (unsigned col_ix = 0; printed < data->line.max && col_ix < columns_used; col_ix++) {
209
+ data->write("|", 1, 1, data->write_arg);
210
+ printed++;
211
+ if (data->markdown_pad && col_ix <= data->widths.used) {
212
+ int j = zsv_pretty_get_width(data, col_ix);
213
+ if (!j)
214
+ j = 1;
215
+ for (; j-- && printed <= data->line.max; printed++)
216
+ data->write("-", 1, 1, data->write_arg);
217
+ } else
218
+ data->write("--", 1, 2, data->write_arg);
219
+ }
220
+ }
221
+ data->write("|", 1, 1, data->write_arg);
222
+ }
223
+ }
224
+ data->write("\n", 1, 1, data->write_arg);
225
+
226
+ data->line.printed = 0;
227
+ }
228
+
229
+ static void zsv_pretty_output_linestart(struct zsv_pretty_data *data) {
230
+ if (data->markdown || data->markdown_pad)
231
+ data->write("|", 1, 1, data->write_arg);
232
+ }
233
+
234
+ static size_t is_newline(const unsigned char *utf8, int wchar_len) {
235
+ return (wchar_len == 1 && strchr("\n\r", utf8[0]));
236
+ // add multibyte newline check?
237
+ }
238
+
239
+ // utf8_bytes_up_to_max_width: return number of bytes used up to a maximum screen width
240
+ // set to the actual width used
241
+ static size_t utf8_bytes_up_to_max_width_and_replace_newlines(unsigned char *str1, size_t len1, size_t max_width,
242
+ size_t *used_width, int *err) {
243
+ utf8proc_int32_t codepoint1;
244
+ utf8proc_ssize_t bytes_read1;
245
+ size_t width_so_far = *used_width = 0;
246
+ int this_char_width = 0;
247
+ size_t bytes_so_far = 0;
248
+ while (bytes_so_far < len1) {
249
+ bytes_read1 = utf8proc_iterate((utf8proc_uint8_t *)str1 + bytes_so_far, len1, &codepoint1);
250
+ if (!bytes_read1) {
251
+ bytes_read1 = 1;
252
+ *err = 1;
253
+ this_char_width = 1;
254
+ } else if (is_newline(str1 + bytes_so_far, bytes_read1)) {
255
+ memset((void *)(str1 + bytes_so_far), ' ', bytes_read1);
256
+ continue;
257
+ } else {
258
+ this_char_width = utf8proc_charwidth(codepoint1);
259
+ if (width_so_far + this_char_width > max_width) {
260
+ *used_width = width_so_far;
261
+ return bytes_so_far;
262
+ }
263
+ }
264
+ width_so_far += this_char_width;
265
+ bytes_so_far += bytes_read1;
266
+ }
267
+ *used_width = width_so_far;
268
+ return bytes_so_far;
269
+ }
270
+
271
+ void zsv_pretty_write_cell(unsigned char *buff, size_t bytes, struct zsv_pretty_data *data, size_t max_col_width,
272
+ char last_column) {
273
+ if (data->line.max > data->line.printed) {
274
+ size_t used_width = 0;
275
+ size_t max_width = max_col_width == 0 || max_col_width > data->line.max - data->line.printed
276
+ ? data->line.max - data->line.printed
277
+ : max_col_width;
278
+ if (bytes) {
279
+ int utf8_err;
280
+ size_t bytes_to_print =
281
+ utf8_bytes_up_to_max_width_and_replace_newlines(buff, bytes, max_width, &used_width, &utf8_err);
282
+ char ellipsis = 0;
283
+ if (bytes_to_print && bytes_to_print < bytes && max_col_width == max_width && used_width == max_col_width) {
284
+ ellipsis = 1;
285
+ if (max_width > 1)
286
+ bytes_to_print =
287
+ utf8_bytes_up_to_max_width_and_replace_newlines(buff, bytes, max_width - 1, &used_width, &utf8_err);
288
+ }
289
+ if (bytes_to_print) {
290
+ if ((data->markdown || data->markdown_pad) &&
291
+ (memchr(buff, '|', bytes_to_print) || memchr(buff, '\\', bytes_to_print))) {
292
+ char *tmp = malloc(bytes_to_print * 2);
293
+ if (!tmp)
294
+ data->parser_status = zsv_status_memory;
295
+ else {
296
+ size_t tmp_len = 0;
297
+ for (size_t i = 0; i < bytes_to_print; i++) {
298
+ if (memchr("|\\", buff[i], 2))
299
+ tmp[tmp_len++] = '\\';
300
+ tmp[tmp_len++] = buff[i];
301
+ }
302
+ data->write(tmp, 1, tmp_len, data->write_arg);
303
+ free(tmp);
304
+ }
305
+ } else
306
+ data->write(buff, 1, bytes_to_print, data->write_arg);
307
+ data->line.printed += used_width;
308
+
309
+ if (ellipsis) {
310
+ data->write((unsigned char *)UTF8_ELLIPSIS, 1, strlen((const char *)UTF8_ELLIPSIS), data->write_arg);
311
+ data->line.printed++;
312
+ used_width++;
313
+ }
314
+ } else
315
+ used_width = 0;
316
+ }
317
+
318
+ if (data->markdown_pad || (!data->markdown && !last_column)) {
319
+ size_t remaining = max_width - used_width;
320
+ while (remaining) {
321
+ data->write((unsigned char *)" ", 1, 1, data->write_arg);
322
+ data->line.printed++;
323
+ --remaining;
324
+ }
325
+ }
326
+ }
327
+ }
328
+
329
+ #define zsv_pretty_output_col_spacer(data) \
330
+ do { \
331
+ if (data->line.printed < data->line.max) { \
332
+ data->write((unsigned char *)"|", 1, 1, data->write_arg); \
333
+ data->line.printed++; \
334
+ } \
335
+ } while (0)
336
+
337
+ static void zsv_pretty_output_row(struct zsv_pretty_data *data, struct zsv_cached_row *r) {
338
+ size_t columns_used = zsv_pretty_get_row_count(data, r);
339
+ size_t columns_to_print = data->first_column_count > columns_used ? data->first_column_count : columns_used;
340
+ if (columns_used == 1) {
341
+ struct zsv_cell cell = zsv_pretty_get_cell(data->parser, r, 0);
342
+ if (cell.len)
343
+ zsv_pretty_write_cell(cell.str, cell.len, data, 0, 1);
344
+ } else {
345
+ for (unsigned col_ix = 0; col_ix < columns_used; col_ix++) {
346
+ if (col_ix > 0)
347
+ zsv_pretty_output_col_spacer(data);
348
+ else
349
+ zsv_pretty_output_linestart(data);
350
+ struct zsv_cell cell = zsv_pretty_get_cell(data->parser, r, col_ix);
351
+ zsv_pretty_write_cell(cell.str, cell.len, data, zsv_pretty_get_width(data, col_ix),
352
+ col_ix + 1 == columns_to_print);
353
+ }
354
+ }
355
+
356
+ // pad the output with additional cells, if this row had fewer than the first row
357
+ if (!data->no_align && !data->markdown && !data->markdown_pad) {
358
+ if (data->first_column_count < 2)
359
+ data->first_column_count = columns_used;
360
+ else {
361
+ unsigned char empty[2];
362
+ empty[0] = '\0';
363
+ empty[1] = '\0';
364
+ while (columns_used > 1 && columns_used < data->first_column_count) {
365
+ zsv_pretty_output_col_spacer(data);
366
+ zsv_pretty_write_cell(empty, 0, data, zsv_pretty_get_width(data, columns_used),
367
+ columns_used + 1 == columns_to_print);
368
+ columns_used++;
369
+ }
370
+ }
371
+ }
372
+ zsv_pretty_output_lineend(data, r);
373
+ }
374
+
375
+ static void zsv_pretty_output_cache(struct zsv_pretty_data *data) {
376
+ for (struct zsv_cached_row *c_row = data->cache.c_rows; c_row; c_row = c_row->next)
377
+ zsv_pretty_output_row(data, c_row);
378
+ }
379
+
380
+ static void zsv_pretty_clear_cache(struct zsv_pretty_data *data) {
381
+ zsv_cached_rows_delete(data->cache.c_rows);
382
+ data->cache.c_rows = NULL;
383
+ data->cache.next = &data->cache.c_rows;
384
+ data->cache.count = 0;
385
+ }
386
+
387
+ static void set_min_col_widths(struct zsv_pretty_data *data, size_t used) {
388
+ for (unsigned i = 0; i < used; i++)
389
+ if (data->widths.values[i] < data->widths.min)
390
+ data->widths.values[i] = data->widths.min;
391
+ }
392
+
393
+ static void zsv_pretty_reset_column_widths(struct zsv_pretty_data *data) {
394
+ zsv_pretty_output_cache(data);
395
+ zsv_pretty_clear_cache(data);
396
+ data->cache.full = 0;
397
+ if (data->widths.used && data->widths.values) {
398
+ memset(data->widths.values, 0, data->widths.used * sizeof(*data->widths.values));
399
+ set_min_col_widths(data, data->widths.used);
400
+ }
401
+ data->widths.used = 0;
402
+ data->first_column_count = 0;
403
+ }
404
+
405
+ static enum zsv_pretty_status zsv_pretty_add_to_cache(struct zsv_pretty_data *data) {
406
+ enum zsv_pretty_status status = zsv_pretty_status_error;
407
+ if (data->cache.full)
408
+ status = zsv_pretty_status_cache_full;
409
+ else {
410
+ struct zsv_cached_row *dupe = zsv_pretty_dupe_row(data->parser);
411
+ if (!dupe)
412
+ status = zsv_pretty_status_memory;
413
+ else {
414
+ *data->cache.next = dupe;
415
+ data->cache.next = &dupe->next;
416
+ if (++data->cache.count >= data->cache.max)
417
+ data->cache.full = 1;
418
+ status = zsv_pretty_status_cache_updated;
419
+ }
420
+ }
421
+ return status;
422
+ }
423
+
424
+ static enum zsv_pretty_status zsv_pretty_update_column_widths(struct zsv_pretty_data *data) {
425
+ size_t columns_used = zsv_cell_count(data->parser);
426
+ if (columns_used > 1) {
427
+ if (columns_used > data->widths.allocated) {
428
+ size_t *new_width_values = realloc(data->widths.values, columns_used * sizeof(*new_width_values));
429
+ if (!new_width_values)
430
+ return zsv_pretty_status_memory;
431
+ // zero out the newly-allocated memory
432
+ for (unsigned int j = data->widths.allocated; j < columns_used; j++)
433
+ new_width_values[j] = data->widths.min;
434
+
435
+ data->widths.values = new_width_values;
436
+ data->widths.allocated = columns_used;
437
+ }
438
+ for (unsigned i = 0; i < columns_used; i++) {
439
+ // struct zsv_row_cell v = zsv_row_get_cell(r, i);
440
+ struct zsv_cell cell = zsv_get_cell(data->parser, i);
441
+ size_t cell_width;
442
+ int utf8_err;
443
+ utf8_bytes_up_to_max_width_and_replace_newlines(cell.str, cell.len, data->line.max + 1, &cell_width, &utf8_err);
444
+ if (cell_width > data->widths.values[i] && data->widths.values[i] < data->widths.max)
445
+ data->widths.values[i] = cell_width > data->widths.max ? data->widths.max : cell_width;
446
+ }
447
+ if (data->widths.used < columns_used)
448
+ data->widths.used = columns_used;
449
+ }
450
+ return zsv_pretty_status_ok;
451
+ }
452
+
453
+ /*
454
+ zsv_pretty_row():
455
+ - if the number of columns == 1, then:
456
+ - output + clear the cache, and output the column
457
+ - alternatively, if data length > 0, add to cache or print if cache is full, but don't update lengths
458
+ - if the number of columns > 1, then:
459
+ - if the cache is not full, update column lengths and cache the column
460
+ - if the cache is full, then:
461
+ - if the cache is not printed, print it
462
+ - output the column with the given lengths
463
+ */
464
+ static void zsv_pretty_row(void *ctx) {
465
+ struct zsv_pretty_data *data = ctx;
466
+ if (data->err)
467
+ return;
468
+
469
+ unsigned int columns_used = zsv_cell_count(data->parser);
470
+ if (columns_used < 2 && (zsv_pretty_get_cell(data->parser, NULL, 0).len == 0 || data->widths.used == 0)) {
471
+ zsv_pretty_reset_column_widths(data);
472
+ zsv_pretty_output_row(data, NULL);
473
+ } else { // >= 2 columns
474
+ switch (zsv_pretty_add_to_cache(data)) {
475
+ case zsv_pretty_status_cache_updated: // row was added to cache
476
+ if (!data->ignore_header_lengths || data->cache.count > 1)
477
+ zsv_pretty_update_column_widths(data);
478
+ break;
479
+ case zsv_pretty_status_cache_full: // row not added
480
+ if (data->cache.c_rows) {
481
+ zsv_pretty_output_cache(data);
482
+ zsv_pretty_clear_cache(data);
483
+ }
484
+ zsv_pretty_output_row(data, NULL);
485
+ break;
486
+ default:
487
+ break;
488
+ }
489
+ }
490
+
491
+ if (++data->row_ix % 1000 == 0 && data->verbose)
492
+ fprintf(stderr, "Processed %zu rows\n", data->row_ix);
493
+ }
494
+
495
+ const char *zsv_pretty_usage_msg[] = {
496
+ APPNAME ": print one or more tables of data in fixed-width format",
497
+ "",
498
+ "Usage: " APPNAME " [options] <filename>",
499
+ "",
500
+ "Options:",
501
+ " -o,--output <filename> : save output the the specified file",
502
+ " -W,--width <n> : max line width to output, try to detect automatically if omitted",
503
+ " -p,--rows <n> : number of (preview) rows to calculated widths from if omitted (default: 150)",
504
+ " -C,--max-col-width <n> : max column width. if not provided, defaults to 50",
505
+ " -D,--min-col-width <n> : min column width. if not provided, defaults to 2",
506
+ " -A,--no-align : do not fill in additional cells if first row has more columns than current row",
507
+ " -m,--markdown : output table in markdown format",
508
+ " -M,--markdown-pad : output table in markdown format with padding",
509
+ " -H,--ignore-header-lengths : ignore header lengths in determining column width",
510
+ NULL,
511
+ };
512
+
513
+ static void zsv_pretty_usage(void) {
514
+ for (size_t i = 0; zsv_pretty_usage_msg[i]; i++)
515
+ fprintf(stdout, "%s\n", zsv_pretty_usage_msg[i]);
516
+ }
517
+
518
+ static void zsv_pretty_flush(struct zsv_pretty_data *data) {
519
+ if (data->parser)
520
+ zsv_finish(data->parser);
521
+ if (data->cache.c_rows) {
522
+ zsv_pretty_output_cache(data);
523
+ zsv_pretty_clear_cache(data);
524
+ }
525
+ }
526
+
527
+ static void zsv_pretty_destroy(struct zsv_pretty_data *data) {
528
+ if (data->parser) {
529
+ zsv_finish(data->parser);
530
+ zsv_delete(data->parser);
531
+ }
532
+ // zsv_row_destroy(data->row);
533
+ zsv_pretty_clear_cache(data);
534
+
535
+ if (data->widths.values)
536
+ free(data->widths.values);
537
+
538
+ free(data);
539
+ }
540
+
541
+ static struct zsv_pretty_data *zsv_pretty_init(struct zsv_pretty_opts *opts, struct zsv_opts *parser_opts,
542
+ struct zsv_prop_handler *custom_prop_handler, const char *input_path) {
543
+ struct zsv_pretty_data *data = calloc(1, sizeof(*data));
544
+ if (!data)
545
+ return NULL;
546
+
547
+ data->ignore_header_lengths = opts->ignore_header_lengths;
548
+ data->markdown = opts->markdown;
549
+ data->markdown_pad = opts->markdown_pad;
550
+ data->no_align = opts->no_align;
551
+
552
+ if (opts->line_width_max)
553
+ data->line.max = opts->line_width_max;
554
+ else if (!(data->line.max = get_console_width()))
555
+ data->line.max = ZSV_PRETTY_DEFAULT_LINE_MAX_WIDTH;
556
+
557
+ parser_opts->row_handler = zsv_pretty_row;
558
+ parser_opts->ctx = data;
559
+ zsv_new_with_properties(parser_opts, custom_prop_handler, input_path, &data->parser);
560
+
561
+ data->write = (size_t(*)(const void *, size_t, size_t, void *))fwrite;
562
+ data->write_arg = opts->out ? opts->out : stdout;
563
+
564
+ zsv_pretty_clear_cache(data);
565
+
566
+ if (opts->column_width_min)
567
+ data->widths.min = opts->column_width_min;
568
+ else
569
+ data->widths.min = ZSV_PRETTY_DEFAULT_COLUMN_MIN_WIDTH;
570
+
571
+ if (opts->column_width_max)
572
+ data->widths.max = opts->column_width_max;
573
+ else
574
+ data->widths.max = ZSV_PRETTY_DEFAULT_COLUMN_MAX_WIDTH;
575
+
576
+ if (opts->cache_max_rows)
577
+ data->cache.max = opts->cache_max_rows;
578
+ else
579
+ data->cache.max = ZSV_PRETTY_DEFAULT_CACHE_MAX;
580
+
581
+ return data;
582
+ }
583
+
584
+ int ZSV_MAIN_FUNC(ZSV_COMMAND)(int argc, const char *argv[], struct zsv_opts *parser_opts,
585
+ struct zsv_prop_handler *custom_prop_handler) {
586
+ if (argc > 1 && (!strcmp(argv[1], "-h") || !strcmp(argv[1], "--help"))) {
587
+ zsv_pretty_usage();
588
+ return 0;
589
+ }
590
+
591
+ int rc = 0;
592
+ FILE *in = stdin;
593
+ const char *input_path = NULL;
594
+
595
+ struct zsv_pretty_opts opts = {0};
596
+
597
+ opts.line_width_max = ZSV_PRETTY_DEFAULT_LINE_MAX_WIDTH;
598
+ opts.column_width_min = ZSV_PRETTY_DEFAULT_COLUMN_MIN_WIDTH;
599
+ opts.column_width_max = ZSV_PRETTY_DEFAULT_COLUMN_MAX_WIDTH;
600
+ opts.cache_max_rows = ZSV_PRETTY_DEFAULT_CACHE_MAX;
601
+
602
+ const char *size_t_args[] = {"-W", "--width", "-C", "--max-col-width", "-D", "--min-col-width", "-p", "--rows", NULL};
603
+ size_t size_t_maximums[] = {32000, 32000, 500, 500, 500, 500, 100000000, 100000000};
604
+ for (int i = 1; !rc && i < argc; i++) {
605
+ if (*argv[i] == '-') {
606
+ if (!strcmp(argv[i], "-o") || !strcmp(argv[i], "--output")) {
607
+ if (++i >= argc)
608
+ rc = zsv_printerr(1, "%s option requires a filename value", argv[i - 1]);
609
+ else if (opts.out)
610
+ rc = zsv_printerr(1, "Output specified more than once");
611
+ else if (!(opts.out = fopen(argv[i], "wb")))
612
+ rc = zsv_printerr(1, "Unable to open for writing: %s", argv[i]);
613
+ } else if (!strcmp(argv[i], "-m") || !strcmp(argv[i], "--markdown"))
614
+ opts.markdown = 1;
615
+ else if (!strcmp(argv[i], "-A") || !strcmp(argv[i], "--no-align"))
616
+ opts.no_align = 1;
617
+ else if (!strcmp(argv[i], "-M") || !strcmp(argv[i], "--markdown-pad"))
618
+ opts.markdown_pad = 1;
619
+ else if (!strcmp(argv[i], "-H") || !strcmp(argv[i], "--ignore-header-lengths"))
620
+ opts.ignore_header_lengths = 1;
621
+ else {
622
+ char got_opt = 0;
623
+ for (int j = 0; size_t_args[j]; j++) {
624
+ if (!strcmp(size_t_args[j], argv[i])) {
625
+ got_opt = 1;
626
+ i++;
627
+ if (i >= argc)
628
+ rc = zsv_printerr(1, "%s option requires a value", size_t_args[j]);
629
+ else if (atol(argv[i]) < 2 || (size_t)atol(argv[i]) > size_t_maximums[j])
630
+ rc = zsv_printerr(1, "%s value must be an integer between 2 and %zu", size_t_args[j], size_t_maximums[j]);
631
+ else {
632
+ switch (j) {
633
+ case 0:
634
+ case 1: // --width
635
+ opts.line_width_max = atol(argv[i]);
636
+ break;
637
+ case 2:
638
+ case 3: // --max-col-width
639
+ opts.column_width_max = atol(argv[i]);
640
+ break;
641
+ case 4:
642
+ case 5: // --min-col-width
643
+ opts.column_width_min = atol(argv[i]);
644
+ break;
645
+ case 6: // --rows
646
+ case 7:
647
+ opts.cache_max_rows = atol(argv[i]);
648
+ break;
649
+ }
650
+ }
651
+ break;
652
+ }
653
+ }
654
+ if (!got_opt)
655
+ rc = zsv_printerr(1, "Unrecognized option: %s", argv[i]);
656
+ }
657
+ } else if (!(in = fopen(argv[i], "rb")))
658
+ rc = zsv_printerr(1, "Unable to open file %s for reading", argv[i]);
659
+ else
660
+ input_path = argv[i];
661
+ }
662
+
663
+ #ifdef NO_STDIN
664
+ if (in == stdin)
665
+ rc = zsv_printerr(1, "Please specify an input file");
666
+ #endif
667
+ if (opts.column_width_min > opts.column_width_max || opts.column_width_min > opts.line_width_max)
668
+ rc = zsv_printerr(1, "Min column width cannot exceed max column width or max line width");
669
+
670
+ parser_opts->stream = in;
671
+ struct zsv_pretty_data *h = zsv_pretty_init(&opts, parser_opts, custom_prop_handler, input_path);
672
+ if (!h)
673
+ rc = 1;
674
+ else {
675
+ zsv_handle_ctrl_c_signal();
676
+ rc = 0;
677
+ enum zsv_status status;
678
+ while (zsv_parse_more(h->parser) == zsv_status_ok)
679
+ ;
680
+
681
+ while (!rc && !zsv_signal_interrupted && (status = zsv_parse_more(h->parser)) == zsv_status_ok)
682
+ ;
683
+
684
+ zsv_pretty_flush(h);
685
+ zsv_pretty_destroy(h);
686
+ }
687
+ if (opts.out && opts.out != stdout)
688
+ fclose(opts.out);
689
+ if (in && in != stdin)
690
+ fclose(in);
691
+
692
+ return rc;
693
+ }