Author: julianalbo Date: Tue Jan 27 13:05:25 2009 New Revision: 36065 Modified: trunk/include/parrot/string_funcs.h trunk/src/ops/string.ops trunk/src/pmc/scalar.pmc trunk/src/spf_render.c trunk/src/string/api.c trunk/src/trace.c
Log: Implement Parrot_str_repeat and replace usages of string_repeat, TT # 210 Modified: trunk/include/parrot/string_funcs.h ============================================================================== --- trunk/include/parrot/string_funcs.h (original) +++ trunk/include/parrot/string_funcs.h Tue Jan 27 13:05:25 2009 @@ -52,6 +52,14 @@ FUNC_MODIFIES(*d); PARROT_EXPORT +PARROT_CANNOT_RETURN_NULL +STRING * Parrot_str_repeat(PARROT_INTERP, + ARGIN(const STRING *s), + UINTVAL num) + __attribute__nonnull__(1) + __attribute__nonnull__(2); + +PARROT_EXPORT PARROT_PURE_FUNCTION PARROT_CANNOT_RETURN_NULL const char * Parrot_string_cstring(SHIM_INTERP, ARGIN(const STRING *str)) @@ -558,6 +566,9 @@ #define ASSERT_ARGS_Parrot_reuse_COW_reference __attribute__unused__ int _ASSERT_ARGS_CHECK = \ PARROT_ASSERT_ARG(s) \ || PARROT_ASSERT_ARG(d) +#define ASSERT_ARGS_Parrot_str_repeat __attribute__unused__ int _ASSERT_ARGS_CHECK = \ + PARROT_ASSERT_ARG(interp) \ + || PARROT_ASSERT_ARG(s) #define ASSERT_ARGS_Parrot_string_cstring __attribute__unused__ int _ASSERT_ARGS_CHECK = \ PARROT_ASSERT_ARG(str) #define ASSERT_ARGS_Parrot_string_find_cclass __attribute__unused__ int _ASSERT_ARGS_CHECK = \ Modified: trunk/src/ops/string.ops ============================================================================== --- trunk/src/ops/string.ops (original) +++ trunk/src/ops/string.ops Tue Jan 27 13:05:25 2009 @@ -142,7 +142,7 @@ "Cannot repeat with negative arg"); goto ADDRESS(handler); } - $1 = string_repeat(interp, $2, (UINTVAL)$3, NULL); + $1 = Parrot_str_repeat(interp, $2, (UINTVAL)$3); } inline op repeat(invar PMC, invar PMC, in INT) :base_core { Modified: trunk/src/pmc/scalar.pmc ============================================================================== --- trunk/src/pmc/scalar.pmc (original) +++ trunk/src/pmc/scalar.pmc Tue Jan 27 13:05:25 2009 @@ -1153,7 +1153,7 @@ dest = pmc_new(INTERP, VTABLE_type(INTERP, SELF)); VTABLE_set_string_native(INTERP, dest, - string_repeat(INTERP, s, n, NULL)); + Parrot_str_repeat(INTERP, s, n)); return dest; } @@ -1164,7 +1164,7 @@ dest = pmc_new(INTERP, VTABLE_type(INTERP, SELF)); VTABLE_set_string_native(INTERP, dest, - string_repeat(INTERP, s, n, NULL)); + Parrot_str_repeat(INTERP, s, n)); return dest; } @@ -1172,13 +1172,13 @@ VTABLE void i_repeat(PMC *value) { STRING * const s = SELF.get_string(); const UINTVAL n = (UINTVAL)VTABLE_get_integer(INTERP, value); - SELF.set_string_native(string_repeat(INTERP, s, n, NULL)); + SELF.set_string_native(Parrot_str_repeat(INTERP, s, n)); } VTABLE void i_repeat_int(INTVAL value) { STRING * const s = SELF.get_string(); const UINTVAL n = value; - SELF.set_string_native(string_repeat(INTERP, s, n, NULL)); + SELF.set_string_native(Parrot_str_repeat(INTERP, s, n)); } Modified: trunk/src/spf_render.c ============================================================================== --- trunk/src/spf_render.c (original) +++ trunk/src/spf_render.c Tue Jan 27 13:05:25 2009 @@ -191,7 +191,7 @@ ((info->flags & FLAG_ZERO) && !(info->flags & FLAG_MINUS)) ? CONST_STRING(interp, "0") : CONST_STRING(interp, " "); - STRING * const fill = string_repeat(interp, filler, info->width - len, NULL); + STRING * const fill = Parrot_str_repeat(interp, filler, info->width - len); if (info->flags & FLAG_MINUS) { /* left-align */ str = string_concat(interp, str, fill, 0); Modified: trunk/src/string/api.c ============================================================================== --- trunk/src/string/api.c (original) +++ trunk/src/string/api.c Tue Jan 27 13:05:25 2009 @@ -1122,6 +1122,43 @@ /* +=item C<STRING * Parrot_str_repeat> + +Repeats the specified Parrot string I<num> times and returns the result. + +=cut + +*/ + +PARROT_EXPORT +PARROT_CANNOT_RETURN_NULL +STRING * +Parrot_str_repeat(PARROT_INTERP, ARGIN(const STRING *s), UINTVAL num) +{ + ASSERT_ARGS(string_repeat) + STRING * const dest = string_make_direct(interp, NULL, + s->bufused * num, + s->encoding, s->charset, 0); + if (num > 0) { + /* copy s into dest num times */ + UINTVAL length = s->bufused; + UINTVAL i; + char * destpos = dest->strstart; + const char * const srcpos = s->strstart; + for (i = 0; i < num; i++) { + mem_sys_memcopy(destpos, srcpos, length); + destpos+= length; + } + + dest->bufused = s->bufused * num; + dest->strlen = s->strlen * num; + } + + return dest; +} + +/* + =item C<STRING * string_substr> Copies the substring of length C<length> from C<offset> from the specified Modified: trunk/src/trace.c ============================================================================== --- trunk/src/trace.c (original) +++ trunk/src/trace.c Tue Jan 27 13:05:25 2009 @@ -388,9 +388,9 @@ if (!more) goto done; if (len < ARGS_COLUMN) { - STRING * const fill = string_repeat(debugger, + STRING * const fill = Parrot_str_repeat(debugger, const_string(debugger, " "), - ARGS_COLUMN - len, NULL); + ARGS_COLUMN); Parrot_io_putps(debugger, Parrot_io_STDERR(debugger), fill); } else {