redsnow 0.0.8

Sign up to get free protection for your applications and to get access to all the features.
Files changed (174) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +34 -0
  3. data/.gitmodules +3 -0
  4. data/.travis.yml +20 -0
  5. data/CHANGELOG.md +4 -0
  6. data/Gemfile +4 -0
  7. data/LICENSE +21 -0
  8. data/README.md +62 -0
  9. data/Rakefile +36 -0
  10. data/Vagrantfile +20 -0
  11. data/ext/snowcrash/Makefile +64 -0
  12. data/ext/snowcrash/Vagrantfile +20 -0
  13. data/ext/snowcrash/bin/snowcrash +0 -0
  14. data/ext/snowcrash/common.gypi +163 -0
  15. data/ext/snowcrash/config.gypi +10 -0
  16. data/ext/snowcrash/config.mk +5 -0
  17. data/ext/snowcrash/configure +213 -0
  18. data/ext/snowcrash/provisioning.sh +15 -0
  19. data/ext/snowcrash/snowcrash.gyp +141 -0
  20. data/ext/snowcrash/src/ActionParser.h +503 -0
  21. data/ext/snowcrash/src/AssetParser.h +215 -0
  22. data/ext/snowcrash/src/BlockUtility.h +186 -0
  23. data/ext/snowcrash/src/Blueprint.h +283 -0
  24. data/ext/snowcrash/src/BlueprintParser.h +347 -0
  25. data/ext/snowcrash/src/BlueprintParserCore.h +190 -0
  26. data/ext/snowcrash/src/BlueprintSection.h +140 -0
  27. data/ext/snowcrash/src/BlueprintUtility.h +126 -0
  28. data/ext/snowcrash/src/CBlueprint.cc +600 -0
  29. data/ext/snowcrash/src/CBlueprint.h +354 -0
  30. data/ext/snowcrash/src/CSourceAnnotation.cc +140 -0
  31. data/ext/snowcrash/src/CSourceAnnotation.h +106 -0
  32. data/ext/snowcrash/src/CodeBlockUtility.h +189 -0
  33. data/ext/snowcrash/src/DescriptionSectionUtility.h +156 -0
  34. data/ext/snowcrash/src/HTTP.cc +46 -0
  35. data/ext/snowcrash/src/HTTP.h +105 -0
  36. data/ext/snowcrash/src/HeaderParser.h +289 -0
  37. data/ext/snowcrash/src/ListBlockUtility.h +273 -0
  38. data/ext/snowcrash/src/ListUtility.h +95 -0
  39. data/ext/snowcrash/src/MarkdownBlock.cc +176 -0
  40. data/ext/snowcrash/src/MarkdownBlock.h +93 -0
  41. data/ext/snowcrash/src/MarkdownParser.cc +266 -0
  42. data/ext/snowcrash/src/MarkdownParser.h +88 -0
  43. data/ext/snowcrash/src/ParameterDefinitonParser.h +570 -0
  44. data/ext/snowcrash/src/ParametersParser.h +252 -0
  45. data/ext/snowcrash/src/Parser.cc +71 -0
  46. data/ext/snowcrash/src/Parser.h +29 -0
  47. data/ext/snowcrash/src/ParserCore.cc +120 -0
  48. data/ext/snowcrash/src/ParserCore.h +82 -0
  49. data/ext/snowcrash/src/PayloadParser.h +672 -0
  50. data/ext/snowcrash/src/Platform.h +54 -0
  51. data/ext/snowcrash/src/RegexMatch.h +32 -0
  52. data/ext/snowcrash/src/ResourceGroupParser.h +195 -0
  53. data/ext/snowcrash/src/ResourceParser.h +584 -0
  54. data/ext/snowcrash/src/SectionUtility.h +142 -0
  55. data/ext/snowcrash/src/Serialize.cc +52 -0
  56. data/ext/snowcrash/src/Serialize.h +69 -0
  57. data/ext/snowcrash/src/SerializeJSON.cc +601 -0
  58. data/ext/snowcrash/src/SerializeJSON.h +21 -0
  59. data/ext/snowcrash/src/SerializeYAML.cc +336 -0
  60. data/ext/snowcrash/src/SerializeYAML.h +21 -0
  61. data/ext/snowcrash/src/SourceAnnotation.h +177 -0
  62. data/ext/snowcrash/src/StringUtility.h +109 -0
  63. data/ext/snowcrash/src/SymbolTable.h +83 -0
  64. data/ext/snowcrash/src/UriTemplateParser.cc +195 -0
  65. data/ext/snowcrash/src/UriTemplateParser.h +243 -0
  66. data/ext/snowcrash/src/Version.h +39 -0
  67. data/ext/snowcrash/src/csnowcrash.cc +23 -0
  68. data/ext/snowcrash/src/csnowcrash.h +38 -0
  69. data/ext/snowcrash/src/posix/RegexMatch.cc +99 -0
  70. data/ext/snowcrash/src/snowcrash.cc +18 -0
  71. data/ext/snowcrash/src/snowcrash.h +41 -0
  72. data/ext/snowcrash/src/snowcrash/snowcrash.cc +170 -0
  73. data/ext/snowcrash/src/win/RegexMatch.cc +78 -0
  74. data/ext/snowcrash/sundown/CONTRIBUTING.md +10 -0
  75. data/ext/snowcrash/sundown/Makefile +83 -0
  76. data/ext/snowcrash/sundown/Makefile.win +33 -0
  77. data/ext/snowcrash/sundown/examples/smartypants.c +72 -0
  78. data/ext/snowcrash/sundown/examples/sundown.c +80 -0
  79. data/ext/snowcrash/sundown/html/houdini.h +37 -0
  80. data/ext/snowcrash/sundown/html/houdini_href_e.c +108 -0
  81. data/ext/snowcrash/sundown/html/houdini_html_e.c +84 -0
  82. data/ext/snowcrash/sundown/html/html.c +647 -0
  83. data/ext/snowcrash/sundown/html/html.h +77 -0
  84. data/ext/snowcrash/sundown/html/html_smartypants.c +389 -0
  85. data/ext/snowcrash/sundown/html_block_names.txt +25 -0
  86. data/ext/snowcrash/sundown/src/autolink.c +297 -0
  87. data/ext/snowcrash/sundown/src/autolink.h +51 -0
  88. data/ext/snowcrash/sundown/src/buffer.c +225 -0
  89. data/ext/snowcrash/sundown/src/buffer.h +96 -0
  90. data/ext/snowcrash/sundown/src/html_blocks.h +206 -0
  91. data/ext/snowcrash/sundown/src/markdown.c +2701 -0
  92. data/ext/snowcrash/sundown/src/markdown.h +147 -0
  93. data/ext/snowcrash/sundown/src/src_map.c +200 -0
  94. data/ext/snowcrash/sundown/src/src_map.h +58 -0
  95. data/ext/snowcrash/sundown/src/stack.c +81 -0
  96. data/ext/snowcrash/sundown/src/stack.h +29 -0
  97. data/ext/snowcrash/sundown/sundown.def +20 -0
  98. data/ext/snowcrash/tools/gyp/AUTHORS +11 -0
  99. data/ext/snowcrash/tools/gyp/DEPS +24 -0
  100. data/ext/snowcrash/tools/gyp/OWNERS +1 -0
  101. data/ext/snowcrash/tools/gyp/PRESUBMIT.py +120 -0
  102. data/ext/snowcrash/tools/gyp/buildbot/buildbot_run.py +190 -0
  103. data/ext/snowcrash/tools/gyp/codereview.settings +10 -0
  104. data/ext/snowcrash/tools/gyp/data/win/large-pdb-shim.cc +12 -0
  105. data/ext/snowcrash/tools/gyp/gyp +8 -0
  106. data/ext/snowcrash/tools/gyp/gyp.bat +5 -0
  107. data/ext/snowcrash/tools/gyp/gyp_main.py +18 -0
  108. data/ext/snowcrash/tools/gyp/pylib/gyp/MSVSNew.py +340 -0
  109. data/ext/snowcrash/tools/gyp/pylib/gyp/MSVSProject.py +208 -0
  110. data/ext/snowcrash/tools/gyp/pylib/gyp/MSVSSettings.py +1063 -0
  111. data/ext/snowcrash/tools/gyp/pylib/gyp/MSVSToolFile.py +58 -0
  112. data/ext/snowcrash/tools/gyp/pylib/gyp/MSVSUserFile.py +147 -0
  113. data/ext/snowcrash/tools/gyp/pylib/gyp/MSVSUtil.py +267 -0
  114. data/ext/snowcrash/tools/gyp/pylib/gyp/MSVSVersion.py +409 -0
  115. data/ext/snowcrash/tools/gyp/pylib/gyp/__init__.py +537 -0
  116. data/ext/snowcrash/tools/gyp/pylib/gyp/__init__.pyc +0 -0
  117. data/ext/snowcrash/tools/gyp/pylib/gyp/common.py +521 -0
  118. data/ext/snowcrash/tools/gyp/pylib/gyp/common.pyc +0 -0
  119. data/ext/snowcrash/tools/gyp/pylib/gyp/easy_xml.py +157 -0
  120. data/ext/snowcrash/tools/gyp/pylib/gyp/flock_tool.py +49 -0
  121. data/ext/snowcrash/tools/gyp/pylib/gyp/generator/__init__.py +0 -0
  122. data/ext/snowcrash/tools/gyp/pylib/gyp/generator/__init__.pyc +0 -0
  123. data/ext/snowcrash/tools/gyp/pylib/gyp/generator/android.py +1069 -0
  124. data/ext/snowcrash/tools/gyp/pylib/gyp/generator/cmake.py +1143 -0
  125. data/ext/snowcrash/tools/gyp/pylib/gyp/generator/dump_dependency_json.py +81 -0
  126. data/ext/snowcrash/tools/gyp/pylib/gyp/generator/eclipse.py +335 -0
  127. data/ext/snowcrash/tools/gyp/pylib/gyp/generator/gypd.py +87 -0
  128. data/ext/snowcrash/tools/gyp/pylib/gyp/generator/gypsh.py +56 -0
  129. data/ext/snowcrash/tools/gyp/pylib/gyp/generator/make.py +2181 -0
  130. data/ext/snowcrash/tools/gyp/pylib/gyp/generator/make.pyc +0 -0
  131. data/ext/snowcrash/tools/gyp/pylib/gyp/generator/msvs.py +3335 -0
  132. data/ext/snowcrash/tools/gyp/pylib/gyp/generator/ninja.py +2156 -0
  133. data/ext/snowcrash/tools/gyp/pylib/gyp/generator/xcode.py +1224 -0
  134. data/ext/snowcrash/tools/gyp/pylib/gyp/generator/xcode.pyc +0 -0
  135. data/ext/snowcrash/tools/gyp/pylib/gyp/input.py +2809 -0
  136. data/ext/snowcrash/tools/gyp/pylib/gyp/input.pyc +0 -0
  137. data/ext/snowcrash/tools/gyp/pylib/gyp/mac_tool.py +510 -0
  138. data/ext/snowcrash/tools/gyp/pylib/gyp/msvs_emulation.py +972 -0
  139. data/ext/snowcrash/tools/gyp/pylib/gyp/ninja_syntax.py +160 -0
  140. data/ext/snowcrash/tools/gyp/pylib/gyp/ordered_dict.py +289 -0
  141. data/ext/snowcrash/tools/gyp/pylib/gyp/win_tool.py +292 -0
  142. data/ext/snowcrash/tools/gyp/pylib/gyp/xcode_emulation.py +1440 -0
  143. data/ext/snowcrash/tools/gyp/pylib/gyp/xcode_emulation.pyc +0 -0
  144. data/ext/snowcrash/tools/gyp/pylib/gyp/xcodeproj_file.py +2889 -0
  145. data/ext/snowcrash/tools/gyp/pylib/gyp/xcodeproj_file.pyc +0 -0
  146. data/ext/snowcrash/tools/gyp/pylib/gyp/xml_fix.py +69 -0
  147. data/ext/snowcrash/tools/gyp/pylintrc +307 -0
  148. data/ext/snowcrash/tools/gyp/samples/samples +81 -0
  149. data/ext/snowcrash/tools/gyp/samples/samples.bat +5 -0
  150. data/ext/snowcrash/tools/gyp/setup.py +19 -0
  151. data/ext/snowcrash/tools/gyp/tools/Xcode/Specifications/gyp.pbfilespec +27 -0
  152. data/ext/snowcrash/tools/gyp/tools/Xcode/Specifications/gyp.xclangspec +226 -0
  153. data/ext/snowcrash/tools/gyp/tools/emacs/gyp.el +252 -0
  154. data/ext/snowcrash/tools/gyp/tools/graphviz.py +100 -0
  155. data/ext/snowcrash/tools/gyp/tools/pretty_gyp.py +155 -0
  156. data/ext/snowcrash/tools/gyp/tools/pretty_sln.py +168 -0
  157. data/ext/snowcrash/tools/gyp/tools/pretty_vcproj.py +329 -0
  158. data/ext/snowcrash/tools/homebrew/snowcrash.rb +11 -0
  159. data/ext/snowcrash/vcbuild.bat +184 -0
  160. data/lib/redsnow.rb +31 -0
  161. data/lib/redsnow/binding.rb +132 -0
  162. data/lib/redsnow/blueprint.rb +365 -0
  163. data/lib/redsnow/object.rb +18 -0
  164. data/lib/redsnow/parseresult.rb +107 -0
  165. data/lib/redsnow/version.rb +4 -0
  166. data/provisioning.sh +20 -0
  167. data/redsnow.gemspec +35 -0
  168. data/test/_helper.rb +15 -0
  169. data/test/fixtures/sample-api-ast.json +97 -0
  170. data/test/fixtures/sample-api.apib +20 -0
  171. data/test/redsnow_binding_test.rb +35 -0
  172. data/test/redsnow_parseresult_test.rb +50 -0
  173. data/test/redsnow_test.rb +285 -0
  174. metadata +358 -0
@@ -0,0 +1,147 @@
1
+ /* markdown.h - generic markdown parser */
2
+
3
+ /*
4
+ * Copyright (c) 2009, Natacha Porté
5
+ *
6
+ * Permission to use, copy, modify, and distribute this software for any
7
+ * purpose with or without fee is hereby granted, provided that the above
8
+ * copyright notice and this permission notice appear in all copies.
9
+ *
10
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
11
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
12
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
13
+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
14
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
15
+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
16
+ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
17
+ */
18
+
19
+ #ifndef UPSKIRT_MARKDOWN_H
20
+ #define UPSKIRT_MARKDOWN_H
21
+
22
+ #include "buffer.h"
23
+ #include "autolink.h"
24
+ #include "src_map.h"
25
+
26
+ #ifdef __cplusplus
27
+ extern "C" {
28
+ #endif
29
+
30
+ #define SUNDOWN_VERSION "1.16.0"
31
+ #define SUNDOWN_VER_MAJOR 1
32
+ #define SUNDOWN_VER_MINOR 16
33
+ #define SUNDOWN_VER_REVISION 0
34
+
35
+ /********************
36
+ * TYPE DEFINITIONS *
37
+ ********************/
38
+
39
+ /* mkd_autolink - type of autolink */
40
+ enum mkd_autolink {
41
+ MKDA_NOT_AUTOLINK, /* used internally when it is not an autolink*/
42
+ MKDA_NORMAL, /* normal http/http/ftp/mailto/etc link */
43
+ MKDA_EMAIL /* e-mail link without explit mailto: */
44
+ };
45
+
46
+ enum mkd_tableflags {
47
+ MKD_TABLE_ALIGN_L = 1,
48
+ MKD_TABLE_ALIGN_R = 2,
49
+ MKD_TABLE_ALIGN_CENTER = 3,
50
+ MKD_TABLE_ALIGNMASK = 3,
51
+ MKD_TABLE_HEADER = 4
52
+ };
53
+
54
+ enum mkd_extensions {
55
+ MKDEXT_NO_INTRA_EMPHASIS = (1 << 0),
56
+ MKDEXT_TABLES = (1 << 1),
57
+ MKDEXT_FENCED_CODE = (1 << 2),
58
+ MKDEXT_AUTOLINK = (1 << 3),
59
+ MKDEXT_STRIKETHROUGH = (1 << 4),
60
+ MKDEXT_SPACE_HEADERS = (1 << 6),
61
+ MKDEXT_SUPERSCRIPT = (1 << 7),
62
+ MKDEXT_LAX_SPACING = (1 << 8)
63
+ };
64
+
65
+ /* sd_callbacks - functions for rendering parsed data */
66
+ struct sd_callbacks {
67
+ /* block level callbacks - NULL skips the block */
68
+ void (*blockcode)(struct buf *ob, const struct buf *text, const struct buf *lang, void *opaque);
69
+ void (*blockquote)(struct buf *ob, const struct buf *text, void *opaque);
70
+ void (*blockhtml)(struct buf *ob,const struct buf *text, void *opaque);
71
+ void (*header)(struct buf *ob, const struct buf *text, int level, void *opaque);
72
+ void (*hrule)(struct buf *ob, void *opaque);
73
+ void (*list)(struct buf *ob, const struct buf *text, int flags, void *opaque);
74
+ void (*listitem)(struct buf *ob, const struct buf *text, int flags, void *opaque);
75
+ void (*paragraph)(struct buf *ob, const struct buf *text, void *opaque);
76
+ void (*table)(struct buf *ob, const struct buf *header, const struct buf *body, void *opaque);
77
+ void (*table_row)(struct buf *ob, const struct buf *text, void *opaque);
78
+ void (*table_cell)(struct buf *ob, const struct buf *text, int flags, void *opaque);
79
+
80
+
81
+ /* span level callbacks - NULL or return 0 prints the span verbatim */
82
+ int (*autolink)(struct buf *ob, const struct buf *link, enum mkd_autolink type, void *opaque);
83
+ int (*codespan)(struct buf *ob, const struct buf *text, void *opaque);
84
+ int (*double_emphasis)(struct buf *ob, const struct buf *text, void *opaque);
85
+ int (*emphasis)(struct buf *ob, const struct buf *text, void *opaque);
86
+ int (*image)(struct buf *ob, const struct buf *link, const struct buf *title, const struct buf *alt, void *opaque);
87
+ int (*linebreak)(struct buf *ob, void *opaque);
88
+ int (*link)(struct buf *ob, const struct buf *link, const struct buf *title, const struct buf *content, void *opaque);
89
+ int (*raw_html_tag)(struct buf *ob, const struct buf *tag, void *opaque);
90
+ int (*triple_emphasis)(struct buf *ob, const struct buf *text, void *opaque);
91
+ int (*strikethrough)(struct buf *ob, const struct buf *text, void *opaque);
92
+ int (*superscript)(struct buf *ob, const struct buf *text, void *opaque);
93
+
94
+ /* low level callbacks - NULL copies input directly into the output */
95
+ void (*entity)(struct buf *ob, const struct buf *entity, void *opaque);
96
+ void (*normal_text)(struct buf *ob, const struct buf *text, void *opaque);
97
+
98
+ /* header and footer */
99
+ void (*doc_header)(struct buf *ob, void *opaque);
100
+ void (*doc_footer)(struct buf *ob, void *opaque);
101
+
102
+ /* AST construction helpers */
103
+ void (*blockquote_begin)(void *opaque);
104
+ void (*list_begin)(int flags, void *opaque);
105
+ void (*listitem_begin)(int flags, void *opaque);
106
+
107
+ /* source map */
108
+ void (*block_did_parse)(const src_map* map, const uint8_t *txt_data, size_t size, void *opaque);
109
+ };
110
+
111
+ struct sd_markdown;
112
+
113
+ /*********
114
+ * FLAGS *
115
+ *********/
116
+
117
+ /* list/listitem flags */
118
+ #define MKD_LIST_ORDERED 1
119
+ #define MKD_LI_BLOCK 2 /* <li> containing block data */
120
+
121
+ /**********************
122
+ * EXPORTED FUNCTIONS *
123
+ **********************/
124
+
125
+ extern struct sd_markdown *
126
+ sd_markdown_new(
127
+ unsigned int extensions,
128
+ size_t max_nesting,
129
+ const struct sd_callbacks *callbacks,
130
+ void *opaque);
131
+
132
+ extern void
133
+ sd_markdown_render(struct buf *ob, const uint8_t *document, size_t doc_size, struct sd_markdown *md);
134
+
135
+ extern void
136
+ sd_markdown_free(struct sd_markdown *md);
137
+
138
+ extern void
139
+ sd_version(int *major, int *minor, int *revision);
140
+
141
+ #ifdef __cplusplus
142
+ }
143
+ #endif
144
+
145
+ #endif
146
+
147
+ /* vim: set filetype=c: */
@@ -0,0 +1,200 @@
1
+ /*
2
+ * src_map.c
3
+ * snowcrash
4
+ *
5
+ * Created by Zdenek Nemec on 4/21/13.
6
+ * Copyright (c) 2013 Apiary Inc. All rights reserved.
7
+ */
8
+
9
+ #include "src_map.h"
10
+
11
+ #include <assert.h>
12
+
13
+ range *
14
+ range_new(size_t loc, size_t len)
15
+ {
16
+ range *r;
17
+ if((r = malloc(sizeof *r)) != NULL) {
18
+ r->loc = loc;
19
+ r->len = len;
20
+ }
21
+
22
+ return r;
23
+ }
24
+
25
+ void
26
+ range_release(range *r)
27
+ {
28
+ if (!r)
29
+ return;
30
+
31
+ free(r);
32
+ r = NULL;
33
+ }
34
+
35
+ src_map *
36
+ src_map_new()
37
+ {
38
+ src_map *map;
39
+ if ((map = malloc(sizeof *map)) != NULL) {
40
+ stack_init(map, 4);
41
+ }
42
+
43
+ return map;
44
+ }
45
+
46
+ void
47
+ src_map_release(src_map *map)
48
+ {
49
+ size_t i = 0;
50
+
51
+ if (!map)
52
+ return;
53
+
54
+ for (i = 0; i < (size_t)map->asize; ++i) {
55
+ range_release(map->item[i]);
56
+ }
57
+
58
+ stack_free(map);
59
+ free(map);
60
+ map = NULL;
61
+ }
62
+
63
+ src_map *
64
+ src_map_new_submap(const src_map *map, const range *r)
65
+ {
66
+ size_t i;
67
+ size_t first_item = -1;
68
+ src_map *new_map = NULL;
69
+ size_t remain_len = 0;
70
+
71
+ if (!map ||
72
+ !map->size ||
73
+ !r ||
74
+ !r->len)
75
+ return NULL;
76
+
77
+ /* find first item */
78
+ for (i = 0; i < (size_t)map->size; ++i) {
79
+
80
+ range *it = (range *)map->item[i];
81
+ if (r->loc >= it->loc &&
82
+ r->loc < it->loc + it->len) {
83
+ first_item = i;
84
+ break;
85
+ }
86
+ }
87
+
88
+ if (first_item == (size_t)-1)
89
+ return NULL;
90
+
91
+ /* create new map */
92
+ new_map = src_map_new();
93
+ remain_len = r->len;
94
+
95
+ for (i = first_item; i < (size_t)map->size; ++i) {
96
+
97
+ range *it = (range *)map->item[i];
98
+ size_t add_loc = (i == first_item) ? r->loc : it->loc;
99
+ size_t add_len = (it->len < remain_len) ? it->len : remain_len;
100
+
101
+ range *add_range = range_new(add_loc, add_len);
102
+ stack_push(new_map, add_range);
103
+
104
+ remain_len -= add_len;
105
+
106
+ if (remain_len <= 0)
107
+ break;
108
+ }
109
+
110
+ return new_map;
111
+ }
112
+
113
+ /* append range to src_map */
114
+ void
115
+ src_map_append(src_map *map, const range *r)
116
+ {
117
+ range *new_range = NULL;
118
+
119
+ if (!map ||
120
+ !r ||
121
+ !r->len)
122
+ return;
123
+
124
+ if (map->size) {
125
+ /* check continuous range */
126
+ range *last_range = (range *)map->item[map->size - 1];
127
+ if (r->loc == last_range->loc + last_range->len) {
128
+ last_range->len += r->len;
129
+ return;
130
+ }
131
+ }
132
+
133
+ /* not continuous, create new range and push */
134
+ new_range = range_new(r->loc, r->len);
135
+ stack_push(map, new_range);
136
+ }
137
+
138
+ /* return index-th cursor from map */
139
+ size_t
140
+ src_map_location(const src_map *map, size_t index)
141
+ {
142
+ size_t i = 0;
143
+ size_t cur = 0;
144
+
145
+ if (!map ||
146
+ !map->size)
147
+ return -1;
148
+
149
+ for (i = 0; i < (size_t)map->size; ++i) {
150
+
151
+ range *it = (range *)map->item[i];
152
+ if (index < cur + it->len) {
153
+ return it->loc + index - cur;
154
+ }
155
+ cur += it->len;
156
+ }
157
+
158
+ assert(0);
159
+ return -1;
160
+ }
161
+
162
+ /* create new src_map from index onward */
163
+ src_map *
164
+ src_map_new_tail(const src_map *map, size_t index)
165
+ {
166
+ size_t i = 0;
167
+ size_t cur = 0;
168
+ size_t first_item = -1;
169
+ src_map *new_map = NULL;
170
+
171
+ if (!map ||
172
+ !map->size)
173
+ return NULL;
174
+
175
+ for (i = 0; i < (size_t)map->size; ++i) {
176
+
177
+ range *it = (range *)map->item[i];
178
+ if (index < cur + it->len) {
179
+ first_item = i;
180
+ break;
181
+ }
182
+ cur += it->len;
183
+ }
184
+
185
+ if (first_item == (size_t)-1)
186
+ return NULL;
187
+
188
+ /* create new map */
189
+ new_map = src_map_new();
190
+
191
+ for (i = first_item; i < map->size; ++i) {
192
+
193
+ range *it = (range *)map->item[i];
194
+ range *add_range = range_new(it->loc, it->len);
195
+ stack_push(new_map, add_range);
196
+
197
+ }
198
+
199
+ return new_map;
200
+ }
@@ -0,0 +1,58 @@
1
+ /*
2
+ * src_map.h
3
+ * snowcrash
4
+ *
5
+ * Created by Zdenek Nemec on 4/21/13.
6
+ * Copyright (c) 2013 Apiary Inc. All rights reserved.
7
+ *
8
+ */
9
+
10
+ #ifndef SNOWCRASH_SUNDOWN_SRCMAP_H
11
+ #define SNOWCRASH_SUNDOWN_SRCMAP_H
12
+
13
+ #include <stdlib.h>
14
+ #include "stack.h"
15
+
16
+ #ifdef __cplusplus
17
+ extern "C" {
18
+ #endif
19
+
20
+ /* range: character data range */
21
+ typedef struct {
22
+ size_t loc;
23
+ size_t len;
24
+ } range;
25
+
26
+ /* range_new: allocate & init new range */
27
+ range *range_new(size_t loc, size_t len);
28
+
29
+ /* range_new: release range */
30
+ void range_release(range *r);
31
+
32
+ /* stack of range forming the buffer content */
33
+ typedef struct stack src_map;
34
+
35
+ /* src_map_new: allocate new source map */
36
+ src_map *src_map_new();
37
+
38
+ /* src_map_release: release source map */
39
+ void src_map_release(src_map *map);
40
+
41
+ /* src_map_submap: create map from a subset of map */
42
+ src_map *src_map_new_submap(const src_map *map, const range *r);
43
+
44
+ /* src_map_new_tail: create map from tail of map */
45
+ src_map *src_map_new_tail(const src_map *map, size_t index);
46
+
47
+ /* src_map_append: append range to source map */
48
+ void src_map_append(src_map *map, const range *r);
49
+
50
+ /* src_map_location: returns location in source for given index */
51
+ size_t src_map_location(const src_map *map, size_t index);
52
+
53
+
54
+ #ifdef __cplusplus
55
+ }
56
+ #endif
57
+
58
+ #endif
@@ -0,0 +1,81 @@
1
+ #include "stack.h"
2
+ #include <string.h>
3
+
4
+ int
5
+ stack_grow(struct stack *st, size_t new_size)
6
+ {
7
+ void **new_st;
8
+
9
+ if (st->asize >= new_size)
10
+ return 0;
11
+
12
+ new_st = realloc(st->item, new_size * sizeof(void *));
13
+ if (new_st == NULL)
14
+ return -1;
15
+
16
+ memset(new_st + st->asize, 0x0,
17
+ (new_size - st->asize) * sizeof(void *));
18
+
19
+ st->item = new_st;
20
+ st->asize = new_size;
21
+
22
+ if (st->size > new_size)
23
+ st->size = new_size;
24
+
25
+ return 0;
26
+ }
27
+
28
+ void
29
+ stack_free(struct stack *st)
30
+ {
31
+ if (!st)
32
+ return;
33
+
34
+ free(st->item);
35
+
36
+ st->item = NULL;
37
+ st->size = 0;
38
+ st->asize = 0;
39
+ }
40
+
41
+ int
42
+ stack_init(struct stack *st, size_t initial_size)
43
+ {
44
+ st->item = NULL;
45
+ st->size = 0;
46
+ st->asize = 0;
47
+
48
+ if (!initial_size)
49
+ initial_size = 8;
50
+
51
+ return stack_grow(st, initial_size);
52
+ }
53
+
54
+ void *
55
+ stack_pop(struct stack *st)
56
+ {
57
+ if (!st->size)
58
+ return NULL;
59
+
60
+ return st->item[--st->size];
61
+ }
62
+
63
+ int
64
+ stack_push(struct stack *st, void *item)
65
+ {
66
+ if (stack_grow(st, st->size * 2) < 0)
67
+ return -1;
68
+
69
+ st->item[st->size++] = item;
70
+ return 0;
71
+ }
72
+
73
+ void *
74
+ stack_top(struct stack *st)
75
+ {
76
+ if (!st->size)
77
+ return NULL;
78
+
79
+ return st->item[st->size - 1];
80
+ }
81
+