pike.git/
src/
stralloc.c
Branch:
Tag:
Non-build tags
All tags
No tags
2014-09-09
2014-09-09 19:11:03 by Stephen R. van den Berg <srb@cuci.nl>
de4fb8b1c4e155ab76868458c8f676a6fba735fa (
51
lines) (+
8
/-
43
)
[
Show
|
Annotate
]
Branch:
8.0
NUL terminate shared strings in just a single spot.
1652:
{ struct pike_string *r = NULL;
-
if (a->flags & STRING_IS_SHORT )
-
{
-
if (size <= SHORT_STRING_THRESHOLD/(1<<a->size_shift))
{
-
/*
There's
already
space
enough.
*/
-
a->len
=
size;
-
low_set_index(a,
size,
0);
-
return
a;
-
}
-
} else
{
+
if (a->flags & STRING_IS_SHORT ) {
+
if (size <= SHORT_STRING_THRESHOLD/(1<<a->size_shift))
+
r
=
a;
/*
There's
already space enough. */
+
} else
r=realloc(a, sizeof(struct pike_string_hdr)+((size+1)<<a->size_shift));
-
}
+
-
if(!r)
-
{
+
if(!r) {
r=begin_wide_shared_string(size, a->size_shift); r->flags |= a->flags & ~15; r->min = a->min; r->max = a->max;
-
if (a->len <= size) {
-
memcpy(r->str, a->str, a->len<
<a->
size
_shift);
-
} else {
-
memcpy(r->str,
a->
str,
size<<a->size_shift);
-
}
+
memcpy(r->str, a->str,
(
a->len
<
=
size
?
a->
len
:
size
)
<<a->size_shift);
free_string(a); } r->len=size;
-
low_set_index(r,size,0);
+
low_set_index(r,size,0);
/* Enforce \0 termination */
return r; }
2386:
} i = s->s->len++; low_set_index(s->s,i,ch);
-
/* Ensure NUL-termination */
-
s->s->str[s->s->len << s->s->size_shift] = 0;
+
} PMOD_EXPORT void string_builder_putchars(struct string_builder *s, int ch,
2426:
} s->s->len += count;
-
/* Ensure NUL-termination */
-
s->s->str[s->s->len << s->s->size_shift] = 0;
+
}
2446:
#endif } s->s->len+=len;
-
/* Ensure NUL-termination */
-
s->s->str[s->s->len << s->s->size_shift] = 0;
+
} PMOD_EXPORT void string_builder_binary_strcat1(struct string_builder *s,
2458:
string_build_mkspace (s, len, 0); convert_1_to_0 (STR0(s->s) + s->s->len, str, len); s->s->len += len;
-
/* Ensure NUL-termination */
-
s->s->str[s->s->len] = 0;
+
return; } s->known_shift = 1;
2477:
convert_1_to_2 (STR2(s->s)+s->s->len, str, len); } s->s->len += len;
-
/* Ensure NUL-termination */
-
s->s->str[s->s->len << s->s->size_shift] = 0;
+
} PMOD_EXPORT void string_builder_binary_strcat2(struct string_builder *s,
2520:
} s->s->len += len;
-
/* Ensure NUL-termination */
-
s->s->str[s->s->len << s->s->size_shift] = 0;
+
} PMOD_EXPORT void string_builder_append(struct string_builder *s,
2541:
string_build_mkspace(s, len, shift); generic_memcpy(MKPCHARP_STR_OFF(s->s,s->s->len), from, len); s->s->len+=len;
-
/* Ensure NUL-termination */
-
s->s->str[s->s->len << s->s->size_shift] = 0;
+
} PMOD_EXPORT void string_builder_fill(struct string_builder *s,
2567:
memset(string_builder_allocate(s,howmany,0), EXTRACT_PCHARP(from), howmany);
-
/* Ensure NUL-termination */
-
s->s->str[s->s->len << s->s->size_shift] = 0;
+
return; }
2610:
s->s->len+=tmp; } }
-
/* Ensure NUL-termination */
-
s->s->str[s->s->len << s->s->size_shift] = 0;
+
} /* Append a NUL-terminated UTF16 string possibly containing surrogates. */
2654:
pike_string_cpy(MKPCHARP_STR_OFF(s->s,s->s->len), str); s->known_shift=MAXIMUM(s->known_shift,str->size_shift); s->s->len+=str->len;
-
/* Ensure NUL-termination */
-
s->s->str[s->s->len << s->s->size_shift] = 0;
+
} PMOD_EXPORT ptrdiff_t string_builder_quote_string(struct string_builder *buf,
3164:
{ s->known_shift=0; s->s->len=0;
-
/* Ensure NUL-termination */
-
low_set_index (s->s, 0, 0);
+
} PMOD_EXPORT void free_string_builder(struct string_builder *s)
3179:
ptrdiff_t len = s->s->len; if (len != s->malloced) s->s = realloc_unlinked_string(s->s, s->malloced = len);
-
else
-
/* Ensure NUL-termination */
-
low_set_index(s->s,s->s->len,0);
+
if(s->known_shift == s->s->size_shift) return low_end_shared_string(s->s); return end_shared_string(s->s);