| 142 | */ |
| 143 | |
| 144 | static char *backtick_string(const CHARSET_INFO *cs, char *to, char *end, |
| 145 | char *par, size_t par_len, char quote_char) |
| 146 | { |
| 147 | uint char_len; |
| 148 | char *start= to; |
| 149 | char *par_end= par + par_len; |
| 150 | size_t buff_length= (size_t) (end - to); |
| 151 | |
| 152 | if (buff_length <= par_len) |
| 153 | goto err; |
| 154 | *start++= quote_char; |
| 155 | |
| 156 | for ( ; par < par_end; par+= char_len) |
| 157 | { |
| 158 | uchar c= *(uchar *) par; |
| 159 | if (!(char_len= my_mbcharlen(cs, c))) |
| 160 | char_len= 1; |
| 161 | if (char_len == 1 && c == (uchar) quote_char ) |
| 162 | { |
| 163 | if (start + 1 >= end) |
| 164 | goto err; |
| 165 | *start++= quote_char; |
| 166 | } |
| 167 | if (start + char_len >= end) |
| 168 | goto err; |
| 169 | start= strnmov(start, par, char_len); |
| 170 | } |
| 171 | |
| 172 | if (start + 1 >= end) |
| 173 | goto err; |
| 174 | *start++= quote_char; |
| 175 | return start; |
| 176 | |
| 177 | err: |
| 178 | *to='\0'; |
| 179 | return to; |
| 180 | } |
| 181 | |
| 182 | |
| 183 | /** |
no test coverage detected