@@ -203,7 +203,7 @@ inline char * qs_k2v(const char * key, char * const * qs_kv, size_t qs_kv_size,
203203inline std::unique_ptr<std::pair<std::string, std::string>> qs_dict_name2kv (const char * dict_name, char * const * qs_kv, size_t qs_kv_size, int nth = 0 )
204204{
205205 size_t i;
206- size_t name_len, skip_to_eq, skip_to_brace_open, skip_to_brace_close ;
206+ size_t name_len, eq_pos, key_size ;
207207
208208 name_len = strlen (dict_name);
209209
@@ -212,29 +212,22 @@ inline std::unique_ptr<std::pair<std::string, std::string>> qs_dict_name2kv(cons
212212#else // _qsSORTING
213213 for (i=0 ; i<qs_kv_size; i++)
214214 {
215- if ( strncmp (dict_name, qs_kv[i], name_len) == 0 )
215+ eq_pos = key_size = strcspn (qs_kv[i], " =" );
216+ if (qs_kv[i][eq_pos] == ' \0 ' )
217+ continue ;
218+ auto key = std::unique_ptr<char []>(new char [key_size]);
219+ memcpy (key.get (), qs_kv[i], key_size);
220+ key[key_size] = ' \0 ' ;
221+ key_size = qs_decode (key.get ());
222+
223+ if (strncmp (dict_name, key.get (), name_len) == 0 &&
224+ key_size > name_len && key[name_len] == ' [' &&
225+ key[key_size - 1 ] == ' ]' &&
226+ nth-- == 0 )
216227 {
217- skip_to_eq = strcspn (qs_kv[i], " =" );
218- if ( qs_kv[i][skip_to_eq] == ' =' )
219- skip_to_eq++;
220- skip_to_brace_open = strcspn (qs_kv[i], " [" );
221- if ( qs_kv[i][skip_to_brace_open] == ' [' )
222- skip_to_brace_open++;
223- skip_to_brace_close = strcspn (qs_kv[i], " ]" );
224-
225- if ( skip_to_brace_open <= skip_to_brace_close &&
226- skip_to_brace_open > 0 &&
227- skip_to_brace_close > 0 &&
228- nth == 0 )
229- {
230- auto key = std::string (qs_kv[i] + skip_to_brace_open, skip_to_brace_close - skip_to_brace_open);
231- auto value = std::string (qs_kv[i] + skip_to_eq);
232- return std::unique_ptr<std::pair<std::string, std::string>>(new std::pair<std::string, std::string>(key, value));
233- }
234- else
235- {
236- --nth;
237- }
228+ auto sub_key = std::string (key.get () + name_len + 1 , key_size - name_len - 2 );
229+ auto value = std::string (qs_kv[i] + eq_pos + 1 );
230+ return std::unique_ptr<std::pair<std::string, std::string>>(new std::pair<std::string, std::string>(sub_key, value));
238231 }
239232 }
240233#endif // _qsSORTING
0 commit comments