/Objects/stringlib/partition.h

http://unladen-swallow.googlecode.com/ · C Header · 111 lines · 83 code · 20 blank · 8 comment · 13 complexity · a29043b23742745fc5af2ff92ecae3b6 MD5 · raw file

  1. /* stringlib: partition implementation */
  2. #ifndef STRINGLIB_PARTITION_H
  3. #define STRINGLIB_PARTITION_H
  4. #ifndef STRINGLIB_FASTSEARCH_H
  5. #error must include "stringlib/fastsearch.h" before including this module
  6. #endif
  7. Py_LOCAL_INLINE(PyObject*)
  8. stringlib_partition(
  9. PyObject* str_obj, const STRINGLIB_CHAR* str, Py_ssize_t str_len,
  10. PyObject* sep_obj, const STRINGLIB_CHAR* sep, Py_ssize_t sep_len
  11. )
  12. {
  13. PyObject* out;
  14. Py_ssize_t pos;
  15. if (sep_len == 0) {
  16. PyErr_SetString(PyExc_ValueError, "empty separator");
  17. return NULL;
  18. }
  19. out = PyTuple_New(3);
  20. if (!out)
  21. return NULL;
  22. pos = fastsearch(str, str_len, sep, sep_len, FAST_SEARCH);
  23. if (pos < 0) {
  24. Py_INCREF(str_obj);
  25. PyTuple_SET_ITEM(out, 0, (PyObject*) str_obj);
  26. Py_INCREF(STRINGLIB_EMPTY);
  27. PyTuple_SET_ITEM(out, 1, (PyObject*) STRINGLIB_EMPTY);
  28. Py_INCREF(STRINGLIB_EMPTY);
  29. PyTuple_SET_ITEM(out, 2, (PyObject*) STRINGLIB_EMPTY);
  30. return out;
  31. }
  32. PyTuple_SET_ITEM(out, 0, STRINGLIB_NEW(str, pos));
  33. Py_INCREF(sep_obj);
  34. PyTuple_SET_ITEM(out, 1, sep_obj);
  35. pos += sep_len;
  36. PyTuple_SET_ITEM(out, 2, STRINGLIB_NEW(str + pos, str_len - pos));
  37. if (PyErr_Occurred()) {
  38. Py_DECREF(out);
  39. return NULL;
  40. }
  41. return out;
  42. }
  43. Py_LOCAL_INLINE(PyObject*)
  44. stringlib_rpartition(
  45. PyObject* str_obj, const STRINGLIB_CHAR* str, Py_ssize_t str_len,
  46. PyObject* sep_obj, const STRINGLIB_CHAR* sep, Py_ssize_t sep_len
  47. )
  48. {
  49. PyObject* out;
  50. Py_ssize_t pos, j;
  51. if (sep_len == 0) {
  52. PyErr_SetString(PyExc_ValueError, "empty separator");
  53. return NULL;
  54. }
  55. out = PyTuple_New(3);
  56. if (!out)
  57. return NULL;
  58. /* XXX - create reversefastsearch helper! */
  59. pos = -1;
  60. for (j = str_len - sep_len; j >= 0; --j)
  61. if (STRINGLIB_CMP(str+j, sep, sep_len) == 0) {
  62. pos = j;
  63. break;
  64. }
  65. if (pos < 0) {
  66. Py_INCREF(STRINGLIB_EMPTY);
  67. PyTuple_SET_ITEM(out, 0, (PyObject*) STRINGLIB_EMPTY);
  68. Py_INCREF(STRINGLIB_EMPTY);
  69. PyTuple_SET_ITEM(out, 1, (PyObject*) STRINGLIB_EMPTY);
  70. Py_INCREF(str_obj);
  71. PyTuple_SET_ITEM(out, 2, (PyObject*) str_obj);
  72. return out;
  73. }
  74. PyTuple_SET_ITEM(out, 0, STRINGLIB_NEW(str, pos));
  75. Py_INCREF(sep_obj);
  76. PyTuple_SET_ITEM(out, 1, sep_obj);
  77. pos += sep_len;
  78. PyTuple_SET_ITEM(out, 2, STRINGLIB_NEW(str + pos, str_len - pos));
  79. if (PyErr_Occurred()) {
  80. Py_DECREF(out);
  81. return NULL;
  82. }
  83. return out;
  84. }
  85. #endif
  86. /*
  87. Local variables:
  88. c-basic-offset: 4
  89. indent-tabs-mode: nil
  90. End:
  91. */