| 152 | */ |
| 153 | |
| 154 | static char *backtick_string(CHARSET_INFO *cs, char *to, const char *end, |
| 155 | char *par, size_t par_len, char quote_char) |
| 156 | { |
| 157 | uint char_len; |
| 158 | char *start= to; |
| 159 | char *par_end= par + par_len; |
| 160 | size_t buff_length= (size_t) (end - to); |
| 161 | |
| 162 | if (buff_length <= par_len) |
| 163 | goto err; |
| 164 | *start++= quote_char; |
| 165 | |
| 166 | for ( ; par < par_end; par+= char_len) |
| 167 | { |
| 168 | uchar c= *(uchar *) par; |
| 169 | char_len= my_ci_charlen_fix(cs, (const uchar *) par, (const uchar *) par_end); |
| 170 | if (char_len == 1 && c == (uchar) quote_char ) |
| 171 | { |
| 172 | if (start + 1 >= end) |
| 173 | goto err; |
| 174 | *start++= quote_char; |
| 175 | } |
| 176 | if (start + char_len >= end) |
| 177 | goto err; |
| 178 | start= strnmov(start, par, char_len); |
| 179 | } |
| 180 | |
| 181 | if (start + 1 >= end) |
| 182 | goto err; |
| 183 | |
| 184 | *start++= quote_char; |
| 185 | return start; |
| 186 | |
| 187 | err: |
| 188 | *to='\0'; |
| 189 | return to; |
| 190 | } |
| 191 | |
| 192 | |
| 193 | /** |
no test coverage detected