diff options
Diffstat (limited to 'sql/gstream.cc')
-rw-r--r-- | sql/gstream.cc | 174 |
1 files changed, 75 insertions, 99 deletions
diff --git a/sql/gstream.cc b/sql/gstream.cc index 17b85af22bd..6b1e12ec733 100644 --- a/sql/gstream.cc +++ b/sql/gstream.cc @@ -1,139 +1,115 @@ +/* Copyright (C) 2004 MySQL AB + + 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; either version 2 of the License, or + (at your option) any later version. + + 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ + +/* + Functions to read and parse geometrical data. + NOTE: These functions assumes that the string is end \0 terminated! +*/ + #include "mysql_priv.h" -int GTextReadStream::get_next_toc_type() const +enum Gis_read_stream::enum_tok_types Gis_read_stream::get_next_toc_type() { - const char *cur = m_cur; - while ((*cur)&&(strchr(" \t\r\n",*cur))) - { - cur++; - } - if (!(*cur)) - { + skip_space(); + if (!*m_cur) return eostream; - } - - if (((*cur>='a') && (*cur<='z')) || ((*cur>='A') && (*cur<='Z')) || - (*cur=='_')) - { + if (my_isvar_start(&my_charset_bin, *m_cur)) return word; - } - - if (((*cur>='0') && (*cur<='9')) || (*cur=='-') || (*cur=='+') || - (*cur=='.')) - { + if ((*m_cur >= '0' && *m_cur <= '9') || *m_cur == '-' || *m_cur == '+') return numeric; - } - - if (*cur == '(') - { + if (*m_cur == '(') return l_bra; - } - - if (*cur == ')') - { + if (*m_cur == ')') return r_bra; - } - - if (*cur == ',') - { + if (*m_cur == ',') return comma; - } - return unknown; } -const char *GTextReadStream::get_next_word(int *word_len) -{ - const char *cur = m_cur; - while ((*cur)&&(strchr(" \t\r\n",*cur))) - { - cur++; - } - m_last_text_position = cur; - - if (!(*cur)) - { - return 0; - } - const char *wd_start = cur; - - if (((*cur<'a') || (*cur>'z')) && ((*cur<'A') || (*cur>'Z')) && (*cur!='_')) - { - return NULL; - } +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 (!my_isvar_start(&my_charset_bin, *m_cur)) + return 1; - ++cur; + /* + We can't combine the following increment with my_isvar() because + my_isvar() is a macro that would cause side effects + */ + m_cur++; + while (my_isvar(&my_charset_bin, *m_cur)) + m_cur++; - while (((*cur>='a') && (*cur<='z')) || ((*cur>='A') && (*cur<='Z')) || - (*cur=='_') || ((*cur>='0') && (*cur<='9'))) - { - ++cur; - } + res->length= (uint32) (m_cur - res->str); + return 0; +} - *word_len = cur - wd_start; - m_cur = cur; +/* + Read a floating point number - return wd_start; -} + NOTE: Number must start with a digit or sign. It can't start with a decimal + point +*/ -int GTextReadStream::get_next_number(double *d) +bool Gis_read_stream::get_next_number(double *d) { - const char *cur = m_cur; - while ((*cur)&&(strchr(" \t\r\n",*cur))) - { - cur++; - } - - m_last_text_position = cur; - if (!(*cur)) - { - set_error_msg("Numeric constant expected"); - return 1; - } + char *endptr; - if (((*cur<'0') || (*cur>'9')) && (*cur!='-') && (*cur!='+') && (*cur!='.')) + skip_space(); + /* The following will also test for end \0 */ + if ((*m_cur < '0' || *m_cur > '9') && *m_cur != '-' && *m_cur != '+') { set_error_msg("Numeric constant expected"); return 1; } - char *endptr; - - *d = my_strtod(cur, &endptr); - + *d = my_strtod(m_cur, &endptr); if (endptr) - { m_cur = endptr; - } - return 0; } -char GTextReadStream::get_next_symbol() + +bool Gis_read_stream::check_next_symbol(char symbol) { - const char *cur = m_cur; - while ((*cur)&&(strchr(" \t\r\n",*cur))) + skip_space(); + if (*m_cur != symbol) { - cur++; - } - if (!(*cur)) - { - return 0; + char buff[32]; + strmov(buff, "'?' expected"); + buff[2]= symbol; + set_error_msg(buff); + return 1; } + m_cur++; + return 0; +} - m_cur = cur + 1; - m_last_text_position = cur; - return *cur; -} +/* + Remember error message. +*/ -void GTextReadStream::set_error_msg(const char *msg) +void Gis_read_stream::set_error_msg(const char *msg) { - size_t len = strlen(msg); - m_err_msg = (char *)my_realloc(m_err_msg, len + 1, MYF(MY_ALLOW_ZERO_PTR)); + size_t len= strlen(msg); // ok in this context + m_err_msg= (char *) my_realloc(m_err_msg, len + 1, MYF(MY_ALLOW_ZERO_PTR)); memcpy(m_err_msg, msg, len + 1); } - - |