summaryrefslogtreecommitdiff
path: root/sql/gstream.cc
diff options
context:
space:
mode:
authorunknown <monty@mashka.mysql.fi>2004-03-04 08:50:37 +0200
committerunknown <monty@mashka.mysql.fi>2004-03-04 08:50:37 +0200
commitafa6728a9f7c00582b3dc9e96b2dce5c4ac1e56c (patch)
treef335ad0e2c6634a947a95d62cbee9a54ee9303e8 /sql/gstream.cc
parentf96960f9e1605189cc49397c64ff1cff97faedf1 (diff)
downloadmariadb-git-afa6728a9f7c00582b3dc9e96b2dce5c4ac1e56c.tar.gz
Optimized GIS functions
heap/hp_delete.c: Added comments mysql-test/r/gis.result: Updated results after name changes (all results line are unchanged) mysql-test/r/show_check.result: Update test results after fix in hp_delete.cc mysql-test/t/gis.test: Changed table names to longer, hopefully non conflicting ones. Added missing drop table mysys/hash.c: Inendation cleanup mysys/tree.c: Updated comments Decrease tree->allocated on delete (for status) sql/field.cc: Added safety checking for GIS objects sql/gstream.cc: Added copyright message Made a lot of speed/space optimizations Changed class names to be MySQL compliant sql/gstream.h: Made a lot of speed/space optimizations Changed class names to be MySQL compliant sql/item_create.cc: Indentation fixup sql/item_geofunc.cc: Use new gis interface functions and new gis class names. Simple optimizations Indentation fixups Fixed a lot of unlikely but possible errors. sql/item_geofunc.h: Moved SRID_SIZE to spatial.h sql/spatial.cc: Added copyright message Made a lot of speed/space optimizations Changed class names to be MySQL compliant sql/spatial.h: Made a lot of speed/space optimizations Changed class names to be MySQL compliant Indentation fixes Use bool instead of int as result type for functions that only return 0 or 1 sql/sql_string.cc: Simple optimizations sql/sql_string.h: Simple cleanups sql/structs.h: Added LEX_STRING_WITH_INIT (needed by spatial.cc)
Diffstat (limited to 'sql/gstream.cc')
-rw-r--r--sql/gstream.cc174
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);
}
-
-