Branch: Tag:

2014-09-09

2014-09-09 19:11:03 by Stephen R. van den Berg <srb@cuci.nl>

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);