Skip to content

Commit 0f6d223

Browse files
committed
Add #defines for mbfl_strpos error conditions
1 parent e72bf63 commit 0f6d223

File tree

3 files changed

+28
-40
lines changed

3 files changed

+28
-40
lines changed

ext/mbstring/libmbfl/mbfl/mbfilter.c

Lines changed: 16 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -819,25 +819,13 @@ mbfl_strpos(
819819
size_t result;
820820
mbfl_string _haystack_u8, _needle_u8;
821821
const mbfl_string *haystack_u8, *needle_u8 = NULL;
822-
const unsigned char *u8_tbl;
823-
824-
if (haystack == NULL || haystack->val == NULL || needle == NULL || needle->val == NULL) {
825-
return (size_t) -8;
826-
}
827-
828-
{
829-
const mbfl_encoding *u8_enc = &mbfl_encoding_utf8;
830-
if (u8_enc->mblen_table == NULL) {
831-
return (size_t) -8;
832-
}
833-
u8_tbl = u8_enc->mblen_table;
834-
}
822+
const unsigned char *u8_tbl = mbfl_encoding_utf8.mblen_table;
835823

836824
if (haystack->encoding->no_encoding != mbfl_no_encoding_utf8) {
837825
mbfl_string_init(&_haystack_u8);
838826
haystack_u8 = mbfl_convert_encoding(haystack, &_haystack_u8, &mbfl_encoding_utf8);
839827
if (haystack_u8 == NULL) {
840-
result = (size_t) -4;
828+
result = MBFL_ERROR_ENCODING;
841829
goto out;
842830
}
843831
} else {
@@ -848,14 +836,14 @@ mbfl_strpos(
848836
mbfl_string_init(&_needle_u8);
849837
needle_u8 = mbfl_convert_encoding(needle, &_needle_u8, &mbfl_encoding_utf8);
850838
if (needle_u8 == NULL) {
851-
result = (size_t) -4;
839+
result = MBFL_ERROR_ENCODING;
852840
goto out;
853841
}
854842
} else {
855843
needle_u8 = needle;
856844
}
857845

858-
result = (size_t) -1;
846+
result = MBFL_ERROR_NOT_FOUND;
859847
if (haystack_u8->len < needle_u8->len) {
860848
goto out;
861849
}
@@ -898,7 +886,7 @@ mbfl_strpos(
898886
p = haystack_u8_val;
899887
while (offset-- > 0) {
900888
if (p >= e) {
901-
result = (size_t) -16;
889+
result = MBFL_ERROR_OFFSET;
902890
goto out;
903891
}
904892
p += u8_tbl[*p];
@@ -968,7 +956,7 @@ mbfl_strpos(
968956
while (offset < 0) {
969957
unsigned char c;
970958
if (p <= e) {
971-
result = (size_t) -16;
959+
result = MBFL_ERROR_OFFSET;
972960
goto out;
973961
}
974962
c = *(--p);
@@ -983,7 +971,7 @@ mbfl_strpos(
983971
const unsigned char *ee = haystack_u8_val + haystack_u8->len;
984972
while (offset-- > 0) {
985973
if (e >= ee) {
986-
result = (size_t) -16;
974+
result = MBFL_ERROR_OFFSET;
987975
goto out;
988976
}
989977
e += u8_tbl[*e];
@@ -1046,28 +1034,25 @@ mbfl_substr_count(
10461034
mbfl_convert_filter *filter;
10471035
struct collector_strpos_data pc;
10481036

1049-
if (haystack == NULL || needle == NULL) {
1050-
return (size_t) -8;
1051-
}
10521037
/* needle is converted into wchar */
10531038
mbfl_wchar_device_init(&pc.needle);
10541039
filter = mbfl_convert_filter_new(
10551040
needle->encoding,
10561041
&mbfl_encoding_wchar,
10571042
mbfl_wchar_device_output, 0, &pc.needle);
10581043
if (filter == NULL) {
1059-
return (size_t) -4;
1044+
return MBFL_ERROR_ENCODING;
10601045
}
10611046
mbfl_convert_filter_feed_string(filter, needle->val, needle->len);
10621047
mbfl_convert_filter_flush(filter);
10631048
mbfl_convert_filter_delete(filter);
10641049
pc.needle_len = pc.needle.pos;
10651050
if (pc.needle.buffer == NULL) {
1066-
return (size_t) -4;
1051+
return MBFL_ERROR_ENCODING;
10671052
}
1068-
if (pc.needle_len <= 0) {
1053+
if (pc.needle_len == 0) {
10691054
mbfl_wchar_device_clear(&pc.needle);
1070-
return (size_t) -2;
1055+
return MBFL_ERROR_EMPTY;
10711056
}
10721057
/* initialize filter and collector data */
10731058
filter = mbfl_convert_filter_new(
@@ -1076,26 +1061,26 @@ mbfl_substr_count(
10761061
collector_strpos, 0, &pc);
10771062
if (filter == NULL) {
10781063
mbfl_wchar_device_clear(&pc.needle);
1079-
return (size_t) -4;
1064+
return MBFL_ERROR_ENCODING;
10801065
}
10811066
pc.start = 0;
10821067
pc.output = 0;
10831068
pc.needle_pos = 0;
10841069
pc.found_pos = 0;
1085-
pc.matched_pos = (size_t) -1;
1070+
pc.matched_pos = MBFL_ERROR_NOT_FOUND;
10861071

10871072
/* feed data */
10881073
p = haystack->val;
10891074
n = haystack->len;
10901075
if (p != NULL) {
10911076
while (n > 0) {
10921077
if ((*filter->filter_function)(*p++, filter) < 0) {
1093-
pc.matched_pos = (size_t) -4;
1078+
pc.matched_pos = MBFL_ERROR_ENCODING;
10941079
break;
10951080
}
1096-
if (pc.matched_pos != (size_t) -1) {
1081+
if (pc.matched_pos != MBFL_ERROR_NOT_FOUND) {
10971082
++result;
1098-
pc.matched_pos = (size_t) -1;
1083+
pc.matched_pos = MBFL_ERROR_NOT_FOUND;
10991084
pc.needle_pos = 0;
11001085
}
11011086
n--;

ext/mbstring/libmbfl/mbfl/mbfilter.h

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -201,8 +201,14 @@ mbfl_strlen(const mbfl_string *string);
201201
MBFLAPI extern size_t
202202
mbfl_oddlen(mbfl_string *string);
203203

204+
#define MBFL_ERROR_NOT_FOUND ((size_t) -1)
205+
#define MBFL_ERROR_ENCODING ((size_t) -4)
206+
#define MBFL_ERROR_EMPTY ((size_t) -8)
207+
#define MBFL_ERROR_OFFSET ((size_t) -16)
208+
204209
/*
205-
* strpos
210+
* strpos.
211+
* Errors: MBFL_ERROR_NOT_FOUND, MBFL_ERROR_ENCODING, MBFL_ERROR_OFFSET
206212
*/
207213
MBFLAPI extern size_t
208214
mbfl_strpos(mbfl_string *haystack, mbfl_string *needle, ssize_t offset, int reverse);

ext/mbstring/mbstring.c

Lines changed: 5 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2114,17 +2114,14 @@ PHP_FUNCTION(mb_strpos)
21142114
if (!mbfl_is_error(n)) {
21152115
RETVAL_LONG(n);
21162116
} else {
2117-
switch (-n) {
2118-
case 1:
2117+
switch (n) {
2118+
case MBFL_ERROR_NOT_FOUND:
21192119
break;
2120-
case 2:
2121-
php_error_docref(NULL, E_WARNING, "Needle has not positive length");
2122-
break;
2123-
case 4:
2120+
case MBFL_ERROR_ENCODING:
21242121
php_error_docref(NULL, E_WARNING, "Unknown encoding or conversion error");
21252122
break;
2126-
case 8:
2127-
php_error_docref(NULL, E_NOTICE, "Argument is empty");
2123+
case MBFL_ERROR_OFFSET:
2124+
php_error_docref(NULL, E_WARNING, "Offset not contained in string");
21282125
break;
21292126
default:
21302127
php_error_docref(NULL, E_WARNING, "Unknown error in mb_strpos");

0 commit comments

Comments
 (0)