%% options copyright owner = Dirk Krause copyright year = 2011-2014 license = bsd %% module #include "dk3all.h" #include "dkt.h" $!trace-include /** Job structure. */ typedef struct { dk3_app_t *app; /**< Application. */ dk3_option_set_t *opt; /**< Option set. */ dkChar const * const *msg; /**< Localized messages. */ dkChar const * const *kwnl; /**< Keywords, not localized. */ int exval; /**< Exit status code. */ int enc_s; /**< Encoding for stdin. */ int enc_f; /**< Encoding for files. */ } DKT_HTML_J; /** Long options / configuration file keywords. */ static dkChar const * const dkt_html_long_opt[] = { dkT("stdin-encoding"), dkT("file-encoding"), dkT("reset"), NULL }; /** Options processed by the subcommand. */ static dk3_option_t const dkt_html_options[] = { { dkT('R'), dkT("reset"), 0 }, { dkT('i'), dkT("input-encoding"), 1 }, { dkT('p'), dkT("plain"), 0 }, }; /** Number of entries in @ref dkt_html_options. */ static size_t const dkt_html_szoptions = sizeof(dkt_html_options)/sizeof(dk3_option_t); /** Reset the job structure. @param j Job structure. */ static void dkt_html_job_reset(DKT_HTML_J *j) { $? "+ dkt_html_job_reset" j->enc_f = dk3app_get_default_file_encoding(j->app); $? ". enc_f=%d", j->enc_f j->enc_s = dk3app_get_default_stdin_encoding(j->app); $? ". enc_s=%d",j->enc_s $? "- dkt_html_job_reset" } /** Initialize job structure. @param j Job structure. */ static void dkt_html_job_init(DKT_HTML_J *j) { $? "+ dkt_html_job_init" j->exval = DKT_RESULT_ERR_UNSPECIFIC; j->opt = NULL; dkt_html_job_reset(j); j->enc_f = dk3app_get_input_file_encoding(j->app); $? ". enc_f=%d", j->enc_f j->enc_s = dk3app_get_input_stdin_encoding(j->app); $? ". enc_s=%d", j->enc_s $? "- dkt_html_job_init" } /** Clean up job structure. @param j Job structure. */ static void dkt_html_job_cleanup(DKT_HTML_J *j) { int i; $? "+ dkt_html_job_cleanup" /* Release option set. */ if(j->opt) { dk3opt_close(j->opt); } j->opt = NULL; $? "- dkt_html_job_cleanup" } /** Process one key/value pair, either long option or config file line. @param job Job structure. @param key Key (option name). @param val Value. @param ori Original text. @param verb Flag: Verbose. @return 1 on success, 0 on error. */ static int dkt_html_long_opt_handler( DKT_HTML_J *job, dkChar const *key, dkChar const *val, dkChar const *ori, int verb ) { int back = 0; int i; $? "+ dkt_html_long_opt_handler" if((job) && (key) && (ori)) { i = dk3str_array_index(dkt_html_long_opt, key, 0); switch(i) { case 0: { back = dkt_tool_set_encoding( job->app, &(job->enc_s), val, dk3app_get_input_stdin_encoding(job->app) ); $? ". enc_s=%d", job->enc_s } break; case 1: { back = dkt_tool_set_encoding( job->app, &(job->enc_f), val, dk3app_get_input_file_encoding(job->app) ); $? ". enc_f=%d", job->enc_f } break; case 2: { dkt_html_job_reset(job); back = 1; } break; default: { if(verb) { /* ERROR: Unknown option */ if((job->app) && (job->msg)) { dk3app_log_3(job->app, DK3_LL_ERROR, job->msg, 63, 64, key); } } } break; } } $? "- dkt_html_long_opt_handler %d", back return back; } /** Handle one configuration line. @param jv Job structure as void pointer. @param k Key part. @param v Value part. @return 1 on success, 0 on error. */ static int dkt_html_conf_line(void *jv, dkChar const *k, dkChar const *v) { $? "+ dkt_html_conf_line k=\"%s\" v=\"%s\"", TR_STR(k), TR_STR(v) (void)dkt_html_long_opt_handler((DKT_HTML_J *)jv, k, v, k, 0); $? "- dkt_html_conf_line" return 1; } /** Process command line arguments. @param j Job structure. @return 1 on success (can continue), 0 on error. */ static int dkt_html_process_arguments(DKT_HTML_J *j) { int back = 0; int xargc; dkChar const * const *xargv; dkChar const *x; int res; $? "+ dkt_html_process_arguments" xargc = dk3app_get_argc(j->app); xargv = dk3app_get_argv(j->app); xargv++; xargv++; xargc--; xargc--; j->opt = dk3opt_open_app( dkt_html_options, dkt_html_szoptions, dkT('\0'), NULL, xargc, xargv, j->app ); if(j->opt) { back = 1; if(dk3opt_is_set(j->opt, dkT('R'))) { dkt_html_job_reset(j); } if(dk3opt_is_set(j->opt, dkT('i'))) { x = dk3opt_get_short_arg(j->opt, dkT('i')); if(x) { res = dkt_tool_set_encoding( j->app, &(j->enc_s), x, dk3app_get_input_stdin_encoding(j->app) ); $? ". enc_s=%d", j->enc_s if(res) { j->enc_f = j->enc_s; } else { back = 0; j->exval = DKT_RESULT_ERR_OPTION; } } else { back = 0; j->exval = DKT_RESULT_ERR_OPTION; } } else { if(dk3opt_is_set(j->opt, dkT('p'))) { j->enc_f = j->enc_s = DK3_FILE_ENCODING_ASCII; } } } else { j->exval = DKT_RESULT_ERR_MEMORY; } $? "- dkt_html_process_arguments %d", back return back; } /** Run the command. @param j Job structure. */ static void dkt_html_run(DKT_HTML_J *j) { $? "+ dkt_html_run" $? "- dkt_html_run" } int dkt_html( dk3_app_t *app, dkChar const *sn, dkChar const * const *msg, dkChar const * const *kwnl ) { int back = DKT_RESULT_ERR_UNSPECIFIC; DKT_HTML_J j; $? "+ dkt_html" j.app = app; j.msg = msg; j.kwnl = kwnl; dkt_html_job_init(&j); dkt_tool_read_conf(app, sn, (void *)(&j), dkt_html_conf_line); $? ". file encoding = %d, stdin encoding = %d", j.enc_f, j.enc_s if(dkt_html_process_arguments(&j)) { j.exval = DKT_RESULT_OK; dkt_html_run(&j); } back = j.exval; dkt_html_job_cleanup(&j); $? "- dkt_html %d", back return back; } /* vim: set ai sw=2 : */