FazBrowse GitHub Viewer
|
Trending
|
URL:
|
Home
Tools:
[Download Repo ZIP]
[View Raw Code]
[Original HTTPS Page]
cpython/Objects/stringlib/find.h at master · python-emscripten/cpython · GitHub
python-emscripten
cpython
Repository navigation
Code
Pull requests
Actions
Projects
Security and quality
Insights
Expand file tree
Breadcrumbs
cpython
/
Objects
/
stringlib
/
find.h
Copy path
More file actions
More file actions
Latest commit
History
History
History
119 lines (94 loc) · 3.19 KB
Breadcrumbs
cpython
/
Objects
/
stringlib
/
find.h
Copy path
File metadata and controls
119 lines (94 loc) · 3.19 KB
Raw
Copy raw file
Download raw file
Open symbols panel
Edit and raw actions
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
/* stringlib: find/index implementation */
#ifndef
STRINGLIB_FASTSEARCH_H
#error
must include "stringlib/fastsearch.h" before including this module
#endif
Py_LOCAL_INLINE
(
Py_ssize_t
)
STRINGLIB
(
find
)(
const
STRINGLIB_CHAR
*
str
,
Py_ssize_t
str_len
,
const
STRINGLIB_CHAR
*
sub
,
Py_ssize_t
sub_len
,
Py_ssize_t
offset
)
{
Py_ssize_t
pos
;
assert
(
str_len
>=
0
);
if
(
sub_len
==
0
)
return
offset
;
pos
=
FASTSEARCH
(
str
,
str_len
,
sub
,
sub_len
,
-1
,
FAST_SEARCH
);
if
(
pos
>=
0
)
pos
+=
offset
;
return
pos
;
}
Py_LOCAL_INLINE
(
Py_ssize_t
)
STRINGLIB
(
rfind
)(
const
STRINGLIB_CHAR
*
str
,
Py_ssize_t
str_len
,
const
STRINGLIB_CHAR
*
sub
,
Py_ssize_t
sub_len
,
Py_ssize_t
offset
)
{
Py_ssize_t
pos
;
assert
(
str_len
>=
0
);
if
(
sub_len
==
0
)
return
str_len
+
offset
;
pos
=
FASTSEARCH
(
str
,
str_len
,
sub
,
sub_len
,
-1
,
FAST_RSEARCH
);
if
(
pos
>=
0
)
pos
+=
offset
;
return
pos
;
}
Py_LOCAL_INLINE
(
Py_ssize_t
)
STRINGLIB
(
find_slice
)(
const
STRINGLIB_CHAR
*
str
,
Py_ssize_t
str_len
,
const
STRINGLIB_CHAR
*
sub
,
Py_ssize_t
sub_len
,
Py_ssize_t
start
,
Py_ssize_t
end
)
{
return
STRINGLIB
(
find
)(
str
+
start
,
end
-
start
,
sub
,
sub_len
,
start
);
}
Py_LOCAL_INLINE
(
Py_ssize_t
)
STRINGLIB
(
rfind_slice
)(
const
STRINGLIB_CHAR
*
str
,
Py_ssize_t
str_len
,
const
STRINGLIB_CHAR
*
sub
,
Py_ssize_t
sub_len
,
Py_ssize_t
start
,
Py_ssize_t
end
)
{
return
STRINGLIB
(
rfind
)(
str
+
start
,
end
-
start
,
sub
,
sub_len
,
start
);
}
#ifdef
STRINGLIB_WANT_CONTAINS_OBJ
Py_LOCAL_INLINE
(
int
)
STRINGLIB
(
contains_obj
)(
PyObject
*
str
,
PyObject
*
sub
)
{
return
STRINGLIB
(
find
)(
STRINGLIB_STR
(
str
),
STRINGLIB_LEN
(
str
),
STRINGLIB_STR
(
sub
),
STRINGLIB_LEN
(
sub
),
0
)
!=
-1
;
}
#endif
/* STRINGLIB_WANT_CONTAINS_OBJ */
/*
This function is a helper for the "find" family (find, rfind, index,
rindex) and for count, startswith and endswith, because they all have
the same behaviour for the arguments.
It does not touch the variables received until it knows everything
is ok.
*/
#define
FORMAT_BUFFER_SIZE
50
Py_LOCAL_INLINE
(
int
)
STRINGLIB
(
parse_args_finds
)(
const
char
*
function_name
,
PyObject
*
args
,
PyObject
*
*
subobj
,
Py_ssize_t
*
start
,
Py_ssize_t
*
end
)
{
PyObject
*
tmp_subobj
;
Py_ssize_t
tmp_start
=
0
;
Py_ssize_t
tmp_end
=
PY_SSIZE_T_MAX
;
PyObject
*
obj_start
=
Py_None
,
*
obj_end
=
Py_None
;
char
format
[
FORMAT_BUFFER_SIZE
]
=
"O|OO:"
;
size_t
len
=
strlen
(
format
);
strncpy
(
format
+
len
,
function_name
,
FORMAT_BUFFER_SIZE
-
len
-
1
);
format
[
FORMAT_BUFFER_SIZE
-
1
]
=
'\0'
;
if
(!
PyArg_ParseTuple
(
args
,
format
,
&
tmp_subobj
,
&
obj_start
,
&
obj_end
))
return
0
;
/* To support None in "start" and "end" arguments, meaning
the same as if they were not passed.
*/
if
(
obj_start
!=
Py_None
)
if
(!
_PyEval_SliceIndex
(
obj_start
,
&
tmp_start
))
return
0
;
if
(
obj_end
!=
Py_None
)
if
(!
_PyEval_SliceIndex
(
obj_end
,
&
tmp_end
))
return
0
;
*
start
=
tmp_start
;
*
end
=
tmp_end
;
*
subobj
=
tmp_subobj
;
return
1
;
}
#undef
FORMAT_BUFFER_SIZE
Back
|
FazBrowse Home
|
New Git URL