static void setSubOrderNumber(Key *key, const char *oldOrder) { char *lastIndexPtr = NULL; char *newOrder = elektraMalloc(elektraStrLen(oldOrder)+ELEKTRA_MAX_ARRAY_SIZE); if ((lastIndexPtr = strrchr(oldOrder, '/'))) { kdb_long_long_t subIndex = 0; char *ptr = lastIndexPtr; ++ptr; //skip / ++ptr; //skip # while (*ptr == '_') { ++ptr; } elektraReadArrayNumber(ptr, &subIndex); ++subIndex; int len = (lastIndexPtr+1) - oldOrder; char buffer[ELEKTRA_MAX_ARRAY_SIZE]; elektraWriteArrayNumber(buffer, subIndex); sprintf(newOrder, "%.*s%s", len, oldOrder, buffer); } else { sprintf(newOrder, "%s/#1", oldOrder); } keySetMeta(key, "order", newOrder); elektraFree(newOrder); }
static void setOrderNumber(Key *parentKey, Key *key) { kdb_long_long_t order = 0; const Key *orderKey = keyGetMeta(parentKey, "order"); if (orderKey != NULL) { char *ptr = (char *)keyString(orderKey); ++ptr; //skip # while (*ptr == '_') { ++ptr; } elektraReadArrayNumber(ptr, &order); } ++order; char buffer[ELEKTRA_MAX_ARRAY_SIZE]; elektraWriteArrayNumber(buffer, order); keySetMeta(key, "order", buffer); keySetMeta(parentKey, "order", buffer); }
/** * @brief Increment the name of the key by one * * Alphabetical order will remain * * e.g. user/abc/\#9 will be changed to * user/abc/\#_10 * * For the start: * user/abc/\# * will be changed to * user/abc/\#0 * * @param key which base name will be incremented * * @retval -1 on error (e.g. too large array, not validated array) * @retval 0 on success */ int elektraArrayIncName(Key *key) { const char * baseName = keyBaseName(key); int arrayElement = elektraArrayValidateName(key); if (arrayElement == -1) { return -1; } ++baseName; // jump over # while(*baseName == '_') // jump over all _ { ++baseName; } kdb_long_long_t oldIndex = 0; if (!arrayElement) { // we have a start element oldIndex = -1; } else { if (elektraReadArrayNumber(baseName, &oldIndex) == -1) { return -1; } } kdb_long_long_t newIndex = oldIndex+1; // we increment by one char newName[ELEKTRA_MAX_ARRAY_SIZE]; elektraWriteArrayNumber(newName, newIndex); keySetBaseName(key, newName); return 0; }