/* 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: dk4opt.ctr */ /** @file dk4opt.c The dk4opt module. */ #line 315 "dk4opt.ctr" #include "dk4conf.h" #include "dk4opt.h" #include "dk4strd.h" #include "dk4mem.h" #if DK4_HAVE_ASSERT_H #ifndef ASSERT_H_INCLUDED #include #define ASSERT_H_INCLUDED 1 #endif #endif #line 332 "dk4opt.ctr" /** Compare two options by short option. @param olp Left option structure. @param orp Right option structure. @return Comparison result. */ static int dk4option_short_compare(const dk4_option_t *olp, const dk4_option_t *orp) { int back = 0; if ((olp->spec).c > (orp->spec).c) { back = 1; } else { if ((olp->spec).c < (orp->spec).c) { back = -1; } } return back; } /** Compare two options by long option. @param olp Left option structure. @param orp Right option structure. @return Comparison result. */ static int dk4option_long_compare(const dk4_option_t *olp, const dk4_option_t *orp) { int back = 0; if (NULL != (olp->spec).longopt) { if (NULL != (orp->spec).longopt) { back = dk4str_cmp((olp->spec).longopt, (orp->spec).longopt); if (-1 > back) back = -1; if ( 1 < back) back = 1; } else { back = 1; } } else { if (NULL != (orp->spec).longopt) { back = -1; } } return back; } int dk4option_compare(const void *l, const void *r, int cr) { const dk4_option_t *olp; const dk4_option_t *orp; const dkChar *cp; int back = 0; if (NULL != l) { olp = (const dk4_option_t *)l; if (NULL != r) { switch (cr) { case 3: { cp = (const dkChar *)r; if (NULL != (olp->spec).longopt) { back = dk4str_cmp((olp->spec).longopt, cp); if (-1 > back) back = -1; if ( 1 < back) back = 1; } else { back = -1; } } break; case 2: { orp = (const dk4_option_t *)r; back = dk4option_long_compare(olp, orp); if (0 == back) { back = dk4option_short_compare(olp, orp); } } break; case 1: { cp = (const dkChar *)r; if ((olp->spec).c > *cp) { back = 1; } else { if ((olp->spec).c < *cp) { back = -1; } } } break; default: { orp = (const dk4_option_t *)r; back = dk4option_short_compare(olp, orp); if (0 == back) { back = dk4option_long_compare(olp, orp); } } break; } } else { back = 1; } } else { if (NULL != r) { back = -1; } } return back; } void dk4opt_close(dk4_option_t *optptr) { #line 449 "dk4opt.ctr" #if DK4_USE_ASSERT assert(NULL != optptr); #endif if (NULL != optptr) { #line 453 "dk4opt.ctr" /* We can not sanitize the memory for option name and option value as the option name is constant and the option value was provided by the shell and is owned by the shell. */ (optptr->spec).longopt = NULL; (optptr->val).t = NULL; dk4mem_free(optptr); } #line 463 "dk4opt.ctr" } dk4_option_t * dk4opt_open(const dk4_option_specification_t *spec, dk4_er_t *erp) { dk4_option_t *back = NULL; #if DK4_USE_ASSERT assert(NULL != spec); #endif if (NULL != spec) { if ((NULL != spec->longopt) || (dkT('\0') != spec->c)) { back = dk4mem_new(dk4_option_t,1,NULL); if (NULL != back) { DK4_MEMCPY(&(back->spec),spec,sizeof(dk4_option_specification_t)); back->found = 0; switch ((back->spec).argtype) { case DK4_OPT_ARG_BOOL: { (back->val).b = 0; } break; case DK4_OPT_ARG_SIZE: { (back->val).s = 0; } break; case DK4_OPT_ARG_INT: { (back->val).i = (dk4_im_t)0L; } break; case DK4_OPT_ARG_UNSIGNED: { (back->val).u = (dk4_um_t)0UL; } break; case DK4_OPT_ARG_DOUBLE: { (back->val).d = 0.0; } break; case DK4_OPT_ARG_STRING: { (back->val).t = NULL; } break; } } else { dk4error_set_elsize_nelem( erp, DK4_E_MEMORY_ALLOCATION_FAILED, sizeof(dk4_option_t), 1 ); } } else { dk4error_set_simple_error_code(erp, DK4_E_SYNTAX); } } else { dk4error_set_simple_error_code(erp, DK4_E_INVALID_ARGUMENTS); } return back; }