# New Ticket Created by [EMAIL PROTECTED]
# Please include the string: [perl #19179]
# in the subject line of all future correspondence about this issue.
# <URL: http://rt.perl.org/rt2/Ticket/Display.html?id=19179 >
This patch
(1) Creates a string_max_bytes() function,
as described in docs/strings.pod.
Code in string.c, prototype in include/parrot/string_funcs.h.
It just uses s->encoding->max_bytes.
(2) Modifies string_grow() in string.c to use string_max_bytes(),
as described in docs/strings.pod.
That is all.
Apropos the TODO item
String subsystem
----------------
grep docs/strings.pod for unimplemented functions and implement them
and the docs/strings.pod description
=head1 Non-user-visible String Manipulation Functions
[...]
INTVAL string_compute_strlen(STRING* s)
and
INTVAL string_max_bytes(STRING *s, INTVAL iv)
The first updates the contents of C<< s->strlen >> by contemplating the
buffer C<bufstart> and working out how many characters it contains. The
second is given a number of characters which we assume are going to be
added into the string at some point; it returns the maximum number of
bytes that need to be allocated to admit that number of characters. For
fixed-width encodings, this is trivial - the "native" encoding, for
instance, encodes one byte per character, so C<string_native_max_bytes>
simply returns the C<INTVAL> it is passed; C<string_utf8_max_bytes>, on the
other hand, returns three times the value that it is passed because a
UTF8 character may occupy up to three bytes.
To grow a string to a specified size, use
void string_grow(STRING *s, INTVAL newsize)
The size is given in characters; C<string_max_bytes> is called to turn
this into a size in bytes, and then the buffer is grown to accomodate
(at least) that many bytes.
Mitchell Charity
-- attachment 1 ------------------------------------------------------
url: http://rt.perl.org/rt2/attach/45540/35737/fed377/create_string_max_bytes.patch
diff -ur ./include/parrot/string_funcs.h
../parrot_strings/include/parrot/string_funcs.h
--- ./include/parrot/string_funcs.h Sun Dec 15 12:59:51 2002
+++ ../parrot_strings/include/parrot/string_funcs.h Mon Dec 16 06:53:11 2002
@@ -18,6 +18,7 @@
/* Declarations of accessors */
INTVAL string_compute_strlen(STRING *);
+INTVAL string_max_bytes(STRING*, INTVAL);
STRING *string_concat(struct Parrot_Interp *, STRING *, STRING *, UINTVAL);
STRING *string_append(struct Parrot_Interp *, STRING *, STRING *, UINTVAL);
STRING *string_from_c_string(struct Parrot_Interp *, const void *, UINTVAL);
diff -ur ./string.c ../parrot_strings/string.c
--- ./string.c Sun Dec 15 12:59:47 2002
+++ ../parrot_strings/string.c Mon Dec 16 07:16:04 2002
@@ -275,7 +275,8 @@
unmake_COW(interpreter,s);
/* Don't check buflen, if we are here, we already checked. */
- Parrot_reallocate_string(interpreter, s, s->buflen + addlen);
+ Parrot_reallocate_string(interpreter, s,
+ s->buflen + string_max_bytes(s,addlen));
return s;
}
@@ -488,6 +489,16 @@
return s->strlen;
}
+/*=for api string string_max_bytes
+ * returns the number of bytes required to safely contain
+ * n characters in the string's encoding
+ */
+INTVAL
+string_max_bytes(STRING *s, INTVAL nchars)
+{
+ return (nchars * s->encoding->max_bytes);
+}
+
/*=for api string string_concat
* concatenate two strings
*/