2019-06-18 13:36:57 +03:00
/*
File autogenerated by gengetopt version 2.22 .6
generated with the following command :
gengetopt - - file - name = transop_ewald_cmdline
The developers of gengetopt consider the fixed text that goes in all
gengetopt output files to be in the public domain :
we make no copyright claims on it .
*/
/* If we use autoconf. */
# ifdef HAVE_CONFIG_H
# include "config.h"
# endif
# include <stdio.h>
# include <stdlib.h>
# include <string.h>
# ifndef FIX_UNUSED
# define FIX_UNUSED(X) (void) (X) /* avoid warnings for unused params */
# endif
# include <getopt.h>
# include "transop_ewald_cmdline.h"
const char * gengetopt_args_info_purpose = " Computes Ewald-summed VSWF translation matrix elements in arbitrary 2D-periodic \n infinite lattices. " ;
const char * gengetopt_args_info_usage = " Usage: qpms-translations-ewald32 [OPTIONS]... " ;
const char * gengetopt_args_info_versiontext = " " ;
const char * gengetopt_args_info_description = " " ;
const char * gengetopt_args_info_detailed_help [ ] = {
" -h, --help Print help and exit " ,
" --detailed-help Print help, including all details and hidden \n options, and exit " ,
" -V, --version Print version and exit " ,
" -o, --output=STRING Output file (default=`') " ,
" Path to the output file. If not specified, print to the standard output. " ,
2019-06-18 15:52:28 +03:00
" -b, --base-vector=X,Y Base vector " ,
" Single base vector (two numbers separated by comma) " ,
2019-06-18 13:36:57 +03:00
" -E, --error-estimate-output=STRING \n Path to the output with error estimates " ,
" -N, --normalisation=ENUM VSWF normalisation convention (possible \n values= \" Power \" , \" None \" , \" SH \" \n default=`Power') " ,
" -c, --csphase=INT Whether the Condon-Shortley phase is included \n in VSWF definition (-1) or not (+1) \n (possible values= \" +1 \" , \" -1 \" default=`-1') " ,
" -e, --Ewald-parameter=DOUBLE The value of Ewald parameter η " ,
2019-06-18 14:48:39 +03:00
" -u, --frequency-unit=ENUM Specifies the frequency unit is used for \n inputs. (possible values= \" eV \" , \" scuff \" \n default=`scuff') " ,
2019-06-18 13:36:57 +03:00
" -L, --lMax=INT Maximum spherical multipole order to which the \n translation operator elements are calculated " ,
2019-06-18 15:52:28 +03:00
" -n, --refractive-index=DOUBLE Medium refractive index " ,
" -p, --particle=X,Y Specify the x and y coordinates of a single \n particle; If not specified, one particle per \n unit cell is assumed. " ,
2019-06-18 13:36:57 +03:00
" \n Mode: k_omega_points \n Specifying each (ω, k) pair separately. " ,
2019-06-18 14:48:39 +03:00
" -T, --pointfile=STRING Path to a file containing frequency, k_x, k_y \n triples(separated by white spaces). If not \n specified, read them from stdin. \n (default=`-') " ,
2019-06-18 15:52:28 +03:00
" -t, --point=ω,k_x,k_y Specifies a frequency, k_x, k_y triple, \n separated by commas. " ,
2019-06-18 13:36:57 +03:00
" \n Mode: k_omega_meshgrid \n Specifying lists of ω and k, from which all possible pairs are generated. " ,
2019-06-18 14:48:39 +03:00
" -F, --omegafile=STRING Path to a file containing a list of \n frequenciesseparated by whitespaces. " ,
2019-06-18 15:52:28 +03:00
" -f, --omega=ω1[,ω2[,...]] Specifies frequency (or multiple frequencies \n separated by commas) on the command line. " ,
2019-06-18 14:48:39 +03:00
" -K, --kfile=STRING Path to a file containing a list of k_x, k_y \n pairs. (default=`-') " ,
2019-06-18 15:52:28 +03:00
" -k, --k=k1_x,k1_y[,k2_x,k2_y[,...]] \n Specifies pair(s) of k_x, k_y values " ,
2019-06-18 13:36:57 +03:00
0
} ;
static void
init_help_array ( void )
{
gengetopt_args_info_help [ 0 ] = gengetopt_args_info_detailed_help [ 0 ] ;
gengetopt_args_info_help [ 1 ] = gengetopt_args_info_detailed_help [ 1 ] ;
gengetopt_args_info_help [ 2 ] = gengetopt_args_info_detailed_help [ 2 ] ;
gengetopt_args_info_help [ 3 ] = gengetopt_args_info_detailed_help [ 3 ] ;
gengetopt_args_info_help [ 4 ] = gengetopt_args_info_detailed_help [ 5 ] ;
2019-06-18 15:52:28 +03:00
gengetopt_args_info_help [ 5 ] = gengetopt_args_info_detailed_help [ 7 ] ;
gengetopt_args_info_help [ 6 ] = gengetopt_args_info_detailed_help [ 8 ] ;
gengetopt_args_info_help [ 7 ] = gengetopt_args_info_detailed_help [ 9 ] ;
gengetopt_args_info_help [ 8 ] = gengetopt_args_info_detailed_help [ 10 ] ;
gengetopt_args_info_help [ 9 ] = gengetopt_args_info_detailed_help [ 11 ] ;
gengetopt_args_info_help [ 10 ] = gengetopt_args_info_detailed_help [ 12 ] ;
gengetopt_args_info_help [ 11 ] = gengetopt_args_info_detailed_help [ 13 ] ;
gengetopt_args_info_help [ 12 ] = gengetopt_args_info_detailed_help [ 14 ] ;
gengetopt_args_info_help [ 13 ] = gengetopt_args_info_detailed_help [ 15 ] ;
gengetopt_args_info_help [ 14 ] = gengetopt_args_info_detailed_help [ 16 ] ;
gengetopt_args_info_help [ 15 ] = gengetopt_args_info_detailed_help [ 17 ] ;
gengetopt_args_info_help [ 16 ] = gengetopt_args_info_detailed_help [ 18 ] ;
gengetopt_args_info_help [ 17 ] = gengetopt_args_info_detailed_help [ 19 ] ;
gengetopt_args_info_help [ 18 ] = gengetopt_args_info_detailed_help [ 20 ] ;
gengetopt_args_info_help [ 19 ] = gengetopt_args_info_detailed_help [ 21 ] ;
gengetopt_args_info_help [ 20 ] = gengetopt_args_info_detailed_help [ 22 ] ;
gengetopt_args_info_help [ 21 ] = 0 ;
2019-06-18 13:36:57 +03:00
}
2019-06-18 15:52:28 +03:00
const char * gengetopt_args_info_help [ 22 ] ;
2019-06-18 13:36:57 +03:00
typedef enum { ARG_NO
, ARG_STRING
, ARG_INT
, ARG_DOUBLE
, ARG_ENUM
} cmdline_parser_arg_type ;
static
void clear_given ( struct gengetopt_args_info * args_info ) ;
static
void clear_args ( struct gengetopt_args_info * args_info ) ;
static int
cmdline_parser_internal ( int argc , char * * argv , struct gengetopt_args_info * args_info ,
struct cmdline_parser_params * params , const char * additional_error ) ;
static int
cmdline_parser_required2 ( struct gengetopt_args_info * args_info , const char * prog_name , const char * additional_error ) ;
const char * cmdline_parser_normalisation_values [ ] = { " Power " , " None " , " SH " , 0 } ; /*< Possible values for normalisation. */
const char * cmdline_parser_csphase_values [ ] = { " +1 " , " -1 " , 0 } ; /*< Possible values for csphase. */
const char * cmdline_parser_frequency_unit_values [ ] = { " eV " , " scuff " , 0 } ; /*< Possible values for frequency-unit. */
static char *
gengetopt_strdup ( const char * s ) ;
static
void clear_given ( struct gengetopt_args_info * args_info )
{
args_info - > help_given = 0 ;
args_info - > detailed_help_given = 0 ;
args_info - > version_given = 0 ;
args_info - > output_given = 0 ;
2019-06-18 15:52:28 +03:00
args_info - > base_vector_given = 0 ;
2019-06-18 13:36:57 +03:00
args_info - > error_estimate_output_given = 0 ;
args_info - > normalisation_given = 0 ;
args_info - > csphase_given = 0 ;
args_info - > Ewald_parameter_given = 0 ;
args_info - > frequency_unit_given = 0 ;
args_info - > lMax_given = 0 ;
2019-06-18 15:52:28 +03:00
args_info - > refractive_index_given = 0 ;
2019-06-18 13:36:57 +03:00
args_info - > particle_given = 0 ;
args_info - > pointfile_given = 0 ;
args_info - > point_given = 0 ;
args_info - > omegafile_given = 0 ;
args_info - > omega_given = 0 ;
args_info - > kfile_given = 0 ;
args_info - > k_given = 0 ;
args_info - > k_omega_meshgrid_mode_counter = 0 ;
args_info - > k_omega_points_mode_counter = 0 ;
}
static
void clear_args ( struct gengetopt_args_info * args_info )
{
FIX_UNUSED ( args_info ) ;
args_info - > output_arg = gengetopt_strdup ( " " ) ;
args_info - > output_orig = NULL ;
2019-06-18 15:52:28 +03:00
args_info - > base_vector_arg = NULL ;
args_info - > base_vector_orig = NULL ;
2019-06-18 13:36:57 +03:00
args_info - > error_estimate_output_arg = NULL ;
args_info - > error_estimate_output_orig = NULL ;
args_info - > normalisation_arg = normalisation_arg_Power ;
args_info - > normalisation_orig = NULL ;
args_info - > csphase_arg = - 1 ;
args_info - > csphase_orig = NULL ;
args_info - > Ewald_parameter_orig = NULL ;
2019-06-18 14:48:39 +03:00
args_info - > frequency_unit_arg = frequency_unit_arg_scuff ;
2019-06-18 13:36:57 +03:00
args_info - > frequency_unit_orig = NULL ;
args_info - > lMax_orig = NULL ;
2019-06-18 15:52:28 +03:00
args_info - > refractive_index_orig = NULL ;
2019-06-18 14:48:39 +03:00
args_info - > particle_arg = NULL ;
args_info - > particle_orig = NULL ;
args_info - > pointfile_arg = NULL ;
args_info - > pointfile_orig = NULL ;
args_info - > point_arg = NULL ;
args_info - > point_orig = NULL ;
args_info - > omegafile_arg = NULL ;
args_info - > omegafile_orig = NULL ;
args_info - > omega_arg = NULL ;
args_info - > omega_orig = NULL ;
args_info - > kfile_arg = NULL ;
args_info - > kfile_orig = NULL ;
args_info - > k_arg = NULL ;
args_info - > k_orig = NULL ;
2019-06-18 13:36:57 +03:00
}
static
void init_args_info ( struct gengetopt_args_info * args_info )
{
init_help_array ( ) ;
args_info - > help_help = gengetopt_args_info_detailed_help [ 0 ] ;
args_info - > detailed_help_help = gengetopt_args_info_detailed_help [ 1 ] ;
args_info - > version_help = gengetopt_args_info_detailed_help [ 2 ] ;
args_info - > output_help = gengetopt_args_info_detailed_help [ 3 ] ;
2019-06-18 15:52:28 +03:00
args_info - > base_vector_help = gengetopt_args_info_detailed_help [ 5 ] ;
2019-06-19 02:44:26 +03:00
args_info - > base_vector_min = 2 ;
args_info - > base_vector_max = 2 ;
2019-06-18 15:52:28 +03:00
args_info - > error_estimate_output_help = gengetopt_args_info_detailed_help [ 7 ] ;
args_info - > normalisation_help = gengetopt_args_info_detailed_help [ 8 ] ;
args_info - > csphase_help = gengetopt_args_info_detailed_help [ 9 ] ;
args_info - > Ewald_parameter_help = gengetopt_args_info_detailed_help [ 10 ] ;
args_info - > frequency_unit_help = gengetopt_args_info_detailed_help [ 11 ] ;
args_info - > lMax_help = gengetopt_args_info_detailed_help [ 12 ] ;
args_info - > refractive_index_help = gengetopt_args_info_detailed_help [ 13 ] ;
args_info - > particle_help = gengetopt_args_info_detailed_help [ 14 ] ;
2019-06-18 13:36:57 +03:00
args_info - > particle_min = 0 ;
args_info - > particle_max = 0 ;
2019-06-18 15:52:28 +03:00
args_info - > pointfile_help = gengetopt_args_info_detailed_help [ 16 ] ;
2019-06-18 13:36:57 +03:00
args_info - > pointfile_min = 0 ;
args_info - > pointfile_max = 0 ;
2019-06-18 15:52:28 +03:00
args_info - > point_help = gengetopt_args_info_detailed_help [ 17 ] ;
2019-06-18 13:36:57 +03:00
args_info - > point_min = 0 ;
args_info - > point_max = 0 ;
2019-06-18 15:52:28 +03:00
args_info - > omegafile_help = gengetopt_args_info_detailed_help [ 19 ] ;
2019-06-18 13:36:57 +03:00
args_info - > omegafile_min = 0 ;
args_info - > omegafile_max = 0 ;
2019-06-18 15:52:28 +03:00
args_info - > omega_help = gengetopt_args_info_detailed_help [ 20 ] ;
2019-06-18 13:36:57 +03:00
args_info - > omega_min = 0 ;
args_info - > omega_max = 0 ;
2019-06-18 15:52:28 +03:00
args_info - > kfile_help = gengetopt_args_info_detailed_help [ 21 ] ;
2019-06-18 13:36:57 +03:00
args_info - > kfile_min = 0 ;
args_info - > kfile_max = 0 ;
2019-06-18 15:52:28 +03:00
args_info - > k_help = gengetopt_args_info_detailed_help [ 22 ] ;
2019-06-18 13:36:57 +03:00
args_info - > k_min = 0 ;
args_info - > k_max = 0 ;
}
void
cmdline_parser_print_version ( void )
{
printf ( " %s %s \n " ,
( strlen ( CMDLINE_PARSER_PACKAGE_NAME ) ? CMDLINE_PARSER_PACKAGE_NAME : CMDLINE_PARSER_PACKAGE ) ,
CMDLINE_PARSER_VERSION ) ;
if ( strlen ( gengetopt_args_info_versiontext ) > 0 )
printf ( " \n %s \n " , gengetopt_args_info_versiontext ) ;
}
static void print_help_common ( void ) {
cmdline_parser_print_version ( ) ;
if ( strlen ( gengetopt_args_info_purpose ) > 0 )
printf ( " \n %s \n " , gengetopt_args_info_purpose ) ;
if ( strlen ( gengetopt_args_info_usage ) > 0 )
printf ( " \n %s \n " , gengetopt_args_info_usage ) ;
printf ( " \n " ) ;
if ( strlen ( gengetopt_args_info_description ) > 0 )
printf ( " %s \n \n " , gengetopt_args_info_description ) ;
}
void
cmdline_parser_print_help ( void )
{
int i = 0 ;
print_help_common ( ) ;
while ( gengetopt_args_info_help [ i ] )
printf ( " %s \n " , gengetopt_args_info_help [ i + + ] ) ;
}
void
cmdline_parser_print_detailed_help ( void )
{
int i = 0 ;
print_help_common ( ) ;
while ( gengetopt_args_info_detailed_help [ i ] )
printf ( " %s \n " , gengetopt_args_info_detailed_help [ i + + ] ) ;
}
void
cmdline_parser_init ( struct gengetopt_args_info * args_info )
{
clear_given ( args_info ) ;
clear_args ( args_info ) ;
init_args_info ( args_info ) ;
}
void
cmdline_parser_params_init ( struct cmdline_parser_params * params )
{
if ( params )
{
params - > override = 0 ;
params - > initialize = 1 ;
params - > check_required = 1 ;
params - > check_ambiguity = 0 ;
params - > print_errors = 1 ;
}
}
struct cmdline_parser_params *
cmdline_parser_params_create ( void )
{
struct cmdline_parser_params * params =
( struct cmdline_parser_params * ) malloc ( sizeof ( struct cmdline_parser_params ) ) ;
cmdline_parser_params_init ( params ) ;
return params ;
}
static void
free_string_field ( char * * s )
{
if ( * s )
{
free ( * s ) ;
* s = 0 ;
}
}
2019-06-18 14:48:39 +03:00
/** @brief generic value variable */
union generic_value {
int int_arg ;
double double_arg ;
char * string_arg ;
const char * default_string_arg ;
} ;
/** @brief holds temporary values for multiple options */
struct generic_list
{
union generic_value arg ;
char * orig ;
struct generic_list * next ;
} ;
/**
* @ brief add a node at the head of the list
*/
static void add_node ( struct generic_list * * list ) {
struct generic_list * new_node = ( struct generic_list * ) malloc ( sizeof ( struct generic_list ) ) ;
new_node - > next = * list ;
* list = new_node ;
new_node - > arg . string_arg = 0 ;
new_node - > orig = 0 ;
}
static void
free_multiple_string_field ( unsigned int len , char * * * arg , char * * * orig )
{
unsigned int i ;
if ( * arg ) {
for ( i = 0 ; i < len ; + + i )
{
free_string_field ( & ( ( * arg ) [ i ] ) ) ;
free_string_field ( & ( ( * orig ) [ i ] ) ) ;
}
free_string_field ( & ( ( * arg ) [ 0 ] ) ) ; /* free default string */
free ( * arg ) ;
* arg = 0 ;
free ( * orig ) ;
* orig = 0 ;
}
}
2019-06-18 13:36:57 +03:00
static void
cmdline_parser_release ( struct gengetopt_args_info * args_info )
{
free_string_field ( & ( args_info - > output_arg ) ) ;
free_string_field ( & ( args_info - > output_orig ) ) ;
2019-06-18 15:52:28 +03:00
free_multiple_string_field ( args_info - > base_vector_given , & ( args_info - > base_vector_arg ) , & ( args_info - > base_vector_orig ) ) ;
2019-06-18 13:36:57 +03:00
free_string_field ( & ( args_info - > error_estimate_output_arg ) ) ;
free_string_field ( & ( args_info - > error_estimate_output_orig ) ) ;
free_string_field ( & ( args_info - > normalisation_orig ) ) ;
free_string_field ( & ( args_info - > csphase_orig ) ) ;
free_string_field ( & ( args_info - > Ewald_parameter_orig ) ) ;
free_string_field ( & ( args_info - > frequency_unit_orig ) ) ;
free_string_field ( & ( args_info - > lMax_orig ) ) ;
2019-06-18 15:52:28 +03:00
free_string_field ( & ( args_info - > refractive_index_orig ) ) ;
2019-06-18 14:48:39 +03:00
free_multiple_string_field ( args_info - > particle_given , & ( args_info - > particle_arg ) , & ( args_info - > particle_orig ) ) ;
free_multiple_string_field ( args_info - > pointfile_given , & ( args_info - > pointfile_arg ) , & ( args_info - > pointfile_orig ) ) ;
free_multiple_string_field ( args_info - > point_given , & ( args_info - > point_arg ) , & ( args_info - > point_orig ) ) ;
free_multiple_string_field ( args_info - > omegafile_given , & ( args_info - > omegafile_arg ) , & ( args_info - > omegafile_orig ) ) ;
free_multiple_string_field ( args_info - > omega_given , & ( args_info - > omega_arg ) , & ( args_info - > omega_orig ) ) ;
free_multiple_string_field ( args_info - > kfile_given , & ( args_info - > kfile_arg ) , & ( args_info - > kfile_orig ) ) ;
free_multiple_string_field ( args_info - > k_given , & ( args_info - > k_arg ) , & ( args_info - > k_orig ) ) ;
2019-06-18 13:36:57 +03:00
clear_given ( args_info ) ;
}
/**
* @ param val the value to check
* @ param values the possible values
* @ return the index of the matched value :
* - 1 if no value matched ,
* - 2 if more than one value has matched
*/
static int
check_possible_values ( const char * val , const char * values [ ] )
{
int i , found , last ;
size_t len ;
if ( ! val ) /* otherwise strlen() crashes below */
return - 1 ; /* -1 means no argument for the option */
found = last = 0 ;
for ( i = 0 , len = strlen ( val ) ; values [ i ] ; + + i )
{
if ( strncmp ( val , values [ i ] , len ) = = 0 )
{
+ + found ;
last = i ;
if ( strlen ( values [ i ] ) = = len )
return i ; /* exact macth no need to check more */
}
}
if ( found = = 1 ) /* one match: OK */
return last ;
return ( found ? - 2 : - 1 ) ; /* return many values or none matched */
}
static void
write_into_file ( FILE * outfile , const char * opt , const char * arg , const char * values [ ] )
{
int found = - 1 ;
if ( arg ) {
if ( values ) {
found = check_possible_values ( arg , values ) ;
}
if ( found > = 0 )
fprintf ( outfile , " %s= \" %s \" # %s \n " , opt , arg , values [ found ] ) ;
else
fprintf ( outfile , " %s= \" %s \" \n " , opt , arg ) ;
} else {
fprintf ( outfile , " %s \n " , opt ) ;
}
}
static void
write_multiple_into_file ( FILE * outfile , int len , const char * opt , char * * arg , const char * values [ ] )
{
int i ;
for ( i = 0 ; i < len ; + + i )
write_into_file ( outfile , opt , ( arg ? arg [ i ] : 0 ) , values ) ;
}
int
cmdline_parser_dump ( FILE * outfile , struct gengetopt_args_info * args_info )
{
int i = 0 ;
if ( ! outfile )
{
fprintf ( stderr , " %s: cannot dump options to stream \n " , CMDLINE_PARSER_PACKAGE ) ;
return EXIT_FAILURE ;
}
if ( args_info - > help_given )
write_into_file ( outfile , " help " , 0 , 0 ) ;
if ( args_info - > detailed_help_given )
write_into_file ( outfile , " detailed-help " , 0 , 0 ) ;
if ( args_info - > version_given )
write_into_file ( outfile , " version " , 0 , 0 ) ;
if ( args_info - > output_given )
write_into_file ( outfile , " output " , args_info - > output_orig , 0 ) ;
2019-06-18 15:52:28 +03:00
write_multiple_into_file ( outfile , args_info - > base_vector_given , " base-vector " , args_info - > base_vector_orig , 0 ) ;
2019-06-18 13:36:57 +03:00
if ( args_info - > error_estimate_output_given )
write_into_file ( outfile , " error-estimate-output " , args_info - > error_estimate_output_orig , 0 ) ;
if ( args_info - > normalisation_given )
write_into_file ( outfile , " normalisation " , args_info - > normalisation_orig , cmdline_parser_normalisation_values ) ;
if ( args_info - > csphase_given )
write_into_file ( outfile , " csphase " , args_info - > csphase_orig , cmdline_parser_csphase_values ) ;
if ( args_info - > Ewald_parameter_given )
write_into_file ( outfile , " Ewald-parameter " , args_info - > Ewald_parameter_orig , 0 ) ;
if ( args_info - > frequency_unit_given )
write_into_file ( outfile , " frequency-unit " , args_info - > frequency_unit_orig , cmdline_parser_frequency_unit_values ) ;
if ( args_info - > lMax_given )
write_into_file ( outfile , " lMax " , args_info - > lMax_orig , 0 ) ;
2019-06-18 15:52:28 +03:00
if ( args_info - > refractive_index_given )
write_into_file ( outfile , " refractive-index " , args_info - > refractive_index_orig , 0 ) ;
2019-06-18 14:48:39 +03:00
write_multiple_into_file ( outfile , args_info - > particle_given , " particle " , args_info - > particle_orig , 0 ) ;
write_multiple_into_file ( outfile , args_info - > pointfile_given , " pointfile " , args_info - > pointfile_orig , 0 ) ;
write_multiple_into_file ( outfile , args_info - > point_given , " point " , args_info - > point_orig , 0 ) ;
write_multiple_into_file ( outfile , args_info - > omegafile_given , " omegafile " , args_info - > omegafile_orig , 0 ) ;
write_multiple_into_file ( outfile , args_info - > omega_given , " omega " , args_info - > omega_orig , 0 ) ;
write_multiple_into_file ( outfile , args_info - > kfile_given , " kfile " , args_info - > kfile_orig , 0 ) ;
write_multiple_into_file ( outfile , args_info - > k_given , " k " , args_info - > k_orig , 0 ) ;
2019-06-18 13:36:57 +03:00
i = EXIT_SUCCESS ;
return i ;
}
int
cmdline_parser_file_save ( const char * filename , struct gengetopt_args_info * args_info )
{
FILE * outfile ;
int i = 0 ;
outfile = fopen ( filename , " w " ) ;
if ( ! outfile )
{
fprintf ( stderr , " %s: cannot open file for writing: %s \n " , CMDLINE_PARSER_PACKAGE , filename ) ;
return EXIT_FAILURE ;
}
i = cmdline_parser_dump ( outfile , args_info ) ;
fclose ( outfile ) ;
return i ;
}
void
cmdline_parser_free ( struct gengetopt_args_info * args_info )
{
cmdline_parser_release ( args_info ) ;
}
/** @brief replacement of strdup, which is not standard */
char *
gengetopt_strdup ( const char * s )
{
char * result = 0 ;
if ( ! s )
return result ;
result = ( char * ) malloc ( strlen ( s ) + 1 ) ;
if ( result = = ( char * ) 0 )
return ( char * ) 0 ;
strcpy ( result , s ) ;
return result ;
}
2019-06-18 14:48:39 +03:00
static char *
get_multiple_arg_token ( const char * arg )
{
const char * tok ;
char * ret ;
size_t len , num_of_escape , i , j ;
if ( ! arg )
return 0 ;
tok = strchr ( arg , ' , ' ) ;
num_of_escape = 0 ;
/* make sure it is not escaped */
while ( tok )
{
if ( * ( tok - 1 ) = = ' \\ ' )
{
/* find the next one */
tok = strchr ( tok + 1 , ' , ' ) ;
+ + num_of_escape ;
}
else
break ;
}
if ( tok )
len = ( size_t ) ( tok - arg + 1 ) ;
else
len = strlen ( arg ) + 1 ;
len - = num_of_escape ;
ret = ( char * ) malloc ( len ) ;
i = 0 ;
j = 0 ;
while ( arg [ i ] & & ( j < len - 1 ) )
{
if ( arg [ i ] = = ' \\ ' & &
arg [ i + 1 ] & &
arg [ i + 1 ] = = ' , ' )
+ + i ;
ret [ j + + ] = arg [ i + + ] ;
}
ret [ len - 1 ] = ' \0 ' ;
return ret ;
}
static const char *
get_multiple_arg_token_next ( const char * arg )
{
const char * tok ;
if ( ! arg )
return 0 ;
tok = strchr ( arg , ' , ' ) ;
/* make sure it is not escaped */
while ( tok )
{
if ( * ( tok - 1 ) = = ' \\ ' )
{
/* find the next one */
tok = strchr ( tok + 1 , ' , ' ) ;
}
else
break ;
}
if ( ! tok | | strlen ( tok ) = = 1 )
return 0 ;
return tok + 1 ;
}
2019-06-18 13:36:57 +03:00
static int
check_multiple_option_occurrences ( const char * prog_name , unsigned int option_given , unsigned int min , unsigned int max , const char * option_desc ) ;
int
check_multiple_option_occurrences ( const char * prog_name , unsigned int option_given , unsigned int min , unsigned int max , const char * option_desc )
{
int error_occurred = 0 ;
if ( option_given & & ( min > 0 | | max > 0 ) )
{
if ( min > 0 & & max > 0 )
{
if ( min = = max )
{
/* specific occurrences */
if ( option_given ! = ( unsigned int ) min )
{
fprintf ( stderr , " %s: %s option occurrences must be %d \n " ,
prog_name , option_desc , min ) ;
error_occurred = 1 ;
}
}
else if ( option_given < ( unsigned int ) min
| | option_given > ( unsigned int ) max )
{
/* range occurrences */
fprintf ( stderr , " %s: %s option occurrences must be between %d and %d \n " ,
prog_name , option_desc , min , max ) ;
error_occurred = 1 ;
}
}
else if ( min > 0 )
{
/* at least check */
if ( option_given < min )
{
fprintf ( stderr , " %s: %s option occurrences must be at least %d \n " ,
prog_name , option_desc , min ) ;
error_occurred = 1 ;
}
}
else if ( max > 0 )
{
/* at most check */
if ( option_given > max )
{
fprintf ( stderr , " %s: %s option occurrences must be at most %d \n " ,
prog_name , option_desc , max ) ;
error_occurred = 1 ;
}
}
}
return error_occurred ;
}
int
cmdline_parser ( int argc , char * * argv , struct gengetopt_args_info * args_info )
{
return cmdline_parser2 ( argc , argv , args_info , 0 , 1 , 1 ) ;
}
int
cmdline_parser_ext ( int argc , char * * argv , struct gengetopt_args_info * args_info ,
struct cmdline_parser_params * params )
{
int result ;
result = cmdline_parser_internal ( argc , argv , args_info , params , 0 ) ;
if ( result = = EXIT_FAILURE )
{
cmdline_parser_free ( args_info ) ;
exit ( EXIT_FAILURE ) ;
}
return result ;
}
int
cmdline_parser2 ( int argc , char * * argv , struct gengetopt_args_info * args_info , int override , int initialize , int check_required )
{
int result ;
struct cmdline_parser_params params ;
params . override = override ;
params . initialize = initialize ;
params . check_required = check_required ;
params . check_ambiguity = 0 ;
params . print_errors = 1 ;
result = cmdline_parser_internal ( argc , argv , args_info , & params , 0 ) ;
if ( result = = EXIT_FAILURE )
{
cmdline_parser_free ( args_info ) ;
exit ( EXIT_FAILURE ) ;
}
return result ;
}
int
cmdline_parser_required ( struct gengetopt_args_info * args_info , const char * prog_name )
{
int result = EXIT_SUCCESS ;
if ( cmdline_parser_required2 ( args_info , prog_name , 0 ) > 0 )
result = EXIT_FAILURE ;
if ( result = = EXIT_FAILURE )
{
cmdline_parser_free ( args_info ) ;
exit ( EXIT_FAILURE ) ;
}
return result ;
}
int
cmdline_parser_required2 ( struct gengetopt_args_info * args_info , const char * prog_name , const char * additional_error )
{
int error_occurred = 0 ;
FIX_UNUSED ( additional_error ) ;
/* checks for required options */
2019-06-18 15:52:28 +03:00
if ( ! args_info - > base_vector_given )
{
fprintf ( stderr , " %s: '--base-vector' ('-b') option required%s \n " , prog_name , ( additional_error ? additional_error : " " ) ) ;
error_occurred = 1 ;
}
if ( check_multiple_option_occurrences ( prog_name , args_info - > base_vector_given , args_info - > base_vector_min , args_info - > base_vector_max , " '--base-vector' ('-b') " ) )
error_occurred = 1 ;
2019-06-18 13:36:57 +03:00
if ( ! args_info - > normalisation_given )
{
fprintf ( stderr , " %s: '--normalisation' ('-N') option required%s \n " , prog_name , ( additional_error ? additional_error : " " ) ) ;
error_occurred = 1 ;
}
if ( ! args_info - > csphase_given )
{
fprintf ( stderr , " %s: '--csphase' ('-c') option required%s \n " , prog_name , ( additional_error ? additional_error : " " ) ) ;
error_occurred = 1 ;
}
if ( ! args_info - > frequency_unit_given )
{
fprintf ( stderr , " %s: '--frequency-unit' ('-u') option required%s \n " , prog_name , ( additional_error ? additional_error : " " ) ) ;
error_occurred = 1 ;
}
if ( ! args_info - > lMax_given )
{
fprintf ( stderr , " %s: '--lMax' ('-L') option required%s \n " , prog_name , ( additional_error ? additional_error : " " ) ) ;
error_occurred = 1 ;
}
2019-06-18 15:52:28 +03:00
if ( ! args_info - > refractive_index_given )
2019-06-18 13:36:57 +03:00
{
2019-06-18 15:52:28 +03:00
fprintf ( stderr , " %s: '--refractive-index' ('-n') option required%s \n " , prog_name , ( additional_error ? additional_error : " " ) ) ;
2019-06-18 13:36:57 +03:00
error_occurred = 1 ;
}
if ( check_multiple_option_occurrences ( prog_name , args_info - > particle_given , args_info - > particle_min , args_info - > particle_max , " '--particle' ('-p') " ) )
error_occurred = 1 ;
if ( args_info - > k_omega_points_mode_counter & & ! args_info - > pointfile_given )
{
fprintf ( stderr , " %s: '--pointfile' ('-T') option required%s \n " , prog_name , ( additional_error ? additional_error : " " ) ) ;
error_occurred = 1 ;
}
if ( args_info - > k_omega_points_mode_counter & & check_multiple_option_occurrences ( prog_name , args_info - > pointfile_given , args_info - > pointfile_min , args_info - > pointfile_max , " '--pointfile' ('-T') " ) )
error_occurred = 1 ;
if ( args_info - > k_omega_points_mode_counter & & check_multiple_option_occurrences ( prog_name , args_info - > point_given , args_info - > point_min , args_info - > point_max , " '--point' ('-t') " ) )
error_occurred = 1 ;
if ( args_info - > k_omega_meshgrid_mode_counter & & check_multiple_option_occurrences ( prog_name , args_info - > omegafile_given , args_info - > omegafile_min , args_info - > omegafile_max , " '--omegafile' ('-F') " ) )
error_occurred = 1 ;
if ( args_info - > k_omega_meshgrid_mode_counter & & check_multiple_option_occurrences ( prog_name , args_info - > omega_given , args_info - > omega_min , args_info - > omega_max , " '--omega' ('-f') " ) )
error_occurred = 1 ;
if ( args_info - > k_omega_meshgrid_mode_counter & & check_multiple_option_occurrences ( prog_name , args_info - > kfile_given , args_info - > kfile_min , args_info - > kfile_max , " '--kfile' ('-K') " ) )
error_occurred = 1 ;
if ( args_info - > k_omega_meshgrid_mode_counter & & check_multiple_option_occurrences ( prog_name , args_info - > k_given , args_info - > k_min , args_info - > k_max , " '--k' ('-k') " ) )
error_occurred = 1 ;
/* checks for dependences among options */
return error_occurred ;
}
static char * package_name = 0 ;
/**
* @ brief updates an option
* @ param field the generic pointer to the field to update
* @ param orig_field the pointer to the orig field
* @ param field_given the pointer to the number of occurrence of this option
* @ param prev_given the pointer to the number of occurrence already seen
* @ param value the argument for this option ( if null no arg was specified )
* @ param possible_values the possible values for this option ( if specified )
* @ param default_value the default value ( in case the option only accepts fixed values )
* @ param arg_type the type of this option
* @ param check_ambiguity @ see cmdline_parser_params . check_ambiguity
* @ param override @ see cmdline_parser_params . override
* @ param no_free whether to free a possible previous value
* @ param multiple_option whether this is a multiple option
* @ param long_opt the corresponding long option
* @ param short_opt the corresponding short option ( or ' - ' if none )
* @ param additional_error possible further error specification
*/
static
int update_arg ( void * field , char * * orig_field ,
unsigned int * field_given , unsigned int * prev_given ,
char * value , const char * possible_values [ ] ,
const char * default_value ,
cmdline_parser_arg_type arg_type ,
int check_ambiguity , int override ,
int no_free , int multiple_option ,
const char * long_opt , char short_opt ,
const char * additional_error )
{
char * stop_char = 0 ;
const char * val = value ;
int found ;
char * * string_field ;
FIX_UNUSED ( field ) ;
stop_char = 0 ;
found = 0 ;
if ( ! multiple_option & & prev_given & & ( * prev_given | | ( check_ambiguity & & * field_given ) ) )
{
if ( short_opt ! = ' - ' )
fprintf ( stderr , " %s: `--%s' (`-%c') option given more than once%s \n " ,
package_name , long_opt , short_opt ,
( additional_error ? additional_error : " " ) ) ;
else
fprintf ( stderr , " %s: `--%s' option given more than once%s \n " ,
package_name , long_opt ,
( additional_error ? additional_error : " " ) ) ;
return 1 ; /* failure */
}
if ( possible_values & & ( found = check_possible_values ( ( value ? value : default_value ) , possible_values ) ) < 0 )
{
if ( short_opt ! = ' - ' )
fprintf ( stderr , " %s: %s argument, \" %s \" , for option `--%s' (`-%c')%s \n " ,
package_name , ( found = = - 2 ) ? " ambiguous " : " invalid " , value , long_opt , short_opt ,
( additional_error ? additional_error : " " ) ) ;
else
fprintf ( stderr , " %s: %s argument, \" %s \" , for option `--%s'%s \n " ,
package_name , ( found = = - 2 ) ? " ambiguous " : " invalid " , value , long_opt ,
( additional_error ? additional_error : " " ) ) ;
return 1 ; /* failure */
}
if ( field_given & & * field_given & & ! override )
return 0 ;
if ( prev_given )
( * prev_given ) + + ;
if ( field_given )
( * field_given ) + + ;
if ( possible_values )
val = possible_values [ found ] ;
switch ( arg_type ) {
case ARG_INT :
if ( val ) * ( ( int * ) field ) = strtol ( val , & stop_char , 0 ) ;
break ;
case ARG_DOUBLE :
if ( val ) * ( ( double * ) field ) = strtod ( val , & stop_char ) ;
break ;
case ARG_ENUM :
if ( val ) * ( ( int * ) field ) = found ;
break ;
case ARG_STRING :
if ( val ) {
string_field = ( char * * ) field ;
if ( ! no_free & & * string_field )
free ( * string_field ) ; /* free previous string */
* string_field = gengetopt_strdup ( val ) ;
}
break ;
default :
break ;
} ;
/* check numeric conversion */
switch ( arg_type ) {
case ARG_INT :
case ARG_DOUBLE :
if ( val & & ! ( stop_char & & * stop_char = = ' \0 ' ) ) {
fprintf ( stderr , " %s: invalid numeric value: %s \n " , package_name , val ) ;
return 1 ; /* failure */
}
break ;
default :
;
} ;
/* store the original value */
switch ( arg_type ) {
case ARG_NO :
break ;
default :
if ( value & & orig_field ) {
if ( no_free ) {
* orig_field = value ;
} else {
if ( * orig_field )
free ( * orig_field ) ; /* free previous string */
* orig_field = gengetopt_strdup ( value ) ;
}
}
} ;
return 0 ; /* OK */
}
2019-06-18 14:48:39 +03:00
/**
* @ brief store information about a multiple option in a temporary list
* @ param list where to ( temporarily ) store multiple options
*/
static
int update_multiple_arg_temp ( struct generic_list * * list ,
unsigned int * prev_given , const char * val ,
const char * possible_values [ ] , const char * default_value ,
cmdline_parser_arg_type arg_type ,
const char * long_opt , char short_opt ,
const char * additional_error )
{
/* store single arguments */
char * multi_token ;
const char * multi_next ;
if ( arg_type = = ARG_NO ) {
( * prev_given ) + + ;
return 0 ; /* OK */
}
multi_token = get_multiple_arg_token ( val ) ;
multi_next = get_multiple_arg_token_next ( val ) ;
while ( 1 )
{
add_node ( list ) ;
if ( update_arg ( ( void * ) & ( ( * list ) - > arg ) , & ( ( * list ) - > orig ) , 0 ,
prev_given , multi_token , possible_values , default_value ,
arg_type , 0 , 1 , 1 , 1 , long_opt , short_opt , additional_error ) ) {
if ( multi_token ) free ( multi_token ) ;
return 1 ; /* failure */
}
if ( multi_next )
{
multi_token = get_multiple_arg_token ( multi_next ) ;
multi_next = get_multiple_arg_token_next ( multi_next ) ;
}
else
break ;
}
return 0 ; /* OK */
}
/**
* @ brief free the passed list ( including possible string argument )
*/
static
void free_list ( struct generic_list * list , short string_arg )
{
if ( list ) {
struct generic_list * tmp ;
while ( list )
{
tmp = list ;
if ( string_arg & & list - > arg . string_arg )
free ( list - > arg . string_arg ) ;
if ( list - > orig )
free ( list - > orig ) ;
list = list - > next ;
free ( tmp ) ;
}
}
}
/**
* @ brief updates a multiple option starting from the passed list
*/
static
void update_multiple_arg ( void * field , char * * * orig_field ,
unsigned int field_given , unsigned int prev_given , union generic_value * default_value ,
cmdline_parser_arg_type arg_type ,
struct generic_list * list )
{
int i ;
struct generic_list * tmp ;
if ( prev_given & & list ) {
* orig_field = ( char * * ) realloc ( * orig_field , ( field_given + prev_given ) * sizeof ( char * ) ) ;
switch ( arg_type ) {
case ARG_INT :
case ARG_ENUM :
* ( ( int * * ) field ) = ( int * ) realloc ( * ( ( int * * ) field ) , ( field_given + prev_given ) * sizeof ( int ) ) ; break ;
case ARG_DOUBLE :
* ( ( double * * ) field ) = ( double * ) realloc ( * ( ( double * * ) field ) , ( field_given + prev_given ) * sizeof ( double ) ) ; break ;
case ARG_STRING :
* ( ( char * * * ) field ) = ( char * * ) realloc ( * ( ( char * * * ) field ) , ( field_given + prev_given ) * sizeof ( char * ) ) ; break ;
default :
break ;
} ;
for ( i = ( prev_given - 1 ) ; i > = 0 ; - - i )
{
tmp = list ;
switch ( arg_type ) {
case ARG_INT :
( * ( ( int * * ) field ) ) [ i + field_given ] = tmp - > arg . int_arg ; break ;
case ARG_DOUBLE :
( * ( ( double * * ) field ) ) [ i + field_given ] = tmp - > arg . double_arg ; break ;
case ARG_ENUM :
( * ( ( int * * ) field ) ) [ i + field_given ] = tmp - > arg . int_arg ; break ;
case ARG_STRING :
( * ( ( char * * * ) field ) ) [ i + field_given ] = tmp - > arg . string_arg ; break ;
default :
break ;
}
( * orig_field ) [ i + field_given ] = list - > orig ;
list = list - > next ;
free ( tmp ) ;
}
} else { /* set the default value */
if ( default_value & & ! field_given ) {
switch ( arg_type ) {
case ARG_INT :
case ARG_ENUM :
if ( ! * ( ( int * * ) field ) ) {
* ( ( int * * ) field ) = ( int * ) malloc ( sizeof ( int ) ) ;
( * ( ( int * * ) field ) ) [ 0 ] = default_value - > int_arg ;
}
break ;
case ARG_DOUBLE :
if ( ! * ( ( double * * ) field ) ) {
* ( ( double * * ) field ) = ( double * ) malloc ( sizeof ( double ) ) ;
( * ( ( double * * ) field ) ) [ 0 ] = default_value - > double_arg ;
}
break ;
case ARG_STRING :
if ( ! * ( ( char * * * ) field ) ) {
* ( ( char * * * ) field ) = ( char * * ) malloc ( sizeof ( char * ) ) ;
( * ( ( char * * * ) field ) ) [ 0 ] = gengetopt_strdup ( default_value - > string_arg ) ;
}
break ;
default : break ;
}
if ( ! ( * orig_field ) ) {
* orig_field = ( char * * ) malloc ( sizeof ( char * ) ) ;
( * orig_field ) [ 0 ] = 0 ;
}
}
}
}
2019-06-18 13:36:57 +03:00
static int check_modes (
int given1 [ ] , const char * options1 [ ] ,
int given2 [ ] , const char * options2 [ ] )
{
int i = 0 , j = 0 , errors = 0 ;
while ( given1 [ i ] > = 0 ) {
if ( given1 [ i ] ) {
while ( given2 [ j ] > = 0 ) {
if ( given2 [ j ] ) {
+ + errors ;
fprintf ( stderr , " %s: option %s conflicts with option %s \n " ,
package_name , options1 [ i ] , options2 [ j ] ) ;
}
+ + j ;
}
}
+ + i ;
}
return errors ;
}
int
cmdline_parser_internal (
int argc , char * * argv , struct gengetopt_args_info * args_info ,
struct cmdline_parser_params * params , const char * additional_error )
{
int c ; /* Character of the parsed option. */
union generic_value multiple_default_value ;
2019-06-18 15:52:28 +03:00
struct generic_list * base_vector_list = NULL ;
2019-06-18 14:48:39 +03:00
struct generic_list * particle_list = NULL ;
struct generic_list * pointfile_list = NULL ;
struct generic_list * point_list = NULL ;
struct generic_list * omegafile_list = NULL ;
struct generic_list * omega_list = NULL ;
struct generic_list * kfile_list = NULL ;
struct generic_list * k_list = NULL ;
2019-06-18 13:36:57 +03:00
int error_occurred = 0 ;
struct gengetopt_args_info local_args_info ;
int override ;
int initialize ;
int check_required ;
int check_ambiguity ;
package_name = argv [ 0 ] ;
override = params - > override ;
initialize = params - > initialize ;
check_required = params - > check_required ;
check_ambiguity = params - > check_ambiguity ;
if ( initialize )
cmdline_parser_init ( args_info ) ;
cmdline_parser_init ( & local_args_info ) ;
optarg = 0 ;
optind = 0 ;
opterr = params - > print_errors ;
optopt = ' ? ' ;
while ( 1 )
{
int option_index = 0 ;
static struct option long_options [ ] = {
{ " help " , 0 , NULL , ' h ' } ,
{ " detailed-help " , 0 , NULL , 0 } ,
{ " version " , 0 , NULL , ' V ' } ,
{ " output " , 1 , NULL , ' o ' } ,
2019-06-18 15:52:28 +03:00
{ " base-vector " , 1 , NULL , ' b ' } ,
2019-06-18 13:36:57 +03:00
{ " error-estimate-output " , 1 , NULL , ' E ' } ,
{ " normalisation " , 1 , NULL , ' N ' } ,
{ " csphase " , 1 , NULL , ' c ' } ,
{ " Ewald-parameter " , 1 , NULL , ' e ' } ,
{ " frequency-unit " , 1 , NULL , ' u ' } ,
{ " lMax " , 1 , NULL , ' L ' } ,
2019-06-18 15:52:28 +03:00
{ " refractive-index " , 1 , NULL , ' n ' } ,
2019-06-18 14:48:39 +03:00
{ " particle " , 1 , NULL , ' p ' } ,
{ " pointfile " , 1 , NULL , ' T ' } ,
{ " point " , 1 , NULL , ' t ' } ,
{ " omegafile " , 1 , NULL , ' F ' } ,
{ " omega " , 1 , NULL , ' f ' } ,
{ " kfile " , 1 , NULL , ' K ' } ,
{ " k " , 1 , NULL , ' k ' } ,
2019-06-18 13:36:57 +03:00
{ 0 , 0 , 0 , 0 }
} ;
2019-06-18 15:52:28 +03:00
c = getopt_long ( argc , argv , " hVo:b:E:N:c:e:u:L:n:p:T:t:F:f:K:k: " , long_options , & option_index ) ;
2019-06-18 13:36:57 +03:00
if ( c = = - 1 ) break ; /* Exit from `while (1)' loop. */
switch ( c )
{
case ' h ' : /* Print help and exit. */
cmdline_parser_print_help ( ) ;
cmdline_parser_free ( & local_args_info ) ;
exit ( EXIT_SUCCESS ) ;
case ' V ' : /* Print version and exit. */
cmdline_parser_print_version ( ) ;
cmdline_parser_free ( & local_args_info ) ;
exit ( EXIT_SUCCESS ) ;
case ' o ' : /* Output file. */
if ( update_arg ( ( void * ) & ( args_info - > output_arg ) ,
& ( args_info - > output_orig ) , & ( args_info - > output_given ) ,
& ( local_args_info . output_given ) , optarg , 0 , " " , ARG_STRING ,
check_ambiguity , override , 0 , 0 ,
" output " , ' o ' ,
additional_error ) )
goto failure ;
2019-06-18 15:52:28 +03:00
break ;
case ' b ' : /* Base vector. */
if ( update_multiple_arg_temp ( & base_vector_list ,
& ( local_args_info . base_vector_given ) , optarg , 0 , 0 , ARG_STRING ,
" base-vector " , ' b ' ,
additional_error ) )
goto failure ;
2019-06-18 13:36:57 +03:00
break ;
case ' E ' : /* Path to the output with error estimates. */
if ( update_arg ( ( void * ) & ( args_info - > error_estimate_output_arg ) ,
& ( args_info - > error_estimate_output_orig ) , & ( args_info - > error_estimate_output_given ) ,
& ( local_args_info . error_estimate_output_given ) , optarg , 0 , 0 , ARG_STRING ,
check_ambiguity , override , 0 , 0 ,
" error-estimate-output " , ' E ' ,
additional_error ) )
goto failure ;
break ;
case ' N ' : /* VSWF normalisation convention. */
if ( update_arg ( ( void * ) & ( args_info - > normalisation_arg ) ,
& ( args_info - > normalisation_orig ) , & ( args_info - > normalisation_given ) ,
& ( local_args_info . normalisation_given ) , optarg , cmdline_parser_normalisation_values , " Power " , ARG_ENUM ,
check_ambiguity , override , 0 , 0 ,
" normalisation " , ' N ' ,
additional_error ) )
goto failure ;
break ;
case ' c ' : /* Whether the Condon-Shortley phase is included in VSWF definition (-1) or not (+1). */
if ( update_arg ( ( void * ) & ( args_info - > csphase_arg ) ,
& ( args_info - > csphase_orig ) , & ( args_info - > csphase_given ) ,
& ( local_args_info . csphase_given ) , optarg , cmdline_parser_csphase_values , " -1 " , ARG_INT ,
check_ambiguity , override , 0 , 0 ,
" csphase " , ' c ' ,
additional_error ) )
goto failure ;
break ;
case ' e ' : /* The value of Ewald parameter η. */
if ( update_arg ( ( void * ) & ( args_info - > Ewald_parameter_arg ) ,
& ( args_info - > Ewald_parameter_orig ) , & ( args_info - > Ewald_parameter_given ) ,
& ( local_args_info . Ewald_parameter_given ) , optarg , 0 , 0 , ARG_DOUBLE ,
check_ambiguity , override , 0 , 0 ,
" Ewald-parameter " , ' e ' ,
additional_error ) )
goto failure ;
break ;
case ' u ' : /* Specifies the frequency unit is used for inputs.. */
if ( update_arg ( ( void * ) & ( args_info - > frequency_unit_arg ) ,
& ( args_info - > frequency_unit_orig ) , & ( args_info - > frequency_unit_given ) ,
2019-06-18 14:48:39 +03:00
& ( local_args_info . frequency_unit_given ) , optarg , cmdline_parser_frequency_unit_values , " scuff " , ARG_ENUM ,
2019-06-18 13:36:57 +03:00
check_ambiguity , override , 0 , 0 ,
" frequency-unit " , ' u ' ,
additional_error ) )
goto failure ;
break ;
case ' L ' : /* Maximum spherical multipole order to which the translation operator elements are calculated. */
if ( update_arg ( ( void * ) & ( args_info - > lMax_arg ) ,
& ( args_info - > lMax_orig ) , & ( args_info - > lMax_given ) ,
& ( local_args_info . lMax_given ) , optarg , 0 , 0 , ARG_INT ,
check_ambiguity , override , 0 , 0 ,
" lMax " , ' L ' ,
additional_error ) )
goto failure ;
break ;
case ' n ' : /* Medium refractive index. */
2019-06-18 15:52:28 +03:00
if ( update_arg ( ( void * ) & ( args_info - > refractive_index_arg ) ,
& ( args_info - > refractive_index_orig ) , & ( args_info - > refractive_index_given ) ,
& ( local_args_info . refractive_index_given ) , optarg , 0 , 0 , ARG_DOUBLE ,
2019-06-18 13:36:57 +03:00
check_ambiguity , override , 0 , 0 ,
2019-06-18 15:52:28 +03:00
" refractive-index " , ' n ' ,
2019-06-18 13:36:57 +03:00
additional_error ) )
goto failure ;
break ;
case ' p ' : /* Specify the x and y coordinates of a single particle; If not specified, one particle per unit cell is assumed.. */
2019-06-18 14:48:39 +03:00
if ( update_multiple_arg_temp ( & particle_list ,
& ( local_args_info . particle_given ) , optarg , 0 , 0 , ARG_STRING ,
" particle " , ' p ' ,
additional_error ) )
goto failure ;
2019-06-18 13:36:57 +03:00
break ;
case ' T ' : /* Path to a file containing frequency, k_x, k_y triples(separated by white spaces). If not specified, read them from stdin.. */
args_info - > k_omega_points_mode_counter + = 1 ;
2019-06-18 14:48:39 +03:00
if ( update_multiple_arg_temp ( & pointfile_list ,
& ( local_args_info . pointfile_given ) , optarg , 0 , " - " , ARG_STRING ,
" pointfile " , ' T ' ,
additional_error ) )
goto failure ;
2019-06-18 13:36:57 +03:00
break ;
case ' t ' : /* Specifies a frequency, k_x, k_y triple, separated by commas.. */
args_info - > k_omega_points_mode_counter + = 1 ;
2019-06-18 14:48:39 +03:00
if ( update_multiple_arg_temp ( & point_list ,
& ( local_args_info . point_given ) , optarg , 0 , 0 , ARG_STRING ,
" point " , ' t ' ,
additional_error ) )
goto failure ;
2019-06-18 13:36:57 +03:00
break ;
case ' F ' : /* Path to a file containing a list of frequenciesseparated by whitespaces.. */
args_info - > k_omega_meshgrid_mode_counter + = 1 ;
2019-06-18 14:48:39 +03:00
if ( update_multiple_arg_temp ( & omegafile_list ,
& ( local_args_info . omegafile_given ) , optarg , 0 , 0 , ARG_STRING ,
" omegafile " , ' F ' ,
additional_error ) )
goto failure ;
2019-06-18 13:36:57 +03:00
break ;
2019-06-18 15:52:28 +03:00
case ' f ' : /* Specifies frequency (or multiple frequencies separated by commas) on the command line.. */
2019-06-18 13:36:57 +03:00
args_info - > k_omega_meshgrid_mode_counter + = 1 ;
2019-06-18 14:48:39 +03:00
if ( update_multiple_arg_temp ( & omega_list ,
& ( local_args_info . omega_given ) , optarg , 0 , 0 , ARG_STRING ,
" omega " , ' f ' ,
additional_error ) )
goto failure ;
2019-06-18 13:36:57 +03:00
break ;
case ' K ' : /* Path to a file containing a list of k_x, k_y pairs.. */
args_info - > k_omega_meshgrid_mode_counter + = 1 ;
2019-06-18 14:48:39 +03:00
if ( update_multiple_arg_temp ( & kfile_list ,
& ( local_args_info . kfile_given ) , optarg , 0 , " - " , ARG_STRING ,
" kfile " , ' K ' ,
additional_error ) )
goto failure ;
2019-06-18 13:36:57 +03:00
break ;
case ' k ' : /* Specifies pair(s) of k_x, k_y values. */
args_info - > k_omega_meshgrid_mode_counter + = 1 ;
2019-06-18 14:48:39 +03:00
if ( update_multiple_arg_temp ( & k_list ,
& ( local_args_info . k_given ) , optarg , 0 , 0 , ARG_STRING ,
" k " , ' k ' ,
additional_error ) )
goto failure ;
2019-06-18 13:36:57 +03:00
break ;
case 0 : /* Long option with no short option */
if ( strcmp ( long_options [ option_index ] . name , " detailed-help " ) = = 0 ) {
cmdline_parser_print_detailed_help ( ) ;
cmdline_parser_free ( & local_args_info ) ;
exit ( EXIT_SUCCESS ) ;
}
case ' ? ' : /* Invalid option. */
/* `getopt_long' already printed an error message. */
goto failure ;
default : /* bug: option not considered. */
fprintf ( stderr , " %s: option unknown: %c%s \n " , CMDLINE_PARSER_PACKAGE , c , ( additional_error ? additional_error : " " ) ) ;
abort ( ) ;
} /* switch */
} /* while */
2019-06-18 15:52:28 +03:00
update_multiple_arg ( ( void * ) & ( args_info - > base_vector_arg ) ,
& ( args_info - > base_vector_orig ) , args_info - > base_vector_given ,
local_args_info . base_vector_given , 0 ,
ARG_STRING , base_vector_list ) ;
2019-06-18 14:48:39 +03:00
update_multiple_arg ( ( void * ) & ( args_info - > particle_arg ) ,
& ( args_info - > particle_orig ) , args_info - > particle_given ,
local_args_info . particle_given , 0 ,
ARG_STRING , particle_list ) ;
multiple_default_value . default_string_arg = " - " ;
update_multiple_arg ( ( void * ) & ( args_info - > pointfile_arg ) ,
& ( args_info - > pointfile_orig ) , args_info - > pointfile_given ,
local_args_info . pointfile_given , & multiple_default_value ,
ARG_STRING , pointfile_list ) ;
update_multiple_arg ( ( void * ) & ( args_info - > point_arg ) ,
& ( args_info - > point_orig ) , args_info - > point_given ,
local_args_info . point_given , 0 ,
ARG_STRING , point_list ) ;
update_multiple_arg ( ( void * ) & ( args_info - > omegafile_arg ) ,
& ( args_info - > omegafile_orig ) , args_info - > omegafile_given ,
local_args_info . omegafile_given , 0 ,
ARG_STRING , omegafile_list ) ;
update_multiple_arg ( ( void * ) & ( args_info - > omega_arg ) ,
& ( args_info - > omega_orig ) , args_info - > omega_given ,
local_args_info . omega_given , 0 ,
ARG_STRING , omega_list ) ;
multiple_default_value . default_string_arg = " - " ;
update_multiple_arg ( ( void * ) & ( args_info - > kfile_arg ) ,
& ( args_info - > kfile_orig ) , args_info - > kfile_given ,
local_args_info . kfile_given , & multiple_default_value ,
ARG_STRING , kfile_list ) ;
update_multiple_arg ( ( void * ) & ( args_info - > k_arg ) ,
& ( args_info - > k_orig ) , args_info - > k_given ,
local_args_info . k_given , 0 ,
ARG_STRING , k_list ) ;
2019-06-18 13:36:57 +03:00
2019-06-18 15:52:28 +03:00
args_info - > base_vector_given + = local_args_info . base_vector_given ;
local_args_info . base_vector_given = 0 ;
2019-06-18 13:36:57 +03:00
args_info - > particle_given + = local_args_info . particle_given ;
local_args_info . particle_given = 0 ;
args_info - > pointfile_given + = local_args_info . pointfile_given ;
local_args_info . pointfile_given = 0 ;
args_info - > point_given + = local_args_info . point_given ;
local_args_info . point_given = 0 ;
args_info - > omegafile_given + = local_args_info . omegafile_given ;
local_args_info . omegafile_given = 0 ;
args_info - > omega_given + = local_args_info . omega_given ;
local_args_info . omega_given = 0 ;
args_info - > kfile_given + = local_args_info . kfile_given ;
local_args_info . kfile_given = 0 ;
args_info - > k_given + = local_args_info . k_given ;
local_args_info . k_given = 0 ;
if ( args_info - > k_omega_meshgrid_mode_counter & & args_info - > k_omega_points_mode_counter ) {
int k_omega_meshgrid_given [ ] = { args_info - > omegafile_given , args_info - > omega_given , args_info - > kfile_given , args_info - > k_given , - 1 } ;
const char * k_omega_meshgrid_desc [ ] = { " --omegafile " , " --omega " , " --kfile " , " --k " , 0 } ;
int k_omega_points_given [ ] = { args_info - > pointfile_given , args_info - > point_given , - 1 } ;
const char * k_omega_points_desc [ ] = { " --pointfile " , " --point " , 0 } ;
error_occurred + = check_modes ( k_omega_meshgrid_given , k_omega_meshgrid_desc , k_omega_points_given , k_omega_points_desc ) ;
}
if ( check_required )
{
error_occurred + = cmdline_parser_required2 ( args_info , argv [ 0 ] , additional_error ) ;
}
cmdline_parser_release ( & local_args_info ) ;
if ( error_occurred )
return ( EXIT_FAILURE ) ;
return 0 ;
failure :
2019-06-18 15:52:28 +03:00
free_list ( base_vector_list , 1 ) ;
2019-06-18 14:48:39 +03:00
free_list ( particle_list , 1 ) ;
free_list ( pointfile_list , 1 ) ;
free_list ( point_list , 1 ) ;
free_list ( omegafile_list , 1 ) ;
free_list ( omega_list , 1 ) ;
free_list ( kfile_list , 1 ) ;
free_list ( k_list , 1 ) ;
2019-06-18 13:36:57 +03:00
cmdline_parser_release ( & local_args_info ) ;
return ( EXIT_FAILURE ) ;
}