/* Copyright (C) 2015-2020, Dirk Krause SPDX-License-Identifier: BSD-3-Clause */ /* WARNING: This file was generated by the dkct program (see http://dktools.sourceforge.net/ for details). Changes you make here will be lost if dkct is run again! You should modify the original source and run dkct on it. Original source: dk4dbit8.ctr */ /** @file dk4dbit8.c The dk4dbit8 module. */ #line 159 "dk4dbit8.ctr" #include "dk4conf.h" #if DK4_HAVE_ASSERT_H #ifndef ASSERT_H_INCLUDED #include #define ASSERT_H_INCLUDED 1 #endif #endif #include "dk4str8.h" #include "dk4dbit8.h" #include "dk4maasz.h" #line 176 "dk4dbit8.ctr" /** Object for database traversal. */ typedef struct { void *obj; /**< Object for string traversal. */ dk4dbi_c8_traverse_fct_t *fct; /**< String traversal function. */ } dk4dbi_c8_traversal_object_t; int dk4dbi_c8_del( dk4_dbi_t *db, const char *k, dk4_er_t *erp ) { dk4_er_t er; /* Internal error report for size calc */ size_t ks = 0; /* Key size */ int back = 0; #line 199 "dk4dbit8.ctr" if ((NULL != db) && (NULL != k)) { dk4error_init(&er); ks = dk4ma_size_t_add(1, dk4str8_len(k), &er); if (DK4_E_NONE == er.ec) { back = dk4dbi_delete(db, k, ks, erp); } else { dk4error_copy(erp, &er); } } else { dk4error_set_simple_error_code(erp, DK4_E_INVALID_ARGUMENTS); } #line 210 "dk4dbit8.ctr" return back; } int dk4dbi_c8_set( dk4_dbi_t *db, const char *k, const char *v, dk4_er_t *erp ) { dk4_er_t er; /* Internal error report for size calc */ size_t ks = 0; /* Key size */ size_t vs = 0; /* Value size */ int back = 0; #line 228 "dk4dbit8.ctr" if ((NULL != db) && (NULL != k)) { #line 229 "dk4dbit8.ctr" if (NULL != v) { #line 230 "dk4dbit8.ctr" dk4error_init(&er); ks = dk4ma_size_t_add(1, dk4str8_len(k), &er); vs = dk4ma_size_t_add(1, dk4str8_len(v), &er); if (DK4_E_NONE == er.ec) { #line 234 "dk4dbit8.ctr" back = dk4dbi_set(db, k, ks, v, vs, erp); } else { #line 236 "dk4dbit8.ctr" dk4error_copy(erp, &er); } } else { #line 239 "dk4dbit8.ctr" back = dk4dbi_c8_del(db, k, erp); } } else { #line 242 "dk4dbit8.ctr" dk4error_set_simple_error_code(erp, DK4_E_INVALID_ARGUMENTS); } #line 244 "dk4dbit8.ctr" return back; } int dk4dbi_c8_get( dk4_dbi_t *db, const char *k, char *vbuf, size_t vsz, dk4_er_t *erp ) { dk4_er_t er; /* Internal error report for size calc */ size_t ks = 0; /* Key size */ size_t ressz = 0; /* Result size */ int back = 0; #line 264 "dk4dbit8.ctr" if ((NULL != vbuf) && (0 < vsz)) { *vbuf = '\0'; } if ((NULL != db) && (NULL != k) && (NULL != vbuf) && (0 < vsz)) { dk4error_init(&er); #line 267 "dk4dbit8.ctr" ressz = vsz; ks = dk4ma_size_t_add(1, dk4str8_len(k), &er); if (DK4_E_NONE == er.ec) { #line 270 "dk4dbit8.ctr" if (0 != dk4dbi_get(db, k, ks, vbuf, &ressz, erp)) { #line 271 "dk4dbit8.ctr" if (0 < ressz) { #line 272 "dk4dbit8.ctr" if ('\0' == vbuf[ressz - 1]) { back = 1; #line 274 "dk4dbit8.ctr" } else { if (ressz < vsz) { vbuf[ressz] = '\0'; back = 1; #line 278 "dk4dbit8.ctr" } else { #line 279 "dk4dbit8.ctr" *vbuf = '\0'; dk4error_set_simple_error_code(erp, DK4_E_BUFFER_TOO_SMALL); } } } else { #line 284 "dk4dbit8.ctr" *vbuf = '\0'; dk4error_set_simple_error_code(erp, DK4_E_NOT_FOUND); } } #if TRACE_DEBUG else { #line 290 "dk4dbit8.ctr" } #endif } else { #line 293 "dk4dbit8.ctr" dk4error_copy(erp, &er); } } else { #line 296 "dk4dbit8.ctr" dk4error_set_simple_error_code(erp, DK4_E_INVALID_ARGUMENTS); } #line 298 "dk4dbit8.ctr" return back; } /** Function to traverse a simple database. The function must check the kb, ks, vb and vs arguments for validity, they are passed as found by the backend functions (this means pointers may be NULL, sizes may be 0). @param Object modified during traversal, may be NULL. @param kb Key data. @param ks Key size. @param vb Value data. @param vs Value size. @return 1 on success, 0 on error (can continue), -1 on error (abort). */ static int dk4dbi_c8_internal_traverse( void *obj, const void *kb, size_t ks, const void *vb, size_t vs ) { dk4dbi_c8_traversal_object_t *myobj; /* Passed from dk4dbi_traverse() */ const char *pk; /* Key pointer */ const char *pv; /* Value pointer */ int back = 0; #line 329 "dk4dbit8.ctr" if ((NULL != obj) && (NULL != kb) && (NULL != vb) && (0 < ks) && (0 < vs)) { pk = (const char *)kb; pv = (const char *)vb; if (('\0' == pk[ks - 1]) && ('\0' == pv[vs - 1])) { myobj = (dk4dbi_c8_traversal_object_t *)obj; back = (*(myobj->fct))(myobj->obj, pk, pv); } } #line 337 "dk4dbit8.ctr" return back; } int dk4dbi_c8_traverse( dk4_dbi_t *db, void *obj, dk4dbi_c8_traverse_fct_t *fct ) { dk4dbi_c8_traversal_object_t myobj; /* Passed to dk4dbi_traverse */ int back = -1; #line 353 "dk4dbit8.ctr" if ((NULL != db) && (NULL != fct)) { myobj.obj = obj; myobj.fct = fct; back = dk4dbi_traverse(db, &myobj, dk4dbi_c8_internal_traverse); } #line 358 "dk4dbit8.ctr" return back; }