1# coding: utf-8
2
3__doc__ = u"""
4    >>> slice_start_end(u'abcdef', 2, 3)
5    c
6    >>> slice_start(u'abcdef', 2, 3)
7    cdef
8    >>> slice_end(u'abcdef', 2, 3)
9    ab
10    >>> slice_all(u'abcdef', 2, 3)
11    abcdef
12    >>> slice_start_none(u'abcdef', 2, 3)
13    cdef
14    >>> slice_none_end(u'abcdef', 2, 3)
15    ab
16    >>> slice_none_none(u'abcdef', 2, 3)
17    abcdef
18
19    >>> slice_start_end(u'abcdef', 2, 10)
20    cdef
21    >>> slice_start(u'abcdef', 2, 10)
22    cdef
23    >>> slice_end(u'abcdef', 2, 10)
24    ab
25    >>> slice_all(u'abcdef', 2, 10)
26    abcdef
27
28    >>> slice_start_end(u'abcdef', 0, 5)
29    abcde
30    >>> slice_start(u'abcdef', 0, 5)
31    abcdef
32    >>> slice_end(u'abcdef', 0, 5)
33    <BLANKLINE>
34    >>> slice_all(u'abcdef', 0, 5)
35    abcdef
36    >>> slice_start_none(u'abcdef', 0, 5)
37    abcdef
38    >>> slice_none_end(u'abcdef', 0, 5)
39    <BLANKLINE>
40    >>> slice_none_none(u'abcdef', 0, 5)
41    abcdef
42
43    >>> slice_start_end(u'abcdef', -6, -1)
44    abcde
45    >>> slice_start(u'abcdef', -6, -1)
46    abcdef
47    >>> slice_end(u'abcdef', -6, -1)
48    <BLANKLINE>
49    >>> slice_all(u'abcdef', -6, -1)
50    abcdef
51    >>> slice_start_none(u'abcdef', -6, -1)
52    abcdef
53    >>> slice_none_end(u'abcdef', -6, -1)
54    <BLANKLINE>
55    >>> slice_none_none(u'abcdef', -6, -1)
56    abcdef
57
58    >>> slice_start_end(u'abcdef', -6, -7)
59    <BLANKLINE>
60    >>> slice_start(u'abcdef', -6, -7)
61    abcdef
62    >>> slice_end(u'abcdef', -6, -7)
63    <BLANKLINE>
64    >>> slice_all(u'abcdef', -6, -7)
65    abcdef
66    >>> slice_start_none(u'abcdef', -6, -7)
67    abcdef
68    >>> slice_none_end(u'abcdef', -6, -7)
69    <BLANKLINE>
70    >>> slice_none_none(u'abcdef', -6, -7)
71    abcdef
72
73    >>> slice_start_end(u'abcdef', -7, -7)
74    <BLANKLINE>
75    >>> slice_start(u'abcdef', -7, -7)
76    abcdef
77    >>> slice_end(u'abcdef', -7, -7)
78    <BLANKLINE>
79    >>> slice_all(u'abcdef', -7, -7)
80    abcdef
81    >>> slice_start_none(u'abcdef', -7, -7)
82    abcdef
83    >>> slice_none_end(u'abcdef', -7, -7)
84    <BLANKLINE>
85    >>> slice_none_none(u'abcdef', -7, -7)
86    abcdef
87
88    >>> slice_start_end(u'aАbБcСdДeЕfФ', 2, 8)
89    bБcСdД
90    >>> slice_start(u'aАbБcСdДeЕfФ', 2, 8)
91    bБcСdДeЕfФ
92    >>> slice_end(u'aАbБcСdДeЕfФ', 2, 8)
9394    >>> slice_all(u'aАbБcСdДeЕfФ', 2, 8)
95    aАbБcСdДeЕfФ
96    >>> slice_start_none(u'aАbБcСdДeЕfФ', 2, 8)
97    bБcСdДeЕfФ
98    >>> slice_none_end(u'aАbБcСdДeЕfФ', 2, 8)
99100    >>> slice_none_none(u'aАbБcСdДeЕfФ', 2, 8)
101    aАbБcСdДeЕfФ
102
103    >>> slice_start_end(u'АБСДЕФ', 2, 4)
104    СД
105    >>> slice_start(u'АБСДЕФ', 2, 4)
106    СДЕФ
107    >>> slice_end(u'АБСДЕФ', 2, 4)
108    АБ
109    >>> slice_all(u'АБСДЕФ', 2, 4)
110    АБСДЕФ
111    >>> slice_start_none(u'АБСДЕФ', 2, 4)
112    СДЕФ
113    >>> slice_none_end(u'АБСДЕФ', 2, 4)
114    АБ
115    >>> slice_none_none(u'АБСДЕФ', 2, 4)
116    АБСДЕФ
117
118    >>> slice_start_end(u'АБСДЕФ', -4, -2)
119    СД
120    >>> slice_start(u'АБСДЕФ', -4, -2)
121    СДЕФ
122    >>> slice_end(u'АБСДЕФ', -4, -2)
123    АБ
124    >>> slice_all(u'АБСДЕФ', -4, -2)
125    АБСДЕФ
126    >>> slice_start_none(u'АБСДЕФ', -4, -2)
127    СДЕФ
128    >>> slice_none_end(u'АБСДЕФ', -4, -2)
129    АБ
130    >>> slice_none_none(u'АБСДЕФ', -4, -2)
131    АБСДЕФ
132
133    >>> slice_start_end(None, 2, 4)
134    Traceback (most recent call last):
135    TypeError: 'NoneType' object is not subscriptable
136    >>> slice_start(None, 2, 4)
137    Traceback (most recent call last):
138    TypeError: 'NoneType' object is not subscriptable
139    >>> slice_end(None, 2, 4)
140    Traceback (most recent call last):
141    TypeError: 'NoneType' object is not subscriptable
142    >>> slice_all(None, 2, 4)
143    Traceback (most recent call last):
144    TypeError: 'NoneType' object is not subscriptable
145    >>> slice_start_none(None, 2, 4)
146    Traceback (most recent call last):
147    TypeError: 'NoneType' object is not subscriptable
148    >>> slice_none_end(None, 2, 4)
149    Traceback (most recent call last):
150    TypeError: 'NoneType' object is not subscriptable
151    >>> slice_none_none(None, 2, 4)
152    Traceback (most recent call last):
153    TypeError: 'NoneType' object is not subscriptable
154
155    >>> slice_start_end(u'abcdef', SSIZE_T_MAX, SSIZE_T_MIN)
156    <BLANKLINE>
157    >>> slice_start(u'abcdef', SSIZE_T_MAX, SSIZE_T_MIN)
158    <BLANKLINE>
159    >>> slice_end(u'abcdef', SSIZE_T_MAX, SSIZE_T_MIN)
160    abcdef
161    >>> slice_all(u'abcdef', SSIZE_T_MAX, SSIZE_T_MIN)
162    abcdef
163    >>> slice_start_none(u'abcdef', SSIZE_T_MAX, SSIZE_T_MIN)
164    <BLANKLINE>
165    >>> slice_none_end(u'abcdef', SSIZE_T_MAX, SSIZE_T_MIN)
166    abcdef
167    >>> slice_none_none(u'abcdef', SSIZE_T_MAX, SSIZE_T_MIN)
168    abcdef
169"""
170
171cdef extern from *:
172    cdef Py_ssize_t PY_SSIZE_T_MIN
173    cdef Py_ssize_t PY_SSIZE_T_MAX
174
175SSIZE_T_MAX = PY_SSIZE_T_MAX
176SSIZE_T_MIN = PY_SSIZE_T_MIN
177
178import sys
179
180if sys.version_info[0] >= 3:
181    __doc__ = __doc__.replace(u"(u'", u"('").replace(u" u'", u" '")
182
183def slice_start_end(unicode s, Py_ssize_t i, Py_ssize_t j):
184    print(s[i:j])
185
186def slice_start(unicode s, Py_ssize_t i, Py_ssize_t j):
187    print(s[i:])
188
189def slice_end(unicode s, Py_ssize_t i, Py_ssize_t j):
190    print(s[:i])
191
192def slice_all(unicode s, Py_ssize_t i, Py_ssize_t j):
193    print(s[:])
194
195def slice_start_none(unicode s, Py_ssize_t i, Py_ssize_t j):
196    print(s[i:None])
197
198def slice_none_end(unicode s, Py_ssize_t i, Py_ssize_t j):
199    print(s[None:i])
200
201def slice_none_none(unicode s, Py_ssize_t i, Py_ssize_t j):
202    print(s[None:None])
203