summaryrefslogtreecommitdiff
path: root/support/dktools/dk4opt.ctr
diff options
context:
space:
mode:
authorNorbert Preining <norbert@preining.info>2020-10-12 03:04:00 +0000
committerNorbert Preining <norbert@preining.info>2020-10-12 03:04:00 +0000
commit0ce40abb18ec02ec6fd6bcc5f21612c88daa7578 (patch)
tree416289fe1448873fd8ca33051f50ad85bffa8aaa /support/dktools/dk4opt.ctr
parentfdb18507cd80dc17f5a5256153d34668b4f4e61c (diff)
CTAN sync 202010120303
Diffstat (limited to 'support/dktools/dk4opt.ctr')
-rw-r--r--support/dktools/dk4opt.ctr514
1 files changed, 0 insertions, 514 deletions
diff --git a/support/dktools/dk4opt.ctr b/support/dktools/dk4opt.ctr
deleted file mode 100644
index cc4579c15c..0000000000
--- a/support/dktools/dk4opt.ctr
+++ /dev/null
@@ -1,514 +0,0 @@
-%% options
-
-copyright owner = Dirk Krause
-copyright year = 2015-xxxx
-SPDX-License-Identifier: BSD-3-Clause
-
-
-
-%% header
-
-/** @file
- Process command line option in simple programs.
- You can specify a set of allowed options including the option
- arguments types. After processing command line arguments you
- can simply check which options were used and obtain option
- argument values.
-*/
-
-
-#ifndef DK4CONF_H_INCLUDED
-#if DK4_BUILDING_DKTOOLS4
-#include "dk4conf.h"
-#else
-#include <dktools-4/dk4conf.h>
-#endif
-#endif
-
-#ifndef DK4TYPES_H_INCLUDED
-#if DK4_BUILDING_DKTOOLS4
-#include "dk4types.h"
-#else
-#include <dktools-4/dk4types.h>
-#endif
-#endif
-
-#ifndef DK4ERROR_H_INCLUDED
-#if DK4_BUILDING_DKTOOLS4
-#include "dk4error.h"
-#else
-#include <dktools-4/dk4error.h>
-#endif
-#endif
-
-/** Option specification for application module.
-*/
-typedef struct {
- dkChar c; /**< Short option character. */
- const dkChar *longopt; /**< Long option string. */
- int argtype; /**< Argument type. */
-} dk4_option_specification_t;
-
-/** Option values can be different types.
-*/
-typedef union {
- dkChar *t; /**< String value. */
- double d; /**< Double value. */
- dk4_im_t i; /**< Integer value. */
- dk4_um_t u; /**< Unsigned integer value. */
- size_t s; /**< Size value. */
- int b; /**< Boolean value. */
-} dk4_option_value_t;
-
-/** Option with value.
-*/
-typedef struct {
- dk4_option_specification_t spec; /**< Option specification. */
- dk4_option_value_t val; /**< Option value. */
- int found; /**< Flag: Option found in cmd line. */
-} dk4_option_t;
-
-
-/** Argument types.
-*/
-enum {
- /** No argument expected.
- */
-DK4_OPT_ARG_NONE = 1,
-
- /** Boolean value expected.
- */
-DK4_OPT_ARG_BOOL ,
-
- /** Size specification expected.
- */
-DK4_OPT_ARG_SIZE ,
-
- /** Signed integer value expected.
- */
-DK4_OPT_ARG_INT ,
-
- /** Unsigned integer value expected.
- */
-DK4_OPT_ARG_UNSIGNED ,
-
- /** Double value expected.
- */
-DK4_OPT_ARG_DOUBLE ,
-
- /** String value expected.
- */
-DK4_OPT_ARG_STRING
-};
-
-
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/** Create option object.
- CRT on Windows: Optional.
- @param spec Specifications for the option.
- @param erp Error report, may be NULL.
- @return Pointer to new option object on success, NULL on error.
-
- Error codes:
- - DK4_E_INVALID_ARGUMENTS<br>
- if spec is NULL,
- - DK4_E_SYNTAX<br>
- if neither short nor long option is defined in spec,
- - DK4_E_MEMORY<br>
- if the memory allocation failed.
-*/
-dk4_option_t *
-dk4opt_open(const dk4_option_specification_t *spec, dk4_er_t *erp);
-
-/** Retrieve boolean value (as int) from option.
- CRT on Windows: Optional.
- @param dptr Pointer to destination variable.
- @param optptr Option to retrieve value from.
- @param erp Error report, may be NULL.
- @return 1 on success, 0 on error.
-
- Error codes:
- - DK4_E_INVALID_ARGUMENTS<br>
- if dptr or optptr is NULL or optptr is configured for another data
- type,
- - DK4_E_NOT_FOUND<br>
- if the option was not specified on the command line,
- - DK4_E_SYNTAX<br>
- if a string is stored not representing a boolean or the option was
- configured with an incompatible type.
-*/
-int
-dk4opt_get_bool(int *dptr, dk4_option_t const *optptr, dk4_er_t *erp);
-
-/** Retrieve size_t value from option.
- CRT on Windows: Optional.
- @param dptr Pointer to destination variable.
- @param optptr Option to retrieve value from.
- @param erp Error report, may be NULL.
- @return 1 on success, 0 on error.
-
- Error codes:
- - DK4_E_INVALID_ARGUMENTS<br>
- if dptr or optptr is NULL or optptr is configured for another data
- type,
- - DK4_E_NOT_FOUND<br>
- if the option was not specified on the command line,
- - DK4_E_SYNTAX<br>
- if the option was configured for an incompatible type or the option
- argument string can not be converted to a size_t,
- - DK4_E_MATH_OVERFLOW<br>
- if the option was configured for another numeric type and conversion
- results in an overflow.
-*/
-int
-dk4opt_get_size(size_t *dptr, dk4_option_t const *optptr, dk4_er_t *erp);
-
-/** Retrieve integer value (dk4_im_t) from option.
- CRT on Windows: Optional.
- @param dptr Pointer to destination variable.
- @param optptr Option to retrieve value from.
- @param erp Error report, may be NULL.
- @return 1 on success, 0 on error.
-
- Error codes:
- - DK4_E_INVALID_ARGUMENTS<br>
- if dptr or optptr is NULL or optptr is configured for another data
- type,
- - DK4_E_NOT_FOUND<br>
- if the option was not specified on the command line,
- - DK4_E_SYNTAX<br>
- if the option was configured for an incompatible type or the option
- argument string does not represent an integer number,
- - DK4_E_MATH_OVERFLOW<br>
- if the option was configured for another numeric type and conversion
- results in an overflow.
-*/
-int
-dk4opt_get_int(dk4_im_t *dptr, dk4_option_t const *optptr, dk4_er_t *erp);
-
-/** Retrieve unsigned integer value (dk4_um_t) from option.
- CRT on Windows: Optional.
- @param dptr Pointer to destination variable.
- @param optptr Option to retrieve value from.
- @param erp Error report, may be NULL.
- @return 1 on success, 0 on error.
-
- Error codes:
- - DK4_E_INVALID_ARGUMENTS<br>
- if dptr or optptr is NULL or optptr is configured for another data
- type,
- - DK4_E_NOT_FOUND<br>
- if the option was not specified on the command line,
- - DK4_E_SYNTAX<br>
- if the option was configured for an incompatible data type or the
- option string does not represent an integer number,
- - DK4_E_MATH_OVERFLOW<br>
- if the option was configured for an incompatible numeric type and a
- negative value is stored.
-*/
-int
-dk4opt_get_unsigned(dk4_um_t *dptr, dk4_option_t const *optptr, dk4_er_t *erp);
-
-/** Retrieve double value from option.
- CRT on Windows: Optional.
- @param dptr Pointer to destination variable.
- @param optptr Option to retrieve value from.
- @param erp Error report, may be NULL.
- @return 1 on success, 0 on error.
-
- Error codes:
- - DK4_E_INVALID_ARGUMENTS<br>
- if dptr or optptr is NULL or optptr is configured for another data
- type,
- - DK4_E_NOT_FOUND<br>
- if the option was not specified on the command line,
- - DK4_E_SYNTAX<br>
- if the option was configured for an incompatible data type or the
- string stored as option argument does not represent a double number.
-*/
-int
-dk4opt_get_double(double *dptr, dk4_option_t const *optptr, dk4_er_t *erp);
-
-/** Retrieve string value from option.
- CRT on Windows: Optional, disabling CRT reduces functionality
- as we can not convert double values to strings.
- @param dptr Pointer to destination buffer.
- @param szdptr Size of destination buffer (number of dkChar).
- @param optptr Option to retrieve value from.
- @param erp Error report, may be NULL.
- @return 1 on success, 0 on error.
-
- Error codes:
- - DK4_E_INVALID_ARGUMENTS<br>
- if dptr or optptr is NULL or optptr is configured for another data
- type,
- - DK4_E_NOT_FOUND<br>
- if the option was not specified on the command line.
- - DK4_E_SYNTAX<br>
- if the option was configured for an incompatible data type,
- - DK4_E_BUFFER_TOO_SMALL<br>
- if the destination buffer is too small to hold a conversion result,
- - DK4_E_NOT_SUPPORTED<br>
- if the option was configured for the double data type and the use of
- sprintf() was denied during setup.
-*/
-int
-dk4opt_get_string(
- dkChar *dptr, size_t szdptr, dk4_option_t const *optptr, dk4_er_t *erp
-);
-
-/** Destroy option object, release memory.
- CRT on Windows: Optional.
- @param optptr Option object to destroy.
-*/
-void
-dk4opt_close(dk4_option_t *optptr);
-
-/** Compare option against other option or char or string.
- CRT on Windows: Optional.
- @param l Left pointer, always an option.
- @param r Right pointer, type depends on cr.
- @param cr Comparison criteria:
- 0=option/option by short character,
- 1=option/character,
- 2=option/option by long option text,
- 3=option/text.
- @return Comparison result.
-*/
-int
-dk4option_compare(const void *l, const void *r, int cr);
-
-/** Process command line options provided to the main function.
- @param optptr Options array.
- @param szoptptr Number of elements in array.
- @param argc Number of command line arguments.
- @param argv Command line arguments array.
- @param filenames Pointer array to store file names.
- @param nfilenames Elements in array (in: size, out: used).
- @param progname Flag: Argument 0 is program name.
- @param logstderr Flag: Logging to stderr allowed.
- @param erp Error report, may be NULL.
- @return 1 on success, 0 on error.
-*/
-int
-dk4opt_process_argv(
- dk4_option_t *optptr,
- size_t szoptptr,
- int argc,
- dkChar *argv[],
- dkChar **filenames,
- size_t *nfilenames,
- int progname,
- int logstderr,
- dk4_er_t *erp
-);
-
-#ifdef __cplusplus
-}
-#endif
-
-%% module
-
-
-
-#include "dk4conf.h"
-#include "dk4opt.h"
-#include "dk4strd.h"
-#include "dk4mem.h"
-
-#if DK4_HAVE_ASSERT_H
-#ifndef ASSERT_H_INCLUDED
-#include <assert.h>
-#define ASSERT_H_INCLUDED 1
-#endif
-#endif
-
-
-$!trace-include
-
-
-
-/** 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)
-{
- $? "+ dk4opt_close"
-#if DK4_USE_ASSERT
- assert(NULL != optptr);
-#endif
- if (NULL != optptr) { $? ". valid option ptr"
- /*
- 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);
- }
- $? "- dk4opt_close"
-}
-
-
-
-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;
-}
-
-