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