static void elektraDropCurrentKey (KeySet * ks, Key * warningKey, const Backend * curHandle, const char * msg) { const Key * k = ksCurrent (ks); const size_t sizeOfStaticText = 100; char * warningMsg = elektraMalloc (keyGetNameSize (curHandle->mountpoint) + keyGetValueSize (curHandle->mountpoint) + keyGetNameSize (k) + strlen (msg) + sizeOfStaticText); strcpy (warningMsg, "drop key "); const char * name = keyName (k); if (name) { strcat (warningMsg, name); } else { strcat (warningMsg, "(no name)"); } strcat (warningMsg, " not belonging to "); strcat (warningMsg, keyName (curHandle->mountpoint)); strcat (warningMsg, " with name "); strcat (warningMsg, keyString (curHandle->mountpoint)); strcat (warningMsg, " because "); strcat (warningMsg, msg); ELEKTRA_ADD_WARNING (79, warningKey, warningMsg); elektraFree (warningMsg); cursor_t c = ksGetCursor (ks); keyDel (elektraKsPopAtCursor (ks, c)); ksSetCursor (ks, c); elektraKsPrev (ks); // next ksNext() will point correctly again }
/** * @brief Pop key at given cursor position * * @param ks the keyset to pop key from * @param c where to pop * * The internal cursor will be rewinded using ksRewind(). You can use * ksGetCursor() and ksSetCursor() jump back to the previous position. * e.g. to pop at current position within ksNext() loop: * @code * cursor_t c = ksGetCursor(ks); * keyDel (ksPopAtCursor(ks, c)); * ksSetCursor(ks, c); * ksPrev(ks); // to have correct key after next ksNext() * @endcode * * @warning do not use, will be superseded by external iterator API * * @return the popped key * @retval 0 if ks is 0 */ Key * ksPopAtCursor (KeySet * ks, cursor_t pos) { return elektraKsPopAtCursor (ks, pos); }