~drizzle-trunk/drizzle/development

1 by brian
clean slate
1
/* Copyright (C) 2000 MySQL AB
2
3
   This program is free software; you can redistribute it and/or modify
4
   it under the terms of the GNU General Public License as published by
5
   the Free Software Foundation; version 2 of the License.
6
7
   This program is distributed in the hope that it will be useful,
8
   but WITHOUT ANY WARRANTY; without even the implied warranty of
9
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
10
   GNU General Public License for more details.
11
12
   You should have received a copy of the GNU General Public License
13
   along with this program; if not, write to the Free Software
14
   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA */
15
16
/*
17
  Code for handling strings with can grow dynamicly.
18
  Copyright Monty Program KB.
19
  By monty.
20
*/
21
22
#include "mysys_priv.h"
23
#include <m_string.h>
24
146 by Brian Aker
my_bool cleanup.
25
bool init_dynamic_string(DYNAMIC_STRING *str, const char *init_str,
1 by brian
clean slate
26
			    size_t init_alloc, size_t alloc_increment)
27
{
28
  uint length;
29
  DBUG_ENTER("init_dynamic_string");
30
31
  if (!alloc_increment)
32
    alloc_increment=128;
33
  length=1;
34
  if (init_str && (length= strlen(init_str)+1) < init_alloc)
35
    init_alloc=((length+alloc_increment-1)/alloc_increment)*alloc_increment;
36
  if (!init_alloc)
37
    init_alloc=alloc_increment;
38
39
  if (!(str->str=(char*) my_malloc(init_alloc,MYF(MY_WME))))
163 by Brian Aker
Merge Monty's code.
40
    DBUG_RETURN(true);
1 by brian
clean slate
41
  str->length=length-1;
42
  if (init_str)
43
    memcpy(str->str,init_str,length);
44
  str->max_length=init_alloc;
45
  str->alloc_increment=alloc_increment;
163 by Brian Aker
Merge Monty's code.
46
  DBUG_RETURN(false);
1 by brian
clean slate
47
}
48
49
146 by Brian Aker
my_bool cleanup.
50
bool dynstr_set(DYNAMIC_STRING *str, const char *init_str)
1 by brian
clean slate
51
{
52
  uint length=0;
53
  DBUG_ENTER("dynstr_set");
54
55
  if (init_str && (length= (uint) strlen(init_str)+1) > str->max_length)
56
  {
57
    str->max_length=((length+str->alloc_increment-1)/str->alloc_increment)*
58
      str->alloc_increment;
59
    if (!str->max_length)
60
      str->max_length=str->alloc_increment;
61
    if (!(str->str=(char*) my_realloc(str->str,str->max_length,MYF(MY_WME))))
163 by Brian Aker
Merge Monty's code.
62
      DBUG_RETURN(true);
1 by brian
clean slate
63
  }
64
  if (init_str)
65
  {
66
    str->length=length-1;
67
    memcpy(str->str,init_str,length);
68
  }
69
  else
70
    str->length=0;
163 by Brian Aker
Merge Monty's code.
71
  DBUG_RETURN(false);
1 by brian
clean slate
72
}
73
74
146 by Brian Aker
my_bool cleanup.
75
bool dynstr_realloc(DYNAMIC_STRING *str, size_t additional_size)
1 by brian
clean slate
76
{
77
  DBUG_ENTER("dynstr_realloc");
78
163 by Brian Aker
Merge Monty's code.
79
  if (!additional_size) DBUG_RETURN(false);
1 by brian
clean slate
80
  if (str->length + additional_size > str->max_length)
81
  {
82
    str->max_length=((str->length + additional_size+str->alloc_increment-1)/
83
		     str->alloc_increment)*str->alloc_increment;
84
    if (!(str->str=(char*) my_realloc(str->str,str->max_length,MYF(MY_WME))))
163 by Brian Aker
Merge Monty's code.
85
      DBUG_RETURN(true);
1 by brian
clean slate
86
  }
163 by Brian Aker
Merge Monty's code.
87
  DBUG_RETURN(false);
1 by brian
clean slate
88
}
89
90
146 by Brian Aker
my_bool cleanup.
91
bool dynstr_append(DYNAMIC_STRING *str, const char *append)
1 by brian
clean slate
92
{
93
  return dynstr_append_mem(str,append,(uint) strlen(append));
94
}
95
96
146 by Brian Aker
my_bool cleanup.
97
bool dynstr_append_mem(DYNAMIC_STRING *str, const char *append,
1 by brian
clean slate
98
			  size_t length)
99
{
100
  char *new_ptr;
101
  if (str->length+length >= str->max_length)
102
  {
103
    uint new_length=(str->length+length+str->alloc_increment)/
104
      str->alloc_increment;
105
    new_length*=str->alloc_increment;
106
    if (!(new_ptr=(char*) my_realloc(str->str,new_length,MYF(MY_WME))))
163 by Brian Aker
Merge Monty's code.
107
      return true;
1 by brian
clean slate
108
    str->str=new_ptr;
109
    str->max_length=new_length;
110
  }
111
  memcpy(str->str + str->length,append,length);
112
  str->length+=length;
113
  str->str[str->length]=0;			/* Safety for C programs */
163 by Brian Aker
Merge Monty's code.
114
  return false;
1 by brian
clean slate
115
}
116
117
146 by Brian Aker
my_bool cleanup.
118
bool dynstr_trunc(DYNAMIC_STRING *str, size_t n)
1 by brian
clean slate
119
{
120
  str->length-=n;
121
  str->str[str->length]= '\0';
163 by Brian Aker
Merge Monty's code.
122
  return false;
1 by brian
clean slate
123
}
124
125
/*
126
  Concatenates any number of strings, escapes any OS quote in the result then
127
  surround the whole affair in another set of quotes which is finally appended
128
  to specified DYNAMIC_STRING.  This function is especially useful when 
129
  building strings to be executed with the system() function.
130
131
  @param str Dynamic String which will have addtional strings appended.
132
  @param append String to be appended.
133
  @param ... Optional. Additional string(s) to be appended.
134
135
  @note The final argument in the list must be NullS even if no additional
136
  options are passed.
137
138
  @return True = Success.
139
*/
140
146 by Brian Aker
my_bool cleanup.
141
bool dynstr_append_os_quoted(DYNAMIC_STRING *str, const char *append, ...)
1 by brian
clean slate
142
{
143
  const char *quote_str= "\'";
144
  const uint  quote_len= 1;
163 by Brian Aker
Merge Monty's code.
145
  bool ret= true;
1 by brian
clean slate
146
  va_list dirty_text;
147
148
  ret&= dynstr_append_mem(str, quote_str, quote_len); /* Leading quote */
149
  va_start(dirty_text, append);
150
  while (append != NullS)
151
  {
152
    const char  *cur_pos= append;
153
    const char *next_pos= cur_pos;
154
155
    /* Search for quote in each string and replace with escaped quote */
156
    while(*(next_pos= strcend(cur_pos, quote_str[0])) != '\0')
157
    {
158
      ret&= dynstr_append_mem(str, cur_pos, next_pos - cur_pos);
159
      ret&= dynstr_append_mem(str ,"\\", 1);
160
      ret&= dynstr_append_mem(str, quote_str, quote_len);
161
      cur_pos= next_pos + 1;
162
    }
163
    ret&= dynstr_append_mem(str, cur_pos, next_pos - cur_pos);
164
    append= va_arg(dirty_text, char *);
165
  }
166
  va_end(dirty_text);
167
  ret&= dynstr_append_mem(str, quote_str, quote_len); /* Trailing quote */
168
169
  return ret;
170
}
171
172
173
void dynstr_free(DYNAMIC_STRING *str)
174
{
175
  if (str->str)
176
  {
177
    my_free(str->str,MYF(MY_WME));
178
    str->str=0;
179
  }
180
}