aboutsummaryrefslogtreecommitdiffstats
path: root/contrib/libs/libmysql_r/strings/my_strchr.cc
diff options
context:
space:
mode:
authorhcpp <hcpp@ydb.tech>2023-11-08 12:09:41 +0300
committerhcpp <hcpp@ydb.tech>2023-11-08 12:56:14 +0300
commita361f5b98b98b44ea510d274f6769164640dd5e1 (patch)
treec47c80962c6e2e7b06798238752fd3da0191a3f6 /contrib/libs/libmysql_r/strings/my_strchr.cc
parent9478806fde1f4d40bd5a45e7cbe77237dab613e9 (diff)
downloadydb-a361f5b98b98b44ea510d274f6769164640dd5e1.tar.gz
metrics have been added
Diffstat (limited to 'contrib/libs/libmysql_r/strings/my_strchr.cc')
-rw-r--r--contrib/libs/libmysql_r/strings/my_strchr.cc82
1 files changed, 82 insertions, 0 deletions
diff --git a/contrib/libs/libmysql_r/strings/my_strchr.cc b/contrib/libs/libmysql_r/strings/my_strchr.cc
new file mode 100644
index 0000000000..cbc3d1f15c
--- /dev/null
+++ b/contrib/libs/libmysql_r/strings/my_strchr.cc
@@ -0,0 +1,82 @@
+/* Copyright (c) 2005, 2018, Oracle and/or its affiliates. All rights reserved.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License, version 2.0,
+ as published by the Free Software Foundation.
+
+ This program is also distributed with certain software (including
+ but not limited to OpenSSL) that is licensed under separate terms,
+ as designated in a particular file or component or in included license
+ documentation. The authors of MySQL hereby grant you an additional
+ permission to link the program and your derivative works with the
+ separately licensed software that they have included with MySQL.
+
+ Without limiting anything contained in the foregoing, this file,
+ which is part of C Driver for MySQL (Connector/C), is also subject to the
+ Universal FOSS Exception, version 1.0, a copy of which can be found at
+ http://oss.oracle.com/licenses/universal-foss-exception.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License, version 2.0, for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */
+
+#include <stddef.h>
+#include <sys/types.h>
+
+#include "m_ctype.h"
+
+/**
+ Calculate the length of the initial segment of 'str' which consists
+ entirely of characters not in 'reject'.
+
+ @param cs Pointer to charset info.
+ @param str Pointer to multi-byte string.
+ @param str_end Pointer to end of multi-byte string.
+ @param reject Pointer to start of single-byte reject string.
+ @param reject_length Length of single-byte reject string.
+
+ @return Length of segment of multi-byte string that doesn't contain
+ any character of the single-byte reject string or zero if an
+ invalid encoding of a character of the multi-byte string is
+ found.
+
+ @note The reject string points to single-byte characters so it is
+ only possible to find the first occurrence of a single-byte
+ character. Multi-byte characters in 'str' are treated as not
+ matching any character in the reject string.
+ This method returns zero if an invalid encoding of any character
+ in the string 'str' using charset 'cs' is found.
+
+ @todo should be moved to CHARSET_INFO if it's going to be called
+ frequently.
+
+ @internal The implementation builds on the assumption that 'str' is long,
+ while 'reject' is short. So it compares each character in string
+ with the characters in 'reject' in a tight loop over the characters
+ in 'reject'.
+*/
+
+size_t my_strcspn(const CHARSET_INFO *cs, const char *str, const char *str_end,
+ const char *reject, size_t reject_length) {
+ const char *ptr_str, *ptr_reject;
+ const char *reject_end = reject + reject_length;
+ uint mbl = 0;
+
+ for (ptr_str = str; ptr_str < str_end; ptr_str += mbl) {
+ mbl = my_mbcharlen_ptr(cs, ptr_str, str_end);
+
+ if (mbl == 0) return 0;
+
+ if (mbl == 1) {
+ for (ptr_reject = reject; ptr_reject < reject_end; ++ptr_reject) {
+ if (*ptr_reject == *ptr_str) return (size_t)(ptr_str - str);
+ }
+ }
+ }
+ return (size_t)(ptr_str - str);
+}