fast_excel 0.1.4 → 0.1.5

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 (95) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +5 -2
  3. data/Makefile +14 -0
  4. data/README.md +7 -2
  5. data/Rakefile +10 -0
  6. data/extconf.rb +0 -0
  7. data/fast_excel.gemspec +3 -1
  8. data/lib/fast_excel/binding.rb +3 -7
  9. data/lib/rubygems_plugin.rb +3 -0
  10. data/libxlsxwriter/.gitignore +49 -0
  11. data/libxlsxwriter/.indent.pro +125 -0
  12. data/libxlsxwriter/.travis.yml +25 -0
  13. data/libxlsxwriter/CONTRIBUTING.md +226 -0
  14. data/libxlsxwriter/Changes.txt +557 -0
  15. data/libxlsxwriter/LICENSE.txt +89 -0
  16. data/libxlsxwriter/Makefile +156 -0
  17. data/libxlsxwriter/Readme.md +78 -0
  18. data/libxlsxwriter/cocoapods/libxlsxwriter-umbrella.h +30 -0
  19. data/libxlsxwriter/cocoapods/libxlsxwriter.modulemap +7 -0
  20. data/libxlsxwriter/include/xlsxwriter/app.h +79 -0
  21. data/libxlsxwriter/include/xlsxwriter/chart.h +3476 -0
  22. data/libxlsxwriter/include/xlsxwriter/common.h +372 -0
  23. data/libxlsxwriter/include/xlsxwriter/content_types.h +74 -0
  24. data/libxlsxwriter/include/xlsxwriter/core.h +51 -0
  25. data/libxlsxwriter/include/xlsxwriter/custom.h +52 -0
  26. data/libxlsxwriter/include/xlsxwriter/drawing.h +111 -0
  27. data/libxlsxwriter/include/xlsxwriter/format.h +1214 -0
  28. data/libxlsxwriter/include/xlsxwriter/hash_table.h +76 -0
  29. data/libxlsxwriter/include/xlsxwriter/packager.h +80 -0
  30. data/libxlsxwriter/include/xlsxwriter/relationships.h +77 -0
  31. data/libxlsxwriter/include/xlsxwriter/shared_strings.h +83 -0
  32. data/libxlsxwriter/include/xlsxwriter/styles.h +77 -0
  33. data/libxlsxwriter/include/xlsxwriter/theme.h +47 -0
  34. data/libxlsxwriter/include/xlsxwriter/third_party/ioapi.h +214 -0
  35. data/libxlsxwriter/include/xlsxwriter/third_party/queue.h +694 -0
  36. data/libxlsxwriter/include/xlsxwriter/third_party/tmpfileplus.h +53 -0
  37. data/libxlsxwriter/include/xlsxwriter/third_party/tree.h +801 -0
  38. data/libxlsxwriter/include/xlsxwriter/third_party/zip.h +375 -0
  39. data/libxlsxwriter/include/xlsxwriter/utility.h +166 -0
  40. data/libxlsxwriter/include/xlsxwriter/workbook.h +757 -0
  41. data/libxlsxwriter/include/xlsxwriter/worksheet.h +2641 -0
  42. data/libxlsxwriter/include/xlsxwriter/xmlwriter.h +178 -0
  43. data/libxlsxwriter/include/xlsxwriter.h +23 -0
  44. data/libxlsxwriter/lib/.gitignore +0 -0
  45. data/libxlsxwriter/libxlsxwriter.podspec +47 -0
  46. data/libxlsxwriter/src/Makefile +130 -0
  47. data/libxlsxwriter/src/app.c +443 -0
  48. data/libxlsxwriter/src/chart.c +6346 -0
  49. data/libxlsxwriter/src/content_types.c +345 -0
  50. data/libxlsxwriter/src/core.c +293 -0
  51. data/libxlsxwriter/src/custom.c +224 -0
  52. data/libxlsxwriter/src/drawing.c +746 -0
  53. data/libxlsxwriter/src/format.c +729 -0
  54. data/libxlsxwriter/src/hash_table.c +223 -0
  55. data/libxlsxwriter/src/packager.c +948 -0
  56. data/libxlsxwriter/src/relationships.c +245 -0
  57. data/libxlsxwriter/src/shared_strings.c +266 -0
  58. data/libxlsxwriter/src/styles.c +1088 -0
  59. data/libxlsxwriter/src/theme.c +348 -0
  60. data/libxlsxwriter/src/utility.c +515 -0
  61. data/libxlsxwriter/src/workbook.c +1930 -0
  62. data/libxlsxwriter/src/worksheet.c +5022 -0
  63. data/libxlsxwriter/src/xmlwriter.c +355 -0
  64. data/libxlsxwriter/third_party/minizip/Makefile +44 -0
  65. data/libxlsxwriter/third_party/minizip/Makefile.am +45 -0
  66. data/libxlsxwriter/third_party/minizip/Makefile.orig +25 -0
  67. data/libxlsxwriter/third_party/minizip/MiniZip64_Changes.txt +6 -0
  68. data/libxlsxwriter/third_party/minizip/MiniZip64_info.txt +74 -0
  69. data/libxlsxwriter/third_party/minizip/README.txt +5 -0
  70. data/libxlsxwriter/third_party/minizip/configure.ac +32 -0
  71. data/libxlsxwriter/third_party/minizip/crypt.h +131 -0
  72. data/libxlsxwriter/third_party/minizip/ioapi.c +247 -0
  73. data/libxlsxwriter/third_party/minizip/ioapi.h +208 -0
  74. data/libxlsxwriter/third_party/minizip/iowin32.c +456 -0
  75. data/libxlsxwriter/third_party/minizip/iowin32.h +28 -0
  76. data/libxlsxwriter/third_party/minizip/make_vms.com +25 -0
  77. data/libxlsxwriter/third_party/minizip/miniunz.c +660 -0
  78. data/libxlsxwriter/third_party/minizip/miniunzip.1 +63 -0
  79. data/libxlsxwriter/third_party/minizip/minizip.1 +46 -0
  80. data/libxlsxwriter/third_party/minizip/minizip.c +520 -0
  81. data/libxlsxwriter/third_party/minizip/minizip.pc.in +12 -0
  82. data/libxlsxwriter/third_party/minizip/mztools.c +291 -0
  83. data/libxlsxwriter/third_party/minizip/mztools.h +37 -0
  84. data/libxlsxwriter/third_party/minizip/unzip.c +2125 -0
  85. data/libxlsxwriter/third_party/minizip/unzip.h +437 -0
  86. data/libxlsxwriter/third_party/minizip/zip.c +2007 -0
  87. data/libxlsxwriter/third_party/minizip/zip.h +367 -0
  88. data/libxlsxwriter/third_party/tmpfileplus/Makefile +42 -0
  89. data/libxlsxwriter/third_party/tmpfileplus/tmpfileplus.c +342 -0
  90. data/libxlsxwriter/third_party/tmpfileplus/tmpfileplus.h +53 -0
  91. data/libxlsxwriter/version.txt +1 -0
  92. metadata +89 -6
  93. data/binaries/libxlsxwriter-alpine.so +0 -0
  94. data/binaries/libxlsxwriter-darwin.dylib +0 -0
  95. data/binaries/libxlsxwriter-glibc.so +0 -0
@@ -0,0 +1,223 @@
1
+ /*****************************************************************************
2
+ * hash_table - Hash table functions for libxlsxwriter.
3
+ *
4
+ * Used in conjunction with the libxlsxwriter library.
5
+ *
6
+ * Copyright 2014-2017, John McNamara, jmcnamara@cpan.org. See LICENSE.txt.
7
+ *
8
+ */
9
+
10
+ #include <stdlib.h>
11
+ #include <stdio.h>
12
+ #include <string.h>
13
+ #include <stdint.h>
14
+ #include "xlsxwriter/hash_table.h"
15
+
16
+ /*
17
+ * Calculate the hash key using the FNV function. See:
18
+ * http://en.wikipedia.org/wiki/Fowler-Noll-Vo_hash_function
19
+ */
20
+ STATIC size_t
21
+ _generate_hash_key(void *data, size_t data_len, size_t num_buckets)
22
+ {
23
+ unsigned char *p = data;
24
+ size_t hash = 2166136261U;
25
+ size_t i;
26
+
27
+ for (i = 0; i < data_len; i++)
28
+ hash = (hash * 16777619) ^ p[i];
29
+
30
+ return hash % num_buckets;
31
+ }
32
+
33
+ /*
34
+ * Check if an element exists in the hash table and return a pointer
35
+ * to it if it does.
36
+ */
37
+ lxw_hash_element *
38
+ lxw_hash_key_exists(lxw_hash_table *lxw_hash, void *key, size_t key_len)
39
+ {
40
+ size_t hash_key = _generate_hash_key(key, key_len, lxw_hash->num_buckets);
41
+ struct lxw_hash_bucket_list *list;
42
+ lxw_hash_element *element;
43
+
44
+ if (!lxw_hash->buckets[hash_key]) {
45
+ /* The key isn't in the LXW_HASH hash table. */
46
+ return NULL;
47
+ }
48
+ else {
49
+ /* The key is already in the table or there is a hash collision. */
50
+ list = lxw_hash->buckets[hash_key];
51
+
52
+ /* Iterate over the keys in the bucket's linked list. */
53
+ SLIST_FOREACH(element, list, lxw_hash_list_pointers) {
54
+ if (memcmp(element->key, key, key_len) == 0) {
55
+ /* The key already exists in the table. */
56
+ return element;
57
+ }
58
+ }
59
+
60
+ /* Key doesn't exist in the list so this is a hash collision. */
61
+ return NULL;
62
+ }
63
+ }
64
+
65
+ /*
66
+ * Insert or update a value in the LXW_HASH table based on a key
67
+ * and return a pointer to the new or updated element.
68
+ */
69
+ lxw_hash_element *
70
+ lxw_insert_hash_element(lxw_hash_table *lxw_hash, void *key, void *value,
71
+ size_t key_len)
72
+ {
73
+ size_t hash_key = _generate_hash_key(key, key_len, lxw_hash->num_buckets);
74
+ struct lxw_hash_bucket_list *list = NULL;
75
+ lxw_hash_element *element = NULL;
76
+
77
+ if (!lxw_hash->buckets[hash_key]) {
78
+ /* The key isn't in the LXW_HASH hash table. */
79
+
80
+ /* Create a linked list in the bucket to hold the lxw_hash keys. */
81
+ list = calloc(1, sizeof(struct lxw_hash_bucket_list));
82
+ GOTO_LABEL_ON_MEM_ERROR(list, mem_error1);
83
+
84
+ /* Initialize the bucket linked list. */
85
+ SLIST_INIT(list);
86
+
87
+ /* Create an lxw_hash element to add to the linked list. */
88
+ element = calloc(1, sizeof(lxw_hash_element));
89
+ GOTO_LABEL_ON_MEM_ERROR(element, mem_error1);
90
+
91
+ /* Store the key and value. */
92
+ element->key = key;
93
+ element->value = value;
94
+
95
+ /* Add the lxw_hash element to the bucket's linked list. */
96
+ SLIST_INSERT_HEAD(list, element, lxw_hash_list_pointers);
97
+
98
+ /* Also add it to the insertion order linked list. */
99
+ STAILQ_INSERT_TAIL(lxw_hash->order_list, element,
100
+ lxw_hash_order_pointers);
101
+
102
+ /* Store the bucket list at the hash index. */
103
+ lxw_hash->buckets[hash_key] = list;
104
+
105
+ lxw_hash->used_buckets++;
106
+ lxw_hash->unique_count++;
107
+
108
+ return element;
109
+ }
110
+ else {
111
+ /* The key is already in the table or there is a hash collision. */
112
+ list = lxw_hash->buckets[hash_key];
113
+
114
+ /* Iterate over the keys in the bucket's linked list. */
115
+ SLIST_FOREACH(element, list, lxw_hash_list_pointers) {
116
+ if (memcmp(element->key, key, key_len) == 0) {
117
+ /* The key already exists in the table. Update the value. */
118
+ if (lxw_hash->free_value)
119
+ free(element->value);
120
+
121
+ element->value = value;
122
+ return element;
123
+ }
124
+ }
125
+
126
+ /* Key doesn't exist in the list so this is a hash collision.
127
+ * Create an lxw_hash element to add to the linked list. */
128
+ element = calloc(1, sizeof(lxw_hash_element));
129
+ GOTO_LABEL_ON_MEM_ERROR(element, mem_error2);
130
+
131
+ /* Store the key and value. */
132
+ element->key = key;
133
+ element->value = value;
134
+
135
+ /* Add the lxw_hash element to the bucket linked list. */
136
+ SLIST_INSERT_HEAD(list, element, lxw_hash_list_pointers);
137
+
138
+ /* Also add it to the insertion order linked list. */
139
+ STAILQ_INSERT_TAIL(lxw_hash->order_list, element,
140
+ lxw_hash_order_pointers);
141
+
142
+ lxw_hash->unique_count++;
143
+
144
+ return element;
145
+ }
146
+
147
+ mem_error1:
148
+ free(list);
149
+
150
+ mem_error2:
151
+ free(element);
152
+ return NULL;
153
+ }
154
+
155
+ /*
156
+ * Create a new LXW_HASH hash table object.
157
+ */
158
+ lxw_hash_table *
159
+ lxw_hash_new(uint32_t num_buckets, uint8_t free_key, uint8_t free_value)
160
+ {
161
+ /* Create the new hash table. */
162
+ lxw_hash_table *lxw_hash = calloc(1, sizeof(lxw_hash_table));
163
+ RETURN_ON_MEM_ERROR(lxw_hash, NULL);
164
+
165
+ lxw_hash->free_key = free_key;
166
+ lxw_hash->free_value = free_value;
167
+
168
+ /* Add the lxw_hash element buckets. */
169
+ lxw_hash->buckets =
170
+ calloc(num_buckets, sizeof(struct lxw_hash_bucket_list *));
171
+ GOTO_LABEL_ON_MEM_ERROR(lxw_hash->buckets, mem_error);
172
+
173
+ /* Add a list for tracking the insertion order. */
174
+ lxw_hash->order_list = calloc(1, sizeof(struct lxw_hash_order_list));
175
+ GOTO_LABEL_ON_MEM_ERROR(lxw_hash->order_list, mem_error);
176
+
177
+ /* Initialize the order list. */
178
+ STAILQ_INIT(lxw_hash->order_list);
179
+
180
+ /* Store the number of buckets to calculate the load factor. */
181
+ lxw_hash->num_buckets = num_buckets;
182
+
183
+ return lxw_hash;
184
+
185
+ mem_error:
186
+ lxw_hash_free(lxw_hash);
187
+ return NULL;
188
+ }
189
+
190
+ /*
191
+ * Free the LXW_HASH hash table object.
192
+ */
193
+ void
194
+ lxw_hash_free(lxw_hash_table *lxw_hash)
195
+ {
196
+ size_t i;
197
+ lxw_hash_element *element;
198
+ lxw_hash_element *element_temp;
199
+
200
+ if (!lxw_hash)
201
+ return;
202
+
203
+ /* Free the lxw_hash_elements and data using the ordered linked list. */
204
+ if (lxw_hash->order_list) {
205
+ STAILQ_FOREACH_SAFE(element, lxw_hash->order_list,
206
+ lxw_hash_order_pointers, element_temp) {
207
+ if (lxw_hash->free_key)
208
+ free(element->key);
209
+ if (lxw_hash->free_value)
210
+ free(element->value);
211
+ free(element);
212
+ }
213
+ }
214
+
215
+ /* Free the buckets from the hash table. */
216
+ for (i = 0; i < lxw_hash->num_buckets; i++) {
217
+ free(lxw_hash->buckets[i]);
218
+ }
219
+
220
+ free(lxw_hash->order_list);
221
+ free(lxw_hash->buckets);
222
+ free(lxw_hash);
223
+ }