diff options
author | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-05-04 18:07:14 +0000 |
---|---|---|
committer | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-05-04 18:07:14 +0000 |
commit | a175314c3e5827eb193872241446f2f8f5c9d33c (patch) | |
tree | cd3d60ca99ae00829c52a6ca79150a5b6e62528b /sql/gstream.cc | |
parent | Initial commit. (diff) | |
download | mariadb-10.5-upstream.tar.xz mariadb-10.5-upstream.zip |
Adding upstream version 1:10.5.12.upstream/1%10.5.12upstream
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to '')
-rw-r--r-- | sql/gstream.cc | 147 |
1 files changed, 147 insertions, 0 deletions
diff --git a/sql/gstream.cc b/sql/gstream.cc new file mode 100644 index 00000000..f8e84e70 --- /dev/null +++ b/sql/gstream.cc @@ -0,0 +1,147 @@ +/* Copyright (c) 2002, 2010, Oracle and/or its affiliates. All rights reserved. + Copyright (c) 2009, 2020, MariaDB Corporation. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; version 2 of the License. + + 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 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-1335 USA */ + +/* + Functions to read and parse geometrical data. + NOTE: These functions assumes that the string is end \0 terminated! +*/ + +#include "mariadb.h" +#include "sql_priv.h" +#include "gstream.h" +#include "m_string.h" // LEX_STRING +#include "mysqld.h" + +enum Gis_read_stream::enum_tok_types Gis_read_stream::get_next_toc_type() +{ + skip_space(); + if (m_cur >= m_limit) + return eostream; + if (my_isvar_start(&my_charset_bin, *m_cur)) + return word; + if ((*m_cur >= '0' && *m_cur <= '9') || *m_cur == '-' || *m_cur == '+') + return numeric; + if (*m_cur == '(') + return l_bra; + if (*m_cur == ')') + return r_bra; + if (*m_cur == ',') + return comma; + return unknown; +} + + +bool Gis_read_stream::lookup_next_word(LEX_STRING *res) +{ + const char *cur= m_cur; + + skip_space(); + res->str= (char*) cur; + /* The following will also test for \0 */ + if ((cur >= m_limit) || !my_isvar_start(&my_charset_bin, *cur)) + return 1; + + /* + We can't combine the following increment with my_isvar() because + my_isvar() is a macro that would cause side effects + */ + cur++; + while ((cur < m_limit) && my_isvar(&my_charset_bin, *cur)) + cur++; + + res->length= (uint32) (cur - res->str); + return 0; +} + + +bool Gis_read_stream::get_next_word(LEX_STRING *res) +{ + skip_space(); + res->str= (char*) m_cur; + /* The following will also test for \0 */ + if ((m_cur >= m_limit) || !my_isvar_start(&my_charset_bin, *m_cur)) + return 1; + + /* + We can't combine the following increment with my_isvar() because + my_isvar() is a macro that would cause side effects + */ + m_cur++; + while ((m_cur < m_limit) && my_isvar(&my_charset_bin, *m_cur)) + m_cur++; + + res->length= (uint32) (m_cur - res->str); + return 0; +} + + +/* + Read a floating point number + + NOTE: Number must start with a digit or sign. It can't start with a decimal + point +*/ + +bool Gis_read_stream::get_next_number(double *d) +{ + char *endptr; + int err; + + skip_space(); + + if ((m_cur >= m_limit) || + ((*m_cur < '0' || *m_cur > '9') && *m_cur != '-' && *m_cur != '+')) + { + set_error_msg("Numeric constant expected"); + return 1; + } + + *d = m_charset->strntod((char *)m_cur, (uint) (m_limit-m_cur), &endptr, &err); + if (err) + return 1; + if (endptr) + m_cur = endptr; + return 0; +} + + +bool Gis_read_stream::check_next_symbol(char symbol) +{ + skip_space(); + if ((m_cur >= m_limit) || (*m_cur != symbol)) + { + char buff[32]; + strmov(buff, "'?' expected"); + buff[2]= symbol; + set_error_msg(buff); + return 1; + } + m_cur++; + return 0; +} + + +/* + Remember error message. +*/ + +void Gis_read_stream::set_error_msg(const char *msg) +{ + size_t len= strlen(msg); // ok in this context + m_err_msg= (char *) my_realloc(key_memory_Gis_read_stream_err_msg, + m_err_msg, (uint) len + 1, MYF(MY_ALLOW_ZERO_PTR)); + memcpy(m_err_msg, msg, len + 1); +} |