LCOV - code coverage report
Current view: | top level - Objects/stringlib - partition.h (source / functions) |  |  | Hit | Total | Coverage
Test: | CPython 3.12 LCOV report [commit 5e6661bce9] |  | Lines: | 42 | 64 | 65.6 %
Date: | 2023-03-20 08:15:36 |  | Functions: | 3 | 10 | 30.0 %
|  |  | Branches: | 10 | 20 | 50.0 %

               Branch data     Line data    Source code
           1                 :            : /* stringlib: partition implementation */
           2                 :            :
           3                 :            : #ifndef STRINGLIB_FASTSEARCH_H
           4                 :            : #  error must include "stringlib/fastsearch.h" before including this module
           5                 :            : #endif
           6                 :            :
           7                 :            : #if !STRINGLIB_MUTABLE && !defined(STRINGLIB_GET_EMPTY)
           8                 :            : #  error "STRINGLIB_GET_EMPTY must be defined if STRINGLIB_MUTABLE is zero"
           9                 :            : #endif
          10                 :            :
          11                 :            :
          12                 :            : Py_LOCAL_INLINE(PyObject*)
          13                 :         36 : STRINGLIB(partition)(PyObject* str_obj,
          14                 :            :                     const STRINGLIB_CHAR* str, Py_ssize_t str_len,
          15                 :            :                     PyObject* sep_obj,
          16                 :            :                     const STRINGLIB_CHAR* sep, Py_ssize_t sep_len)
          17                 :            : {
          18                 :            :     PyObject* out;
          19                 :            :     Py_ssize_t pos;
          20                 :            :
          21         [ -  + ]:         36 :     if (sep_len == 0) {
          22                 :          0 :         PyErr_SetString(PyExc_ValueError, "empty separator");
          23                 :          0 :         return NULL;
          24                 :            :     }
          25                 :            :
          26                 :         36 :     out = PyTuple_New(3);
          27         [ -  + ]:         36 :     if (!out)
          28                 :          0 :         return NULL;
          29                 :            :
          30                 :         36 :     pos = FASTSEARCH(str, str_len, sep, sep_len, -1, FAST_SEARCH);
          31                 :            :
          32         [ +  + ]:         36 :     if (pos < 0) {
          33                 :            : #if STRINGLIB_MUTABLE
          34                 :          0 :         PyTuple_SET_ITEM(out, 0, STRINGLIB_NEW(str, str_len));
          35                 :          0 :         PyTuple_SET_ITEM(out, 1, STRINGLIB_NEW(NULL, 0));
          36                 :          0 :         PyTuple_SET_ITEM(out, 2, STRINGLIB_NEW(NULL, 0));
          37                 :            :
          38         [ #  # ]:          0 :         if (PyErr_Occurred()) {
          39                 :          0 :             Py_DECREF(out);
          40                 :          0 :             return NULL;
          41                 :            :         }
          42                 :            : #else
          43                 :          7 :         Py_INCREF(str_obj);
          44                 :          7 :         PyTuple_SET_ITEM(out, 0, (PyObject*) str_obj);
          45                 :          7 :         PyObject *empty = (PyObject*)STRINGLIB_GET_EMPTY();
          46                 :            :         assert(empty != NULL);
          47                 :          7 :         Py_INCREF(empty);
          48                 :          7 :         PyTuple_SET_ITEM(out, 1, empty);
          49                 :          7 :         Py_INCREF(empty);
          50                 :          7 :         PyTuple_SET_ITEM(out, 2, empty);
          51                 :            : #endif
          52                 :          7 :         return out;
          53                 :            :     }
          54                 :            :
          55                 :         29 :     PyTuple_SET_ITEM(out, 0, STRINGLIB_NEW(str, pos));
          56                 :         29 :     Py_INCREF(sep_obj);
          57                 :         29 :     PyTuple_SET_ITEM(out, 1, sep_obj);
          58                 :         29 :     pos += sep_len;
          59                 :         29 :     PyTuple_SET_ITEM(out, 2, STRINGLIB_NEW(str + pos, str_len - pos));
          60                 :            :
          61         [ -  + ]:         29 :     if (PyErr_Occurred()) {
          62                 :          0 :         Py_DECREF(out);
          63                 :          0 :         return NULL;
          64                 :            :     }
          65                 :            :
          66                 :         29 :     return out;
          67                 :            : }
          68                 :            :
          69                 :            : Py_LOCAL_INLINE(PyObject*)
          70                 :       4387 : STRINGLIB(rpartition)(PyObject* str_obj,
          71                 :            :                      const STRINGLIB_CHAR* str, Py_ssize_t str_len,
          72                 :            :                      PyObject* sep_obj,
          73                 :            :                      const STRINGLIB_CHAR* sep, Py_ssize_t sep_len)
          74                 :            : {
          75                 :            :     PyObject* out;
          76                 :            :     Py_ssize_t pos;
          77                 :            :
          78         [ -  + ]:       4387 :     if (sep_len == 0) {
          79                 :          0 :         PyErr_SetString(PyExc_ValueError, "empty separator");
          80                 :          0 :         return NULL;
          81                 :            :     }
          82                 :            :
          83                 :       4387 :     out = PyTuple_New(3);
          84         [ -  + ]:       4387 :     if (!out)
          85                 :          0 :         return NULL;
          86                 :            :
          87                 :       4387 :     pos = FASTSEARCH(str, str_len, sep, sep_len, -1, FAST_RSEARCH);
          88                 :            :
          89         [ +  + ]:       4387 :     if (pos < 0) {
          90                 :            : #if STRINGLIB_MUTABLE
          91                 :          0 :         PyTuple_SET_ITEM(out, 0, STRINGLIB_NEW(NULL, 0));
          92                 :          0 :         PyTuple_SET_ITEM(out, 1, STRINGLIB_NEW(NULL, 0));
          93                 :          0 :         PyTuple_SET_ITEM(out, 2, STRINGLIB_NEW(str, str_len));
          94                 :            :
          95         [ #  # ]:          0 :         if (PyErr_Occurred()) {
          96                 :          0 :             Py_DECREF(out);
          97                 :          0 :             return NULL;
          98                 :            :         }
          99                 :            : #else
         100                 :       2569 :         PyObject *empty = (PyObject*)STRINGLIB_GET_EMPTY();
         101                 :            :         assert(empty != NULL);
         102                 :       2569 :         Py_INCREF(empty);
         103                 :       2569 :         PyTuple_SET_ITEM(out, 0, empty);
         104                 :       2569 :         Py_INCREF(empty);
         105                 :       2569 :         PyTuple_SET_ITEM(out, 1, empty);
         106                 :       2569 :         Py_INCREF(str_obj);
         107                 :       2569 :         PyTuple_SET_ITEM(out, 2, (PyObject*) str_obj);
         108                 :            : #endif
         109                 :       2569 :         return out;
         110                 :            :     }
         111                 :            :
         112                 :       1818 :     PyTuple_SET_ITEM(out, 0, STRINGLIB_NEW(str, pos));
         113                 :       1818 :     Py_INCREF(sep_obj);
         114                 :       1818 :     PyTuple_SET_ITEM(out, 1, sep_obj);
         115                 :       1818 :     pos += sep_len;
         116                 :       1818 :     PyTuple_SET_ITEM(out, 2, STRINGLIB_NEW(str + pos, str_len - pos));
         117                 :            :
         118         [ -  + ]:       1818 :     if (PyErr_Occurred()) {
         119                 :          0 :         Py_DECREF(out);
         120                 :          0 :         return NULL;
         121                 :            :     }
         122                 :            :
         123                 :       1818 :     return out;
         124                 :            : }
         125                 :            :

Generated by: LCOV version 1.14