/** * @internal * * @brief Call this function after every key name changing operation * * @pre key->key and key->keySize are set accordingly and the size of * allocation is twice as what you actually needed. * * @post we get a unsynced key with a correctly terminated * key name suitable for ordering and the name getter methods * * It will duplicate the key length and put a second name afterwards * that is used for sorting keys. * * @param key */ ssize_t elektraFinalizeName (Key * key) { key->key[key->keySize - 1] = 0; /* finalize string */ key->keyUSize = elektraUnescapeKeyName (key->key, key->key + key->keySize); key->flags |= KEY_FLAG_SYNC; return key->keySize; }
static void test_elektraUnescapeKeyName (void) { printf ("test unescape key name \n"); char dest[2000]; char * p = NULL; succeed_if (elektraUnescapeKeyName ("abc", dest) == 4, "size of unescaping wrong"); succeed_if_same_string ("abc", dest); succeed_if (elektraUnescapeKeyName ("\\\\.", dest) == 3, "size of unescaping wrong"); succeed_if_same_string ("\\.", dest); succeed_if (elektraUnescapeKeyName ("abc/def", dest) == 8, "size of unescaping wrong"); p = dest; succeed_if_same_string ("abc", p); p += 4; succeed_if_same_string ("def", p); succeed_if (elektraUnescapeKeyName ("abc\\/def", dest) == 8, "size of unescaping wrong"); p = dest; succeed_if_same_string ("abc/def", p); succeed_if (elektraUnescapeKeyName ("abc/%/def", dest) == 9, "size of unescaping wrong"); p = dest; succeed_if_same_string ("abc", p); p += 4; succeed_if_same_string ("", p); p += 1; succeed_if_same_string ("def", p); succeed_if (elektraUnescapeKeyName ("abc/\\%/def", dest) == 10, "size of unescaping wrong"); p = dest; succeed_if_same_string ("abc", p); p += 4; succeed_if_same_string ("%", p); p += 2; succeed_if_same_string ("def", p); succeed_if (elektraUnescapeKeyName ("abc/\\./def", dest) == 10, "size of unescaping wrong"); p = dest; succeed_if_same_string ("abc", p); p += 4; succeed_if_same_string (".", p); p += 2; succeed_if_same_string ("def", p); succeed_if (elektraUnescapeKeyName ("abc/\\../def", dest) == 11, "size of unescaping wrong"); p = dest; succeed_if_same_string ("abc", p); p += 4; succeed_if_same_string ("..", p); p += 3; succeed_if_same_string ("def", p); succeed_if (elektraUnescapeKeyName ("abc/\\\\../def", dest) == 12, "size of unescaping wrong"); p = dest; succeed_if_same_string ("abc", p); p += 4; succeed_if_same_string ("\\..", p); p += 4; succeed_if_same_string ("def", p); succeed_if (elektraUnescapeKeyName ("a\\c/\\../d\\f", dest) == 11, "size of unescaping wrong"); p = dest; succeed_if_same_string ("a\\c", p); p += 4; succeed_if_same_string ("..", p); p += 3; succeed_if_same_string ("d\\f", p); succeed_if (elektraUnescapeKeyName ("\\bc/\\%/\\ef", dest) == 10, "size of unescaping wrong"); p = dest; succeed_if_same_string ("\\bc", p); p += 4; succeed_if_same_string ("%", p); p += 2; succeed_if_same_string ("\\ef", p); succeed_if (elektraUnescapeKeyName ("\\b/\\%/\\e", dest) == 8, "size of unescaping wrong"); p = dest; succeed_if_same_string ("\\b", p); p += 3; succeed_if_same_string ("%", p); p += 2; succeed_if_same_string ("\\e", p); succeed_if (elektraUnescapeKeyName ("\\b/\\\\%/\\e", dest) == 9, "size of unescaping wrong"); p = dest; succeed_if_same_string ("\\b", p); p += 3; succeed_if_same_string ("\\%", p); p += 3; succeed_if_same_string ("\\e", p); succeed_if (elektraUnescapeKeyName ("a\\/\\/def", dest) == 7, "size of unescaping wrong"); p = dest; succeed_if_same_string ("a//def", p); succeed_if (elektraUnescapeKeyName ("\\/\\/\\/def", dest) == 7, "size of unescaping wrong"); p = dest; succeed_if_same_string ("///def", p); succeed_if (elektraUnescapeKeyName ("\\/\\/\\/def", dest) == 7, "size of unescaping wrong"); p = dest; succeed_if_same_string ("///def", p); succeed_if (elektraUnescapeKeyName ("\\/\\/\\/\\/\\/\\/", dest) == 7, "size of unescaping wrong"); p = dest; succeed_if_same_string ("//////", p); succeed_if (elektraUnescapeKeyName ("\\/\\/%\\/\\/\\/", dest) == 7, "size of unescaping wrong"); p = dest; succeed_if_same_string ("//%///", p); succeed_if (elektraUnescapeKeyName ("\\/\\/..\\/\\/", dest) == 7, "size of unescaping wrong"); p = dest; succeed_if_same_string ("//..//", p); succeed_if (elektraUnescapeKeyName ("bar\\/foo_bar\\/", dest) == sizeof ("bar/foo_bar/"), "size of unescaping wrong"); p = dest; succeed_if_same_string ("bar/foo_bar/", p); }