libarchive-static 1.0.5 → 1.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (296) hide show
  1. checksums.yaml +5 -5
  2. data/ext/extconf.rb +2 -9
  3. data/ext/libarchive-0.1.1/ext/archive_read_support_compression.c +6 -6
  4. data/ext/libarchive-0.1.1/ext/archive_read_support_compression.o +0 -0
  5. data/ext/libarchive-0.1.1/ext/archive_read_support_format.o +0 -0
  6. data/ext/libarchive-0.1.1/ext/archive_write_open_rb_str.c +1 -1
  7. data/ext/libarchive-0.1.1/ext/archive_write_open_rb_str.o +0 -0
  8. data/ext/libarchive-0.1.1/ext/archive_write_set_compression.c +5 -5
  9. data/ext/libarchive-0.1.1/ext/archive_write_set_compression.o +0 -0
  10. data/ext/libarchive-0.1.1/ext/config.h +23 -0
  11. data/ext/libarchive-0.1.1/ext/config.log +230 -0
  12. data/ext/libarchive-0.1.1/ext/config.status +671 -0
  13. data/ext/libarchive-0.1.1/ext/libarchive.c +1 -1
  14. data/ext/libarchive-0.1.1/ext/libarchive.o +0 -0
  15. data/ext/libarchive-0.1.1/ext/libarchive_archive.c +7 -7
  16. data/ext/libarchive-0.1.1/ext/libarchive_archive.o +0 -0
  17. data/ext/libarchive-0.1.1/ext/libarchive_entry.c +6 -0
  18. data/ext/libarchive-0.1.1/ext/libarchive_entry.o +0 -0
  19. data/ext/libarchive-0.1.1/ext/libarchive_internal.h +0 -1
  20. data/ext/libarchive-0.1.1/ext/libarchive_reader.c +6 -4
  21. data/ext/libarchive-0.1.1/ext/libarchive_reader.o +0 -0
  22. data/ext/libarchive-0.1.1/ext/libarchive_ruby.so +0 -0
  23. data/ext/libarchive-0.1.1/ext/libarchive_win32.h +1 -1
  24. data/ext/libarchive-0.1.1/ext/libarchive_writer.c +2 -2
  25. data/ext/libarchive-0.1.1/ext/libarchive_writer.o +0 -0
  26. data/ext/libarchive-3.6.2/Makefile.in +16892 -0
  27. data/ext/libarchive-3.6.2/build/autoconf/ax_append_compile_flags.m4 +67 -0
  28. data/ext/libarchive-3.6.2/build/autoconf/ax_append_flag.m4 +71 -0
  29. data/ext/libarchive-3.6.2/build/autoconf/ax_check_compile_flag.m4 +74 -0
  30. data/ext/libarchive-3.6.2/build/autoconf/ax_require_defined.m4 +37 -0
  31. data/ext/{libarchive-2.8.4 → libarchive-3.6.2}/build/autoconf/check_stdcall_func.m4 +0 -0
  32. data/ext/libarchive-3.6.2/build/autoconf/compile +348 -0
  33. data/ext/libarchive-3.6.2/build/autoconf/config.guess +1754 -0
  34. data/ext/libarchive-3.6.2/build/autoconf/config.rpath +696 -0
  35. data/ext/libarchive-3.6.2/build/autoconf/config.sub +1890 -0
  36. data/ext/libarchive-3.6.2/build/autoconf/depcomp +791 -0
  37. data/ext/libarchive-3.6.2/build/autoconf/iconv.m4 +271 -0
  38. data/ext/libarchive-3.6.2/build/autoconf/install-sh +541 -0
  39. data/ext/{libarchive-2.8.4 → libarchive-3.6.2}/build/autoconf/la_uid_t.m4 +0 -0
  40. data/ext/libarchive-3.6.2/build/autoconf/lib-ld.m4 +109 -0
  41. data/ext/libarchive-3.6.2/build/autoconf/lib-link.m4 +777 -0
  42. data/ext/libarchive-3.6.2/build/autoconf/lib-prefix.m4 +224 -0
  43. data/ext/libarchive-3.6.2/build/autoconf/ltmain.sh +11251 -0
  44. data/ext/libarchive-3.6.2/build/autoconf/m4_ax_compile_check_sizeof.m4 +115 -0
  45. data/ext/libarchive-3.6.2/build/autoconf/missing +215 -0
  46. data/ext/libarchive-3.6.2/build/autoconf/test-driver +153 -0
  47. data/ext/{libarchive-2.8.4 → libarchive-3.6.2}/build/pkgconfig/libarchive.pc.in +4 -1
  48. data/ext/libarchive-3.6.2/config.h.in +1504 -0
  49. data/ext/libarchive-3.6.2/configure +25558 -0
  50. data/ext/libarchive-3.6.2/libarchive/archive.h +1212 -0
  51. data/ext/libarchive-3.6.2/libarchive/archive_acl.c +2097 -0
  52. data/ext/libarchive-3.6.2/libarchive/archive_acl_private.h +83 -0
  53. data/ext/libarchive-3.6.2/libarchive/archive_blake2.h +197 -0
  54. data/ext/libarchive-3.6.2/libarchive/archive_blake2_impl.h +161 -0
  55. data/ext/libarchive-3.6.2/libarchive/archive_blake2s_ref.c +369 -0
  56. data/ext/libarchive-3.6.2/libarchive/archive_blake2sp_ref.c +361 -0
  57. data/ext/{libarchive-2.8.4 → libarchive-3.6.2}/libarchive/archive_check_magic.c +63 -22
  58. data/ext/libarchive-3.6.2/libarchive/archive_cmdline.c +227 -0
  59. data/ext/libarchive-3.6.2/libarchive/archive_cmdline_private.h +47 -0
  60. data/ext/{libarchive-2.8.4 → libarchive-3.6.2}/libarchive/archive_crc32.h +17 -0
  61. data/ext/libarchive-3.6.2/libarchive/archive_cryptor.c +534 -0
  62. data/ext/libarchive-3.6.2/libarchive/archive_cryptor_private.h +188 -0
  63. data/ext/libarchive-3.6.2/libarchive/archive_digest.c +1505 -0
  64. data/ext/libarchive-3.6.2/libarchive/archive_digest_private.h +416 -0
  65. data/ext/libarchive-3.6.2/libarchive/archive_disk_acl_darwin.c +559 -0
  66. data/ext/libarchive-3.6.2/libarchive/archive_disk_acl_freebsd.c +712 -0
  67. data/ext/libarchive-3.6.2/libarchive/archive_disk_acl_linux.c +760 -0
  68. data/ext/libarchive-3.6.2/libarchive/archive_disk_acl_sunos.c +824 -0
  69. data/ext/{libarchive-2.8.4 → libarchive-3.6.2}/libarchive/archive_endian.h +48 -15
  70. data/ext/libarchive-3.6.2/libarchive/archive_entry.c +2149 -0
  71. data/ext/{libarchive-2.8.4 → libarchive-3.6.2}/libarchive/archive_entry.h +305 -106
  72. data/ext/{libarchive-2.8.4 → libarchive-3.6.2}/libarchive/archive_entry_copy_bhfi.c +5 -4
  73. data/ext/{libarchive-2.8.4 → libarchive-3.6.2}/libarchive/archive_entry_copy_stat.c +9 -3
  74. data/ext/{libarchive-2.8.4 → libarchive-3.6.2}/libarchive/archive_entry_link_resolver.c +104 -62
  75. data/ext/libarchive-3.6.2/libarchive/archive_entry_locale.h +92 -0
  76. data/ext/{libarchive-2.8.4 → libarchive-3.6.2}/libarchive/archive_entry_private.h +65 -49
  77. data/ext/libarchive-3.6.2/libarchive/archive_entry_sparse.c +156 -0
  78. data/ext/{libarchive-2.8.4 → libarchive-3.6.2}/libarchive/archive_entry_stat.c +6 -6
  79. data/ext/{libarchive-2.8.4 → libarchive-3.6.2}/libarchive/archive_entry_strmode.c +1 -1
  80. data/ext/{libarchive-2.8.4 → libarchive-3.6.2}/libarchive/archive_entry_xattr.c +4 -6
  81. data/ext/libarchive-3.6.2/libarchive/archive_getdate.c +1165 -0
  82. data/ext/libarchive-3.6.2/libarchive/archive_getdate.h +39 -0
  83. data/ext/libarchive-3.6.2/libarchive/archive_hmac.c +334 -0
  84. data/ext/libarchive-3.6.2/libarchive/archive_hmac_private.h +117 -0
  85. data/ext/libarchive-3.6.2/libarchive/archive_match.c +1875 -0
  86. data/ext/libarchive-3.6.2/libarchive/archive_openssl_evp_private.h +53 -0
  87. data/ext/libarchive-3.6.2/libarchive/archive_openssl_hmac_private.h +54 -0
  88. data/ext/libarchive-3.6.2/libarchive/archive_options.c +218 -0
  89. data/ext/libarchive-3.6.2/libarchive/archive_options_private.h +51 -0
  90. data/ext/libarchive-3.6.2/libarchive/archive_pack_dev.c +337 -0
  91. data/ext/libarchive-3.6.2/libarchive/archive_pack_dev.h +49 -0
  92. data/ext/libarchive-3.6.2/libarchive/archive_pathmatch.c +463 -0
  93. data/ext/libarchive-3.6.2/libarchive/archive_pathmatch.h +52 -0
  94. data/ext/{libarchive-2.8.4 → libarchive-3.6.2}/libarchive/archive_platform.h +77 -9
  95. data/ext/libarchive-3.6.2/libarchive/archive_platform_acl.h +55 -0
  96. data/ext/libarchive-3.6.2/libarchive/archive_platform_xattr.h +47 -0
  97. data/ext/libarchive-3.6.2/libarchive/archive_ppmd7.c +1168 -0
  98. data/ext/libarchive-3.6.2/libarchive/archive_ppmd7_private.h +119 -0
  99. data/ext/libarchive-3.6.2/libarchive/archive_ppmd8.c +1287 -0
  100. data/ext/libarchive-3.6.2/libarchive/archive_ppmd8_private.h +148 -0
  101. data/ext/libarchive-3.6.2/libarchive/archive_ppmd_private.h +151 -0
  102. data/ext/{libarchive-2.8.4 → libarchive-3.6.2}/libarchive/archive_private.h +74 -18
  103. data/ext/libarchive-3.6.2/libarchive/archive_random.c +272 -0
  104. data/ext/libarchive-3.6.2/libarchive/archive_random_private.h +36 -0
  105. data/ext/libarchive-3.6.2/libarchive/archive_rb.c +709 -0
  106. data/ext/libarchive-3.6.2/libarchive/archive_rb.h +113 -0
  107. data/ext/libarchive-3.6.2/libarchive/archive_read.c +1756 -0
  108. data/ext/libarchive-3.6.2/libarchive/archive_read_add_passphrase.c +190 -0
  109. data/ext/libarchive-3.6.2/libarchive/archive_read_append_filter.c +204 -0
  110. data/ext/{libarchive-2.8.4 → libarchive-3.6.2}/libarchive/archive_read_data_into_fd.c +64 -18
  111. data/ext/libarchive-3.6.2/libarchive/archive_read_disk_entry_from_file.c +1086 -0
  112. data/ext/libarchive-3.6.2/libarchive/archive_read_disk_posix.c +2732 -0
  113. data/ext/{libarchive-2.8.4 → libarchive-3.6.2}/libarchive/archive_read_disk_private.h +40 -4
  114. data/ext/{libarchive-2.8.4 → libarchive-3.6.2}/libarchive/archive_read_disk_set_standard_lookup.c +21 -11
  115. data/ext/libarchive-3.6.2/libarchive/archive_read_disk_windows.c +2479 -0
  116. data/ext/libarchive-3.6.2/libarchive/archive_read_extract.c +60 -0
  117. data/ext/{libarchive-2.8.4/libarchive/archive_read_extract.c → libarchive-3.6.2/libarchive/archive_read_extract2.c} +34 -61
  118. data/ext/{libarchive-2.8.4 → libarchive-3.6.2}/libarchive/archive_read_open_fd.c +70 -49
  119. data/ext/{libarchive-2.8.4 → libarchive-3.6.2}/libarchive/archive_read_open_file.c +38 -23
  120. data/ext/libarchive-3.6.2/libarchive/archive_read_open_filename.c +586 -0
  121. data/ext/{libarchive-2.8.4 → libarchive-3.6.2}/libarchive/archive_read_open_memory.c +58 -28
  122. data/ext/{libarchive-2.8.4 → libarchive-3.6.2}/libarchive/archive_read_private.h +127 -59
  123. data/ext/libarchive-3.6.2/libarchive/archive_read_set_format.c +117 -0
  124. data/ext/libarchive-3.6.2/libarchive/archive_read_set_options.c +133 -0
  125. data/ext/{libarchive-2.8.4/libarchive/archive_read_support_compression_all.c → libarchive-3.6.2/libarchive/archive_read_support_filter_all.c} +35 -10
  126. data/ext/libarchive-3.6.2/libarchive/archive_read_support_filter_by_code.c +83 -0
  127. data/ext/{libarchive-2.8.4/libarchive/archive_read_support_compression_bzip2.c → libarchive-3.6.2/libarchive/archive_read_support_filter_bzip2.c} +38 -26
  128. data/ext/{libarchive-2.8.4/libarchive/archive_read_support_compression_compress.c → libarchive-3.6.2/libarchive/archive_read_support_filter_compress.c} +52 -44
  129. data/ext/libarchive-3.6.2/libarchive/archive_read_support_filter_grzip.c +112 -0
  130. data/ext/{libarchive-2.8.4/libarchive/archive_read_support_compression_gzip.c → libarchive-3.6.2/libarchive/archive_read_support_filter_gzip.c} +108 -37
  131. data/ext/libarchive-3.6.2/libarchive/archive_read_support_filter_lrzip.c +122 -0
  132. data/ext/libarchive-3.6.2/libarchive/archive_read_support_filter_lz4.c +742 -0
  133. data/ext/libarchive-3.6.2/libarchive/archive_read_support_filter_lzop.c +499 -0
  134. data/ext/{libarchive-2.8.4/libarchive/archive_read_support_compression_none.c → libarchive-3.6.2/libarchive/archive_read_support_filter_none.c} +15 -3
  135. data/ext/{libarchive-2.8.4/libarchive/archive_read_support_compression_program.c → libarchive-3.6.2/libarchive/archive_read_support_filter_program.c} +114 -77
  136. data/ext/{libarchive-2.8.4/libarchive/archive_read_support_compression_rpm.c → libarchive-3.6.2/libarchive/archive_read_support_filter_rpm.c} +31 -31
  137. data/ext/{libarchive-2.8.4/libarchive/archive_read_support_compression_uu.c → libarchive-3.6.2/libarchive/archive_read_support_filter_uu.c} +141 -85
  138. data/ext/{libarchive-2.8.4/libarchive/archive_read_support_compression_xz.c → libarchive-3.6.2/libarchive/archive_read_support_filter_xz.c} +369 -284
  139. data/ext/libarchive-3.6.2/libarchive/archive_read_support_filter_zstd.c +297 -0
  140. data/ext/libarchive-3.6.2/libarchive/archive_read_support_format_7zip.c +3900 -0
  141. data/ext/libarchive-3.6.2/libarchive/archive_read_support_format_all.c +89 -0
  142. data/ext/{libarchive-2.8.4 → libarchive-3.6.2}/libarchive/archive_read_support_format_ar.c +126 -72
  143. data/ext/libarchive-3.6.2/libarchive/archive_read_support_format_by_code.c +92 -0
  144. data/ext/libarchive-3.6.2/libarchive/archive_read_support_format_cab.c +3228 -0
  145. data/ext/libarchive-3.6.2/libarchive/archive_read_support_format_cpio.c +1104 -0
  146. data/ext/{libarchive-2.8.4 → libarchive-3.6.2}/libarchive/archive_read_support_format_empty.c +14 -11
  147. data/ext/{libarchive-2.8.4 → libarchive-3.6.2}/libarchive/archive_read_support_format_iso9660.c +990 -541
  148. data/ext/libarchive-3.6.2/libarchive/archive_read_support_format_lha.c +2916 -0
  149. data/ext/libarchive-3.6.2/libarchive/archive_read_support_format_mtree.c +2150 -0
  150. data/ext/libarchive-3.6.2/libarchive/archive_read_support_format_rar.c +3797 -0
  151. data/ext/libarchive-3.6.2/libarchive/archive_read_support_format_rar5.c +4251 -0
  152. data/ext/{libarchive-2.8.4 → libarchive-3.6.2}/libarchive/archive_read_support_format_raw.c +38 -31
  153. data/ext/{libarchive-2.8.4 → libarchive-3.6.2}/libarchive/archive_read_support_format_tar.c +1157 -629
  154. data/ext/libarchive-3.6.2/libarchive/archive_read_support_format_warc.c +848 -0
  155. data/ext/{libarchive-2.8.4 → libarchive-3.6.2}/libarchive/archive_read_support_format_xar.c +439 -258
  156. data/ext/libarchive-3.6.2/libarchive/archive_read_support_format_zip.c +4270 -0
  157. data/ext/libarchive-3.6.2/libarchive/archive_string.c +4240 -0
  158. data/ext/libarchive-3.6.2/libarchive/archive_string.h +243 -0
  159. data/ext/libarchive-3.6.2/libarchive/archive_string_composition.h +2292 -0
  160. data/ext/{libarchive-2.8.4 → libarchive-3.6.2}/libarchive/archive_string_sprintf.c +44 -16
  161. data/ext/libarchive-3.6.2/libarchive/archive_util.c +655 -0
  162. data/ext/libarchive-3.6.2/libarchive/archive_version_details.c +151 -0
  163. data/ext/{libarchive-2.8.4 → libarchive-3.6.2}/libarchive/archive_virtual.c +85 -16
  164. data/ext/{libarchive-2.8.4 → libarchive-3.6.2}/libarchive/archive_windows.c +214 -541
  165. data/ext/{libarchive-2.8.4 → libarchive-3.6.2}/libarchive/archive_windows.h +74 -106
  166. data/ext/libarchive-3.6.2/libarchive/archive_write.c +828 -0
  167. data/ext/libarchive-3.6.2/libarchive/archive_write_add_filter.c +72 -0
  168. data/ext/libarchive-3.6.2/libarchive/archive_write_add_filter_b64encode.c +304 -0
  169. data/ext/libarchive-3.6.2/libarchive/archive_write_add_filter_by_name.c +77 -0
  170. data/ext/libarchive-3.6.2/libarchive/archive_write_add_filter_bzip2.c +401 -0
  171. data/ext/{libarchive-2.8.4/libarchive/archive_write_set_compression_compress.c → libarchive-3.6.2/libarchive/archive_write_add_filter_compress.c} +86 -131
  172. data/ext/libarchive-3.6.2/libarchive/archive_write_add_filter_grzip.c +135 -0
  173. data/ext/libarchive-3.6.2/libarchive/archive_write_add_filter_gzip.c +442 -0
  174. data/ext/libarchive-3.6.2/libarchive/archive_write_add_filter_lrzip.c +197 -0
  175. data/ext/libarchive-3.6.2/libarchive/archive_write_add_filter_lz4.c +700 -0
  176. data/ext/libarchive-3.6.2/libarchive/archive_write_add_filter_lzop.c +478 -0
  177. data/ext/{libarchive-2.8.4/libarchive/archive_read_support_format_all.c → libarchive-3.6.2/libarchive/archive_write_add_filter_none.c} +11 -11
  178. data/ext/libarchive-3.6.2/libarchive/archive_write_add_filter_program.c +391 -0
  179. data/ext/libarchive-3.6.2/libarchive/archive_write_add_filter_uuencode.c +295 -0
  180. data/ext/libarchive-3.6.2/libarchive/archive_write_add_filter_xz.c +545 -0
  181. data/ext/libarchive-3.6.2/libarchive/archive_write_add_filter_zstd.c +418 -0
  182. data/ext/libarchive-3.6.2/libarchive/archive_write_disk_posix.c +4711 -0
  183. data/ext/{libarchive-2.8.4 → libarchive-3.6.2}/libarchive/archive_write_disk_private.h +9 -2
  184. data/ext/{libarchive-2.8.4 → libarchive-3.6.2}/libarchive/archive_write_disk_set_standard_lookup.c +30 -29
  185. data/ext/libarchive-3.6.2/libarchive/archive_write_disk_windows.c +2842 -0
  186. data/ext/{libarchive-2.8.4 → libarchive-3.6.2}/libarchive/archive_write_open_fd.c +15 -10
  187. data/ext/{libarchive-2.8.4 → libarchive-3.6.2}/libarchive/archive_write_open_file.c +15 -9
  188. data/ext/{libarchive-2.8.4 → libarchive-3.6.2}/libarchive/archive_write_open_filename.c +128 -20
  189. data/ext/{libarchive-2.8.4 → libarchive-3.6.2}/libarchive/archive_write_open_memory.c +7 -18
  190. data/ext/{libarchive-2.8.4 → libarchive-3.6.2}/libarchive/archive_write_private.h +72 -29
  191. data/ext/{libarchive-2.8.4 → libarchive-3.6.2}/libarchive/archive_write_set_format.c +56 -3
  192. data/ext/libarchive-3.6.2/libarchive/archive_write_set_format_7zip.c +2322 -0
  193. data/ext/{libarchive-2.8.4 → libarchive-3.6.2}/libarchive/archive_write_set_format_ar.c +54 -34
  194. data/ext/{libarchive-2.8.4 → libarchive-3.6.2}/libarchive/archive_write_set_format_by_name.c +20 -2
  195. data/ext/libarchive-3.6.2/libarchive/archive_write_set_format_cpio.c +11 -0
  196. data/ext/libarchive-3.6.2/libarchive/archive_write_set_format_cpio_binary.c +610 -0
  197. data/ext/libarchive-3.6.2/libarchive/archive_write_set_format_cpio_newc.c +457 -0
  198. data/ext/libarchive-3.6.2/libarchive/archive_write_set_format_cpio_odc.c +500 -0
  199. data/ext/libarchive-3.6.2/libarchive/archive_write_set_format_filter_by_ext.c +142 -0
  200. data/ext/libarchive-3.6.2/libarchive/archive_write_set_format_gnutar.c +755 -0
  201. data/ext/libarchive-3.6.2/libarchive/archive_write_set_format_iso9660.c +8165 -0
  202. data/ext/libarchive-3.6.2/libarchive/archive_write_set_format_mtree.c +2217 -0
  203. data/ext/{libarchive-2.8.4 → libarchive-3.6.2}/libarchive/archive_write_set_format_pax.c +1049 -387
  204. data/ext/libarchive-3.6.2/libarchive/archive_write_set_format_private.h +42 -0
  205. data/ext/libarchive-3.6.2/libarchive/archive_write_set_format_raw.c +125 -0
  206. data/ext/{libarchive-2.8.4 → libarchive-3.6.2}/libarchive/archive_write_set_format_shar.c +62 -47
  207. data/ext/{libarchive-2.8.4 → libarchive-3.6.2}/libarchive/archive_write_set_format_ustar.c +279 -108
  208. data/ext/libarchive-3.6.2/libarchive/archive_write_set_format_v7tar.c +638 -0
  209. data/ext/libarchive-3.6.2/libarchive/archive_write_set_format_warc.c +453 -0
  210. data/ext/libarchive-3.6.2/libarchive/archive_write_set_format_xar.c +3259 -0
  211. data/ext/libarchive-3.6.2/libarchive/archive_write_set_format_zip.c +1704 -0
  212. data/ext/libarchive-3.6.2/libarchive/archive_write_set_options.c +130 -0
  213. data/ext/libarchive-3.6.2/libarchive/archive_write_set_passphrase.c +95 -0
  214. data/ext/libarchive-3.6.2/libarchive/archive_xxhash.h +48 -0
  215. data/ext/libarchive-3.6.2/libarchive/config_freebsd.h +271 -0
  216. data/ext/{libarchive-2.8.4 → libarchive-3.6.2}/libarchive/filter_fork.h +10 -5
  217. data/ext/{libarchive-2.8.4/libarchive/filter_fork.c → libarchive-3.6.2/libarchive/filter_fork_posix.c} +98 -19
  218. data/ext/libarchive-3.6.2/libarchive/filter_fork_windows.c +236 -0
  219. data/ext/libarchive-3.6.2/libarchive/xxhash.c +525 -0
  220. data/ext/libarchive-static-makefile +144 -80
  221. data/ext/libarchive-static-wrapper-makefile +1 -1
  222. data/ext/zlib-1.2.13/Makefile.in +404 -0
  223. data/ext/{zlib-1.2.5 → zlib-1.2.13}/adler32.c +51 -34
  224. data/ext/{zlib-1.2.5 → zlib-1.2.13}/compress.c +27 -21
  225. data/ext/zlib-1.2.13/configure +922 -0
  226. data/ext/zlib-1.2.13/crc32.c +1125 -0
  227. data/ext/zlib-1.2.13/crc32.h +9446 -0
  228. data/ext/{zlib-1.2.5 → zlib-1.2.13}/deflate.c +842 -459
  229. data/ext/{zlib-1.2.5 → zlib-1.2.13}/deflate.h +37 -33
  230. data/ext/{zlib-1.2.5 → zlib-1.2.13}/gzclose.c +0 -0
  231. data/ext/{zlib-1.2.5 → zlib-1.2.13}/gzguts.h +103 -16
  232. data/ext/{zlib-1.2.5 → zlib-1.2.13}/gzlib.c +155 -53
  233. data/ext/zlib-1.2.13/gzread.c +650 -0
  234. data/ext/zlib-1.2.13/gzwrite.c +677 -0
  235. data/ext/{zlib-1.2.5 → zlib-1.2.13}/infback.c +24 -12
  236. data/ext/{zlib-1.2.5 → zlib-1.2.13}/inffast.c +49 -66
  237. data/ext/{zlib-1.2.5 → zlib-1.2.13}/inffast.h +0 -0
  238. data/ext/{zlib-1.2.5 → zlib-1.2.13}/inffixed.h +3 -3
  239. data/ext/{zlib-1.2.5 → zlib-1.2.13}/inflate.c +209 -94
  240. data/ext/{zlib-1.2.5 → zlib-1.2.13}/inflate.h +9 -5
  241. data/ext/{zlib-1.2.5 → zlib-1.2.13}/inftrees.c +24 -50
  242. data/ext/{zlib-1.2.5 → zlib-1.2.13}/inftrees.h +1 -1
  243. data/ext/{zlib-1.2.5 → zlib-1.2.13}/trees.c +135 -198
  244. data/ext/{zlib-1.2.5 → zlib-1.2.13}/trees.h +0 -0
  245. data/ext/zlib-1.2.13/uncompr.c +93 -0
  246. data/ext/{zlib-1.2.5 → zlib-1.2.13}/zconf.h +182 -63
  247. data/ext/{zlib-1.2.5 → zlib-1.2.13}/zlib.h +617 -295
  248. data/ext/{zlib-1.2.5 → zlib-1.2.13}/zutil.c +50 -41
  249. data/ext/{zlib-1.2.5 → zlib-1.2.13}/zutil.h +83 -82
  250. metadata +244 -137
  251. data/ext/libarchive-0.1.1/libarchive.c +0 -1762
  252. data/ext/libarchive-2.8.4/Makefile.in +0 -7076
  253. data/ext/libarchive-2.8.4/build/autoconf/compile +0 -143
  254. data/ext/libarchive-2.8.4/build/autoconf/config.guess +0 -1502
  255. data/ext/libarchive-2.8.4/build/autoconf/config.sub +0 -1708
  256. data/ext/libarchive-2.8.4/build/autoconf/depcomp +0 -630
  257. data/ext/libarchive-2.8.4/build/autoconf/install-sh +0 -291
  258. data/ext/libarchive-2.8.4/build/autoconf/ltmain.sh +0 -8406
  259. data/ext/libarchive-2.8.4/build/autoconf/missing +0 -376
  260. data/ext/libarchive-2.8.4/config.h.in +0 -772
  261. data/ext/libarchive-2.8.4/configure +0 -17916
  262. data/ext/libarchive-2.8.4/libarchive/archive.h +0 -741
  263. data/ext/libarchive-2.8.4/libarchive/archive_entry.c +0 -2202
  264. data/ext/libarchive-2.8.4/libarchive/archive_hash.h +0 -281
  265. data/ext/libarchive-2.8.4/libarchive/archive_read.c +0 -1249
  266. data/ext/libarchive-2.8.4/libarchive/archive_read_disk.c +0 -198
  267. data/ext/libarchive-2.8.4/libarchive/archive_read_disk_entry_from_file.c +0 -570
  268. data/ext/libarchive-2.8.4/libarchive/archive_read_open_filename.c +0 -272
  269. data/ext/libarchive-2.8.4/libarchive/archive_read_support_format_cpio.c +0 -777
  270. data/ext/libarchive-2.8.4/libarchive/archive_read_support_format_mtree.c +0 -1304
  271. data/ext/libarchive-2.8.4/libarchive/archive_read_support_format_zip.c +0 -903
  272. data/ext/libarchive-2.8.4/libarchive/archive_string.c +0 -453
  273. data/ext/libarchive-2.8.4/libarchive/archive_string.h +0 -148
  274. data/ext/libarchive-2.8.4/libarchive/archive_util.c +0 -391
  275. data/ext/libarchive-2.8.4/libarchive/archive_write.c +0 -466
  276. data/ext/libarchive-2.8.4/libarchive/archive_write_disk.c +0 -2628
  277. data/ext/libarchive-2.8.4/libarchive/archive_write_set_compression_bzip2.c +0 -408
  278. data/ext/libarchive-2.8.4/libarchive/archive_write_set_compression_gzip.c +0 -477
  279. data/ext/libarchive-2.8.4/libarchive/archive_write_set_compression_none.c +0 -257
  280. data/ext/libarchive-2.8.4/libarchive/archive_write_set_compression_program.c +0 -347
  281. data/ext/libarchive-2.8.4/libarchive/archive_write_set_compression_xz.c +0 -438
  282. data/ext/libarchive-2.8.4/libarchive/archive_write_set_format_cpio.c +0 -344
  283. data/ext/libarchive-2.8.4/libarchive/archive_write_set_format_cpio_newc.c +0 -295
  284. data/ext/libarchive-2.8.4/libarchive/archive_write_set_format_mtree.c +0 -1050
  285. data/ext/libarchive-2.8.4/libarchive/archive_write_set_format_zip.c +0 -667
  286. data/ext/libarchive-2.8.4/libarchive/config_freebsd.h +0 -154
  287. data/ext/libarchive-2.8.4/libarchive/filter_fork_windows.c +0 -113
  288. data/ext/zlib-1.2.5/Makefile.in +0 -257
  289. data/ext/zlib-1.2.5/configure +0 -596
  290. data/ext/zlib-1.2.5/crc32.c +0 -442
  291. data/ext/zlib-1.2.5/crc32.h +0 -441
  292. data/ext/zlib-1.2.5/example.c +0 -565
  293. data/ext/zlib-1.2.5/gzread.c +0 -653
  294. data/ext/zlib-1.2.5/gzwrite.c +0 -531
  295. data/ext/zlib-1.2.5/minigzip.c +0 -440
  296. data/ext/zlib-1.2.5/uncompr.c +0 -59
@@ -0,0 +1,1165 @@
1
+ /*
2
+ * This code is in the public domain and has no copyright.
3
+ *
4
+ * This is a plain C recursive-descent translation of an old
5
+ * public-domain YACC grammar that has been used for parsing dates in
6
+ * very many open-source projects.
7
+ *
8
+ * Since the original authors were generous enough to donate their
9
+ * work to the public domain, I feel compelled to match their
10
+ * generosity.
11
+ *
12
+ * Tim Kientzle, February 2009.
13
+ */
14
+
15
+ /*
16
+ * Header comment from original getdate.y:
17
+ */
18
+
19
+ /*
20
+ ** Originally written by Steven M. Bellovin <smb@research.att.com> while
21
+ ** at the University of North Carolina at Chapel Hill. Later tweaked by
22
+ ** a couple of people on Usenet. Completely overhauled by Rich $alz
23
+ ** <rsalz@bbn.com> and Jim Berets <jberets@bbn.com> in August, 1990;
24
+ **
25
+ ** This grammar has 10 shift/reduce conflicts.
26
+ **
27
+ ** This code is in the public domain and has no copyright.
28
+ */
29
+
30
+ #include "archive_platform.h"
31
+ #ifdef __FreeBSD__
32
+ #include <sys/cdefs.h>
33
+ __FBSDID("$FreeBSD$");
34
+ #endif
35
+
36
+ #include <ctype.h>
37
+ #include <stdio.h>
38
+ #include <stdlib.h>
39
+ #include <string.h>
40
+ #include <time.h>
41
+
42
+ #define __LIBARCHIVE_BUILD 1
43
+ #include "archive_getdate.h"
44
+
45
+ /* Basic time units. */
46
+ #define EPOCH 1970
47
+ #define MINUTE (60L)
48
+ #define HOUR (60L * MINUTE)
49
+ #define DAY (24L * HOUR)
50
+
51
+ /* Daylight-savings mode: on, off, or not yet known. */
52
+ enum DSTMODE { DSTon, DSToff, DSTmaybe };
53
+ /* Meridian: am or pm. */
54
+ enum { tAM, tPM };
55
+ /* Token types returned by nexttoken() */
56
+ enum { tAGO = 260, tDAY, tDAYZONE, tAMPM, tMONTH, tMONTH_UNIT, tSEC_UNIT,
57
+ tUNUMBER, tZONE, tDST };
58
+ struct token { int token; time_t value; };
59
+
60
+ /*
61
+ * Parser state.
62
+ */
63
+ struct gdstate {
64
+ struct token *tokenp; /* Pointer to next token. */
65
+ /* HaveXxxx counts how many of this kind of phrase we've seen;
66
+ * it's a fatal error to have more than one time, zone, day,
67
+ * or date phrase. */
68
+ int HaveYear;
69
+ int HaveMonth;
70
+ int HaveDay;
71
+ int HaveWeekDay; /* Day of week */
72
+ int HaveTime; /* Hour/minute/second */
73
+ int HaveZone; /* timezone and/or DST info */
74
+ int HaveRel; /* time offset; we can have more than one */
75
+ /* Absolute time values. */
76
+ time_t Timezone; /* Seconds offset from GMT */
77
+ time_t Day;
78
+ time_t Hour;
79
+ time_t Minutes;
80
+ time_t Month;
81
+ time_t Seconds;
82
+ time_t Year;
83
+ /* DST selection */
84
+ enum DSTMODE DSTmode;
85
+ /* Day of week accounting, e.g., "3rd Tuesday" */
86
+ time_t DayOrdinal; /* "3" in "3rd Tuesday" */
87
+ time_t DayNumber; /* "Tuesday" in "3rd Tuesday" */
88
+ /* Relative time values: hour/day/week offsets are measured in
89
+ * seconds, month/year are counted in months. */
90
+ time_t RelMonth;
91
+ time_t RelSeconds;
92
+ };
93
+
94
+ /*
95
+ * A series of functions that recognize certain common time phrases.
96
+ * Each function returns 1 if it managed to make sense of some of the
97
+ * tokens, zero otherwise.
98
+ */
99
+
100
+ /*
101
+ * hour:minute or hour:minute:second with optional AM, PM, or numeric
102
+ * timezone offset
103
+ */
104
+ static int
105
+ timephrase(struct gdstate *gds)
106
+ {
107
+ if (gds->tokenp[0].token == tUNUMBER
108
+ && gds->tokenp[1].token == ':'
109
+ && gds->tokenp[2].token == tUNUMBER
110
+ && gds->tokenp[3].token == ':'
111
+ && gds->tokenp[4].token == tUNUMBER) {
112
+ /* "12:14:18" or "22:08:07" */
113
+ ++gds->HaveTime;
114
+ gds->Hour = gds->tokenp[0].value;
115
+ gds->Minutes = gds->tokenp[2].value;
116
+ gds->Seconds = gds->tokenp[4].value;
117
+ gds->tokenp += 5;
118
+ }
119
+ else if (gds->tokenp[0].token == tUNUMBER
120
+ && gds->tokenp[1].token == ':'
121
+ && gds->tokenp[2].token == tUNUMBER) {
122
+ /* "12:14" or "22:08" */
123
+ ++gds->HaveTime;
124
+ gds->Hour = gds->tokenp[0].value;
125
+ gds->Minutes = gds->tokenp[2].value;
126
+ gds->Seconds = 0;
127
+ gds->tokenp += 3;
128
+ }
129
+ else if (gds->tokenp[0].token == tUNUMBER
130
+ && gds->tokenp[1].token == tAMPM) {
131
+ /* "7" is a time if it's followed by "am" or "pm" */
132
+ ++gds->HaveTime;
133
+ gds->Hour = gds->tokenp[0].value;
134
+ gds->Minutes = gds->Seconds = 0;
135
+ /* We'll handle the AM/PM below. */
136
+ gds->tokenp += 1;
137
+ } else {
138
+ /* We can't handle this. */
139
+ return 0;
140
+ }
141
+
142
+ if (gds->tokenp[0].token == tAMPM) {
143
+ /* "7:12pm", "12:20:13am" */
144
+ if (gds->Hour == 12)
145
+ gds->Hour = 0;
146
+ if (gds->tokenp[0].value == tPM)
147
+ gds->Hour += 12;
148
+ gds->tokenp += 1;
149
+ }
150
+ if (gds->tokenp[0].token == '+'
151
+ && gds->tokenp[1].token == tUNUMBER) {
152
+ /* "7:14+0700" */
153
+ gds->HaveZone++;
154
+ gds->DSTmode = DSToff;
155
+ gds->Timezone = - ((gds->tokenp[1].value / 100) * HOUR
156
+ + (gds->tokenp[1].value % 100) * MINUTE);
157
+ gds->tokenp += 2;
158
+ }
159
+ if (gds->tokenp[0].token == '-'
160
+ && gds->tokenp[1].token == tUNUMBER) {
161
+ /* "19:14:12-0530" */
162
+ gds->HaveZone++;
163
+ gds->DSTmode = DSToff;
164
+ gds->Timezone = + ((gds->tokenp[1].value / 100) * HOUR
165
+ + (gds->tokenp[1].value % 100) * MINUTE);
166
+ gds->tokenp += 2;
167
+ }
168
+ return 1;
169
+ }
170
+
171
+ /*
172
+ * Timezone name, possibly including DST.
173
+ */
174
+ static int
175
+ zonephrase(struct gdstate *gds)
176
+ {
177
+ if (gds->tokenp[0].token == tZONE
178
+ && gds->tokenp[1].token == tDST) {
179
+ gds->HaveZone++;
180
+ gds->Timezone = gds->tokenp[0].value;
181
+ gds->DSTmode = DSTon;
182
+ gds->tokenp += 1;
183
+ return 1;
184
+ }
185
+
186
+ if (gds->tokenp[0].token == tZONE) {
187
+ gds->HaveZone++;
188
+ gds->Timezone = gds->tokenp[0].value;
189
+ gds->DSTmode = DSToff;
190
+ gds->tokenp += 1;
191
+ return 1;
192
+ }
193
+
194
+ if (gds->tokenp[0].token == tDAYZONE) {
195
+ gds->HaveZone++;
196
+ gds->Timezone = gds->tokenp[0].value;
197
+ gds->DSTmode = DSTon;
198
+ gds->tokenp += 1;
199
+ return 1;
200
+ }
201
+ return 0;
202
+ }
203
+
204
+ /*
205
+ * Year/month/day in various combinations.
206
+ */
207
+ static int
208
+ datephrase(struct gdstate *gds)
209
+ {
210
+ if (gds->tokenp[0].token == tUNUMBER
211
+ && gds->tokenp[1].token == '/'
212
+ && gds->tokenp[2].token == tUNUMBER
213
+ && gds->tokenp[3].token == '/'
214
+ && gds->tokenp[4].token == tUNUMBER) {
215
+ gds->HaveYear++;
216
+ gds->HaveMonth++;
217
+ gds->HaveDay++;
218
+ if (gds->tokenp[0].value >= 13) {
219
+ /* First number is big: 2004/01/29, 99/02/17 */
220
+ gds->Year = gds->tokenp[0].value;
221
+ gds->Month = gds->tokenp[2].value;
222
+ gds->Day = gds->tokenp[4].value;
223
+ } else if ((gds->tokenp[4].value >= 13)
224
+ || (gds->tokenp[2].value >= 13)) {
225
+ /* Last number is big: 01/07/98 */
226
+ /* Middle number is big: 01/29/04 */
227
+ gds->Month = gds->tokenp[0].value;
228
+ gds->Day = gds->tokenp[2].value;
229
+ gds->Year = gds->tokenp[4].value;
230
+ } else {
231
+ /* No significant clues: 02/03/04 */
232
+ gds->Month = gds->tokenp[0].value;
233
+ gds->Day = gds->tokenp[2].value;
234
+ gds->Year = gds->tokenp[4].value;
235
+ }
236
+ gds->tokenp += 5;
237
+ return 1;
238
+ }
239
+
240
+ if (gds->tokenp[0].token == tUNUMBER
241
+ && gds->tokenp[1].token == '/'
242
+ && gds->tokenp[2].token == tUNUMBER) {
243
+ /* "1/15" */
244
+ gds->HaveMonth++;
245
+ gds->HaveDay++;
246
+ gds->Month = gds->tokenp[0].value;
247
+ gds->Day = gds->tokenp[2].value;
248
+ gds->tokenp += 3;
249
+ return 1;
250
+ }
251
+
252
+ if (gds->tokenp[0].token == tUNUMBER
253
+ && gds->tokenp[1].token == '-'
254
+ && gds->tokenp[2].token == tUNUMBER
255
+ && gds->tokenp[3].token == '-'
256
+ && gds->tokenp[4].token == tUNUMBER) {
257
+ /* ISO 8601 format. yyyy-mm-dd. */
258
+ gds->HaveYear++;
259
+ gds->HaveMonth++;
260
+ gds->HaveDay++;
261
+ gds->Year = gds->tokenp[0].value;
262
+ gds->Month = gds->tokenp[2].value;
263
+ gds->Day = gds->tokenp[4].value;
264
+ gds->tokenp += 5;
265
+ return 1;
266
+ }
267
+
268
+ if (gds->tokenp[0].token == tUNUMBER
269
+ && gds->tokenp[1].token == '-'
270
+ && gds->tokenp[2].token == tMONTH
271
+ && gds->tokenp[3].token == '-'
272
+ && gds->tokenp[4].token == tUNUMBER) {
273
+ gds->HaveYear++;
274
+ gds->HaveMonth++;
275
+ gds->HaveDay++;
276
+ if (gds->tokenp[0].value > 31) {
277
+ /* e.g. 1992-Jun-17 */
278
+ gds->Year = gds->tokenp[0].value;
279
+ gds->Month = gds->tokenp[2].value;
280
+ gds->Day = gds->tokenp[4].value;
281
+ } else {
282
+ /* e.g. 17-JUN-1992. */
283
+ gds->Day = gds->tokenp[0].value;
284
+ gds->Month = gds->tokenp[2].value;
285
+ gds->Year = gds->tokenp[4].value;
286
+ }
287
+ gds->tokenp += 5;
288
+ return 1;
289
+ }
290
+
291
+ if (gds->tokenp[0].token == tMONTH
292
+ && gds->tokenp[1].token == tUNUMBER
293
+ && gds->tokenp[2].token == ','
294
+ && gds->tokenp[3].token == tUNUMBER) {
295
+ /* "June 17, 2001" */
296
+ gds->HaveYear++;
297
+ gds->HaveMonth++;
298
+ gds->HaveDay++;
299
+ gds->Month = gds->tokenp[0].value;
300
+ gds->Day = gds->tokenp[1].value;
301
+ gds->Year = gds->tokenp[3].value;
302
+ gds->tokenp += 4;
303
+ return 1;
304
+ }
305
+
306
+ if (gds->tokenp[0].token == tMONTH
307
+ && gds->tokenp[1].token == tUNUMBER) {
308
+ /* "May 3" */
309
+ gds->HaveMonth++;
310
+ gds->HaveDay++;
311
+ gds->Month = gds->tokenp[0].value;
312
+ gds->Day = gds->tokenp[1].value;
313
+ gds->tokenp += 2;
314
+ return 1;
315
+ }
316
+
317
+ if (gds->tokenp[0].token == tUNUMBER
318
+ && gds->tokenp[1].token == tMONTH
319
+ && gds->tokenp[2].token == tUNUMBER) {
320
+ /* "12 Sept 1997" */
321
+ gds->HaveYear++;
322
+ gds->HaveMonth++;
323
+ gds->HaveDay++;
324
+ gds->Day = gds->tokenp[0].value;
325
+ gds->Month = gds->tokenp[1].value;
326
+ gds->Year = gds->tokenp[2].value;
327
+ gds->tokenp += 3;
328
+ return 1;
329
+ }
330
+
331
+ if (gds->tokenp[0].token == tUNUMBER
332
+ && gds->tokenp[1].token == tMONTH) {
333
+ /* "12 Sept" */
334
+ gds->HaveMonth++;
335
+ gds->HaveDay++;
336
+ gds->Day = gds->tokenp[0].value;
337
+ gds->Month = gds->tokenp[1].value;
338
+ gds->tokenp += 2;
339
+ return 1;
340
+ }
341
+
342
+ return 0;
343
+ }
344
+
345
+ /*
346
+ * Relative time phrase: "tomorrow", "yesterday", "+1 hour", etc.
347
+ */
348
+ static int
349
+ relunitphrase(struct gdstate *gds)
350
+ {
351
+ if (gds->tokenp[0].token == '-'
352
+ && gds->tokenp[1].token == tUNUMBER
353
+ && gds->tokenp[2].token == tSEC_UNIT) {
354
+ /* "-3 hours" */
355
+ gds->HaveRel++;
356
+ gds->RelSeconds -= gds->tokenp[1].value * gds->tokenp[2].value;
357
+ gds->tokenp += 3;
358
+ return 1;
359
+ }
360
+ if (gds->tokenp[0].token == '+'
361
+ && gds->tokenp[1].token == tUNUMBER
362
+ && gds->tokenp[2].token == tSEC_UNIT) {
363
+ /* "+1 minute" */
364
+ gds->HaveRel++;
365
+ gds->RelSeconds += gds->tokenp[1].value * gds->tokenp[2].value;
366
+ gds->tokenp += 3;
367
+ return 1;
368
+ }
369
+ if (gds->tokenp[0].token == tUNUMBER
370
+ && gds->tokenp[1].token == tSEC_UNIT) {
371
+ /* "1 day" */
372
+ gds->HaveRel++;
373
+ gds->RelSeconds += gds->tokenp[0].value * gds->tokenp[1].value;
374
+ gds->tokenp += 2;
375
+ return 1;
376
+ }
377
+ if (gds->tokenp[0].token == '-'
378
+ && gds->tokenp[1].token == tUNUMBER
379
+ && gds->tokenp[2].token == tMONTH_UNIT) {
380
+ /* "-3 months" */
381
+ gds->HaveRel++;
382
+ gds->RelMonth -= gds->tokenp[1].value * gds->tokenp[2].value;
383
+ gds->tokenp += 3;
384
+ return 1;
385
+ }
386
+ if (gds->tokenp[0].token == '+'
387
+ && gds->tokenp[1].token == tUNUMBER
388
+ && gds->tokenp[2].token == tMONTH_UNIT) {
389
+ /* "+5 years" */
390
+ gds->HaveRel++;
391
+ gds->RelMonth += gds->tokenp[1].value * gds->tokenp[2].value;
392
+ gds->tokenp += 3;
393
+ return 1;
394
+ }
395
+ if (gds->tokenp[0].token == tUNUMBER
396
+ && gds->tokenp[1].token == tMONTH_UNIT) {
397
+ /* "2 years" */
398
+ gds->HaveRel++;
399
+ gds->RelMonth += gds->tokenp[0].value * gds->tokenp[1].value;
400
+ gds->tokenp += 2;
401
+ return 1;
402
+ }
403
+ if (gds->tokenp[0].token == tSEC_UNIT) {
404
+ /* "now", "tomorrow" */
405
+ gds->HaveRel++;
406
+ gds->RelSeconds += gds->tokenp[0].value;
407
+ gds->tokenp += 1;
408
+ return 1;
409
+ }
410
+ if (gds->tokenp[0].token == tMONTH_UNIT) {
411
+ /* "month" */
412
+ gds->HaveRel++;
413
+ gds->RelMonth += gds->tokenp[0].value;
414
+ gds->tokenp += 1;
415
+ return 1;
416
+ }
417
+ return 0;
418
+ }
419
+
420
+ /*
421
+ * Day of the week specification.
422
+ */
423
+ static int
424
+ dayphrase(struct gdstate *gds)
425
+ {
426
+ if (gds->tokenp[0].token == tDAY) {
427
+ /* "tues", "wednesday," */
428
+ gds->HaveWeekDay++;
429
+ gds->DayOrdinal = 1;
430
+ gds->DayNumber = gds->tokenp[0].value;
431
+ gds->tokenp += 1;
432
+ if (gds->tokenp[0].token == ',')
433
+ gds->tokenp += 1;
434
+ return 1;
435
+ }
436
+ if (gds->tokenp[0].token == tUNUMBER
437
+ && gds->tokenp[1].token == tDAY) {
438
+ /* "second tues" "3 wed" */
439
+ gds->HaveWeekDay++;
440
+ gds->DayOrdinal = gds->tokenp[0].value;
441
+ gds->DayNumber = gds->tokenp[1].value;
442
+ gds->tokenp += 2;
443
+ return 1;
444
+ }
445
+ return 0;
446
+ }
447
+
448
+ /*
449
+ * Try to match a phrase using one of the above functions.
450
+ * This layer also deals with a couple of generic issues.
451
+ */
452
+ static int
453
+ phrase(struct gdstate *gds)
454
+ {
455
+ if (timephrase(gds))
456
+ return 1;
457
+ if (zonephrase(gds))
458
+ return 1;
459
+ if (datephrase(gds))
460
+ return 1;
461
+ if (dayphrase(gds))
462
+ return 1;
463
+ if (relunitphrase(gds)) {
464
+ if (gds->tokenp[0].token == tAGO) {
465
+ gds->RelSeconds = -gds->RelSeconds;
466
+ gds->RelMonth = -gds->RelMonth;
467
+ gds->tokenp += 1;
468
+ }
469
+ return 1;
470
+ }
471
+
472
+ /* Bare numbers sometimes have meaning. */
473
+ if (gds->tokenp[0].token == tUNUMBER) {
474
+ if (gds->HaveTime && !gds->HaveYear && !gds->HaveRel) {
475
+ gds->HaveYear++;
476
+ gds->Year = gds->tokenp[0].value;
477
+ gds->tokenp += 1;
478
+ return 1;
479
+ }
480
+
481
+ if(gds->tokenp[0].value > 10000) {
482
+ /* "20040301" */
483
+ gds->HaveYear++;
484
+ gds->HaveMonth++;
485
+ gds->HaveDay++;
486
+ gds->Day= (gds->tokenp[0].value)%100;
487
+ gds->Month= (gds->tokenp[0].value/100)%100;
488
+ gds->Year = gds->tokenp[0].value/10000;
489
+ gds->tokenp += 1;
490
+ return 1;
491
+ }
492
+
493
+ if (gds->tokenp[0].value < 24) {
494
+ gds->HaveTime++;
495
+ gds->Hour = gds->tokenp[0].value;
496
+ gds->Minutes = 0;
497
+ gds->Seconds = 0;
498
+ gds->tokenp += 1;
499
+ return 1;
500
+ }
501
+
502
+ if ((gds->tokenp[0].value / 100 < 24)
503
+ && (gds->tokenp[0].value % 100 < 60)) {
504
+ /* "513" is same as "5:13" */
505
+ gds->Hour = gds->tokenp[0].value / 100;
506
+ gds->Minutes = gds->tokenp[0].value % 100;
507
+ gds->Seconds = 0;
508
+ gds->tokenp += 1;
509
+ return 1;
510
+ }
511
+ }
512
+
513
+ return 0;
514
+ }
515
+
516
+ /*
517
+ * A dictionary of time words.
518
+ */
519
+ static struct LEXICON {
520
+ size_t abbrev;
521
+ const char *name;
522
+ int type;
523
+ time_t value;
524
+ } const TimeWords[] = {
525
+ /* am/pm */
526
+ { 0, "am", tAMPM, tAM },
527
+ { 0, "pm", tAMPM, tPM },
528
+
529
+ /* Month names. */
530
+ { 3, "january", tMONTH, 1 },
531
+ { 3, "february", tMONTH, 2 },
532
+ { 3, "march", tMONTH, 3 },
533
+ { 3, "april", tMONTH, 4 },
534
+ { 3, "may", tMONTH, 5 },
535
+ { 3, "june", tMONTH, 6 },
536
+ { 3, "july", tMONTH, 7 },
537
+ { 3, "august", tMONTH, 8 },
538
+ { 3, "september", tMONTH, 9 },
539
+ { 3, "october", tMONTH, 10 },
540
+ { 3, "november", tMONTH, 11 },
541
+ { 3, "december", tMONTH, 12 },
542
+
543
+ /* Days of the week. */
544
+ { 2, "sunday", tDAY, 0 },
545
+ { 3, "monday", tDAY, 1 },
546
+ { 2, "tuesday", tDAY, 2 },
547
+ { 3, "wednesday", tDAY, 3 },
548
+ { 2, "thursday", tDAY, 4 },
549
+ { 2, "friday", tDAY, 5 },
550
+ { 2, "saturday", tDAY, 6 },
551
+
552
+ /* Timezones: Offsets are in seconds. */
553
+ { 0, "gmt", tZONE, 0*HOUR }, /* Greenwich Mean */
554
+ { 0, "ut", tZONE, 0*HOUR }, /* Universal (Coordinated) */
555
+ { 0, "utc", tZONE, 0*HOUR },
556
+ { 0, "wet", tZONE, 0*HOUR }, /* Western European */
557
+ { 0, "bst", tDAYZONE, 0*HOUR }, /* British Summer */
558
+ { 0, "wat", tZONE, 1*HOUR }, /* West Africa */
559
+ { 0, "at", tZONE, 2*HOUR }, /* Azores */
560
+ /* { 0, "bst", tZONE, 3*HOUR }, */ /* Brazil Standard: Conflict */
561
+ /* { 0, "gst", tZONE, 3*HOUR }, */ /* Greenland Standard: Conflict*/
562
+ { 0, "nft", tZONE, 3*HOUR+30*MINUTE }, /* Newfoundland */
563
+ { 0, "nst", tZONE, 3*HOUR+30*MINUTE }, /* Newfoundland Standard */
564
+ { 0, "ndt", tDAYZONE, 3*HOUR+30*MINUTE }, /* Newfoundland Daylight */
565
+ { 0, "ast", tZONE, 4*HOUR }, /* Atlantic Standard */
566
+ { 0, "adt", tDAYZONE, 4*HOUR }, /* Atlantic Daylight */
567
+ { 0, "est", tZONE, 5*HOUR }, /* Eastern Standard */
568
+ { 0, "edt", tDAYZONE, 5*HOUR }, /* Eastern Daylight */
569
+ { 0, "cst", tZONE, 6*HOUR }, /* Central Standard */
570
+ { 0, "cdt", tDAYZONE, 6*HOUR }, /* Central Daylight */
571
+ { 0, "mst", tZONE, 7*HOUR }, /* Mountain Standard */
572
+ { 0, "mdt", tDAYZONE, 7*HOUR }, /* Mountain Daylight */
573
+ { 0, "pst", tZONE, 8*HOUR }, /* Pacific Standard */
574
+ { 0, "pdt", tDAYZONE, 8*HOUR }, /* Pacific Daylight */
575
+ { 0, "yst", tZONE, 9*HOUR }, /* Yukon Standard */
576
+ { 0, "ydt", tDAYZONE, 9*HOUR }, /* Yukon Daylight */
577
+ { 0, "hst", tZONE, 10*HOUR }, /* Hawaii Standard */
578
+ { 0, "hdt", tDAYZONE, 10*HOUR }, /* Hawaii Daylight */
579
+ { 0, "cat", tZONE, 10*HOUR }, /* Central Alaska */
580
+ { 0, "ahst", tZONE, 10*HOUR }, /* Alaska-Hawaii Standard */
581
+ { 0, "nt", tZONE, 11*HOUR }, /* Nome */
582
+ { 0, "idlw", tZONE, 12*HOUR }, /* Intl Date Line West */
583
+ { 0, "cet", tZONE, -1*HOUR }, /* Central European */
584
+ { 0, "met", tZONE, -1*HOUR }, /* Middle European */
585
+ { 0, "mewt", tZONE, -1*HOUR }, /* Middle European Winter */
586
+ { 0, "mest", tDAYZONE, -1*HOUR }, /* Middle European Summer */
587
+ { 0, "swt", tZONE, -1*HOUR }, /* Swedish Winter */
588
+ { 0, "sst", tDAYZONE, -1*HOUR }, /* Swedish Summer */
589
+ { 0, "fwt", tZONE, -1*HOUR }, /* French Winter */
590
+ { 0, "fst", tDAYZONE, -1*HOUR }, /* French Summer */
591
+ { 0, "eet", tZONE, -2*HOUR }, /* Eastern Eur, USSR Zone 1 */
592
+ { 0, "bt", tZONE, -3*HOUR }, /* Baghdad, USSR Zone 2 */
593
+ { 0, "it", tZONE, -3*HOUR-30*MINUTE },/* Iran */
594
+ { 0, "zp4", tZONE, -4*HOUR }, /* USSR Zone 3 */
595
+ { 0, "zp5", tZONE, -5*HOUR }, /* USSR Zone 4 */
596
+ { 0, "ist", tZONE, -5*HOUR-30*MINUTE },/* Indian Standard */
597
+ { 0, "zp6", tZONE, -6*HOUR }, /* USSR Zone 5 */
598
+ /* { 0, "nst", tZONE, -6.5*HOUR }, */ /* North Sumatra: Conflict */
599
+ /* { 0, "sst", tZONE, -7*HOUR }, */ /* So Sumatra, USSR 6: Conflict */
600
+ { 0, "wast", tZONE, -7*HOUR }, /* West Australian Standard */
601
+ { 0, "wadt", tDAYZONE, -7*HOUR }, /* West Australian Daylight */
602
+ { 0, "jt", tZONE, -7*HOUR-30*MINUTE },/* Java (3pm in Cronusland!)*/
603
+ { 0, "cct", tZONE, -8*HOUR }, /* China Coast, USSR Zone 7 */
604
+ { 0, "jst", tZONE, -9*HOUR }, /* Japan Std, USSR Zone 8 */
605
+ { 0, "cast", tZONE, -9*HOUR-30*MINUTE },/* Ctrl Australian Std */
606
+ { 0, "cadt", tDAYZONE, -9*HOUR-30*MINUTE },/* Ctrl Australian Daylt */
607
+ { 0, "east", tZONE, -10*HOUR }, /* Eastern Australian Std */
608
+ { 0, "eadt", tDAYZONE, -10*HOUR }, /* Eastern Australian Daylt */
609
+ { 0, "gst", tZONE, -10*HOUR }, /* Guam Std, USSR Zone 9 */
610
+ { 0, "nzt", tZONE, -12*HOUR }, /* New Zealand */
611
+ { 0, "nzst", tZONE, -12*HOUR }, /* New Zealand Standard */
612
+ { 0, "nzdt", tDAYZONE, -12*HOUR }, /* New Zealand Daylight */
613
+ { 0, "idle", tZONE, -12*HOUR }, /* Intl Date Line East */
614
+
615
+ { 0, "dst", tDST, 0 },
616
+
617
+ /* Time units. */
618
+ { 4, "years", tMONTH_UNIT, 12 },
619
+ { 5, "months", tMONTH_UNIT, 1 },
620
+ { 9, "fortnights", tSEC_UNIT, 14 * DAY },
621
+ { 4, "weeks", tSEC_UNIT, 7 * DAY },
622
+ { 3, "days", tSEC_UNIT, DAY },
623
+ { 4, "hours", tSEC_UNIT, HOUR },
624
+ { 3, "minutes", tSEC_UNIT, MINUTE },
625
+ { 3, "seconds", tSEC_UNIT, 1 },
626
+
627
+ /* Relative-time words. */
628
+ { 0, "tomorrow", tSEC_UNIT, DAY },
629
+ { 0, "yesterday", tSEC_UNIT, -DAY },
630
+ { 0, "today", tSEC_UNIT, 0 },
631
+ { 0, "now", tSEC_UNIT, 0 },
632
+ { 0, "last", tUNUMBER, -1 },
633
+ { 0, "this", tSEC_UNIT, 0 },
634
+ { 0, "next", tUNUMBER, 2 },
635
+ { 0, "first", tUNUMBER, 1 },
636
+ { 0, "1st", tUNUMBER, 1 },
637
+ /* { 0, "second", tUNUMBER, 2 }, */
638
+ { 0, "2nd", tUNUMBER, 2 },
639
+ { 0, "third", tUNUMBER, 3 },
640
+ { 0, "3rd", tUNUMBER, 3 },
641
+ { 0, "fourth", tUNUMBER, 4 },
642
+ { 0, "4th", tUNUMBER, 4 },
643
+ { 0, "fifth", tUNUMBER, 5 },
644
+ { 0, "5th", tUNUMBER, 5 },
645
+ { 0, "sixth", tUNUMBER, 6 },
646
+ { 0, "seventh", tUNUMBER, 7 },
647
+ { 0, "eighth", tUNUMBER, 8 },
648
+ { 0, "ninth", tUNUMBER, 9 },
649
+ { 0, "tenth", tUNUMBER, 10 },
650
+ { 0, "eleventh", tUNUMBER, 11 },
651
+ { 0, "twelfth", tUNUMBER, 12 },
652
+ { 0, "ago", tAGO, 1 },
653
+
654
+ /* Military timezones. */
655
+ { 0, "a", tZONE, 1*HOUR },
656
+ { 0, "b", tZONE, 2*HOUR },
657
+ { 0, "c", tZONE, 3*HOUR },
658
+ { 0, "d", tZONE, 4*HOUR },
659
+ { 0, "e", tZONE, 5*HOUR },
660
+ { 0, "f", tZONE, 6*HOUR },
661
+ { 0, "g", tZONE, 7*HOUR },
662
+ { 0, "h", tZONE, 8*HOUR },
663
+ { 0, "i", tZONE, 9*HOUR },
664
+ { 0, "k", tZONE, 10*HOUR },
665
+ { 0, "l", tZONE, 11*HOUR },
666
+ { 0, "m", tZONE, 12*HOUR },
667
+ { 0, "n", tZONE, -1*HOUR },
668
+ { 0, "o", tZONE, -2*HOUR },
669
+ { 0, "p", tZONE, -3*HOUR },
670
+ { 0, "q", tZONE, -4*HOUR },
671
+ { 0, "r", tZONE, -5*HOUR },
672
+ { 0, "s", tZONE, -6*HOUR },
673
+ { 0, "t", tZONE, -7*HOUR },
674
+ { 0, "u", tZONE, -8*HOUR },
675
+ { 0, "v", tZONE, -9*HOUR },
676
+ { 0, "w", tZONE, -10*HOUR },
677
+ { 0, "x", tZONE, -11*HOUR },
678
+ { 0, "y", tZONE, -12*HOUR },
679
+ { 0, "z", tZONE, 0*HOUR },
680
+
681
+ /* End of table. */
682
+ { 0, NULL, 0, 0 }
683
+ };
684
+
685
+ /*
686
+ * Year is either:
687
+ * = A number from 0 to 99, which means a year from 1970 to 2069, or
688
+ * = The actual year (>=100).
689
+ */
690
+ static time_t
691
+ Convert(time_t Month, time_t Day, time_t Year,
692
+ time_t Hours, time_t Minutes, time_t Seconds,
693
+ time_t Timezone, enum DSTMODE DSTmode)
694
+ {
695
+ signed char DaysInMonth[12] = {
696
+ 31, 0, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31
697
+ };
698
+ time_t Julian;
699
+ int i;
700
+ struct tm *ltime;
701
+ #if defined(HAVE_LOCALTIME_R) || defined(HAVE__LOCALTIME64_S)
702
+ struct tm tmbuf;
703
+ #endif
704
+ #if defined(HAVE__LOCALTIME64_S)
705
+ errno_t terr;
706
+ __time64_t tmptime;
707
+ #endif
708
+
709
+ if (Year < 69)
710
+ Year += 2000;
711
+ else if (Year < 100)
712
+ Year += 1900;
713
+ DaysInMonth[1] = Year % 4 == 0 && (Year % 100 != 0 || Year % 400 == 0)
714
+ ? 29 : 28;
715
+ /* Checking for 2038 bogusly assumes that time_t is 32 bits. But
716
+ I'm too lazy to try to check for time_t overflow in another way. */
717
+ if (Year < EPOCH || Year >= 2038
718
+ || Month < 1 || Month > 12
719
+ /* Lint fluff: "conversion from long may lose accuracy" */
720
+ || Day < 1 || Day > DaysInMonth[(int)--Month]
721
+ || Hours < 0 || Hours > 23
722
+ || Minutes < 0 || Minutes > 59
723
+ || Seconds < 0 || Seconds > 59)
724
+ return -1;
725
+
726
+ Julian = Day - 1;
727
+ for (i = 0; i < Month; i++)
728
+ Julian += DaysInMonth[i];
729
+ for (i = EPOCH; i < Year; i++)
730
+ Julian += 365 + (i % 4 == 0);
731
+ Julian *= DAY;
732
+ Julian += Timezone;
733
+ Julian += Hours * HOUR + Minutes * MINUTE + Seconds;
734
+ #if defined(HAVE_LOCALTIME_R)
735
+ ltime = localtime_r(&Julian, &tmbuf);
736
+ #elif defined(HAVE__LOCALTIME64_S)
737
+ tmptime = Julian;
738
+ terr = _localtime64_s(&tmbuf, &tmptime);
739
+ if (terr)
740
+ ltime = NULL;
741
+ else
742
+ ltime = &tmbuf;
743
+ #else
744
+ ltime = localtime(&Julian);
745
+ #endif
746
+ if (DSTmode == DSTon
747
+ || (DSTmode == DSTmaybe && ltime->tm_isdst))
748
+ Julian -= HOUR;
749
+ return Julian;
750
+ }
751
+
752
+ static time_t
753
+ DSTcorrect(time_t Start, time_t Future)
754
+ {
755
+ time_t StartDay;
756
+ time_t FutureDay;
757
+ struct tm *ltime;
758
+ #if defined(HAVE_LOCALTIME_R) || defined(HAVE__LOCALTIME64_S)
759
+ struct tm tmbuf;
760
+ #endif
761
+ #if defined(HAVE__LOCALTIME64_S)
762
+ errno_t terr;
763
+ __time64_t tmptime;
764
+ #endif
765
+
766
+ #if defined(HAVE_LOCALTIME_R)
767
+ ltime = localtime_r(&Start, &tmbuf);
768
+ #elif defined(HAVE__LOCALTIME64_S)
769
+ tmptime = Start;
770
+ terr = _localtime64_s(&tmbuf, &tmptime);
771
+ if (terr)
772
+ ltime = NULL;
773
+ else
774
+ ltime = &tmbuf;
775
+ #else
776
+ ltime = localtime(&Start);
777
+ #endif
778
+ StartDay = (ltime->tm_hour + 1) % 24;
779
+ #if defined(HAVE_LOCALTIME_R)
780
+ ltime = localtime_r(&Future, &tmbuf);
781
+ #elif defined(HAVE__LOCALTIME64_S)
782
+ tmptime = Future;
783
+ terr = _localtime64_s(&tmbuf, &tmptime);
784
+ if (terr)
785
+ ltime = NULL;
786
+ else
787
+ ltime = &tmbuf;
788
+ #else
789
+ ltime = localtime(&Future);
790
+ #endif
791
+ FutureDay = (ltime->tm_hour + 1) % 24;
792
+ return (Future - Start) + (StartDay - FutureDay) * HOUR;
793
+ }
794
+
795
+
796
+ static time_t
797
+ RelativeDate(time_t Start, time_t zone, int dstmode,
798
+ time_t DayOrdinal, time_t DayNumber)
799
+ {
800
+ struct tm *tm;
801
+ time_t t, now;
802
+ #if defined(HAVE_GMTIME_R) || defined(HAVE__GMTIME64_S)
803
+ struct tm tmbuf;
804
+ #endif
805
+ #if defined(HAVE__GMTIME64_S)
806
+ errno_t terr;
807
+ __time64_t tmptime;
808
+ #endif
809
+
810
+ t = Start - zone;
811
+ #if defined(HAVE_GMTIME_R)
812
+ tm = gmtime_r(&t, &tmbuf);
813
+ #elif defined(HAVE__GMTIME64_S)
814
+ tmptime = t;
815
+ terr = _gmtime64_s(&tmbuf, &tmptime);
816
+ if (terr)
817
+ tm = NULL;
818
+ else
819
+ tm = &tmbuf;
820
+ #else
821
+ tm = gmtime(&t);
822
+ #endif
823
+ now = Start;
824
+ now += DAY * ((DayNumber - tm->tm_wday + 7) % 7);
825
+ now += 7 * DAY * (DayOrdinal <= 0 ? DayOrdinal : DayOrdinal - 1);
826
+ if (dstmode == DSTmaybe)
827
+ return DSTcorrect(Start, now);
828
+ return now - Start;
829
+ }
830
+
831
+
832
+ static time_t
833
+ RelativeMonth(time_t Start, time_t Timezone, time_t RelMonth)
834
+ {
835
+ struct tm *tm;
836
+ time_t Month;
837
+ time_t Year;
838
+ #if defined(HAVE_LOCALTIME_R) || defined(HAVE__LOCALTIME64_S)
839
+ struct tm tmbuf;
840
+ #endif
841
+ #if defined(HAVE__LOCALTIME64_S)
842
+ errno_t terr;
843
+ __time64_t tmptime;
844
+ #endif
845
+
846
+ if (RelMonth == 0)
847
+ return 0;
848
+ #if defined(HAVE_LOCALTIME_R)
849
+ tm = localtime_r(&Start, &tmbuf);
850
+ #elif defined(HAVE__LOCALTIME64_S)
851
+ tmptime = Start;
852
+ terr = _localtime64_s(&tmbuf, &tmptime);
853
+ if (terr)
854
+ tm = NULL;
855
+ else
856
+ tm = &tmbuf;
857
+ #else
858
+ tm = localtime(&Start);
859
+ #endif
860
+ Month = 12 * (tm->tm_year + 1900) + tm->tm_mon + RelMonth;
861
+ Year = Month / 12;
862
+ Month = Month % 12 + 1;
863
+ return DSTcorrect(Start,
864
+ Convert(Month, (time_t)tm->tm_mday, Year,
865
+ (time_t)tm->tm_hour, (time_t)tm->tm_min, (time_t)tm->tm_sec,
866
+ Timezone, DSTmaybe));
867
+ }
868
+
869
+ /*
870
+ * Tokenizer.
871
+ */
872
+ static int
873
+ nexttoken(const char **in, time_t *value)
874
+ {
875
+ char c;
876
+ char buff[64];
877
+
878
+ for ( ; ; ) {
879
+ while (isspace((unsigned char)**in))
880
+ ++*in;
881
+
882
+ /* Skip parenthesized comments. */
883
+ if (**in == '(') {
884
+ int Count = 0;
885
+ do {
886
+ c = *(*in)++;
887
+ if (c == '\0')
888
+ return c;
889
+ if (c == '(')
890
+ Count++;
891
+ else if (c == ')')
892
+ Count--;
893
+ } while (Count > 0);
894
+ continue;
895
+ }
896
+
897
+ /* Try the next token in the word table first. */
898
+ /* This allows us to match "2nd", for example. */
899
+ {
900
+ const char *src = *in;
901
+ const struct LEXICON *tp;
902
+ unsigned i = 0;
903
+
904
+ /* Force to lowercase and strip '.' characters. */
905
+ while (*src != '\0'
906
+ && (isalnum((unsigned char)*src) || *src == '.')
907
+ && i < sizeof(buff)-1) {
908
+ if (*src != '.') {
909
+ if (isupper((unsigned char)*src))
910
+ buff[i++] = tolower((unsigned char)*src);
911
+ else
912
+ buff[i++] = *src;
913
+ }
914
+ src++;
915
+ }
916
+ buff[i] = '\0';
917
+
918
+ /*
919
+ * Find the first match. If the word can be
920
+ * abbreviated, make sure we match at least
921
+ * the minimum abbreviation.
922
+ */
923
+ for (tp = TimeWords; tp->name; tp++) {
924
+ size_t abbrev = tp->abbrev;
925
+ if (abbrev == 0)
926
+ abbrev = strlen(tp->name);
927
+ if (strlen(buff) >= abbrev
928
+ && strncmp(tp->name, buff, strlen(buff))
929
+ == 0) {
930
+ /* Skip over token. */
931
+ *in = src;
932
+ /* Return the match. */
933
+ *value = tp->value;
934
+ return tp->type;
935
+ }
936
+ }
937
+ }
938
+
939
+ /*
940
+ * Not in the word table, maybe it's a number. Note:
941
+ * Because '-' and '+' have other special meanings, I
942
+ * don't deal with signed numbers here.
943
+ */
944
+ if (isdigit((unsigned char)(c = **in))) {
945
+ for (*value = 0; isdigit((unsigned char)(c = *(*in)++)); )
946
+ *value = 10 * *value + c - '0';
947
+ (*in)--;
948
+ return (tUNUMBER);
949
+ }
950
+
951
+ return *(*in)++;
952
+ }
953
+ }
954
+
955
+ #define TM_YEAR_ORIGIN 1900
956
+
957
+ /* Yield A - B, measured in seconds. */
958
+ static long
959
+ difftm (struct tm *a, struct tm *b)
960
+ {
961
+ int ay = a->tm_year + (TM_YEAR_ORIGIN - 1);
962
+ int by = b->tm_year + (TM_YEAR_ORIGIN - 1);
963
+ int days = (
964
+ /* difference in day of year */
965
+ a->tm_yday - b->tm_yday
966
+ /* + intervening leap days */
967
+ + ((ay >> 2) - (by >> 2))
968
+ - (ay/100 - by/100)
969
+ + ((ay/100 >> 2) - (by/100 >> 2))
970
+ /* + difference in years * 365 */
971
+ + (long)(ay-by) * 365
972
+ );
973
+ return (days * DAY + (a->tm_hour - b->tm_hour) * HOUR
974
+ + (a->tm_min - b->tm_min) * MINUTE
975
+ + (a->tm_sec - b->tm_sec));
976
+ }
977
+
978
+ /*
979
+ *
980
+ * The public function.
981
+ *
982
+ * TODO: tokens[] array should be dynamically sized.
983
+ */
984
+ time_t
985
+ __archive_get_date(time_t now, const char *p)
986
+ {
987
+ struct token tokens[256];
988
+ struct gdstate _gds;
989
+ struct token *lasttoken;
990
+ struct gdstate *gds;
991
+ struct tm local, *tm;
992
+ struct tm gmt, *gmt_ptr;
993
+ time_t Start;
994
+ time_t tod;
995
+ long tzone;
996
+ #if defined(HAVE__LOCALTIME64_S) || defined(HAVE__GMTIME64_S)
997
+ errno_t terr;
998
+ __time64_t tmptime;
999
+ #endif
1000
+
1001
+ /* Clear out the parsed token array. */
1002
+ memset(tokens, 0, sizeof(tokens));
1003
+ /* Initialize the parser state. */
1004
+ memset(&_gds, 0, sizeof(_gds));
1005
+ gds = &_gds;
1006
+
1007
+ /* Look up the current time. */
1008
+ #if defined(HAVE_LOCALTIME_R)
1009
+ tm = localtime_r(&now, &local);
1010
+ #elif defined(HAVE__LOCALTIME64_S)
1011
+ tmptime = now;
1012
+ terr = _localtime64_s(&local, &tmptime);
1013
+ if (terr)
1014
+ tm = NULL;
1015
+ else
1016
+ tm = &local;
1017
+ #else
1018
+ memset(&local, 0, sizeof(local));
1019
+ tm = localtime(&now);
1020
+ #endif
1021
+ if (tm == NULL)
1022
+ return -1;
1023
+ #if !defined(HAVE_LOCALTIME_R) && !defined(HAVE__LOCALTIME64_S)
1024
+ local = *tm;
1025
+ #endif
1026
+
1027
+ /* Look up UTC if we can and use that to determine the current
1028
+ * timezone offset. */
1029
+ #if defined(HAVE_GMTIME_R)
1030
+ gmt_ptr = gmtime_r(&now, &gmt);
1031
+ #elif defined(HAVE__GMTIME64_S)
1032
+ tmptime = now;
1033
+ terr = _gmtime64_s(&gmt, &tmptime);
1034
+ if (terr)
1035
+ gmt_ptr = NULL;
1036
+ else
1037
+ gmt_ptr = &gmt;
1038
+ #else
1039
+ memset(&gmt, 0, sizeof(gmt));
1040
+ gmt_ptr = gmtime(&now);
1041
+ if (gmt_ptr != NULL) {
1042
+ /* Copy, in case localtime and gmtime use the same buffer. */
1043
+ gmt = *gmt_ptr;
1044
+ }
1045
+ #endif
1046
+ if (gmt_ptr != NULL)
1047
+ tzone = difftm (&gmt, &local);
1048
+ else
1049
+ /* This system doesn't understand timezones; fake it. */
1050
+ tzone = 0;
1051
+ if(local.tm_isdst)
1052
+ tzone += HOUR;
1053
+
1054
+ /* Tokenize the input string. */
1055
+ lasttoken = tokens;
1056
+ while ((lasttoken->token = nexttoken(&p, &lasttoken->value)) != 0) {
1057
+ ++lasttoken;
1058
+ if (lasttoken > tokens + 255)
1059
+ return -1;
1060
+ }
1061
+ gds->tokenp = tokens;
1062
+
1063
+ /* Match phrases until we run out of input tokens. */
1064
+ while (gds->tokenp < lasttoken) {
1065
+ if (!phrase(gds))
1066
+ return -1;
1067
+ }
1068
+
1069
+ /* Use current local timezone if none was specified. */
1070
+ if (!gds->HaveZone) {
1071
+ gds->Timezone = tzone;
1072
+ gds->DSTmode = DSTmaybe;
1073
+ }
1074
+
1075
+ /* If a timezone was specified, use that for generating the default
1076
+ * time components instead of the local timezone. */
1077
+ if (gds->HaveZone && gmt_ptr != NULL) {
1078
+ now -= gds->Timezone;
1079
+ #if defined(HAVE_GMTIME_R)
1080
+ gmt_ptr = gmtime_r(&now, &gmt);
1081
+ #elif defined(HAVE__GMTIME64_S)
1082
+ tmptime = now;
1083
+ terr = _gmtime64_s(&gmt, &tmptime);
1084
+ if (terr)
1085
+ gmt_ptr = NULL;
1086
+ else
1087
+ gmt_ptr = &gmt;
1088
+ #else
1089
+ gmt_ptr = gmtime(&now);
1090
+ #endif
1091
+ if (gmt_ptr != NULL)
1092
+ local = *gmt_ptr;
1093
+ now += gds->Timezone;
1094
+ }
1095
+
1096
+ if (!gds->HaveYear)
1097
+ gds->Year = local.tm_year + 1900;
1098
+ if (!gds->HaveMonth)
1099
+ gds->Month = local.tm_mon + 1;
1100
+ if (!gds->HaveDay)
1101
+ gds->Day = local.tm_mday;
1102
+ /* Note: No default for hour/min/sec; a specifier that just
1103
+ * gives date always refers to 00:00 on that date. */
1104
+
1105
+ /* If we saw more than one time, timezone, weekday, year, month,
1106
+ * or day, then give up. */
1107
+ if (gds->HaveTime > 1 || gds->HaveZone > 1 || gds->HaveWeekDay > 1
1108
+ || gds->HaveYear > 1 || gds->HaveMonth > 1 || gds->HaveDay > 1)
1109
+ return -1;
1110
+
1111
+ /* Compute an absolute time based on whatever absolute information
1112
+ * we collected. */
1113
+ if (gds->HaveYear || gds->HaveMonth || gds->HaveDay
1114
+ || gds->HaveTime || gds->HaveWeekDay) {
1115
+ Start = Convert(gds->Month, gds->Day, gds->Year,
1116
+ gds->Hour, gds->Minutes, gds->Seconds,
1117
+ gds->Timezone, gds->DSTmode);
1118
+ if (Start < 0)
1119
+ return -1;
1120
+ } else {
1121
+ Start = now;
1122
+ if (!gds->HaveRel)
1123
+ Start -= local.tm_hour * HOUR + local.tm_min * MINUTE
1124
+ + local.tm_sec;
1125
+ }
1126
+
1127
+ /* Add the relative offset. */
1128
+ Start += gds->RelSeconds;
1129
+ Start += RelativeMonth(Start, gds->Timezone, gds->RelMonth);
1130
+
1131
+ /* Adjust for day-of-week offsets. */
1132
+ if (gds->HaveWeekDay
1133
+ && !(gds->HaveYear || gds->HaveMonth || gds->HaveDay)) {
1134
+ tod = RelativeDate(Start, gds->Timezone,
1135
+ gds->DSTmode, gds->DayOrdinal, gds->DayNumber);
1136
+ Start += tod;
1137
+ }
1138
+
1139
+ /* -1 is an error indicator, so return 0 instead of -1 if
1140
+ * that's the actual time. */
1141
+ return Start == -1 ? 0 : Start;
1142
+ }
1143
+
1144
+
1145
+ #if defined(TEST)
1146
+
1147
+ /* ARGSUSED */
1148
+ int
1149
+ main(int argc, char **argv)
1150
+ {
1151
+ time_t d;
1152
+ time_t now = time(NULL);
1153
+
1154
+ while (*++argv != NULL) {
1155
+ (void)printf("Input: %s\n", *argv);
1156
+ d = get_date(now, *argv);
1157
+ if (d == -1)
1158
+ (void)printf("Bad format - couldn't convert.\n");
1159
+ else
1160
+ (void)printf("Output: %s\n", ctime(&d));
1161
+ }
1162
+ exit(0);
1163
+ /* NOTREACHED */
1164
+ }
1165
+ #endif /* defined(TEST) */