def fn(_): s = StringBuilder() s.append("a") s.append("abc") s.append_slice("abc", 1, 2) s.append_multiple_char('d', 4) return s.build()
def func(): s = StringBuilder() s.append("a") s.append("abc") s.append_slice("abc", 1, 2) s.append_multiple_char('d', 4) return s.build()
def test_string_builder(): s = StringBuilder() s.append("a") s.append("abc") s.append("a") s.append_slice("abc", 1, 2) s.append_multiple_char('d', 4) assert s.build() == "aabcabdddd"
def str_zfill__String_ANY(space, w_self, w_width): input = w_self._value width = space.int_w(w_width) num_zeros = width - len(input) if num_zeros <= 0: # cannot return w_self, in case it is a subclass of str return space.wrap(input) builder = StringBuilder(width) if len(input) > 0 and (input[0] == '+' or input[0] == '-'): builder.append(input[0]) start = 1 else: start = 0 builder.append_multiple_char('0', num_zeros) builder.append_slice(input, start, len(input)) return space.wrap(builder.build())
def descr_repr(self, space): res = StringBuilder() res.append("array(") concrete = self.get_concrete() dtype = concrete.find_dtype() if not concrete.find_size(): res.append('[]') if len(self.shape) > 1: # An empty slice reports its shape res.append(", shape=(") self_shape = str(self.shape) res.append_slice(str(self_shape), 1, len(self_shape) - 1) res.append(')') else: concrete.to_str(space, 1, res, indent=' ') if (dtype is not space.fromcache(interp_dtype.W_Float64Dtype) and dtype is not space.fromcache(interp_dtype.W_Int64Dtype)) or \ not self.find_size(): res.append(", dtype=" + dtype.name) res.append(")") return space.wrap(res.build())
def descr_repr(self, space): res = StringBuilder() res.append("array(") concrete = self.get_concrete_or_scalar() dtype = concrete.find_dtype() if not concrete.size: res.append('[]') if len(self.shape) > 1: # An empty slice reports its shape res.append(", shape=(") self_shape = str(self.shape) res.append_slice(str(self_shape), 1, len(self_shape) - 1) res.append(')') else: concrete.to_str(space, 1, res, indent=' ') if (dtype is not interp_dtype.get_dtype_cache(space).w_float64dtype and not (dtype.kind == interp_dtype.SIGNEDLTR and dtype.itemtype.get_element_size() == rffi.sizeof(lltype.Signed)) or not self.size): res.append(", dtype=" + dtype.name) res.append(")") return space.wrap(res.build())
def descr_repr(self, space): res = StringBuilder() res.append("array(") concrete = self.get_concrete_or_scalar() dtype = concrete.find_dtype() if not concrete.size: res.append('[]') if len(self.shape) > 1: # An empty slice reports its shape res.append(", shape=(") self_shape = str(self.shape) res.append_slice(str(self_shape), 1, len(self_shape) - 1) res.append(')') else: concrete.to_str(space, 1, res, indent=' ') if (dtype is not interp_dtype.get_dtype_cache(space).w_float64dtype and not (dtype.kind == interp_dtype.SIGNEDLTR and dtype.itemtype.get_element_size() == rffi.sizeof( lltype.Signed)) or not self.size): res.append(", dtype=" + dtype.name) res.append(")") return space.wrap(res.build())
def _string_replace(space, input, sub, by, maxsplit): if maxsplit == 0: return space.wrap(input) if not sub: upper = len(input) if maxsplit > 0 and maxsplit < upper + 2: upper = maxsplit - 1 assert upper >= 0 try: result_size = ovfcheck(upper * len(by)) result_size = ovfcheck(result_size + upper) result_size = ovfcheck(result_size + len(by)) remaining_size = len(input) - upper result_size = ovfcheck(result_size + remaining_size) except OverflowError: raise OperationError(space.w_OverflowError, space.wrap("replace string is too long") ) builder = StringBuilder(result_size) for i in range(upper): builder.append(by) builder.append(input[i]) builder.append(by) builder.append_slice(input, upper, len(input)) else: # First compute the exact result size count = input.count(sub) if count > maxsplit and maxsplit > 0: count = maxsplit diff_len = len(by) - len(sub) try: result_size = ovfcheck(diff_len * count) result_size = ovfcheck(result_size + len(input)) except OverflowError: raise OperationError(space.w_OverflowError, space.wrap("replace string is too long") ) builder = StringBuilder(result_size) start = 0 sublen = len(sub) while maxsplit != 0: next = input.find(sub, start) if next < 0: break builder.append_slice(input, start, next) builder.append(by) start = next + sublen maxsplit -= 1 # NB. if it's already < 0, it stays < 0 builder.append_slice(input, start, len(input)) return space.wrap(builder.build())
def _string_replace(space, input, sub, by, maxsplit): if maxsplit == 0: return space.wrap(input) if not sub: upper = len(input) if maxsplit > 0 and maxsplit < upper + 2: upper = maxsplit - 1 assert upper >= 0 try: result_size = ovfcheck(upper * len(by)) result_size = ovfcheck(result_size + upper) result_size = ovfcheck(result_size + len(by)) remaining_size = len(input) - upper result_size = ovfcheck(result_size + remaining_size) except OverflowError: raise OperationError(space.w_OverflowError, space.wrap("replace string is too long")) builder = StringBuilder(result_size) for i in range(upper): builder.append(by) builder.append(input[i]) builder.append(by) builder.append_slice(input, upper, len(input)) else: # First compute the exact result size count = input.count(sub) if count > maxsplit and maxsplit > 0: count = maxsplit diff_len = len(by) - len(sub) try: result_size = ovfcheck(diff_len * count) result_size = ovfcheck(result_size + len(input)) except OverflowError: raise OperationError(space.w_OverflowError, space.wrap("replace string is too long")) builder = StringBuilder(result_size) start = 0 sublen = len(sub) while maxsplit != 0: next = input.find(sub, start) if next < 0: break builder.append_slice(input, start, next) builder.append(by) start = next + sublen maxsplit -= 1 # NB. if it's already < 0, it stays < 0 builder.append_slice(input, start, len(input)) return space.wrap(builder.build())
def repr__String(space, w_str): s = w_str._value buf = StringBuilder(50) quote = "'" if quote in s and '"' not in s: quote = '"' buf.append(quote) startslice = 0 for i in range(len(s)): c = s[i] use_bs_char = False # character quoted by backspace if c == '\\' or c == quote: bs_char = c use_bs_char = True elif c == '\t': bs_char = 't' use_bs_char = True elif c == '\r': bs_char = 'r' use_bs_char = True elif c == '\n': bs_char = 'n' use_bs_char = True elif not '\x20' <= c < '\x7f': n = ord(c) if i != startslice: buf.append_slice(s, startslice, i) startslice = i + 1 buf.append('\\x') buf.append("0123456789abcdef"[n>>4]) buf.append("0123456789abcdef"[n&0xF]) if use_bs_char: if i != startslice: buf.append_slice(s, startslice, i) startslice = i + 1 buf.append('\\') buf.append(bs_char) if len(s) != startslice: buf.append_slice(s, startslice, len(s)) buf.append(quote) return space.wrap(buf.build())
def repr__String(space, w_str): s = w_str._value buf = StringBuilder(50) quote = "'" if quote in s and '"' not in s: quote = '"' buf.append(quote) startslice = 0 for i in range(len(s)): c = s[i] use_bs_char = False # character quoted by backspace if c == "\\" or c == quote: bs_char = c use_bs_char = True elif c == "\t": bs_char = "t" use_bs_char = True elif c == "\r": bs_char = "r" use_bs_char = True elif c == "\n": bs_char = "n" use_bs_char = True elif not "\x20" <= c < "\x7f": n = ord(c) if i != startslice: buf.append_slice(s, startslice, i) startslice = i + 1 buf.append("\\x") buf.append("0123456789abcdef"[n >> 4]) buf.append("0123456789abcdef"[n & 0xF]) if use_bs_char: if i != startslice: buf.append_slice(s, startslice, i) startslice = i + 1 buf.append("\\") buf.append(bs_char) if len(s) != startslice: buf.append_slice(s, startslice, len(s)) buf.append(quote) return space.wrap(buf.build())
def string_escape_encode(s, quote): buf = StringBuilder(len(s) + 2) buf.append(quote) startslice = 0 for i in range(len(s)): c = s[i] use_bs_char = False # character quoted by backspace if c == '\\' or c == quote: bs_char = c use_bs_char = True elif c == '\t': bs_char = 't' use_bs_char = True elif c == '\r': bs_char = 'r' use_bs_char = True elif c == '\n': bs_char = 'n' use_bs_char = True elif not '\x20' <= c < '\x7f': n = ord(c) if i != startslice: buf.append_slice(s, startslice, i) startslice = i + 1 buf.append('\\x') buf.append("0123456789abcdef"[n>>4]) buf.append("0123456789abcdef"[n&0xF]) if use_bs_char: if i != startslice: buf.append_slice(s, startslice, i) startslice = i + 1 buf.append('\\') buf.append(bs_char) if len(s) != startslice: buf.append_slice(s, startslice, len(s)) buf.append(quote) return buf.build()
def string_escape_encode(s, quote): buf = StringBuilder(len(s) + 2) buf.append(quote) startslice = 0 for i in range(len(s)): c = s[i] use_bs_char = False # character quoted by backspace if c == '\\' or c == quote: bs_char = c use_bs_char = True elif c == '\t': bs_char = 't' use_bs_char = True elif c == '\r': bs_char = 'r' use_bs_char = True elif c == '\n': bs_char = 'n' use_bs_char = True elif not '\x20' <= c < '\x7f': n = ord(c) if i != startslice: buf.append_slice(s, startslice, i) startslice = i + 1 buf.append('\\x') buf.append("0123456789abcdef"[n >> 4]) buf.append("0123456789abcdef"[n & 0xF]) if use_bs_char: if i != startslice: buf.append_slice(s, startslice, i) startslice = i + 1 buf.append('\\') buf.append(bs_char) if len(s) != startslice: buf.append_slice(s, startslice, len(s)) buf.append(quote) return buf.build()
def PyString_DecodeEscape(space, s, recode_encoding): """ Unescape a backslash-escaped string. If recode_encoding is non-zero, the string is UTF-8 encoded and should be re-encoded in the specified encoding. """ builder = StringBuilder(len(s)) ps = 0 end = len(s) while 1: ps2 = ps while ps < end and s[ps] != '\\': if recode_encoding and ord(s[ps]) & 0x80: w, ps = decode_utf8(space, s, ps, end, recode_encoding) builder.append(w) ps2 = ps else: ps += 1 if ps > ps2: builder.append_slice(s, ps2, ps) if ps == end: break ps += 1 if ps == end: raise_app_valueerror(space, 'Trailing \\ in string') prevps = ps ch = s[ps] ps += 1 # XXX This assumes ASCII! if ch == '\n': pass elif ch == '\\': builder.append('\\') elif ch == "'": builder.append("'") elif ch == '"': builder.append('"') elif ch == 'b': builder.append("\010") elif ch == 'f': builder.append('\014') # FF elif ch == 't': builder.append('\t') elif ch == 'n': builder.append('\n') elif ch == 'r': builder.append('\r') elif ch == 'v': builder.append('\013') # VT elif ch == 'a': builder.append('\007') # BEL, not classic C elif ch in '01234567': # Look for up to two more octal digits span = ps span += (span < end) and (s[span] in '01234567') span += (span < end) and (s[span] in '01234567') octal = s[prevps : span] # emulate a strange wrap-around behavior of CPython: # \400 is the same as \000 because 0400 == 256 num = int(octal, 8) & 0xFF builder.append(chr(num)) ps = span elif ch == 'x': if ps+2 <= end and isxdigit(s[ps]) and isxdigit(s[ps + 1]): hexa = s[ps : ps + 2] num = int(hexa, 16) builder.append(chr(num)) ps += 2 else: raise_app_valueerror(space, 'invalid \\x escape') # ignored replace and ignore for now else: # this was not an escape, so the backslash # has to be added, and we start over in # non-escape mode. builder.append('\\') ps -= 1 assert ps >= 0 continue # an arbitry number of unescaped UTF-8 bytes may follow. buf = builder.build() return buf