diff --git a/g10/ChangeLog b/g10/ChangeLog index aae073153..13d670366 100644 --- a/g10/ChangeLog +++ b/g10/ChangeLog @@ -1,3 +1,13 @@ +2003-05-31 David Shaw + + * main.h, misc.c (parse_options): New general option line parser. + Fix the bug in the old version that did not handle report syntax + errors after a valid entry. + + * import.c (parse_import_options), export.c + (parse_export_options): Call it here instead of duplicating the + code. + 2003-05-30 David Shaw * keylist.c (list_one): Don't show the keyring filename when in diff --git a/g10/export.c b/g10/export.c index b652c2cf7..b4c87d4dc 100644 --- a/g10/export.c +++ b/g10/export.c @@ -41,13 +41,7 @@ static int do_export_stream( IOBUF out, STRLIST users, int parse_export_options(char *str,unsigned int *options) { - char *tok; - int hit=0; - struct - { - char *name; - unsigned int bit; - } export_opts[]= + struct parse_options export_opts[]= { {"include-non-rfc",EXPORT_INCLUDE_NON_RFC}, {"include-local-sigs",EXPORT_INCLUDE_LOCAL_SIGS}, @@ -57,34 +51,7 @@ parse_export_options(char *str,unsigned int *options) /* add tags for include revoked and disabled? */ }; - while((tok=strsep(&str," ,"))) - { - int i,rev=0; - - if(ascii_strncasecmp("no-",tok,3)==0) - { - rev=1; - tok+=3; - } - - for(i=0;export_opts[i].name;i++) - { - if(ascii_strcasecmp(export_opts[i].name,tok)==0) - { - if(rev) - *options&=~export_opts[i].bit; - else - *options|=export_opts[i].bit; - hit=1; - break; - } - } - - if(!hit && !export_opts[i].name) - return 0; - } - - return hit; + return parse_options(str,options,export_opts); } /**************** @@ -343,4 +310,3 @@ do_export_stream( IOBUF out, STRLIST users, int secret, log_info(_("WARNING: nothing exported\n")); return rc; } - diff --git a/g10/import.c b/g10/import.c index 9c1cba879..049c598d4 100644 --- a/g10/import.c +++ b/g10/import.c @@ -86,13 +86,7 @@ static int merge_keysigs( KBNODE dst, KBNODE src, int *n_sigs, int parse_import_options(char *str,unsigned int *options) { - char *tok; - int hit=0; - struct - { - char *name; - unsigned int bit; - } import_opts[]= + struct parse_options import_opts[]= { {"allow-local-sigs",IMPORT_ALLOW_LOCAL_SIGS}, {"repair-hkp-subkey-bug",IMPORT_REPAIR_PKS_SUBKEY_BUG}, @@ -100,34 +94,7 @@ parse_import_options(char *str,unsigned int *options) {NULL,0} }; - while((tok=strsep(&str," ,"))) - { - int i,rev=0; - - if(ascii_strncasecmp("no-",tok,3)==0) - { - rev=1; - tok+=3; - } - - for(i=0;import_opts[i].name;i++) - { - if(ascii_strcasecmp(import_opts[i].name,tok)==0) - { - if(rev) - *options&=~import_opts[i].bit; - else - *options|=import_opts[i].bit; - hit=1; - break; - } - } - - if(!hit && !import_opts[i].name) - return 0; - } - - return hit; + return parse_options(str,options,import_opts); } void * diff --git a/g10/main.h b/g10/main.h index 6356f5bb8..d48798921 100644 --- a/g10/main.h +++ b/g10/main.h @@ -87,8 +87,16 @@ void deprecated_warning(const char *configname,unsigned int configlineno, const char *option,const char *repl1,const char *repl2); const char *compress_algo_to_string(int algo); int check_compress_algo(int algo); -void compliance_failure(void); const char *compliance_option_string(void); +void compliance_failure(void); + +struct parse_options +{ + char *name; + unsigned int bit; +}; + +int parse_options(char *str,unsigned int *options,struct parse_options *opts); /*-- helptext.c --*/ void display_online_help( const char *keyword ); diff --git a/g10/misc.c b/g10/misc.c index c625e3ff2..24e258d89 100644 --- a/g10/misc.c +++ b/g10/misc.c @@ -593,3 +593,40 @@ compliance_failure(void) log_info(_("this message may not be usable by %s\n"),compliance_string()); opt.compliance=CO_GNUPG; } + +int +parse_options(char *str,unsigned int *options,struct parse_options *opts) +{ + char *tok; + + while((tok=strsep(&str," ,"))) + { + int i,rev=0; + + if(tok[0]=='\0') + continue; + + if(ascii_strncasecmp("no-",tok,3)==0) + { + rev=1; + tok+=3; + } + + for(i=0;opts[i].name;i++) + { + if(ascii_strcasecmp(opts[i].name,tok)==0) + { + if(rev) + *options&=~opts[i].bit; + else + *options|=opts[i].bit; + break; + } + } + + if(!opts[i].name) + return 0; + } + + return 1; +}