kmadej_fast_excel_fork 0.2.2

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 (119) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +13 -0
  3. data/.travis.yml +28 -0
  4. data/CHANGELOG.md +13 -0
  5. data/Gemfile +17 -0
  6. data/Gemfile.lock +70 -0
  7. data/Makefile +14 -0
  8. data/README.md +95 -0
  9. data/Rakefile +24 -0
  10. data/appveyor.yml +25 -0
  11. data/benchmarks/1k_rows.rb +59 -0
  12. data/benchmarks/20k_rows.rb +26 -0
  13. data/benchmarks/init.rb +59 -0
  14. data/benchmarks/memory.rb +49 -0
  15. data/examples/example.rb +42 -0
  16. data/examples/example_align.rb +23 -0
  17. data/examples/example_chart.rb +21 -0
  18. data/examples/example_colors.rb +37 -0
  19. data/examples/example_formula.rb +18 -0
  20. data/examples/example_image.rb +13 -0
  21. data/examples/example_styles.rb +27 -0
  22. data/examples/logo.png +0 -0
  23. data/extconf.rb +0 -0
  24. data/fast_excel.gemspec +20 -0
  25. data/lib/fast_excel.rb +600 -0
  26. data/lib/fast_excel/binding.rb +2819 -0
  27. data/lib/fast_excel/binding/chart.rb +2666 -0
  28. data/lib/fast_excel/binding/format.rb +1177 -0
  29. data/lib/fast_excel/binding/workbook.rb +338 -0
  30. data/lib/fast_excel/binding/worksheet.rb +1555 -0
  31. data/libxlsxwriter/.gitignore +49 -0
  32. data/libxlsxwriter/.indent.pro +125 -0
  33. data/libxlsxwriter/.travis.yml +25 -0
  34. data/libxlsxwriter/CONTRIBUTING.md +226 -0
  35. data/libxlsxwriter/Changes.txt +557 -0
  36. data/libxlsxwriter/LICENSE.txt +89 -0
  37. data/libxlsxwriter/Makefile +156 -0
  38. data/libxlsxwriter/Readme.md +78 -0
  39. data/libxlsxwriter/cocoapods/libxlsxwriter-umbrella.h +30 -0
  40. data/libxlsxwriter/cocoapods/libxlsxwriter.modulemap +7 -0
  41. data/libxlsxwriter/include/xlsxwriter.h +23 -0
  42. data/libxlsxwriter/include/xlsxwriter/app.h +79 -0
  43. data/libxlsxwriter/include/xlsxwriter/chart.h +3476 -0
  44. data/libxlsxwriter/include/xlsxwriter/common.h +372 -0
  45. data/libxlsxwriter/include/xlsxwriter/content_types.h +74 -0
  46. data/libxlsxwriter/include/xlsxwriter/core.h +51 -0
  47. data/libxlsxwriter/include/xlsxwriter/custom.h +52 -0
  48. data/libxlsxwriter/include/xlsxwriter/drawing.h +111 -0
  49. data/libxlsxwriter/include/xlsxwriter/format.h +1214 -0
  50. data/libxlsxwriter/include/xlsxwriter/hash_table.h +76 -0
  51. data/libxlsxwriter/include/xlsxwriter/packager.h +80 -0
  52. data/libxlsxwriter/include/xlsxwriter/relationships.h +77 -0
  53. data/libxlsxwriter/include/xlsxwriter/shared_strings.h +83 -0
  54. data/libxlsxwriter/include/xlsxwriter/styles.h +77 -0
  55. data/libxlsxwriter/include/xlsxwriter/theme.h +47 -0
  56. data/libxlsxwriter/include/xlsxwriter/third_party/ioapi.h +214 -0
  57. data/libxlsxwriter/include/xlsxwriter/third_party/queue.h +694 -0
  58. data/libxlsxwriter/include/xlsxwriter/third_party/tmpfileplus.h +53 -0
  59. data/libxlsxwriter/include/xlsxwriter/third_party/tree.h +801 -0
  60. data/libxlsxwriter/include/xlsxwriter/third_party/zip.h +375 -0
  61. data/libxlsxwriter/include/xlsxwriter/utility.h +166 -0
  62. data/libxlsxwriter/include/xlsxwriter/workbook.h +757 -0
  63. data/libxlsxwriter/include/xlsxwriter/worksheet.h +2641 -0
  64. data/libxlsxwriter/include/xlsxwriter/xmlwriter.h +178 -0
  65. data/libxlsxwriter/lib/.gitignore +0 -0
  66. data/libxlsxwriter/libxlsxwriter.podspec +47 -0
  67. data/libxlsxwriter/src/Makefile +130 -0
  68. data/libxlsxwriter/src/app.c +443 -0
  69. data/libxlsxwriter/src/chart.c +6346 -0
  70. data/libxlsxwriter/src/content_types.c +345 -0
  71. data/libxlsxwriter/src/core.c +293 -0
  72. data/libxlsxwriter/src/custom.c +224 -0
  73. data/libxlsxwriter/src/drawing.c +746 -0
  74. data/libxlsxwriter/src/format.c +729 -0
  75. data/libxlsxwriter/src/hash_table.c +223 -0
  76. data/libxlsxwriter/src/packager.c +948 -0
  77. data/libxlsxwriter/src/relationships.c +245 -0
  78. data/libxlsxwriter/src/shared_strings.c +266 -0
  79. data/libxlsxwriter/src/styles.c +1088 -0
  80. data/libxlsxwriter/src/theme.c +348 -0
  81. data/libxlsxwriter/src/utility.c +515 -0
  82. data/libxlsxwriter/src/workbook.c +1930 -0
  83. data/libxlsxwriter/src/worksheet.c +5022 -0
  84. data/libxlsxwriter/src/xmlwriter.c +355 -0
  85. data/libxlsxwriter/third_party/minizip/Makefile +44 -0
  86. data/libxlsxwriter/third_party/minizip/Makefile.am +45 -0
  87. data/libxlsxwriter/third_party/minizip/Makefile.orig +25 -0
  88. data/libxlsxwriter/third_party/minizip/MiniZip64_Changes.txt +6 -0
  89. data/libxlsxwriter/third_party/minizip/MiniZip64_info.txt +74 -0
  90. data/libxlsxwriter/third_party/minizip/README.txt +5 -0
  91. data/libxlsxwriter/third_party/minizip/configure.ac +32 -0
  92. data/libxlsxwriter/third_party/minizip/crypt.h +131 -0
  93. data/libxlsxwriter/third_party/minizip/ioapi.c +247 -0
  94. data/libxlsxwriter/third_party/minizip/ioapi.h +208 -0
  95. data/libxlsxwriter/third_party/minizip/iowin32.c +456 -0
  96. data/libxlsxwriter/third_party/minizip/iowin32.h +28 -0
  97. data/libxlsxwriter/third_party/minizip/make_vms.com +25 -0
  98. data/libxlsxwriter/third_party/minizip/miniunz.c +660 -0
  99. data/libxlsxwriter/third_party/minizip/miniunzip.1 +63 -0
  100. data/libxlsxwriter/third_party/minizip/minizip.1 +46 -0
  101. data/libxlsxwriter/third_party/minizip/minizip.c +520 -0
  102. data/libxlsxwriter/third_party/minizip/minizip.pc.in +12 -0
  103. data/libxlsxwriter/third_party/minizip/mztools.c +291 -0
  104. data/libxlsxwriter/third_party/minizip/mztools.h +37 -0
  105. data/libxlsxwriter/third_party/minizip/unzip.c +2125 -0
  106. data/libxlsxwriter/third_party/minizip/unzip.h +437 -0
  107. data/libxlsxwriter/third_party/minizip/zip.c +2007 -0
  108. data/libxlsxwriter/third_party/minizip/zip.h +367 -0
  109. data/libxlsxwriter/third_party/tmpfileplus/Makefile +42 -0
  110. data/libxlsxwriter/third_party/tmpfileplus/tmpfileplus.c +342 -0
  111. data/libxlsxwriter/third_party/tmpfileplus/tmpfileplus.h +53 -0
  112. data/libxlsxwriter/version.txt +1 -0
  113. data/test/date_test.rb +22 -0
  114. data/test/default_format_test.rb +19 -0
  115. data/test/format_test.rb +171 -0
  116. data/test/test_helper.rb +52 -0
  117. data/test/tmpfile_test.rb +23 -0
  118. data/test/worksheet_test.rb +86 -0
  119. metadata +182 -0
@@ -0,0 +1,355 @@
1
+ /*****************************************************************************
2
+ * xmlwriter - A base library for libxlsxwriter libraries.
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 <stdio.h>
11
+ #include <string.h>
12
+ #include <stdlib.h>
13
+ #include "xlsxwriter/xmlwriter.h"
14
+
15
+ #define LXW_AMP "&amp;"
16
+ #define LXW_LT "&lt;"
17
+ #define LXW_GT "&gt;"
18
+ #define LXW_QUOT "&quot;"
19
+
20
+ /* Defines. */
21
+ #define LXW_MAX_ENCODED_ATTRIBUTE_LENGTH (LXW_MAX_ATTRIBUTE_LENGTH*6)
22
+
23
+ /* Forward declarations. */
24
+ STATIC char *_escape_attributes(struct xml_attribute *attribute);
25
+
26
+ char *lxw_escape_data(const char *data);
27
+
28
+ STATIC void _fprint_escaped_attributes(FILE * xmlfile,
29
+ struct xml_attribute_list *attributes);
30
+
31
+ STATIC void _fprint_escaped_data(FILE * xmlfile, const char *data);
32
+
33
+ /*
34
+ * Write the XML declaration.
35
+ */
36
+ void
37
+ lxw_xml_declaration(FILE * xmlfile)
38
+ {
39
+ fprintf(xmlfile, "<?xml version=\"1.0\" "
40
+ "encoding=\"UTF-8\" standalone=\"yes\"?>\n");
41
+ }
42
+
43
+ /*
44
+ * Write an XML start tag with optional attributes.
45
+ */
46
+ void
47
+ lxw_xml_start_tag(FILE * xmlfile,
48
+ const char *tag, struct xml_attribute_list *attributes)
49
+ {
50
+ fprintf(xmlfile, "<%s", tag);
51
+
52
+ _fprint_escaped_attributes(xmlfile, attributes);
53
+
54
+ fprintf(xmlfile, ">");
55
+ }
56
+
57
+ /*
58
+ * Write an XML start tag with optional, unencoded, attributes.
59
+ * This is a minor speed optimization for elements that don't need encoding.
60
+ */
61
+ void
62
+ lxw_xml_start_tag_unencoded(FILE * xmlfile,
63
+ const char *tag,
64
+ struct xml_attribute_list *attributes)
65
+ {
66
+ struct xml_attribute *attribute;
67
+
68
+ fprintf(xmlfile, "<%s", tag);
69
+
70
+ if (attributes) {
71
+ STAILQ_FOREACH(attribute, attributes, list_entries) {
72
+ fprintf(xmlfile, " %s=\"%s\"", attribute->key, attribute->value);
73
+ }
74
+ }
75
+
76
+ fprintf(xmlfile, ">");
77
+ }
78
+
79
+ /*
80
+ * Write an XML end tag.
81
+ */
82
+ void
83
+ lxw_xml_end_tag(FILE * xmlfile, const char *tag)
84
+ {
85
+ fprintf(xmlfile, "</%s>", tag);
86
+ }
87
+
88
+ /*
89
+ * Write an empty XML tag with optional attributes.
90
+ */
91
+ void
92
+ lxw_xml_empty_tag(FILE * xmlfile,
93
+ const char *tag, struct xml_attribute_list *attributes)
94
+ {
95
+ fprintf(xmlfile, "<%s", tag);
96
+
97
+ _fprint_escaped_attributes(xmlfile, attributes);
98
+
99
+ fprintf(xmlfile, "/>");
100
+ }
101
+
102
+ /*
103
+ * Write an XML start tag with optional, unencoded, attributes.
104
+ * This is a minor speed optimization for elements that don't need encoding.
105
+ */
106
+ void
107
+ lxw_xml_empty_tag_unencoded(FILE * xmlfile,
108
+ const char *tag,
109
+ struct xml_attribute_list *attributes)
110
+ {
111
+ struct xml_attribute *attribute;
112
+
113
+ fprintf(xmlfile, "<%s", tag);
114
+
115
+ if (attributes) {
116
+ STAILQ_FOREACH(attribute, attributes, list_entries) {
117
+ fprintf(xmlfile, " %s=\"%s\"", attribute->key, attribute->value);
118
+ }
119
+ }
120
+
121
+ fprintf(xmlfile, "/>");
122
+ }
123
+
124
+ /*
125
+ * Write an XML element containing data with optional attributes.
126
+ */
127
+ void
128
+ lxw_xml_data_element(FILE * xmlfile,
129
+ const char *tag,
130
+ const char *data, struct xml_attribute_list *attributes)
131
+ {
132
+ fprintf(xmlfile, "<%s", tag);
133
+
134
+ _fprint_escaped_attributes(xmlfile, attributes);
135
+
136
+ fprintf(xmlfile, ">");
137
+
138
+ _fprint_escaped_data(xmlfile, data);
139
+
140
+ fprintf(xmlfile, "</%s>", tag);
141
+ }
142
+
143
+ /*
144
+ * Escape XML characters in attributes.
145
+ */
146
+ STATIC char *
147
+ _escape_attributes(struct xml_attribute *attribute)
148
+ {
149
+ char *encoded = (char *) calloc(LXW_MAX_ENCODED_ATTRIBUTE_LENGTH, 1);
150
+ char *p_encoded = encoded;
151
+ char *p_attr = attribute->value;
152
+
153
+ while (*p_attr) {
154
+ switch (*p_attr) {
155
+ case '&':
156
+ strncat(p_encoded, LXW_AMP, sizeof(LXW_AMP) - 1);
157
+ p_encoded += sizeof(LXW_AMP) - 1;
158
+ break;
159
+ case '<':
160
+ strncat(p_encoded, LXW_LT, sizeof(LXW_LT) - 1);
161
+ p_encoded += sizeof(LXW_LT) - 1;
162
+ break;
163
+ case '>':
164
+ strncat(p_encoded, LXW_GT, sizeof(LXW_GT) - 1);
165
+ p_encoded += sizeof(LXW_GT) - 1;
166
+ break;
167
+ case '"':
168
+ strncat(p_encoded, LXW_QUOT, sizeof(LXW_QUOT) - 1);
169
+ p_encoded += sizeof(LXW_QUOT) - 1;
170
+ break;
171
+ default:
172
+ *p_encoded = *p_attr;
173
+ p_encoded++;
174
+ break;
175
+ }
176
+ p_attr++;
177
+ }
178
+
179
+ return encoded;
180
+ }
181
+
182
+ /*
183
+ * Escape XML characters in data sections of tags.
184
+ * Note, this is different from _escape_attributes()
185
+ * in that double quotes are not escaped by Excel.
186
+ */
187
+ char *
188
+ lxw_escape_data(const char *data)
189
+ {
190
+ size_t encoded_len = (strlen(data) * 5 + 1);
191
+
192
+ char *encoded = (char *) calloc(encoded_len, 1);
193
+ char *p_encoded = encoded;
194
+
195
+ while (*data) {
196
+ switch (*data) {
197
+ case '&':
198
+ strncat(p_encoded, LXW_AMP, sizeof(LXW_AMP) - 1);
199
+ p_encoded += sizeof(LXW_AMP) - 1;
200
+ break;
201
+ case '<':
202
+ strncat(p_encoded, LXW_LT, sizeof(LXW_LT) - 1);
203
+ p_encoded += sizeof(LXW_LT) - 1;
204
+ break;
205
+ case '>':
206
+ strncat(p_encoded, LXW_GT, sizeof(LXW_GT) - 1);
207
+ p_encoded += sizeof(LXW_GT) - 1;
208
+ break;
209
+ default:
210
+ *p_encoded = *data;
211
+ p_encoded++;
212
+ break;
213
+ }
214
+ data++;
215
+ }
216
+
217
+ return encoded;
218
+ }
219
+
220
+ /*
221
+ * Escape control characters in strings with with _xHHHH_.
222
+ */
223
+ char *
224
+ lxw_escape_control_characters(const char *string)
225
+ {
226
+ size_t escape_len = sizeof("_xHHHH_") - 1;
227
+ size_t encoded_len = (strlen(string) * escape_len + 1);
228
+
229
+ char *encoded = (char *) calloc(encoded_len, 1);
230
+ char *p_encoded = encoded;
231
+
232
+ while (*string) {
233
+ switch (*string) {
234
+ case '\x01':
235
+ case '\x02':
236
+ case '\x03':
237
+ case '\x04':
238
+ case '\x05':
239
+ case '\x06':
240
+ case '\x07':
241
+ case '\x08':
242
+ case '\x0B':
243
+ case '\x0C':
244
+ case '\x0D':
245
+ case '\x0E':
246
+ case '\x0F':
247
+ case '\x10':
248
+ case '\x11':
249
+ case '\x12':
250
+ case '\x13':
251
+ case '\x14':
252
+ case '\x15':
253
+ case '\x16':
254
+ case '\x17':
255
+ case '\x18':
256
+ case '\x19':
257
+ case '\x1A':
258
+ case '\x1B':
259
+ case '\x1C':
260
+ case '\x1D':
261
+ case '\x1E':
262
+ case '\x1F':
263
+ lxw_snprintf(p_encoded, escape_len + 1, "_x%04X_", *string);
264
+ p_encoded += escape_len;
265
+ break;
266
+ default:
267
+ *p_encoded = *string;
268
+ p_encoded++;
269
+ break;
270
+ }
271
+ string++;
272
+ }
273
+
274
+ return encoded;
275
+ }
276
+
277
+ /* Write out escaped attributes. */
278
+ STATIC void
279
+ _fprint_escaped_attributes(FILE * xmlfile,
280
+ struct xml_attribute_list *attributes)
281
+ {
282
+ struct xml_attribute *attribute;
283
+
284
+ if (attributes) {
285
+ STAILQ_FOREACH(attribute, attributes, list_entries) {
286
+ fprintf(xmlfile, " %s=", attribute->key);
287
+
288
+ if (!strpbrk(attribute->value, "&<>\"")) {
289
+ fprintf(xmlfile, "\"%s\"", attribute->value);
290
+ }
291
+ else {
292
+ char *encoded = _escape_attributes(attribute);
293
+
294
+ if (encoded) {
295
+ fprintf(xmlfile, "\"%s\"", encoded);
296
+
297
+ free(encoded);
298
+ }
299
+ }
300
+ }
301
+ }
302
+ }
303
+
304
+ /* Write out escaped XML data. */
305
+ STATIC void
306
+ _fprint_escaped_data(FILE * xmlfile, const char *data)
307
+ {
308
+ /* Escape the data section of the XML element. */
309
+ if (!strpbrk(data, "&<>")) {
310
+ fprintf(xmlfile, "%s", data);
311
+ }
312
+ else {
313
+ char *encoded = lxw_escape_data(data);
314
+ if (encoded) {
315
+ fprintf(xmlfile, "%s", encoded);
316
+ free(encoded);
317
+ }
318
+ }
319
+ }
320
+
321
+ /* Create a new string XML attribute. */
322
+ struct xml_attribute *
323
+ lxw_new_attribute_str(const char *key, const char *value)
324
+ {
325
+ struct xml_attribute *attribute = malloc(sizeof(struct xml_attribute));
326
+
327
+ LXW_ATTRIBUTE_COPY(attribute->key, key);
328
+ LXW_ATTRIBUTE_COPY(attribute->value, value);
329
+
330
+ return attribute;
331
+ }
332
+
333
+ /* Create a new integer XML attribute. */
334
+ struct xml_attribute *
335
+ lxw_new_attribute_int(const char *key, uint32_t value)
336
+ {
337
+ struct xml_attribute *attribute = malloc(sizeof(struct xml_attribute));
338
+
339
+ LXW_ATTRIBUTE_COPY(attribute->key, key);
340
+ lxw_snprintf(attribute->value, LXW_MAX_ATTRIBUTE_LENGTH, "%d", value);
341
+
342
+ return attribute;
343
+ }
344
+
345
+ /* Create a new double XML attribute. */
346
+ struct xml_attribute *
347
+ lxw_new_attribute_dbl(const char *key, double value)
348
+ {
349
+ struct xml_attribute *attribute = malloc(sizeof(struct xml_attribute));
350
+
351
+ LXW_ATTRIBUTE_COPY(attribute->key, key);
352
+ lxw_snprintf(attribute->value, LXW_MAX_ATTRIBUTE_LENGTH, "%.16g", value);
353
+
354
+ return attribute;
355
+ }
@@ -0,0 +1,44 @@
1
+ ###############################################################################
2
+ #
3
+ # Simplied Makefile to build the minizip objects for the libxlsxwriter library.
4
+ #
5
+
6
+ # Keep the output quiet by default.
7
+ Q=@
8
+ ifdef V
9
+ Q=
10
+ endif
11
+
12
+ UNAME := $(shell uname)
13
+
14
+ # Check for MinGW/MinGW64/Cygwin environments.
15
+ ifneq (,$(findstring MINGW, $(UNAME)))
16
+ MING_LIKE = y
17
+ endif
18
+ ifneq (,$(findstring MSYS, $(UNAME)))
19
+ MING_LIKE = y
20
+ endif
21
+ ifneq (,$(findstring CYGWIN, $(UNAME)))
22
+ MING_LIKE = y
23
+ endif
24
+
25
+ FPIC = -fPIC
26
+ CFLAGS += -O3 -DNOCRYPT -DNOUNCRYPT
27
+
28
+ # Change make options on MinGW/MinGW64/Cygwin.
29
+ ifdef MING_LIKE
30
+ FPIC =
31
+ CC = gcc
32
+ CFLAGS += -DUSE_FILE32API
33
+ endif
34
+
35
+ all: ioapi.o zip.o ioapi.so zip.so
36
+
37
+ %.o : %.c
38
+ $(Q)$(CC) -c $(CFLAGS) $<
39
+
40
+ %.so : %.c
41
+ $(Q)$(CC) $(FPIC) -c $(CFLAGS) $< -o $@
42
+
43
+ clean:
44
+ $(Q)/bin/rm -f *.o *.so
@@ -0,0 +1,45 @@
1
+ lib_LTLIBRARIES = libminizip.la
2
+
3
+ if COND_DEMOS
4
+ bin_PROGRAMS = miniunzip minizip
5
+ endif
6
+
7
+ zlib_top_srcdir = $(top_srcdir)/../..
8
+ zlib_top_builddir = $(top_builddir)/../..
9
+
10
+ AM_CPPFLAGS = -I$(zlib_top_srcdir)
11
+ AM_LDFLAGS = -L$(zlib_top_builddir)
12
+
13
+ if WIN32
14
+ iowin32_src = iowin32.c
15
+ iowin32_h = iowin32.h
16
+ endif
17
+
18
+ libminizip_la_SOURCES = \
19
+ ioapi.c \
20
+ mztools.c \
21
+ unzip.c \
22
+ zip.c \
23
+ ${iowin32_src}
24
+
25
+ libminizip_la_LDFLAGS = $(AM_LDFLAGS) -version-info 1:0:0 -lz
26
+
27
+ minizip_includedir = $(includedir)/minizip
28
+ minizip_include_HEADERS = \
29
+ crypt.h \
30
+ ioapi.h \
31
+ mztools.h \
32
+ unzip.h \
33
+ zip.h \
34
+ ${iowin32_h}
35
+
36
+ pkgconfigdir = $(libdir)/pkgconfig
37
+ pkgconfig_DATA = minizip.pc
38
+
39
+ EXTRA_PROGRAMS = miniunzip minizip
40
+
41
+ miniunzip_SOURCES = miniunz.c
42
+ miniunzip_LDADD = libminizip.la
43
+
44
+ minizip_SOURCES = minizip.c
45
+ minizip_LDADD = libminizip.la -lz
@@ -0,0 +1,25 @@
1
+ CC=cc
2
+ CFLAGS=-O -I../..
3
+
4
+ UNZ_OBJS = miniunz.o unzip.o ioapi.o ../../libz.a
5
+ ZIP_OBJS = minizip.o zip.o ioapi.o ../../libz.a
6
+
7
+ .c.o:
8
+ $(CC) -c $(CFLAGS) $*.c
9
+
10
+ all: miniunz minizip
11
+
12
+ miniunz: $(UNZ_OBJS)
13
+ $(CC) $(CFLAGS) -o $@ $(UNZ_OBJS)
14
+
15
+ minizip: $(ZIP_OBJS)
16
+ $(CC) $(CFLAGS) -o $@ $(ZIP_OBJS)
17
+
18
+ test: miniunz minizip
19
+ ./minizip test readme.txt
20
+ ./miniunz -l test.zip
21
+ mv readme.txt readme.old
22
+ ./miniunz test.zip
23
+
24
+ clean:
25
+ /bin/rm -f *.o *~ minizip miniunz