/* Copyright (C) 2011-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: dk3opt.ctr */ /** @file dk3opt.c The dk3opt module. */ #line 168 "dk3opt.ctr" #include "dk3all.h" #line 174 "dk3opt.ctr" /** Find index of character in options set. @param os Options set. @param c Character to search for. @param pind Pointer to destination variable. @return 1 on success, 0 on error. */ static int dk3opt_find_index_short( dk3_option_set_t const *os, dkChar c, size_t *pind ) { int back = 0; size_t i; #line 194 "dk3opt.ctr" if((os) && (pind)) { if((os->options) && (os->szoptions)) { for(i = 0; ((i < os->szoptions) && (back == 0)); i++) { if(((os->options)[i]).so == c) { *pind = i; back = 1; #line 199 "dk3opt.ctr" } } } } #line 203 "dk3opt.ctr" return back; } /** Find index of long option in options set. @param os Options set. @param t Long option name to search for. @param pind Pointer to destination variable. @return 1 on success, 0 on error. */ static int dk3opt_find_index_long( dk3_option_set_t const *os, dkChar const *t, size_t *pind ) { int back = 0; size_t i; #line 225 "dk3opt.ctr" if((os) && (t) && (pind)) { if((os->options) && (os->szoptions)) { for(i = 0; ((i < os->szoptions) && (back == 0)); i++) { if(((os->options)[i]).lo) { if(dk3str_cmp(((os->options)[i]).lo, t) == 0) { *pind = i; back = 1; #line 231 "dk3opt.ctr" } } } } } #line 236 "dk3opt.ctr" return back; } /** Apply the command line options to the options set. @param os Options set. @param argc Number of command line arguments. @param argv Command line arguments array. */ static void dk3opt_apply_options( dk3_option_set_t *os, int argc, dkChar const * const *argv ) { dkChar const * const *lfdptr; dkChar const *ptr; dkChar const *optr; dkChar const *cptr; int i; size_t j; int done; dkChar bu[2 * DK3_MAX_PATH]; dkChar *p1; #line 264 "dk3opt.ctr" lfdptr = argv; i = 0; while(i < argc) { optr = ptr = *lfdptr; if(*ptr == dkT('-')) { #line 268 "dk3opt.ctr" ptr++; if(*ptr == dkT('-')) { #line 270 "dk3opt.ctr" ptr++; if(dk3str_len(ptr) < DK3_SIZEOF(bu,dkChar)) { dk3str_cpy_not_overlapped(bu, ptr); p1 = dk3str_chr(bu, dkT('=')); if(p1) { *p1 = dkT('\0'); } done = 0; if(os->focl) { if(dk3str_cmp(os->focl, bu) == 0) { done = 1; cptr = dk3str_chr(ptr, dkT('=')); if(cptr) { cptr++; if(!(*cptr)) { cptr = NULL; } } if(!(cptr)) { lfdptr++; i++; if(i < argc) { cptr = *lfdptr; } } if(cptr) { (os->fo)[os->fou] = cptr; os->fou += 1; } else { /* ERROR: Option needs argument! */ os->ec = 1; if(os->app) { dk3app_log_i3(os->app, DK3_LL_ERROR, 133, 134, optr); } } } } if(!done) { if(dk3opt_find_index_long(os, bu, &j)) { (os->found)[j] += 1; if((os->found)[j] == 0) { /* Overflow */ (os->found)[j] = 0x7FFF; } if(((os->options)[j]).na) { cptr = dk3str_chr(ptr, dkT('=')); if(cptr) { cptr++; if(!(*cptr)) { cptr = NULL; } } if(!(cptr)) { lfdptr++; i++; if(i < argc) { cptr = *lfdptr; } } if(cptr) { if((os->optargs)[j]) { /* Warning: Redefinition */ /* os->ec = 1; */ if(os->app) { dk3app_log_i5( os->app, DK3_LL_WARNING, 206, 207, 208, (os->optargs)[j], cptr ); } } (os->optargs)[j] = cptr; } else { /* ERROR: Option needs argument! */ os->ec = 1; if(os->app) { dk3app_log_i3(os->app, DK3_LL_ERROR, 133, 134, optr); } } } } else { /* ERROR: Illegal option! */ os->ec = 1; if(os->app) { dk3app_log_i3(os->app, DK3_LL_ERROR, 139, 140, optr); } } } } else { /* ERROR: Option too long! */ os->ec = 1; if(os->app) { dk3app_log_i3(os->app, DK3_LL_ERROR, 135, 136, optr); } } } else { #line 351 "dk3opt.ctr" if(*ptr == os->foc) { #line 352 "dk3opt.ctr" ptr++; if(!(*ptr)) { ptr = NULL; lfdptr++; i++; if(i < argc) { ptr = *lfdptr; } } if(ptr) { (os->fo)[os->fou] = ptr; os->fou += 1; } else { /* ERROR: Option needs an argument! */ os->ec = 1; if(os->app) { dk3app_log_i3(os->app, DK3_LL_ERROR, 133, 134, optr); } } } else { #line 369 "dk3opt.ctr" if(dk3opt_find_index_short(os, *ptr, &j)) { (os->found)[j] += 1; if((os->found)[j] == 0) { /* Overflow */ (os->found)[j] = 0x7FFF; } if(((os->options)[j]).na) { ptr++; if(!(*ptr)) { ptr = NULL; lfdptr++; i++; if(i < argc) { ptr = *lfdptr; } } if(ptr) { if((os->optargs)[j]) { /* Warning: Redefinition of option. */ /* os->ec = 1; */ if(os->app) { dk3app_log_i5( os->app, DK3_LL_WARNING, 206, 207, 208, (os->optargs)[j], ptr ); } } (os->optargs)[j] = ptr; } else { /* ERROR: Option needs an argument! */ os->ec = 1; if(os->app) { dk3app_log_i3(os->app, DK3_LL_ERROR, 133, 134, optr); } } } else { ptr++; if(*ptr) { if((os->optargs)[j]) { if(os->app) { dk3app_log_i5( os->app, DK3_LL_WARNING, 206, 207, 208, (os->optargs)[j], ptr ); } } (os->optargs)[j] = ptr; } } } else { /* ERROR: Illegal option! */ os->ec = 1; if(os->app) { dk3app_log_i3(os->app, DK3_LL_ERROR, 139, 140, optr); } } } } } else { #line 424 "dk3opt.ctr" (os->args)[os->argsused] = ptr; os->argsused += 1; } lfdptr++; i++; } #line 429 "dk3opt.ctr" } dk3_option_set_t * dk3opt_open_app( dk3_option_t const *options, size_t szoptions, dkChar foc, dkChar const *focl, int argc, dkChar const * const *argv, dk3_app_t *app ) { dk3_option_set_t *back = NULL; int ok = 0; int i = 0; size_t j = 0; #line 449 "dk3opt.ctr" if((options) && (szoptions)) { #line 450 "dk3opt.ctr" back = dk3_new_app(dk3_option_set_t,1,app); if(back) { #line 452 "dk3opt.ctr" back->app = app; back->options = options; back->szoptions = szoptions; back->found = NULL; back->optargs = NULL; back->args = NULL; back->fo = NULL; back->foc = foc; back->focl = focl; back->argsav = 0; back->argsused = 0; back->foav = 0; back->fou = 0; back->ec = 0; back->found = dk3_new_app(int,szoptions,app); if(back->found) { #line 468 "dk3opt.ctr" for(j = 0; j < szoptions; j++) { (back->found)[j] = 0; } #line 471 "dk3opt.ctr" back->optargs = dk3_new_app(DK3_PCDKCHAR,szoptions,app); if(back->optargs) { #line 473 "dk3opt.ctr" for(j = 0; j < szoptions; j++) { (back->optargs)[j] = NULL; } if(argc) { back->args = dk3_new_app(DK3_PCDKCHAR,argc,app); if(back->args) { back->argsav = argc; for(i = 0; i < argc; i++) { (back->args)[i] = NULL; } back->fo = dk3_new_app(DK3_PCDKCHAR,argc,app); if(back->fo) { back->foav = argc; for(i = 0; i < argc; i++) { (back->fo)[i] = NULL; } ok = 1; #line 486 "dk3opt.ctr" dk3opt_apply_options(back, argc, argv); } } } else { ok = 1; } } else { #line 493 "dk3opt.ctr" } } else { #line 495 "dk3opt.ctr" } if(!ok) { dk3opt_close(back); back = NULL; } if(back) { if(back->ec) { if(app) { dk3app_log_i1(app, DK3_LL_ERROR, 252); } } } } } #line 508 "dk3opt.ctr" return back; } dk3_option_set_t * dk3opt_open_from_app( dk3_option_t const *options, size_t szoptions, dkChar foc, dkChar const *focl, dk3_app_t *app ) { dk3_option_set_t *back = NULL; dkChar const * const *argv; int argc; #line 526 "dk3opt.ctr" if((options) && (szoptions) && (app)) { argc = dk3app_get_argc(app); argv = dk3app_get_argv(app); argv++; argc--; back = dk3opt_open_app(options, szoptions, foc, focl, argc, argv, app); } #line 532 "dk3opt.ctr" return back; } int dk3opt_is_set( dk3_option_set_t const *optset, dkChar shortopt ) { int back = 0; size_t i; #line 546 "dk3opt.ctr" if(optset) { if(dk3opt_find_index_short(optset, shortopt, &i)) { if(optset->found) { back = (optset->found)[i]; } } } #line 553 "dk3opt.ctr" return back; } int dk3opt_is_set_long( dk3_option_set_t const *optset, dkChar const *longopt ) { int back = 0; size_t i; #line 567 "dk3opt.ctr" if((optset) && (longopt)) { if(dk3opt_find_index_long(optset, longopt, &i)) { if(optset->found) { back = (optset->found)[i]; #line 571 "dk3opt.ctr" } } } #line 574 "dk3opt.ctr" return back; } dkChar const * dk3opt_get_short_arg( dk3_option_set_t const *optset, dkChar shortopt ) { dkChar const *back = NULL; size_t i; #line 588 "dk3opt.ctr" if(optset) { if(dk3opt_find_index_short(optset, shortopt, &i)) { if(optset->options) { if(((optset->options)[i]).na) { if(optset->optargs) { back = (optset->optargs)[i]; } } } } } #line 599 "dk3opt.ctr" return back; } dkChar const * dk3opt_get_long_arg( dk3_option_set_t const *optset, dkChar const *longopt ) { dkChar const *back = NULL; size_t i; #line 613 "dk3opt.ctr" if((optset) && (longopt)) { if(dk3opt_find_index_long(optset, longopt, &i)) { if(optset->options) { if(((optset->options)[i]).na) { if(optset->optargs) { back = (optset->optargs)[i]; } } } } } #line 624 "dk3opt.ctr" return back; } int dk3opt_get_num_args( dk3_option_set_t const *optset ) { int back = 0; #line 636 "dk3opt.ctr" if(optset) { back = optset->argsused; } #line 639 "dk3opt.ctr" return back; } dkChar const * dk3opt_get_arg( dk3_option_set_t const *optset, int num ) { dkChar const *back = NULL; #line 652 "dk3opt.ctr" if((optset) && (num >= 0)) { if(num < optset->argsused) { if(optset->args) { back = (optset->args)[num]; } } } #line 659 "dk3opt.ctr" return back; } int dk3opt_get_num_fo( dk3_option_set_t const *os ) { int back = 0; #line 671 "dk3opt.ctr" if(os) { back = os->fou; } #line 674 "dk3opt.ctr" return back; } dkChar const * dk3opt_get_fo( dk3_option_set_t const *os, int num ) { dkChar const *back = NULL; #line 687 "dk3opt.ctr" if((os) && (num >= 0)) { if(num < os->fou) { if(os->fo) { back = (os->fo)[num]; } } } #line 694 "dk3opt.ctr" return back; } void dk3opt_close( dk3_option_set_t *os ) { int i; size_t j; #line 707 "dk3opt.ctr" if(os) { if(os->optargs) { for(j = 0; j < os->szoptions; j++) { (os->optargs)[j] = NULL; } #line 711 "dk3opt.ctr" dk3_delete(os->optargs); #line 713 "dk3opt.ctr" } os->optargs = NULL; if(os->found) { for(j = 0; j < os->szoptions; j++) { (os->found)[j] = 0;} #line 717 "dk3opt.ctr" dk3_delete(os->found); #line 719 "dk3opt.ctr" } os->found = NULL; if(os->args) { for(i = 0; i < os->argsav; i++) { (os->args)[i] = NULL; } #line 723 "dk3opt.ctr" dk3_delete(os->args); #line 725 "dk3opt.ctr" } os->args = NULL; if(os->fo) { for(i = 0; i < os->foav; i++) { (os->fo)[i] = NULL; } #line 729 "dk3opt.ctr" dk3_delete(os->fo); #line 731 "dk3opt.ctr" } os->fo = NULL; os->options = NULL; os->szoptions = 0; os->argsav = os->argsused = 0; os->foav = os->fou = 0; os->ec = 0; os->focl = NULL; os->foc = dkT('\0'); #line 740 "dk3opt.ctr" dk3_delete(os); #line 742 "dk3opt.ctr" } #line 743 "dk3opt.ctr" } int dk3opt_get_error_code(dk3_option_set_t const *os) { int back = 0; if(os) { back = os->ec; } return back; } void dk3opt_reset_error_code(dk3_option_set_t *os) { if(os) { os->ec = 0; } } /* vim: set ai sw=2 : */