nutcracker 0.4.0.16 → 0.4.1.18

Sign up to get free protection for your applications and to get access to all the features.
Files changed (121) hide show
  1. checksums.yaml +4 -4
  2. data/Rakefile +3 -3
  3. data/ext/nutcracker/ChangeLog +33 -8
  4. data/ext/nutcracker/Makefile.in +34 -21
  5. data/ext/nutcracker/README.md +61 -26
  6. data/ext/nutcracker/aclocal.m4 +34 -31
  7. data/ext/nutcracker/autom4te.cache/output.0 +1875 -1330
  8. data/ext/nutcracker/autom4te.cache/output.1 +1875 -1330
  9. data/ext/nutcracker/autom4te.cache/requests +232 -451
  10. data/ext/nutcracker/autom4te.cache/traces.0 +2256 -2129
  11. data/ext/nutcracker/autom4te.cache/traces.1 +73 -59
  12. data/ext/nutcracker/config.h.in +1 -2
  13. data/ext/nutcracker/config.h.in~ +333 -0
  14. data/ext/nutcracker/config/compile +1 -1
  15. data/ext/nutcracker/config/config.guess +13 -160
  16. data/ext/nutcracker/config/config.sub +25 -11
  17. data/ext/nutcracker/config/depcomp +1 -1
  18. data/ext/nutcracker/config/install-sh +170 -196
  19. data/ext/nutcracker/config/ltmain.sh +3509 -2018
  20. data/ext/nutcracker/config/missing +1 -1
  21. data/ext/nutcracker/configure +1874 -1329
  22. data/ext/nutcracker/configure.ac +3 -2
  23. data/ext/nutcracker/contrib/Makefile.in +18 -5
  24. data/ext/nutcracker/contrib/yaml-0.1.4/LICENSE +19 -0
  25. data/ext/nutcracker/contrib/yaml-0.1.4/Makefile.am +20 -0
  26. data/ext/nutcracker/contrib/yaml-0.1.4/Makefile.in +832 -0
  27. data/ext/nutcracker/contrib/yaml-0.1.4/README +27 -0
  28. data/ext/nutcracker/contrib/yaml-0.1.4/aclocal.m4 +1157 -0
  29. data/ext/nutcracker/contrib/yaml-0.1.4/autom4te.cache/output.0 +13342 -0
  30. data/ext/nutcracker/contrib/yaml-0.1.4/autom4te.cache/output.1 +14611 -0
  31. data/ext/nutcracker/{autom4te.cache → contrib/yaml-0.1.4/autom4te.cache}/output.2 +3465 -8761
  32. data/ext/nutcracker/contrib/yaml-0.1.4/autom4te.cache/requests +516 -0
  33. data/ext/nutcracker/{autom4te.cache/traces.2 → contrib/yaml-0.1.4/autom4te.cache/traces.0} +662 -698
  34. data/ext/nutcracker/contrib/yaml-0.1.4/autom4te.cache/traces.1 +577 -0
  35. data/ext/nutcracker/contrib/yaml-0.1.4/autom4te.cache/traces.2 +2721 -0
  36. data/ext/nutcracker/contrib/yaml-0.1.4/config.h.in +79 -0
  37. data/ext/nutcracker/contrib/yaml-0.1.4/config.h.in~ +80 -0
  38. data/ext/nutcracker/contrib/yaml-0.1.4/config/compile +347 -0
  39. data/ext/nutcracker/contrib/yaml-0.1.4/config/config.guess +1421 -0
  40. data/ext/nutcracker/contrib/yaml-0.1.4/config/config.sub +1807 -0
  41. data/ext/nutcracker/contrib/yaml-0.1.4/config/depcomp +791 -0
  42. data/ext/nutcracker/contrib/yaml-0.1.4/config/install-sh +501 -0
  43. data/ext/nutcracker/contrib/yaml-0.1.4/config/ltmain.sh +11147 -0
  44. data/ext/nutcracker/contrib/yaml-0.1.4/config/missing +215 -0
  45. data/ext/nutcracker/contrib/yaml-0.1.4/config/test-driver +148 -0
  46. data/ext/nutcracker/contrib/yaml-0.1.4/configure +14611 -0
  47. data/ext/nutcracker/contrib/yaml-0.1.4/configure.ac +75 -0
  48. data/ext/nutcracker/contrib/yaml-0.1.4/doc/doxygen.cfg +222 -0
  49. data/ext/nutcracker/contrib/yaml-0.1.4/include/yaml.h +1971 -0
  50. data/ext/nutcracker/contrib/yaml-0.1.4/m4/libtool.m4 +8369 -0
  51. data/ext/nutcracker/contrib/yaml-0.1.4/m4/ltoptions.m4 +437 -0
  52. data/ext/nutcracker/contrib/yaml-0.1.4/m4/ltsugar.m4 +124 -0
  53. data/ext/nutcracker/contrib/yaml-0.1.4/m4/ltversion.m4 +23 -0
  54. data/ext/nutcracker/contrib/yaml-0.1.4/m4/lt~obsolete.m4 +99 -0
  55. data/ext/nutcracker/contrib/yaml-0.1.4/src/Makefile.am +4 -0
  56. data/ext/nutcracker/contrib/yaml-0.1.4/src/Makefile.in +600 -0
  57. data/ext/nutcracker/contrib/yaml-0.1.4/src/api.c +1392 -0
  58. data/ext/nutcracker/contrib/yaml-0.1.4/src/dumper.c +394 -0
  59. data/ext/nutcracker/contrib/yaml-0.1.4/src/emitter.c +2329 -0
  60. data/ext/nutcracker/contrib/yaml-0.1.4/src/loader.c +432 -0
  61. data/ext/nutcracker/contrib/yaml-0.1.4/src/parser.c +1374 -0
  62. data/ext/nutcracker/contrib/yaml-0.1.4/src/reader.c +465 -0
  63. data/ext/nutcracker/contrib/yaml-0.1.4/src/scanner.c +3570 -0
  64. data/ext/nutcracker/contrib/yaml-0.1.4/src/writer.c +141 -0
  65. data/ext/nutcracker/contrib/yaml-0.1.4/src/yaml_private.h +640 -0
  66. data/ext/nutcracker/contrib/yaml-0.1.4/tests/Makefile.am +8 -0
  67. data/ext/nutcracker/contrib/yaml-0.1.4/tests/Makefile.in +1083 -0
  68. data/ext/nutcracker/contrib/yaml-0.1.4/tests/example-deconstructor-alt.c +800 -0
  69. data/ext/nutcracker/contrib/yaml-0.1.4/tests/example-deconstructor.c +1130 -0
  70. data/ext/nutcracker/contrib/yaml-0.1.4/tests/example-reformatter-alt.c +217 -0
  71. data/ext/nutcracker/contrib/yaml-0.1.4/tests/example-reformatter.c +202 -0
  72. data/ext/nutcracker/contrib/yaml-0.1.4/tests/run-dumper.c +311 -0
  73. data/ext/nutcracker/contrib/yaml-0.1.4/tests/run-emitter.c +327 -0
  74. data/ext/nutcracker/contrib/yaml-0.1.4/tests/run-loader.c +63 -0
  75. data/ext/nutcracker/contrib/yaml-0.1.4/tests/run-parser.c +63 -0
  76. data/ext/nutcracker/contrib/yaml-0.1.4/tests/run-scanner.c +63 -0
  77. data/ext/nutcracker/contrib/yaml-0.1.4/tests/test-reader.c +354 -0
  78. data/ext/nutcracker/contrib/yaml-0.1.4/tests/test-version.c +29 -0
  79. data/ext/nutcracker/m4/libtool.m4 +1474 -1087
  80. data/ext/nutcracker/m4/ltoptions.m4 +90 -37
  81. data/ext/nutcracker/m4/ltsugar.m4 +4 -3
  82. data/ext/nutcracker/m4/ltversion.m4 +6 -6
  83. data/ext/nutcracker/m4/lt~obsolete.m4 +4 -3
  84. data/ext/nutcracker/man/nutcracker.8 +1 -1
  85. data/ext/nutcracker/notes/memcache.md +162 -0
  86. data/ext/nutcracker/notes/recommendation.md +10 -5
  87. data/ext/nutcracker/notes/redis.md +23 -9
  88. data/ext/nutcracker/scripts/nutcracker.init +10 -0
  89. data/ext/nutcracker/scripts/nutcracker.init.debian +83 -0
  90. data/ext/nutcracker/scripts/nutcracker.spec +36 -2
  91. data/ext/nutcracker/scripts/redis-check.sh +4 -0
  92. data/ext/nutcracker/src/Makefile.am +6 -1
  93. data/ext/nutcracker/src/Makefile.in +26 -12
  94. data/ext/nutcracker/src/event/Makefile.in +19 -6
  95. data/ext/nutcracker/src/hashkit/Makefile.in +19 -6
  96. data/ext/nutcracker/src/hashkit/nc_jenkins.c +1 -1
  97. data/ext/nutcracker/src/hashkit/nc_ketama.c +3 -3
  98. data/ext/nutcracker/src/nc.c +1 -1
  99. data/ext/nutcracker/src/nc_conf.c +67 -19
  100. data/ext/nutcracker/src/nc_conf.h +9 -4
  101. data/ext/nutcracker/src/nc_connection.c +35 -2
  102. data/ext/nutcracker/src/nc_connection.h +53 -47
  103. data/ext/nutcracker/src/nc_core.c +8 -1
  104. data/ext/nutcracker/src/nc_message.c +23 -7
  105. data/ext/nutcracker/src/nc_message.h +24 -1
  106. data/ext/nutcracker/src/nc_proxy.c +14 -3
  107. data/ext/nutcracker/src/nc_rbtree.c +1 -5
  108. data/ext/nutcracker/src/nc_request.c +58 -10
  109. data/ext/nutcracker/src/nc_response.c +27 -4
  110. data/ext/nutcracker/src/nc_server.c +33 -5
  111. data/ext/nutcracker/src/nc_server.h +10 -9
  112. data/ext/nutcracker/src/nc_string.h +17 -0
  113. data/ext/nutcracker/src/nc_util.c +5 -1
  114. data/ext/nutcracker/src/proto/Makefile.in +19 -6
  115. data/ext/nutcracker/src/proto/nc_memcache.c +76 -12
  116. data/ext/nutcracker/src/proto/nc_proto.h +9 -0
  117. data/ext/nutcracker/src/proto/nc_redis.c +400 -18
  118. data/lib/nutcracker.rb +1 -1
  119. data/lib/nutcracker/version.rb +1 -1
  120. metadata +61 -6
  121. data/ext/nutcracker/notes/memcache.txt +0 -123
@@ -0,0 +1,217 @@
1
+
2
+ #include <yaml.h>
3
+
4
+ #include <stdlib.h>
5
+ #include <stdio.h>
6
+
7
+ int
8
+ main(int argc, char *argv[])
9
+ {
10
+ int help = 0;
11
+ int canonical = 0;
12
+ int unicode = 0;
13
+ int k;
14
+ int done = 0;
15
+
16
+ yaml_parser_t parser;
17
+ yaml_emitter_t emitter;
18
+ yaml_document_t document;
19
+
20
+ /* Clear the objects. */
21
+
22
+ memset(&parser, 0, sizeof(parser));
23
+ memset(&emitter, 0, sizeof(emitter));
24
+ memset(&document, 0, sizeof(document));
25
+
26
+ /* Analyze command line options. */
27
+
28
+ for (k = 1; k < argc; k ++)
29
+ {
30
+ if (strcmp(argv[k], "-h") == 0
31
+ || strcmp(argv[k], "--help") == 0) {
32
+ help = 1;
33
+ }
34
+
35
+ else if (strcmp(argv[k], "-c") == 0
36
+ || strcmp(argv[k], "--canonical") == 0) {
37
+ canonical = 1;
38
+ }
39
+
40
+ else if (strcmp(argv[k], "-u") == 0
41
+ || strcmp(argv[k], "--unicode") == 0) {
42
+ unicode = 1;
43
+ }
44
+
45
+ else {
46
+ fprintf(stderr, "Unrecognized option: %s\n"
47
+ "Try `%s --help` for more information.\n",
48
+ argv[k], argv[0]);
49
+ return 1;
50
+ }
51
+ }
52
+
53
+ /* Display the help string. */
54
+
55
+ if (help)
56
+ {
57
+ printf("%s [--canonical] [--unicode] <input >output\n"
58
+ "or\n%s -h | --help\nReformat a YAML stream\n\nOptions:\n"
59
+ "-h, --help\t\tdisplay this help and exit\n"
60
+ "-c, --canonical\t\toutput in the canonical YAML format\n"
61
+ "-u, --unicode\t\toutput unescaped non-ASCII characters\n",
62
+ argv[0], argv[0]);
63
+ return 0;
64
+ }
65
+
66
+ /* Initialize the parser and emitter objects. */
67
+
68
+ if (!yaml_parser_initialize(&parser))
69
+ goto parser_error;
70
+
71
+ if (!yaml_emitter_initialize(&emitter))
72
+ goto emitter_error;
73
+
74
+ /* Set the parser parameters. */
75
+
76
+ yaml_parser_set_input_file(&parser, stdin);
77
+
78
+ /* Set the emitter parameters. */
79
+
80
+ yaml_emitter_set_output_file(&emitter, stdout);
81
+
82
+ yaml_emitter_set_canonical(&emitter, canonical);
83
+ yaml_emitter_set_unicode(&emitter, unicode);
84
+
85
+ /* The main loop. */
86
+
87
+ while (!done)
88
+ {
89
+ /* Get the next event. */
90
+
91
+ if (!yaml_parser_load(&parser, &document))
92
+ goto parser_error;
93
+
94
+ /* Check if this is the stream end. */
95
+
96
+ if (!yaml_document_get_root_node(&document)) {
97
+ done = 1;
98
+ }
99
+
100
+ /* Emit the event. */
101
+
102
+ if (!yaml_emitter_dump(&emitter, &document))
103
+ goto emitter_error;
104
+ }
105
+
106
+ yaml_parser_delete(&parser);
107
+ yaml_emitter_delete(&emitter);
108
+
109
+ return 0;
110
+
111
+ parser_error:
112
+
113
+ /* Display a parser error message. */
114
+
115
+ switch (parser.error)
116
+ {
117
+ case YAML_MEMORY_ERROR:
118
+ fprintf(stderr, "Memory error: Not enough memory for parsing\n");
119
+ break;
120
+
121
+ case YAML_READER_ERROR:
122
+ if (parser.problem_value != -1) {
123
+ fprintf(stderr, "Reader error: %s: #%X at %d\n", parser.problem,
124
+ parser.problem_value, parser.problem_offset);
125
+ }
126
+ else {
127
+ fprintf(stderr, "Reader error: %s at %d\n", parser.problem,
128
+ parser.problem_offset);
129
+ }
130
+ break;
131
+
132
+ case YAML_SCANNER_ERROR:
133
+ if (parser.context) {
134
+ fprintf(stderr, "Scanner error: %s at line %d, column %d\n"
135
+ "%s at line %d, column %d\n", parser.context,
136
+ parser.context_mark.line+1, parser.context_mark.column+1,
137
+ parser.problem, parser.problem_mark.line+1,
138
+ parser.problem_mark.column+1);
139
+ }
140
+ else {
141
+ fprintf(stderr, "Scanner error: %s at line %d, column %d\n",
142
+ parser.problem, parser.problem_mark.line+1,
143
+ parser.problem_mark.column+1);
144
+ }
145
+ break;
146
+
147
+ case YAML_PARSER_ERROR:
148
+ if (parser.context) {
149
+ fprintf(stderr, "Parser error: %s at line %d, column %d\n"
150
+ "%s at line %d, column %d\n", parser.context,
151
+ parser.context_mark.line+1, parser.context_mark.column+1,
152
+ parser.problem, parser.problem_mark.line+1,
153
+ parser.problem_mark.column+1);
154
+ }
155
+ else {
156
+ fprintf(stderr, "Parser error: %s at line %d, column %d\n",
157
+ parser.problem, parser.problem_mark.line+1,
158
+ parser.problem_mark.column+1);
159
+ }
160
+ break;
161
+
162
+ case YAML_COMPOSER_ERROR:
163
+ if (parser.context) {
164
+ fprintf(stderr, "Composer error: %s at line %d, column %d\n"
165
+ "%s at line %d, column %d\n", parser.context,
166
+ parser.context_mark.line+1, parser.context_mark.column+1,
167
+ parser.problem, parser.problem_mark.line+1,
168
+ parser.problem_mark.column+1);
169
+ }
170
+ else {
171
+ fprintf(stderr, "Composer error: %s at line %d, column %d\n",
172
+ parser.problem, parser.problem_mark.line+1,
173
+ parser.problem_mark.column+1);
174
+ }
175
+ break;
176
+
177
+ default:
178
+ /* Couldn't happen. */
179
+ fprintf(stderr, "Internal error\n");
180
+ break;
181
+ }
182
+
183
+ yaml_parser_delete(&parser);
184
+ yaml_emitter_delete(&emitter);
185
+
186
+ return 1;
187
+
188
+ emitter_error:
189
+
190
+ /* Display an emitter error message. */
191
+
192
+ switch (emitter.error)
193
+ {
194
+ case YAML_MEMORY_ERROR:
195
+ fprintf(stderr, "Memory error: Not enough memory for emitting\n");
196
+ break;
197
+
198
+ case YAML_WRITER_ERROR:
199
+ fprintf(stderr, "Writer error: %s\n", emitter.problem);
200
+ break;
201
+
202
+ case YAML_EMITTER_ERROR:
203
+ fprintf(stderr, "Emitter error: %s\n", emitter.problem);
204
+ break;
205
+
206
+ default:
207
+ /* Couldn't happen. */
208
+ fprintf(stderr, "Internal error\n");
209
+ break;
210
+ }
211
+
212
+ yaml_parser_delete(&parser);
213
+ yaml_emitter_delete(&emitter);
214
+
215
+ return 1;
216
+ }
217
+
@@ -0,0 +1,202 @@
1
+
2
+ #include <yaml.h>
3
+
4
+ #include <stdlib.h>
5
+ #include <stdio.h>
6
+
7
+ int
8
+ main(int argc, char *argv[])
9
+ {
10
+ int help = 0;
11
+ int canonical = 0;
12
+ int unicode = 0;
13
+ int k;
14
+ int done = 0;
15
+
16
+ yaml_parser_t parser;
17
+ yaml_emitter_t emitter;
18
+ yaml_event_t event;
19
+
20
+ /* Clear the objects. */
21
+
22
+ memset(&parser, 0, sizeof(parser));
23
+ memset(&emitter, 0, sizeof(emitter));
24
+ memset(&event, 0, sizeof(event));
25
+
26
+ /* Analyze command line options. */
27
+
28
+ for (k = 1; k < argc; k ++)
29
+ {
30
+ if (strcmp(argv[k], "-h") == 0
31
+ || strcmp(argv[k], "--help") == 0) {
32
+ help = 1;
33
+ }
34
+
35
+ else if (strcmp(argv[k], "-c") == 0
36
+ || strcmp(argv[k], "--canonical") == 0) {
37
+ canonical = 1;
38
+ }
39
+
40
+ else if (strcmp(argv[k], "-u") == 0
41
+ || strcmp(argv[k], "--unicode") == 0) {
42
+ unicode = 1;
43
+ }
44
+
45
+ else {
46
+ fprintf(stderr, "Unrecognized option: %s\n"
47
+ "Try `%s --help` for more information.\n",
48
+ argv[k], argv[0]);
49
+ return 1;
50
+ }
51
+ }
52
+
53
+ /* Display the help string. */
54
+
55
+ if (help)
56
+ {
57
+ printf("%s [--canonical] [--unicode] <input >output\n"
58
+ "or\n%s -h | --help\nReformat a YAML stream\n\nOptions:\n"
59
+ "-h, --help\t\tdisplay this help and exit\n"
60
+ "-c, --canonical\t\toutput in the canonical YAML format\n"
61
+ "-u, --unicode\t\toutput unescaped non-ASCII characters\n",
62
+ argv[0], argv[0]);
63
+ return 0;
64
+ }
65
+
66
+ /* Initialize the parser and emitter objects. */
67
+
68
+ if (!yaml_parser_initialize(&parser))
69
+ goto parser_error;
70
+
71
+ if (!yaml_emitter_initialize(&emitter))
72
+ goto emitter_error;
73
+
74
+ /* Set the parser parameters. */
75
+
76
+ yaml_parser_set_input_file(&parser, stdin);
77
+
78
+ /* Set the emitter parameters. */
79
+
80
+ yaml_emitter_set_output_file(&emitter, stdout);
81
+
82
+ yaml_emitter_set_canonical(&emitter, canonical);
83
+ yaml_emitter_set_unicode(&emitter, unicode);
84
+
85
+ /* The main loop. */
86
+
87
+ while (!done)
88
+ {
89
+ /* Get the next event. */
90
+
91
+ if (!yaml_parser_parse(&parser, &event))
92
+ goto parser_error;
93
+
94
+ /* Check if this is the stream end. */
95
+
96
+ if (event.type == YAML_STREAM_END_EVENT) {
97
+ done = 1;
98
+ }
99
+
100
+ /* Emit the event. */
101
+
102
+ if (!yaml_emitter_emit(&emitter, &event))
103
+ goto emitter_error;
104
+ }
105
+
106
+ yaml_parser_delete(&parser);
107
+ yaml_emitter_delete(&emitter);
108
+
109
+ return 0;
110
+
111
+ parser_error:
112
+
113
+ /* Display a parser error message. */
114
+
115
+ switch (parser.error)
116
+ {
117
+ case YAML_MEMORY_ERROR:
118
+ fprintf(stderr, "Memory error: Not enough memory for parsing\n");
119
+ break;
120
+
121
+ case YAML_READER_ERROR:
122
+ if (parser.problem_value != -1) {
123
+ fprintf(stderr, "Reader error: %s: #%X at %d\n", parser.problem,
124
+ parser.problem_value, parser.problem_offset);
125
+ }
126
+ else {
127
+ fprintf(stderr, "Reader error: %s at %d\n", parser.problem,
128
+ parser.problem_offset);
129
+ }
130
+ break;
131
+
132
+ case YAML_SCANNER_ERROR:
133
+ if (parser.context) {
134
+ fprintf(stderr, "Scanner error: %s at line %d, column %d\n"
135
+ "%s at line %d, column %d\n", parser.context,
136
+ parser.context_mark.line+1, parser.context_mark.column+1,
137
+ parser.problem, parser.problem_mark.line+1,
138
+ parser.problem_mark.column+1);
139
+ }
140
+ else {
141
+ fprintf(stderr, "Scanner error: %s at line %d, column %d\n",
142
+ parser.problem, parser.problem_mark.line+1,
143
+ parser.problem_mark.column+1);
144
+ }
145
+ break;
146
+
147
+ case YAML_PARSER_ERROR:
148
+ if (parser.context) {
149
+ fprintf(stderr, "Parser error: %s at line %d, column %d\n"
150
+ "%s at line %d, column %d\n", parser.context,
151
+ parser.context_mark.line+1, parser.context_mark.column+1,
152
+ parser.problem, parser.problem_mark.line+1,
153
+ parser.problem_mark.column+1);
154
+ }
155
+ else {
156
+ fprintf(stderr, "Parser error: %s at line %d, column %d\n",
157
+ parser.problem, parser.problem_mark.line+1,
158
+ parser.problem_mark.column+1);
159
+ }
160
+ break;
161
+
162
+ default:
163
+ /* Couldn't happen. */
164
+ fprintf(stderr, "Internal error\n");
165
+ break;
166
+ }
167
+
168
+ yaml_parser_delete(&parser);
169
+ yaml_emitter_delete(&emitter);
170
+
171
+ return 1;
172
+
173
+ emitter_error:
174
+
175
+ /* Display an emitter error message. */
176
+
177
+ switch (emitter.error)
178
+ {
179
+ case YAML_MEMORY_ERROR:
180
+ fprintf(stderr, "Memory error: Not enough memory for emitting\n");
181
+ break;
182
+
183
+ case YAML_WRITER_ERROR:
184
+ fprintf(stderr, "Writer error: %s\n", emitter.problem);
185
+ break;
186
+
187
+ case YAML_EMITTER_ERROR:
188
+ fprintf(stderr, "Emitter error: %s\n", emitter.problem);
189
+ break;
190
+
191
+ default:
192
+ /* Couldn't happen. */
193
+ fprintf(stderr, "Internal error\n");
194
+ break;
195
+ }
196
+
197
+ yaml_parser_delete(&parser);
198
+ yaml_emitter_delete(&emitter);
199
+
200
+ return 1;
201
+ }
202
+
@@ -0,0 +1,311 @@
1
+ #include <yaml.h>
2
+
3
+ #include <stdlib.h>
4
+ #include <stdio.h>
5
+ #include <string.h>
6
+
7
+ #ifdef NDEBUG
8
+ #undef NDEBUG
9
+ #endif
10
+ #include <assert.h>
11
+
12
+ #define BUFFER_SIZE 65536
13
+ #define MAX_DOCUMENTS 16
14
+
15
+ int copy_document(yaml_document_t *document_to, yaml_document_t *document_from)
16
+ {
17
+ yaml_node_t *node;
18
+ yaml_node_item_t *item;
19
+ yaml_node_pair_t *pair;
20
+
21
+ if (!yaml_document_initialize(document_to, document_from->version_directive,
22
+ document_from->tag_directives.start,
23
+ document_from->tag_directives.end,
24
+ document_from->start_implicit, document_from->end_implicit))
25
+ return 0;
26
+
27
+ for (node = document_from->nodes.start;
28
+ node < document_from->nodes.top; node ++) {
29
+ switch (node->type) {
30
+ case YAML_SCALAR_NODE:
31
+ if (!yaml_document_add_scalar(document_to, node->tag,
32
+ node->data.scalar.value, node->data.scalar.length,
33
+ node->data.scalar.style)) goto error;
34
+ break;
35
+ case YAML_SEQUENCE_NODE:
36
+ if (!yaml_document_add_sequence(document_to, node->tag,
37
+ node->data.sequence.style)) goto error;
38
+ break;
39
+ case YAML_MAPPING_NODE:
40
+ if (!yaml_document_add_mapping(document_to, node->tag,
41
+ node->data.mapping.style)) goto error;
42
+ break;
43
+ default:
44
+ assert(0);
45
+ break;
46
+ }
47
+ }
48
+
49
+ for (node = document_from->nodes.start;
50
+ node < document_from->nodes.top; node ++) {
51
+ switch (node->type) {
52
+ case YAML_SEQUENCE_NODE:
53
+ for (item = node->data.sequence.items.start;
54
+ item < node->data.sequence.items.top; item ++) {
55
+ if (!yaml_document_append_sequence_item(document_to,
56
+ node - document_from->nodes.start + 1,
57
+ *item)) goto error;
58
+ }
59
+ break;
60
+ case YAML_MAPPING_NODE:
61
+ for (pair = node->data.mapping.pairs.start;
62
+ pair < node->data.mapping.pairs.top; pair ++) {
63
+ if (!yaml_document_append_mapping_pair(document_to,
64
+ node - document_from->nodes.start + 1,
65
+ pair->key, pair->value)) goto error;
66
+ }
67
+ break;
68
+ default:
69
+ break;
70
+ }
71
+ }
72
+ return 1;
73
+
74
+ error:
75
+ yaml_document_delete(document_to);
76
+ return 0;
77
+ }
78
+
79
+ int compare_nodes(yaml_document_t *document1, int index1,
80
+ yaml_document_t *document2, int index2)
81
+ {
82
+ yaml_node_t *node1 = yaml_document_get_node(document1, index1);
83
+ yaml_node_t *node2 = yaml_document_get_node(document2, index2);
84
+ int k;
85
+
86
+ assert(node1);
87
+ assert(node2);
88
+
89
+ if (node1->type != node2->type)
90
+ return 0;
91
+
92
+ if (strcmp((char *)node1->tag, (char *)node2->tag) != 0) return 0;
93
+
94
+ switch (node1->type) {
95
+ case YAML_SCALAR_NODE:
96
+ if (node1->data.scalar.length != node2->data.scalar.length)
97
+ return 0;
98
+ if (strncmp((char *)node1->data.scalar.value, (char *)node2->data.scalar.value,
99
+ node1->data.scalar.length) != 0) return 0;
100
+ break;
101
+ case YAML_SEQUENCE_NODE:
102
+ if ((node1->data.sequence.items.top - node1->data.sequence.items.start) !=
103
+ (node2->data.sequence.items.top - node2->data.sequence.items.start))
104
+ return 0;
105
+ for (k = 0; k < (node1->data.sequence.items.top - node1->data.sequence.items.start); k ++) {
106
+ if (!compare_nodes(document1, node1->data.sequence.items.start[k],
107
+ document2, node2->data.sequence.items.start[k])) return 0;
108
+ }
109
+ break;
110
+ case YAML_MAPPING_NODE:
111
+ if ((node1->data.mapping.pairs.top - node1->data.mapping.pairs.start) !=
112
+ (node2->data.mapping.pairs.top - node2->data.mapping.pairs.start))
113
+ return 0;
114
+ for (k = 0; k < (node1->data.mapping.pairs.top - node1->data.mapping.pairs.start); k ++) {
115
+ if (!compare_nodes(document1, node1->data.mapping.pairs.start[k].key,
116
+ document2, node2->data.mapping.pairs.start[k].key)) return 0;
117
+ if (!compare_nodes(document1, node1->data.mapping.pairs.start[k].value,
118
+ document2, node2->data.mapping.pairs.start[k].value)) return 0;
119
+ }
120
+ break;
121
+ default:
122
+ assert(0);
123
+ break;
124
+ }
125
+ return 1;
126
+ }
127
+
128
+ int compare_documents(yaml_document_t *document1, yaml_document_t *document2)
129
+ {
130
+ int k;
131
+
132
+ if ((document1->version_directive && !document2->version_directive)
133
+ || (!document1->version_directive && document2->version_directive)
134
+ || (document1->version_directive && document2->version_directive
135
+ && (document1->version_directive->major != document2->version_directive->major
136
+ || document1->version_directive->minor != document2->version_directive->minor)))
137
+ return 0;
138
+
139
+ if ((document1->tag_directives.end - document1->tag_directives.start) !=
140
+ (document2->tag_directives.end - document2->tag_directives.start))
141
+ return 0;
142
+ for (k = 0; k < (document1->tag_directives.end - document1->tag_directives.start); k ++) {
143
+ if ((strcmp((char *)document1->tag_directives.start[k].handle,
144
+ (char *)document2->tag_directives.start[k].handle) != 0)
145
+ || (strcmp((char *)document1->tag_directives.start[k].prefix,
146
+ (char *)document2->tag_directives.start[k].prefix) != 0))
147
+ return 0;
148
+ }
149
+
150
+ if ((document1->nodes.top - document1->nodes.start) !=
151
+ (document2->nodes.top - document2->nodes.start))
152
+ return 0;
153
+
154
+ if (document1->nodes.top != document1->nodes.start) {
155
+ if (!compare_nodes(document1, 1, document2, 1))
156
+ return 0;
157
+ }
158
+
159
+ return 1;
160
+ }
161
+
162
+ int print_output(char *name, unsigned char *buffer, size_t size, int count)
163
+ {
164
+ FILE *file;
165
+ char data[BUFFER_SIZE];
166
+ size_t data_size = 1;
167
+ size_t total_size = 0;
168
+ if (count >= 0) {
169
+ printf("FAILED (at the document #%d)\nSOURCE:\n", count+1);
170
+ }
171
+ file = fopen(name, "rb");
172
+ assert(file);
173
+ while (data_size > 0) {
174
+ data_size = fread(data, 1, BUFFER_SIZE, file);
175
+ assert(!ferror(file));
176
+ if (!data_size) break;
177
+ assert(fwrite(data, 1, data_size, stdout) == data_size);
178
+ total_size += data_size;
179
+ if (feof(file)) break;
180
+ }
181
+ fclose(file);
182
+ printf("#### (length: %d)\n", total_size);
183
+ printf("OUTPUT:\n%s#### (length: %d)\n", buffer, size);
184
+ return 0;
185
+ }
186
+
187
+ int
188
+ main(int argc, char *argv[])
189
+ {
190
+ int number;
191
+ int canonical = 0;
192
+ int unicode = 0;
193
+
194
+ number = 1;
195
+ while (number < argc) {
196
+ if (strcmp(argv[number], "-c") == 0) {
197
+ canonical = 1;
198
+ }
199
+ else if (strcmp(argv[number], "-u") == 0) {
200
+ unicode = 1;
201
+ }
202
+ else if (argv[number][0] == '-') {
203
+ printf("Unknown option: '%s'\n", argv[number]);
204
+ return 0;
205
+ }
206
+ if (argv[number][0] == '-') {
207
+ if (number < argc-1) {
208
+ memmove(argv+number, argv+number+1, (argc-number-1)*sizeof(char *));
209
+ }
210
+ argc --;
211
+ }
212
+ else {
213
+ number ++;
214
+ }
215
+ }
216
+
217
+ if (argc < 2) {
218
+ printf("Usage: %s [-c] [-u] file1.yaml ...\n", argv[0]);
219
+ return 0;
220
+ }
221
+
222
+ for (number = 1; number < argc; number ++)
223
+ {
224
+ FILE *file;
225
+ yaml_parser_t parser;
226
+ yaml_emitter_t emitter;
227
+
228
+ yaml_document_t document;
229
+ unsigned char buffer[BUFFER_SIZE];
230
+ size_t written = 0;
231
+ yaml_document_t documents[MAX_DOCUMENTS];
232
+ size_t document_number = 0;
233
+ int done = 0;
234
+ int count = 0;
235
+ int error = 0;
236
+ int k;
237
+ memset(buffer, 0, BUFFER_SIZE);
238
+ memset(documents, 0, MAX_DOCUMENTS*sizeof(yaml_document_t));
239
+
240
+ printf("[%d] Loading, dumping, and loading again '%s': ", number, argv[number]);
241
+ fflush(stdout);
242
+
243
+ file = fopen(argv[number], "rb");
244
+ assert(file);
245
+
246
+ assert(yaml_parser_initialize(&parser));
247
+ yaml_parser_set_input_file(&parser, file);
248
+ assert(yaml_emitter_initialize(&emitter));
249
+ if (canonical) {
250
+ yaml_emitter_set_canonical(&emitter, 1);
251
+ }
252
+ if (unicode) {
253
+ yaml_emitter_set_unicode(&emitter, 1);
254
+ }
255
+ yaml_emitter_set_output_string(&emitter, buffer, BUFFER_SIZE, &written);
256
+ yaml_emitter_open(&emitter);
257
+
258
+ while (!done)
259
+ {
260
+ if (!yaml_parser_load(&parser, &document)) {
261
+ error = 1;
262
+ break;
263
+ }
264
+
265
+ done = (!yaml_document_get_root_node(&document));
266
+ if (!done) {
267
+ assert(document_number < MAX_DOCUMENTS);
268
+ assert(copy_document(&(documents[document_number++]), &document));
269
+ assert(yaml_emitter_dump(&emitter, &document) ||
270
+ (yaml_emitter_flush(&emitter) && print_output(argv[number], buffer, written, count)));
271
+ count ++;
272
+ }
273
+ else {
274
+ yaml_document_delete(&document);
275
+ }
276
+ }
277
+
278
+ yaml_parser_delete(&parser);
279
+ assert(!fclose(file));
280
+ yaml_emitter_close(&emitter);
281
+ yaml_emitter_delete(&emitter);
282
+
283
+ if (!error)
284
+ {
285
+ count = done = 0;
286
+ assert(yaml_parser_initialize(&parser));
287
+ yaml_parser_set_input_string(&parser, buffer, written);
288
+
289
+ while (!done)
290
+ {
291
+ assert(yaml_parser_load(&parser, &document) || print_output(argv[number], buffer, written, count));
292
+ done = (!yaml_document_get_root_node(&document));
293
+ if (!done) {
294
+ assert(compare_documents(documents+count, &document) || print_output(argv[number], buffer, written, count));
295
+ count ++;
296
+ }
297
+ yaml_document_delete(&document);
298
+ }
299
+ yaml_parser_delete(&parser);
300
+ }
301
+
302
+ for (k = 0; k < document_number; k ++) {
303
+ yaml_document_delete(documents+k);
304
+ }
305
+
306
+ printf("PASSED (length: %d)\n", written);
307
+ print_output(argv[number], buffer, written, -1);
308
+ }
309
+
310
+ return 0;
311
+ }