def char_utf_8_length(char): # same as (bytes-length (string->bytes/utf-8 (string char))) builder = UnicodeBuilder() builder.append(char.value) w_str = W_String.fromunicode(builder.build()) w_bytes = values.W_Bytes.from_charlist(w_str.as_charlist_utf8()) return values.W_Fixnum(w_bytes.length())
def bytes_to_string_latin(w_bytes, err, start, end): str = w_bytes.as_str().decode("latin-1") # From Racket Docs: The err-char argument is ignored, but present # for consistency with the other operations. return get_substring(W_String.fromunicode(str), start, end)
def string_append(args): if jit.isconstant(len(args)): return string_append_fastpath(args) if not args: return W_String.fromascii("") builder = StringBuilder(len(args)) unibuilder = None ascii_idx = 0 try: for ascii_idx in range(len(args)): arg = args[ascii_idx] if not isinstance(arg, W_String): raise SchemeException("string-append: expected a string") builder.append(arg.as_str_ascii()) except ValueError: unibuilder = UnicodeBuilder(len(args)) unibuilder.append(unicode(builder.build())) builder = None for i in range(ascii_idx, len(args)): arg = args[i] if not isinstance(arg, W_String): raise SchemeException("string-append: expected a string") unibuilder.append(arg.as_unicode()) if unibuilder is None: assert builder is not None return W_String.fromascii(builder.build()) else: assert unibuilder is not None return W_String.fromunicode(unibuilder.build())
def string_append(args): if not args: return W_String.fromascii("") builder = StringBuilder() unibuilder = None ascii_idx = 0 try: for ascii_idx in range(len(args)): arg = args[ascii_idx] if not isinstance(arg, W_String): raise SchemeException("string-append: expected a string") builder.append(arg.as_str_ascii()) except ValueError: unibuilder = UnicodeBuilder() unibuilder.append(unicode(builder.build())) builder = None for i in range(ascii_idx, len(args)): arg = args[i] if not isinstance(arg, W_String): raise SchemeException("string-append: expected a string") unibuilder.append(arg.as_unicode()) if unibuilder is None: assert builder is not None return W_String.fromascii(builder.build()) else: assert unibuilder is not None return W_String.fromunicode(unibuilder.build())
def string_append_fastpath(args): try: joined = "".join([a.as_str_ascii() for a in args]) result = W_String.fromascii(joined) except ValueError: joined = u"".join([a.as_unicode() for a in args]) result = W_String.fromunicode(joined) return result
def string(args): if len(args) == 0: return W_String.fromascii("") assert len(args) > 0 builder = UnicodeBuilder() # XXX could do one less copy in the ascii case for char in args: if not isinstance(char, values.W_Character): raise SchemeException("string: expected a character") builder.append(char.value) return W_String.fromunicode(builder.build())
def list_to_string(w_list): if not w_list.is_proper_list(): raise SchemeException("list->string: expected proper list") if not isinstance(w_list, values.W_Cons): return W_String.fromascii("") builder = UnicodeBuilder() while isinstance(w_list, values.W_Cons): char, w_list = w_list.car(), w_list.cdr() if not isinstance(char, values.W_Character): raise SchemeException("list->string: expected list of characters") builder.append(char.value) return W_String.fromunicode(builder.build())
def make_string(k, char): if char is None: char = u'\0' else: char = char.value c = ord(char) if k.value < 0: raise SchemeException("make-string: around negative") if c < 128: char = chr(c) return W_String.fromascii(char * k.value) else: char = unichr(c) return W_String.fromunicode(char * k.value)
def string_append(args): if not args: return W_String.fromascii("") builder = StringBuilder() unibuilder = None for a in args: if not isinstance(a, W_String): raise SchemeException("string-append: expected a string") if unibuilder is None: try: builder.append(a.as_str_ascii()) continue except ValueError: unibuilder = UnicodeBuilder() unibuilder.append(unicode(builder.build())) unibuilder.append(a.as_unicode()) if unibuilder is None: return W_String.fromascii(builder.build()) else: return W_String.fromunicode(unibuilder.build())
def symbol_to_string(v): if v.asciivalue is not None: return W_String.fromascii(v.asciivalue) return W_String.fromunicode(v.unicodevalue)
def symbol_to_string_impl(v): asciivalue = v.asciivalue() if asciivalue is not None: return W_String.fromascii(asciivalue) return W_String.fromunicode(v.unicodevalue())
def symbol_to_string_impl(v, immutable=False): asciivalue = v.asciivalue() if asciivalue is not None: return W_String.fromascii(asciivalue, immutable) return W_String.fromunicode(v.unicodevalue(), immutable)
def bytes_to_string_latin(w_bytes, err, start, end): # XXX Not a valid implementation str = w_bytes.as_str().decode("latin-1") return W_String.fromunicode(str)