Skip to content

Commit f19ee81

Browse files
eregonandrykonchin
authored andcommitted
Import YARP
1 parent 585abd5 commit f19ee81

File tree

13 files changed

+1275
-199
lines changed

13 files changed

+1275
-199
lines changed

src/main/c/yarp/.gitignore

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,9 @@
1414
/lib/yarp/yarp.*
1515
/lib/yarp.bundle
1616
/lib/yarp.so
17-
test.rb
17+
/test.rb
1818
*.dSYM
19+
/*.iml
1920
*~
2021

2122
test.c

src/main/c/yarp/Makefile.in

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -36,12 +36,12 @@ build/librubyparser.a: $(STATIC_OBJECTS)
3636
build/shared/%.o: src/%.c Makefile $(HEADERS)
3737
$(ECHO) "compiling $@"
3838
$(Q) mkdir -p $(@D)
39-
$(Q) $(CC) $(DEBUG_FLAGS) $(CPPFLAGS) $(CFLAGS) -c -o $@ $<
39+
$(Q) $(CC) $(DEBUG_FLAGS) -DYP_EXPORT_SYMBOLS $(CPPFLAGS) $(CFLAGS) -c -o $@ $<
4040

4141
build/static/%.o: src/%.c Makefile $(HEADERS)
4242
$(ECHO) "compiling $@"
4343
$(Q) mkdir -p $(@D)
44-
$(Q) $(CC) $(DEBUG_FLAGS) -DYP_STATIC $(CPPFLAGS) $(CFLAGS) -c -o $@ $<
44+
$(Q) $(CC) $(DEBUG_FLAGS) $(CPPFLAGS) $(CFLAGS) -c -o $@ $<
4545

4646
build/fuzz.%: $(SOURCES) fuzz/%.c fuzz/fuzz.c
4747
$(ECHO) "building $* fuzzer"

src/main/c/yarp/include/yarp/defines.h

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -12,18 +12,18 @@
1212
#include <string.h>
1313

1414
// YP_EXPORTED_FUNCTION
15-
#if defined(YP_STATIC)
16-
# define YP_EXPORTED_FUNCTION
17-
#elif defined(_WIN32)
15+
#if defined(_WIN32)
1816
# define YP_EXPORTED_FUNCTION __declspec(dllexport) extern
19-
#else
17+
#elif defined(YP_EXPORT_SYMBOLS)
2018
# ifndef YP_EXPORTED_FUNCTION
2119
# ifndef RUBY_FUNC_EXPORTED
2220
# define YP_EXPORTED_FUNCTION __attribute__((__visibility__("default"))) extern
2321
# else
2422
# define YP_EXPORTED_FUNCTION RUBY_FUNC_EXPORTED
2523
# endif
2624
# endif
25+
#else
26+
# define YP_EXPORTED_FUNCTION
2727
#endif
2828

2929
// YP_ATTRIBUTE_UNUSED
@@ -45,6 +45,12 @@ int yp_snprintf(char *dest, YP_ATTRIBUTE_UNUSED size_t size, const char *format,
4545
#if defined(HAVE_SNPRINTF)
4646
// We use snprintf if it's available
4747
# define yp_snprintf snprintf
48+
49+
#else
50+
// In case snprintf isn't present on the system, we provide our own that simply
51+
// forwards to the less-safe sprintf.
52+
# define yp_snprintf(dest, size, ...) sprintf((dest), __VA_ARGS__)
53+
4854
#endif
4955

5056
#endif

src/main/c/yarp/include/yarp/node.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,9 @@ typedef struct {
2727
// Calculates the memory footprint of a given node.
2828
YP_EXPORTED_FUNCTION void yp_node_memsize(yp_node_t *node, yp_memsize_t *memsize);
2929

30+
// Returns a string representation of the given node type.
31+
YP_EXPORTED_FUNCTION const char * yp_node_type_to_str(yp_node_type_t node_type);
32+
3033
#define YP_EMPTY_NODE_LIST ((yp_node_list_t) { .nodes = NULL, .size = 0, .capacity = 0 })
3134
#define YP_EMPTY_LOCATION_LIST ((yp_location_list_t) { .locations = NULL, .size = 0, .capacity = 0 })
3235

src/main/c/yarp/include/yarp/util/yp_char.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ size_t yp_strspn_whitespace(const char *string, ptrdiff_t length);
1515
// whitespace while also tracking the location of each newline. Disallows
1616
// searching past the given maximum number of characters.
1717
size_t
18-
yp_strspn_whitespace_newlines(const char *string, long length, yp_newline_list_t *newline_list);
18+
yp_strspn_whitespace_newlines(const char *string, long length, yp_newline_list_t *newline_list, bool);
1919

2020
// Returns the number of characters at the start of the string that are inline
2121
// whitespace. Disallows searching past the given maximum number of characters.

src/main/c/yarp/src/node.c

Lines changed: 261 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1732,3 +1732,264 @@ yp_node_memsize(yp_node_t *node, yp_memsize_t *memsize) {
17321732
*memsize = (yp_memsize_t) { .memsize = 0, .node_count = 0 };
17331733
yp_node_memsize_node(node, memsize);
17341734
}
1735+
1736+
// Returns a string representation of the given node type.
1737+
YP_EXPORTED_FUNCTION const char *
1738+
yp_node_type_to_str(yp_node_type_t node_type)
1739+
{
1740+
switch (node_type) {
1741+
case YP_NODE_ALIAS_NODE:
1742+
return "YP_NODE_ALIAS_NODE";
1743+
case YP_NODE_ALTERNATION_PATTERN_NODE:
1744+
return "YP_NODE_ALTERNATION_PATTERN_NODE";
1745+
case YP_NODE_AND_NODE:
1746+
return "YP_NODE_AND_NODE";
1747+
case YP_NODE_ARGUMENTS_NODE:
1748+
return "YP_NODE_ARGUMENTS_NODE";
1749+
case YP_NODE_ARRAY_NODE:
1750+
return "YP_NODE_ARRAY_NODE";
1751+
case YP_NODE_ARRAY_PATTERN_NODE:
1752+
return "YP_NODE_ARRAY_PATTERN_NODE";
1753+
case YP_NODE_ASSOC_NODE:
1754+
return "YP_NODE_ASSOC_NODE";
1755+
case YP_NODE_ASSOC_SPLAT_NODE:
1756+
return "YP_NODE_ASSOC_SPLAT_NODE";
1757+
case YP_NODE_BACK_REFERENCE_READ_NODE:
1758+
return "YP_NODE_BACK_REFERENCE_READ_NODE";
1759+
case YP_NODE_BEGIN_NODE:
1760+
return "YP_NODE_BEGIN_NODE";
1761+
case YP_NODE_BLOCK_ARGUMENT_NODE:
1762+
return "YP_NODE_BLOCK_ARGUMENT_NODE";
1763+
case YP_NODE_BLOCK_NODE:
1764+
return "YP_NODE_BLOCK_NODE";
1765+
case YP_NODE_BLOCK_PARAMETER_NODE:
1766+
return "YP_NODE_BLOCK_PARAMETER_NODE";
1767+
case YP_NODE_BLOCK_PARAMETERS_NODE:
1768+
return "YP_NODE_BLOCK_PARAMETERS_NODE";
1769+
case YP_NODE_BREAK_NODE:
1770+
return "YP_NODE_BREAK_NODE";
1771+
case YP_NODE_CALL_NODE:
1772+
return "YP_NODE_CALL_NODE";
1773+
case YP_NODE_CALL_OPERATOR_AND_WRITE_NODE:
1774+
return "YP_NODE_CALL_OPERATOR_AND_WRITE_NODE";
1775+
case YP_NODE_CALL_OPERATOR_OR_WRITE_NODE:
1776+
return "YP_NODE_CALL_OPERATOR_OR_WRITE_NODE";
1777+
case YP_NODE_CALL_OPERATOR_WRITE_NODE:
1778+
return "YP_NODE_CALL_OPERATOR_WRITE_NODE";
1779+
case YP_NODE_CAPTURE_PATTERN_NODE:
1780+
return "YP_NODE_CAPTURE_PATTERN_NODE";
1781+
case YP_NODE_CASE_NODE:
1782+
return "YP_NODE_CASE_NODE";
1783+
case YP_NODE_CLASS_NODE:
1784+
return "YP_NODE_CLASS_NODE";
1785+
case YP_NODE_CLASS_VARIABLE_OPERATOR_AND_WRITE_NODE:
1786+
return "YP_NODE_CLASS_VARIABLE_OPERATOR_AND_WRITE_NODE";
1787+
case YP_NODE_CLASS_VARIABLE_OPERATOR_OR_WRITE_NODE:
1788+
return "YP_NODE_CLASS_VARIABLE_OPERATOR_OR_WRITE_NODE";
1789+
case YP_NODE_CLASS_VARIABLE_OPERATOR_WRITE_NODE:
1790+
return "YP_NODE_CLASS_VARIABLE_OPERATOR_WRITE_NODE";
1791+
case YP_NODE_CLASS_VARIABLE_READ_NODE:
1792+
return "YP_NODE_CLASS_VARIABLE_READ_NODE";
1793+
case YP_NODE_CLASS_VARIABLE_WRITE_NODE:
1794+
return "YP_NODE_CLASS_VARIABLE_WRITE_NODE";
1795+
case YP_NODE_CONSTANT_OPERATOR_AND_WRITE_NODE:
1796+
return "YP_NODE_CONSTANT_OPERATOR_AND_WRITE_NODE";
1797+
case YP_NODE_CONSTANT_OPERATOR_OR_WRITE_NODE:
1798+
return "YP_NODE_CONSTANT_OPERATOR_OR_WRITE_NODE";
1799+
case YP_NODE_CONSTANT_OPERATOR_WRITE_NODE:
1800+
return "YP_NODE_CONSTANT_OPERATOR_WRITE_NODE";
1801+
case YP_NODE_CONSTANT_PATH_NODE:
1802+
return "YP_NODE_CONSTANT_PATH_NODE";
1803+
case YP_NODE_CONSTANT_PATH_OPERATOR_AND_WRITE_NODE:
1804+
return "YP_NODE_CONSTANT_PATH_OPERATOR_AND_WRITE_NODE";
1805+
case YP_NODE_CONSTANT_PATH_OPERATOR_OR_WRITE_NODE:
1806+
return "YP_NODE_CONSTANT_PATH_OPERATOR_OR_WRITE_NODE";
1807+
case YP_NODE_CONSTANT_PATH_OPERATOR_WRITE_NODE:
1808+
return "YP_NODE_CONSTANT_PATH_OPERATOR_WRITE_NODE";
1809+
case YP_NODE_CONSTANT_PATH_WRITE_NODE:
1810+
return "YP_NODE_CONSTANT_PATH_WRITE_NODE";
1811+
case YP_NODE_CONSTANT_READ_NODE:
1812+
return "YP_NODE_CONSTANT_READ_NODE";
1813+
case YP_NODE_DEF_NODE:
1814+
return "YP_NODE_DEF_NODE";
1815+
case YP_NODE_DEFINED_NODE:
1816+
return "YP_NODE_DEFINED_NODE";
1817+
case YP_NODE_ELSE_NODE:
1818+
return "YP_NODE_ELSE_NODE";
1819+
case YP_NODE_EMBEDDED_STATEMENTS_NODE:
1820+
return "YP_NODE_EMBEDDED_STATEMENTS_NODE";
1821+
case YP_NODE_EMBEDDED_VARIABLE_NODE:
1822+
return "YP_NODE_EMBEDDED_VARIABLE_NODE";
1823+
case YP_NODE_ENSURE_NODE:
1824+
return "YP_NODE_ENSURE_NODE";
1825+
case YP_NODE_FALSE_NODE:
1826+
return "YP_NODE_FALSE_NODE";
1827+
case YP_NODE_FIND_PATTERN_NODE:
1828+
return "YP_NODE_FIND_PATTERN_NODE";
1829+
case YP_NODE_FLOAT_NODE:
1830+
return "YP_NODE_FLOAT_NODE";
1831+
case YP_NODE_FOR_NODE:
1832+
return "YP_NODE_FOR_NODE";
1833+
case YP_NODE_FORWARDING_ARGUMENTS_NODE:
1834+
return "YP_NODE_FORWARDING_ARGUMENTS_NODE";
1835+
case YP_NODE_FORWARDING_PARAMETER_NODE:
1836+
return "YP_NODE_FORWARDING_PARAMETER_NODE";
1837+
case YP_NODE_FORWARDING_SUPER_NODE:
1838+
return "YP_NODE_FORWARDING_SUPER_NODE";
1839+
case YP_NODE_GLOBAL_VARIABLE_OPERATOR_AND_WRITE_NODE:
1840+
return "YP_NODE_GLOBAL_VARIABLE_OPERATOR_AND_WRITE_NODE";
1841+
case YP_NODE_GLOBAL_VARIABLE_OPERATOR_OR_WRITE_NODE:
1842+
return "YP_NODE_GLOBAL_VARIABLE_OPERATOR_OR_WRITE_NODE";
1843+
case YP_NODE_GLOBAL_VARIABLE_OPERATOR_WRITE_NODE:
1844+
return "YP_NODE_GLOBAL_VARIABLE_OPERATOR_WRITE_NODE";
1845+
case YP_NODE_GLOBAL_VARIABLE_READ_NODE:
1846+
return "YP_NODE_GLOBAL_VARIABLE_READ_NODE";
1847+
case YP_NODE_GLOBAL_VARIABLE_WRITE_NODE:
1848+
return "YP_NODE_GLOBAL_VARIABLE_WRITE_NODE";
1849+
case YP_NODE_HASH_NODE:
1850+
return "YP_NODE_HASH_NODE";
1851+
case YP_NODE_HASH_PATTERN_NODE:
1852+
return "YP_NODE_HASH_PATTERN_NODE";
1853+
case YP_NODE_IF_NODE:
1854+
return "YP_NODE_IF_NODE";
1855+
case YP_NODE_IMAGINARY_NODE:
1856+
return "YP_NODE_IMAGINARY_NODE";
1857+
case YP_NODE_IN_NODE:
1858+
return "YP_NODE_IN_NODE";
1859+
case YP_NODE_INSTANCE_VARIABLE_OPERATOR_AND_WRITE_NODE:
1860+
return "YP_NODE_INSTANCE_VARIABLE_OPERATOR_AND_WRITE_NODE";
1861+
case YP_NODE_INSTANCE_VARIABLE_OPERATOR_OR_WRITE_NODE:
1862+
return "YP_NODE_INSTANCE_VARIABLE_OPERATOR_OR_WRITE_NODE";
1863+
case YP_NODE_INSTANCE_VARIABLE_OPERATOR_WRITE_NODE:
1864+
return "YP_NODE_INSTANCE_VARIABLE_OPERATOR_WRITE_NODE";
1865+
case YP_NODE_INSTANCE_VARIABLE_READ_NODE:
1866+
return "YP_NODE_INSTANCE_VARIABLE_READ_NODE";
1867+
case YP_NODE_INSTANCE_VARIABLE_WRITE_NODE:
1868+
return "YP_NODE_INSTANCE_VARIABLE_WRITE_NODE";
1869+
case YP_NODE_INTEGER_NODE:
1870+
return "YP_NODE_INTEGER_NODE";
1871+
case YP_NODE_INTERPOLATED_REGULAR_EXPRESSION_NODE:
1872+
return "YP_NODE_INTERPOLATED_REGULAR_EXPRESSION_NODE";
1873+
case YP_NODE_INTERPOLATED_STRING_NODE:
1874+
return "YP_NODE_INTERPOLATED_STRING_NODE";
1875+
case YP_NODE_INTERPOLATED_SYMBOL_NODE:
1876+
return "YP_NODE_INTERPOLATED_SYMBOL_NODE";
1877+
case YP_NODE_INTERPOLATED_X_STRING_NODE:
1878+
return "YP_NODE_INTERPOLATED_X_STRING_NODE";
1879+
case YP_NODE_KEYWORD_HASH_NODE:
1880+
return "YP_NODE_KEYWORD_HASH_NODE";
1881+
case YP_NODE_KEYWORD_PARAMETER_NODE:
1882+
return "YP_NODE_KEYWORD_PARAMETER_NODE";
1883+
case YP_NODE_KEYWORD_REST_PARAMETER_NODE:
1884+
return "YP_NODE_KEYWORD_REST_PARAMETER_NODE";
1885+
case YP_NODE_LAMBDA_NODE:
1886+
return "YP_NODE_LAMBDA_NODE";
1887+
case YP_NODE_LOCAL_VARIABLE_OPERATOR_AND_WRITE_NODE:
1888+
return "YP_NODE_LOCAL_VARIABLE_OPERATOR_AND_WRITE_NODE";
1889+
case YP_NODE_LOCAL_VARIABLE_OPERATOR_OR_WRITE_NODE:
1890+
return "YP_NODE_LOCAL_VARIABLE_OPERATOR_OR_WRITE_NODE";
1891+
case YP_NODE_LOCAL_VARIABLE_OPERATOR_WRITE_NODE:
1892+
return "YP_NODE_LOCAL_VARIABLE_OPERATOR_WRITE_NODE";
1893+
case YP_NODE_LOCAL_VARIABLE_READ_NODE:
1894+
return "YP_NODE_LOCAL_VARIABLE_READ_NODE";
1895+
case YP_NODE_LOCAL_VARIABLE_WRITE_NODE:
1896+
return "YP_NODE_LOCAL_VARIABLE_WRITE_NODE";
1897+
case YP_NODE_MATCH_PREDICATE_NODE:
1898+
return "YP_NODE_MATCH_PREDICATE_NODE";
1899+
case YP_NODE_MATCH_REQUIRED_NODE:
1900+
return "YP_NODE_MATCH_REQUIRED_NODE";
1901+
case YP_NODE_MISSING_NODE:
1902+
return "YP_NODE_MISSING_NODE";
1903+
case YP_NODE_MODULE_NODE:
1904+
return "YP_NODE_MODULE_NODE";
1905+
case YP_NODE_MULTI_WRITE_NODE:
1906+
return "YP_NODE_MULTI_WRITE_NODE";
1907+
case YP_NODE_NEXT_NODE:
1908+
return "YP_NODE_NEXT_NODE";
1909+
case YP_NODE_NIL_NODE:
1910+
return "YP_NODE_NIL_NODE";
1911+
case YP_NODE_NO_KEYWORDS_PARAMETER_NODE:
1912+
return "YP_NODE_NO_KEYWORDS_PARAMETER_NODE";
1913+
case YP_NODE_NUMBERED_REFERENCE_READ_NODE:
1914+
return "YP_NODE_NUMBERED_REFERENCE_READ_NODE";
1915+
case YP_NODE_OPTIONAL_PARAMETER_NODE:
1916+
return "YP_NODE_OPTIONAL_PARAMETER_NODE";
1917+
case YP_NODE_OR_NODE:
1918+
return "YP_NODE_OR_NODE";
1919+
case YP_NODE_PARAMETERS_NODE:
1920+
return "YP_NODE_PARAMETERS_NODE";
1921+
case YP_NODE_PARENTHESES_NODE:
1922+
return "YP_NODE_PARENTHESES_NODE";
1923+
case YP_NODE_PINNED_EXPRESSION_NODE:
1924+
return "YP_NODE_PINNED_EXPRESSION_NODE";
1925+
case YP_NODE_PINNED_VARIABLE_NODE:
1926+
return "YP_NODE_PINNED_VARIABLE_NODE";
1927+
case YP_NODE_POST_EXECUTION_NODE:
1928+
return "YP_NODE_POST_EXECUTION_NODE";
1929+
case YP_NODE_PRE_EXECUTION_NODE:
1930+
return "YP_NODE_PRE_EXECUTION_NODE";
1931+
case YP_NODE_PROGRAM_NODE:
1932+
return "YP_NODE_PROGRAM_NODE";
1933+
case YP_NODE_RANGE_NODE:
1934+
return "YP_NODE_RANGE_NODE";
1935+
case YP_NODE_RATIONAL_NODE:
1936+
return "YP_NODE_RATIONAL_NODE";
1937+
case YP_NODE_REDO_NODE:
1938+
return "YP_NODE_REDO_NODE";
1939+
case YP_NODE_REGULAR_EXPRESSION_NODE:
1940+
return "YP_NODE_REGULAR_EXPRESSION_NODE";
1941+
case YP_NODE_REQUIRED_DESTRUCTURED_PARAMETER_NODE:
1942+
return "YP_NODE_REQUIRED_DESTRUCTURED_PARAMETER_NODE";
1943+
case YP_NODE_REQUIRED_PARAMETER_NODE:
1944+
return "YP_NODE_REQUIRED_PARAMETER_NODE";
1945+
case YP_NODE_RESCUE_MODIFIER_NODE:
1946+
return "YP_NODE_RESCUE_MODIFIER_NODE";
1947+
case YP_NODE_RESCUE_NODE:
1948+
return "YP_NODE_RESCUE_NODE";
1949+
case YP_NODE_REST_PARAMETER_NODE:
1950+
return "YP_NODE_REST_PARAMETER_NODE";
1951+
case YP_NODE_RETRY_NODE:
1952+
return "YP_NODE_RETRY_NODE";
1953+
case YP_NODE_RETURN_NODE:
1954+
return "YP_NODE_RETURN_NODE";
1955+
case YP_NODE_SELF_NODE:
1956+
return "YP_NODE_SELF_NODE";
1957+
case YP_NODE_SINGLETON_CLASS_NODE:
1958+
return "YP_NODE_SINGLETON_CLASS_NODE";
1959+
case YP_NODE_SOURCE_ENCODING_NODE:
1960+
return "YP_NODE_SOURCE_ENCODING_NODE";
1961+
case YP_NODE_SOURCE_FILE_NODE:
1962+
return "YP_NODE_SOURCE_FILE_NODE";
1963+
case YP_NODE_SOURCE_LINE_NODE:
1964+
return "YP_NODE_SOURCE_LINE_NODE";
1965+
case YP_NODE_SPLAT_NODE:
1966+
return "YP_NODE_SPLAT_NODE";
1967+
case YP_NODE_STATEMENTS_NODE:
1968+
return "YP_NODE_STATEMENTS_NODE";
1969+
case YP_NODE_STRING_CONCAT_NODE:
1970+
return "YP_NODE_STRING_CONCAT_NODE";
1971+
case YP_NODE_STRING_NODE:
1972+
return "YP_NODE_STRING_NODE";
1973+
case YP_NODE_SUPER_NODE:
1974+
return "YP_NODE_SUPER_NODE";
1975+
case YP_NODE_SYMBOL_NODE:
1976+
return "YP_NODE_SYMBOL_NODE";
1977+
case YP_NODE_TRUE_NODE:
1978+
return "YP_NODE_TRUE_NODE";
1979+
case YP_NODE_UNDEF_NODE:
1980+
return "YP_NODE_UNDEF_NODE";
1981+
case YP_NODE_UNLESS_NODE:
1982+
return "YP_NODE_UNLESS_NODE";
1983+
case YP_NODE_UNTIL_NODE:
1984+
return "YP_NODE_UNTIL_NODE";
1985+
case YP_NODE_WHEN_NODE:
1986+
return "YP_NODE_WHEN_NODE";
1987+
case YP_NODE_WHILE_NODE:
1988+
return "YP_NODE_WHILE_NODE";
1989+
case YP_NODE_X_STRING_NODE:
1990+
return "YP_NODE_X_STRING_NODE";
1991+
case YP_NODE_YIELD_NODE:
1992+
return "YP_NODE_YIELD_NODE";
1993+
}
1994+
return "\0";
1995+
}

src/main/c/yarp/src/util/yp_char.c

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -75,15 +75,20 @@ yp_strspn_whitespace(const char *string, ptrdiff_t length) {
7575
// whitespace while also tracking the location of each newline. Disallows
7676
// searching past the given maximum number of characters.
7777
size_t
78-
yp_strspn_whitespace_newlines(const char *string, long length, yp_newline_list_t *newline_list) {
78+
yp_strspn_whitespace_newlines(const char *string, long length, yp_newline_list_t *newline_list, bool stop_at_newline) {
7979
if (length <= 0) return 0;
8080

8181
size_t size = 0;
8282
size_t maximum = (size_t) length;
8383

8484
while (size < maximum && (yp_char_table[(unsigned char) string[size]] & YP_CHAR_BIT_WHITESPACE)) {
8585
if (string[size] == '\n') {
86-
yp_newline_list_append(newline_list, string + size);
86+
if (stop_at_newline) {
87+
return size + 1;
88+
}
89+
else {
90+
yp_newline_list_append(newline_list, string + size);
91+
}
8792
}
8893

8994
size++;

src/main/c/yarp/src/util/yp_newline_list.c

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,13 +25,15 @@ yp_newline_list_init(yp_newline_list_t *list, const char *start, size_t capacity
2525
bool
2626
yp_newline_list_append(yp_newline_list_t *list, const char *cursor) {
2727
if (list->size == list->capacity) {
28-
list->capacity = list->capacity * 3 / 2;
28+
list->capacity = (list->capacity * 3) / 2;
2929
list->offsets = (size_t *) realloc(list->offsets, list->capacity * sizeof(size_t));
3030
if (list->offsets == NULL) return false;
3131
}
3232

3333
assert(cursor >= list->start);
34-
list->offsets[list->size++] = (size_t) (cursor - list->start + 1);
34+
size_t newline_offset = (size_t) (cursor - list->start + 1);
35+
assert(list->size == 0 || newline_offset > list->offsets[list->size - 1]);
36+
list->offsets[list->size++] = newline_offset;
3537

3638
return true;
3739
}

0 commit comments

Comments
 (0)