LCOV - code coverage report
Current view: top level - Objects/stringlib - partition.h (source / functions) Hit Total Coverage
Test: CPython lcov report Lines: 0 56 0.0 %
Date: 2017-04-19 Functions: 0 2 0.0 %

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

Generated by: LCOV version 1.10