--- old/src/java.base/share/native/libjli/jli_util.c 2015-07-15 12:24:25.000000000 -0700 +++ new/src/java.base/share/native/libjli/jli_util.c 2015-07-15 12:24:25.000000000 -0700 @@ -25,8 +25,7 @@ #include #include -#include - +#include #include "jli_util.h" /* @@ -119,3 +118,122 @@ { return JLI_StrNCmp(s1, s2, JLI_StrLen(s2)); } + +JLI_List +JLI_List_new(int capacity) +{ + JLI_List l = (JLI_List) JLI_MemAlloc(sizeof(struct JLI_List_)); + l->capacity = capacity; + l->elements = (char **) JLI_MemAlloc(capacity * sizeof(l->elements[0])); + l->size = 0; + return l; +} + +void +JLI_List_free(JLI_List sl) +{ + if (sl) { + if (sl->elements) { + int i; + for (i = 0; i < sl->size; i++) + JLI_MemFree(sl->elements[i]); + JLI_MemFree(sl->elements); + } + JLI_MemFree(sl); + } +} + +void +JLI_List_ensureCapacity(JLI_List sl, int capacity) +{ + if (sl->capacity < capacity) { + while (sl->capacity < capacity) + sl->capacity *= 2; + sl->elements = JLI_MemRealloc(sl->elements, + sl->capacity * sizeof(sl->elements[0])); + } +} + +void +JLI_List_add(JLI_List sl, char *str) +{ + JLI_List_ensureCapacity(sl, sl->size+1); + sl->elements[sl->size++] = str; +} + +void +JLI_List_addSubstring(JLI_List sl, const char *beg, size_t len) +{ + char *str = (char *) JLI_MemAlloc(len+1); + memcpy(str, beg, len); + str[len] = '\0'; + JLI_List_ensureCapacity(sl, sl->size+1); + sl->elements[sl->size++] = str; +} + +char * +JLI_List_combine(JLI_List sl) +{ + int i; + int size; + char *str; + char *p; + for (i = 0, size = 1; i < sl->size; i++) + size += (int)JLI_StrLen(sl->elements[i]); + + str = JLI_MemAlloc(size); + + for (i = 0, p = str; i < sl->size; i++) { + int len = (int)JLI_StrLen(sl->elements[i]); + memcpy(p, sl->elements[i], len); + p += len; + } + *p = '\0'; + + return str; +} + +char * +JLI_List_join(JLI_List sl, char sep) +{ + int i; + int size; + char *str; + char *p; + for (i = 0, size = 1; i < sl->size; i++) + size += (int)JLI_StrLen(sl->elements[i]) + 1; + + str = JLI_MemAlloc(size); + + for (i = 0, p = str; i < sl->size; i++) { + int len = (int)JLI_StrLen(sl->elements[i]); + if (i > 0) *p++ = sep; + memcpy(p, sl->elements[i], len); + p += len; + } + *p = '\0'; + + return str; +} + +JLI_List +JLI_List_split(const char *str, char sep) +{ + const char *p, *q; + size_t len = JLI_StrLen(str); + int count; + JLI_List sl; + for (count = 1, p = str; p < str + len; p++) + count += (*p == sep); + sl = JLI_List_new(count); + for (p = str;;) { + for (q = p; q <= str + len; q++) { + if (*q == sep || *q == '\0') { + JLI_List_addSubstring(sl, p, q - p); + if (*q == '\0') + return sl; + p = q + 1; + } + } + } +}