strm_string strm_str_intern_str(strm_string str) { if (strm_str_intern_p(str)) { return str; } if (!strm_event_loop_started) { return str_intern(strm_str_ptr(str), strm_str_len(str), 0); } pthread_mutex_lock(&sym_mutex); str = str_intern(strm_str_ptr(str), strm_str_len(str), 0); pthread_mutex_unlock(&sym_mutex); return str; }
strm_string* strm_str_intern(const char *p, size_t len) { strm_string *str; assert(p!=NULL); if (!strm_event_loop_started) { return str_intern(p, len); } pthread_mutex_lock(&sym_mutex); str = str_intern(p, len); pthread_mutex_unlock(&sym_mutex); return str; }
lat_object* lat_str_new(const char* p, size_t len) { if (p && (len < MAX_STR_INTERN)) { return str_intern(p, len); } return str_new(p, len); }
str_type uint_to_str(unsigned int n) { const int result_size = (sizeof(n)*CHAR_BIT + 2)/3 + 1; char* result = checked_malloc(result_size); int required_size = snprintf(result, result_size, "%u", n); // We do not expect errors, because the result buffer can hold the // base 10 representation of any unsigned integer. assert(0 <= required_size && required_size <= result_size); return str_intern(result); }
strm_string* strm_str_new(const char *p, size_t len) { if (!strm_event_loop_started) { /* single thread mode */ if (p && (len < STRM_STR_INTERN_LIMIT || readonly_data_p(p))) { return str_intern(p, len); } } return str_new(p, len); }
str_type str_substr(str_type first, str_type beyond) { assert(first); assert(beyond); const ptrdiff_t len = beyond - first; char* result = checked_malloc(len + 1); memcpy(result, first, len); result[len] = '\0'; return str_intern(result); }
const char * dbio_read_string_intern(void) { const char *s, *r; s = dbio_read_string(); r = str_intern(s); /* puts(r); */ return r; }
str_type str_cat(str_type str0, ...) { assert(str0); ptrdiff_t tot_len = 0; { va_list args; va_start(args, str0); str_type stri = str0; do { tot_len += strlen(stri); stri = va_arg(args, str_type); } while (str_end != stri); va_end(args); } char* const result = checked_malloc(tot_len + 1); { va_list args; va_start(args, str0); char* dst = result; str_type stri = str0; do { ptrdiff_t len = strlen(stri); memcpy(dst, stri, len); dst += len; stri = va_arg(args, str_type); } while (str_end != stri); dst[0] = '\0'; va_end(args); } return str_intern(result); }
strm_string strm_str_intern_static(const char* p, strm_int len) { return str_intern(p, len, 1); }