1#cython: c_string_type = unicode 2#cython: c_string_encoding = ascii 3 4auto_string_type = unicode 5 6from libc.string cimport strcmp 7 8 9def _as_string(x): 10 try: 11 return x.decode('latin1') 12 except AttributeError: 13 return x 14 15 16def as_objects(char* ascii_data): 17 """ 18 >>> x = as_objects('abc') 19 >>> isinstance(x, auto_string_type) or type(x) 20 True 21 >>> _as_string(x) == 'abc' or repr(x) 22 True 23 """ 24 assert isinstance(<object>ascii_data, auto_string_type) 25 assert isinstance(<bytes>ascii_data, bytes) 26 assert isinstance(<str>ascii_data, str) 27 assert isinstance(<unicode>ascii_data, unicode) 28 return ascii_data 29 30def from_object(): 31 """ 32 >>> from_object() 33 """ 34 cdef bytes b = b"abc" 35 cdef str s = "abc" 36 cdef unicode u = u"abc" 37 assert strcmp(<char*>b, "abc") == 0 38 assert strcmp(<char*>s, "abc") == 0 39 assert strcmp(<char*>u, "abc") == 0 40 41def slice_as_objects(char* ascii_data, int start, int end): 42 """ 43 >>> x = slice_as_objects('grok', 1, 3) 44 >>> isinstance(x, auto_string_type) or type(x) 45 True 46 >>> _as_string(x) == 'ro' or repr(x) 47 True 48 """ 49 assert isinstance(<object>ascii_data[start:end], auto_string_type) 50 assert isinstance(<bytes>ascii_data[start:end], bytes) 51 assert isinstance(<str>ascii_data[start:end], str) 52 assert isinstance(<unicode>ascii_data[start:end], unicode) 53 54 assert isinstance(<object>ascii_data[start:], auto_string_type) 55 assert isinstance(<bytes>ascii_data[start:], bytes) 56 assert isinstance(<str>ascii_data[start:], str) 57 assert isinstance(<unicode>ascii_data[start:], unicode) 58 59 return ascii_data[start:end] 60