diff options
author | Norbert Preining <norbert@preining.info> | 2019-09-02 13:46:59 +0900 |
---|---|---|
committer | Norbert Preining <norbert@preining.info> | 2019-09-02 13:46:59 +0900 |
commit | e0c6872cf40896c7be36b11dcc744620f10adf1d (patch) | |
tree | 60335e10d2f4354b0674ec22d7b53f0f8abee672 /support/dktools/dkct.ctr |
Initial commit
Diffstat (limited to 'support/dktools/dkct.ctr')
-rw-r--r-- | support/dktools/dkct.ctr | 837 |
1 files changed, 837 insertions, 0 deletions
diff --git a/support/dktools/dkct.ctr b/support/dktools/dkct.ctr new file mode 100644 index 0000000000..72bddf85cc --- /dev/null +++ b/support/dktools/dkct.ctr @@ -0,0 +1,837 @@ +%% options + +copyright owner = Dirk Krause +copyright year = 2011-xxxx +license = bsd + + + +%% module + +/** @file dkct.c Dirk Krause's C/C++ tool. +*/ + + +#if DK3_USE_WX +#include "dkwxtrace.h" +#else +#include "dkct.h" +#endif + +$!trace-include + + + +/** Application group name. +*/ +static dkChar const dkct_group_name[] = { dkT("dktools") }; + + + +/** Version number string. +*/ +static dkChar const dkct_version[] = { +dkT("dkct ") DKT_VERSION_DK +}; + + + +/** License conditions shown for dkct --license. +*/ +static dkChar const * const dkct_license[] = { +$!text macro=dkT + +Copyright (c) 2011-2016, Dirk Krause +All rights reserved. + +Redistribution and use in source and binary forms, +with or without modification, are permitted provided +that the following conditions are met: + +* Redistributions of source code must retain the above + copyright notice, this list of conditions and the + following disclaimer. +* Redistributions in binary form must reproduce the above + copyright notice, this list of conditions and the following + disclaimer in the documentation and/or other materials + provided with the distribution. +* Neither the name of the copyright holder(s) nor the names of + contributors may be used to endorse or promote + products derived from this software without specific + prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND +CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE +OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH +DAMAGE. + +$!end +}; + + + +/** Options for the dkct program. +*/ +static dk3_option_t const dkct_options[] = { + { dkT('R'), dkT("reset"), 0 }, + { dkT('d'), dkT("debug"), 0 }, + { dkT('s'), dkT("debug-stdout"), 0 }, + { dkT('l'), dkT("line-numbers"), 0 }, + { dkT('m'), dkT("make"), 0 }, + { dkT('b'), dkT("box-width"), 1 }, + { dkT('h'), dkT("help"), 0 }, + { dkT('v'), dkT("version"), 0 }, + { dkT('L'), dkT("license-terms"), 0 }, + { dkT('\0'),dkT("license"), 0 }, + { dkT('t'), dkT("timestamp"), 0 }, + { dkT('k'), dkT("trace-keyword"), 0 }, + { dkT('w'), dkT("windows-wide-char"), 0 }, + { dkT('p'), dkT("portable-output"), 0 }, + { dkT('S'), dkT("splint"), 0 }, + { dkT('\0'),dkT("splint-comment-char"), 1 } +}; +/** Number of options in the \a dkct_options array. +*/ +static size_t dkct_sz_options = sizeof(dkct_options)/sizeof(dk3_option_t); + +/** Keywords without need for localization. +*/ +static dkChar const * dkct_not_localized[] = { +/* 0 */ dkT("."), /* Current directory. */ +NULL +}; + + + +/** File name for help file. +*/ +static dkChar const dkct_help_file_name[] = { +dkT("dkct.txt") +}; + + + +/** Default help text, shown if help text file is not found. +*/ +static dkChar const * dkct_help_text[] = { +$!text macro=dkT + +NAME + + dkct - Dirk Krause's C tool + +SYNOPSIS + + dkt [<options>] [<files>] + +DESCRIPTION + +The program provides: +- A preprocessor for debug/trace instructions, +- a code generator for state machines, +- a code generator for GUIs using the wxWidgets library. + +The program converts *.ctr, *.cpt, *.mtr and *.jtr files to *.c, *.cpp, +*.m and *.java. The source files can contain debug instructions in a special +notation. When producing release versions the debug instructions are ignored. +When producing debug versions the debug instructions are converted to output +instructtions. + +OPTIONS + +-R +--reset + Ignore all settings from configuration files. + +-d +--debug + Create debug output. + +-s +--debug-stdout + Debug output goes to standard output. + +-t +--timestamp + Debug output contains a timestamp. + +-k +--trace-keyword + Debug output contains "trace" string. + +-w +--windows-wide-char + Prepare debug output for wchar_t. + +-p +--portable-output + Create portable debug output code (implies -w). + +-l +--line-numbers + Write preprozessor directives "#line ..." to output. + +-m +--make + Make mode: rebuild destination files only if necessary. + +-b <width> +--box-width=<width> + Box with for comment boxes. + +-h +--help + Show help text. + +-v +--version + Show version number. + +-L +--license-terms + Show license conditions. + +EXIT STATUS + +The program returns 0 on success, any other value indicates an error. + +SEE ALSO + +http://dktools.sourceforge.net + +AUTHOR + +Dirk Krause + +LICENSE + +Use + dkct --license-terms +to view the license conditions. + +$!end +}; + + + +/** Initialize option set. + @param o Option set. +*/ +static +void +dkct_option_set_init(DKCT_OPTION_SET *o) +{ + o->deb = 0; o->lnn = 0; o->mak = 0; o->sty = 0; + o->bw = 78; o->tkw = 0; o->ts = 0; o->win = 0; + o->tip = 0; o->deben = 1; o->port = 0; + o->spls = '\0'; +} + + + +/** Initialize job structure. + @param j Structure to initialize. +*/ +static +void +dkct_job_init(DKCT_J *j) +{ + j->exval = DKT_RESULT_ERR_UNSPECIFIC; + j->app = NULL; + j->msg = NULL; + j->nlc = NULL; + j->opt = NULL; + j->sCwd = NULL; + j->cmd = 0; + j->curdi = 0; + dkct_option_set_init(&(j->dkcto)); +} + + + +/** Clean up job structure. + @param j Job structure to clean up. +*/ +static +void +dkct_job_cleanup(DKCT_J *j) +{ + if(j->opt) { + dk3opt_close(j->opt); + } j->opt = NULL; + if(j->app) { + dk3app_close(j->app); + } j->app = NULL; + j->msg = NULL; j->nlc = NULL; +} + + + +/** Process command line arguments, search for options. + @param j Job structure. + @return 1 on success, 0 on error. +*/ +static +int +dkct_process_arguments(DKCT_J *j) +{ + int back = 0; + int i; /* Temporary value to read box width. */ + dkChar const *arg; /* Argument value. */ + $? "+ dkct_process_arguments" + j->opt = dk3opt_open_from_app( + dkct_options, + dkct_sz_options, + 0x00, + NULL, + j->app + ); + if(j->opt) { + if(dk3opt_get_error_code(j->opt) == 0) { + back = 1; + if(dk3opt_is_set(j->opt, dkT('R'))) { + dkct_option_set_init(&(j->dkcto)); + } + if(dk3opt_is_set(j->opt, dkT('d'))) { + (j->dkcto).deb = 1; + } + if(dk3opt_is_set(j->opt, dkT('s'))) { + (j->dkcto).deb = 2; + } + if((j->dkcto).deb) { + if(dk3opt_is_set(j->opt, dkT('t'))) { + (j->dkcto).ts = 1; + } + if(dk3opt_is_set(j->opt, dkT('k'))) { + (j->dkcto).tkw = 1; + } + if(dk3opt_is_set(j->opt, dkT('w'))) { + (j->dkcto).win = 1; + } + if(dk3opt_is_set(j->opt, dkT('p'))) { + (j->dkcto).port = 1; + } + } + if(dk3opt_is_set(j->opt, dkT('l'))) { + (j->dkcto).lnn = 1; + } + if(dk3opt_is_set(j->opt, dkT('m'))) { + (j->dkcto).mak = 1; + } + if(dk3opt_is_set(j->opt, dkT('h'))) { + j->cmd |= DK3_APP_CMD_HELP; + } + if(dk3opt_is_set(j->opt, dkT('v'))) { + j->cmd |= DK3_APP_CMD_VERSION; + } + if(dk3opt_is_set(j->opt, dkT('L'))) { + j->cmd |= DK3_APP_CMD_LICENSE; + } + if(dk3opt_is_set_long(j->opt, dkT("license"))) { + j->cmd |= DK3_APP_CMD_LICENSE; + } + if(dk3opt_is_set(j->opt, dkT('b'))) { + arg = dk3opt_get_short_arg(j->opt, dkT('b')); + if(arg) { +#if VERSION_BEFORE_20140716 + if(dk3sf_sscanf3(arg, dkT("%d"), &i)) +#else + if(0 != dk3ma_i_from_string(&i, arg, NULL)) +#endif + { + if(i > 20) { + (j->dkcto).bw = i; + } else { + j->exval = DKT_RESULT_ERR_OPTION; back = 0; + } + } else { + j->exval = DKT_RESULT_ERR_OPTION; back = 0; + } + } else { + j->exval = DKT_RESULT_ERR_OPTION; back = 0; + } + } + +#if VERSION_BEFORE_20140611 + if (dk3opt_is_set(j->opt, dkT('S'))) { $? ". option S" + arg = dk3opt_get_short_arg(j->opt, dkT('S')); + if (arg) { $? ". have arg" + if (dk3str_len(arg) == 1) { $? ". length ok" + if (128 > (int)(*arg)) { $? ". char ok" + (j->dkcto).spls = (char)(*arg); + } else { $? "! not ASCII" + j->exval = DKT_RESULT_ERR_OPTION; back = 0; + /* ##### ERROR: Not an ASCII character */ + } + } else { $? "! too long" + j->exval = DKT_RESULT_ERR_OPTION; back = 0; + /* ##### ERROR: Just one character allowed */ + } + } else { $? "! missing arg" + j->exval = DKT_RESULT_ERR_OPTION; back = 0; + } + } +#else + if (dk3opt_is_set_long(j->opt, dkct_options[14].lo)) { $? ". --splint-comment-char set" + arg = dk3opt_get_long_arg(j->opt, dkct_options[14].lo); + if (arg) { + if (1 == dk3str_len(arg)) { + if (128 > (int)(*arg)) { + (j->dkcto).spls = (char)(*arg); + } else { + /* ##### ERROR: Not an ASCII character! */ + j->exval = DKT_RESULT_ERR_OPTION; back = 0; + } + } else { + /* ##### ERROR: Exactly one character required! */ + j->exval = DKT_RESULT_ERR_OPTION; back = 0; + } + } else { + /* ##### ERROR: Argument required for option! */ + j->exval = DKT_RESULT_ERR_OPTION; back = 0; + } + } else { $? ". --splint-comment-char not set" + } + if (dk3opt_is_set(j->opt, dkT('S'))) { $? ". -S set" + if ('\0' == (j->dkcto).spls) { + (j->dkcto).spls = '@'; + } + } else { $? ". -S not set" + } +#endif + } else { + j->exval = DKT_RESULT_ERR_OPTION; + } + } else { + j->exval = DKT_RESULT_ERR_OPTION; + } $? "- dkct_process_arguments %d exval=%d", back, j->exval + return back; +} + + + +/** Run for file after expanding wildcards. + @param j Job structure. + @param fn Source file name. + @param sufi Source file suffix index. +*/ +static +void +dkct_really_run_for_file(DKCT_J *j, dkChar const *fn, int sufi) +{ + char shn[DK3_MAX_PATH]; /* Short file name. */ + dkChar const *pstart; /* Short file name. */ + int ie; /* System input encoding. */ + DKCT_SRC *psrc; /* Source structure. */ + int success; /* Flag: Success so far. */ + $? "+ dkct_really_run_for_file \"%!ds\"", fn + pstart = dk3str_rchr(fn, DK3_CHAR_SEP); + if(pstart) { + pstart++; + } else { + pstart = fn; + } + if(pstart) { + ie = dk3app_get_encoding(j->app); + if(dk3str_to_c8p_app(shn, sizeof(shn), pstart, ie, j->app)) { $? ". shn ok" + psrc = dkct_tr_new(&(j->dkcto), shn, sufi, j->app, fn); + if(psrc) { $? ". psrc ok" + success = 0; + if(j->curdi) { psrc->curdi = 1; } + psrc->msg = j->msg; + dk3app_log_1(j->app, DK3_LL_PROGRESS, j->msg, 106); + if(dkct_tr_read(psrc, fn, sufi)) { $? ". read ok" + if(dkct_tr_check(psrc, fn, sufi)) { $? ". check ok" + if(dkct_tr_write(psrc, fn, sufi)) { + success = 1; + } + } + } + dk3app_set_source_line(j->app, 0UL); + dk3app_log_1(j->app, DK3_LL_PROGRESS, j->msg, 107); + if(!success) { + j->exval = DKT_RESULT_ERR_UNSPECIFIC; + switch(psrc->ec) { + case DK3_ERROR_MEMORY: { + j->exval = DKT_RESULT_ERR_MEMORY; + } break; + case DK3_ERROR_SYNTAX: { + j->exval = DKT_RESULT_ERR_INPUT; + } break; + } + } + dkct_tr_delete(psrc); psrc = NULL; + } else { + j->exval = DKT_RESULT_ERR_MEMORY; + } + } + } + $? "- dkct_really_run_for_file" +} + + + +/** Run for a file name. + @param j Job structure. + @param fn Source file name. +*/ +static +void +dkct_run_for_file(DKCT_J *j, dkChar const *fn) +{ + int must_run = 1; /* Flag: Must run. */ + int ai; /* Source suffix type. */ + dkChar const *su; /* Source suffx. */ + dkChar const *oldsourcename; /* Old source file name. */ + dkChar const *shortSourceName; /* Short source file name. */ + dkChar *xsu; /* Suffix position. */ + dkChar const * const *lfdsu; /* Destination suffix. */ + dkChar b1[DK3_MAX_PATH]; /* Destination file name. */ + unsigned long oldsourceline; /* Old source line number. */ + $? "+ dkct_run_for_file \"%!ds\"", fn + oldsourcename = dk3app_get_source_file(j->app); + oldsourceline = dk3app_get_source_line(j->app); + if(j->curdi) { + shortSourceName = dk3str_rchr(fn, (dk3app_not_localized(20))[0]); + if(shortSourceName) { shortSourceName++; } + else { shortSourceName = fn; } + } else { + shortSourceName = fn; + } + dk3app_set_source_file(j->app, shortSourceName); + dk3app_set_source_line(j->app, 0UL); + su = dk3str_get_suffix(fn); + if(su) { +#if DK3_ON_WINDOWS || DK3_HAVE_FNCASEINS + ai = dk3str_array_index(dkct_str_get_source_suffixes(), su, 0); +#else + ai = dk3str_array_index(dkct_str_get_source_suffixes(), su, 1); +#endif + if(ai >= 0) { + if((j->dkcto).mak) { + if(dk3str_len(fn) < DK3_SIZEOF(b1,dkChar)) { + dk3str_cpy_not_overlapped(b1, fn); + lfdsu = (dkct_str_get_dest_suffixes())[ai]; + xsu = dk3str_get_suffix(b1); + if(xsu) { + must_run = 0; + while(*lfdsu) { + *xsu = dkT('\0'); + if((dk3str_len(b1)+dk3str_len(*lfdsu)) < DK3_SIZEOF(b1,dkChar)) { + dk3str_cat(b1, *lfdsu); + if(dk3sf_must_rebuild(b1, fn)) { + must_run = 1; + } + } else { + must_run = 1; + } + lfdsu++; + } + } + } + } + if(must_run) { + dkct_really_run_for_file(j, fn, ai); + } else { + /* Progress: All output files up to date. 105 */ + dk3app_log_1(j->app, DK3_LL_PROGRESS, j->msg, 105); + } + } else { + /* Wrong suffix, not an input file! */ + dk3app_log_3(j->app, DK3_LL_ERROR, j->msg, 0, 1, fn); + j->exval = DKT_RESULT_ERR_FILENAME; + } + } else { + /* No suffix, Not an input file! */ + dk3app_log_3(j->app, DK3_LL_ERROR, j->msg, 0, 1, fn); + j->exval = DKT_RESULT_ERR_FILENAME; + } + dk3app_set_source_file(j->app, oldsourcename); + dk3app_set_source_line(j->app, oldsourceline); + $? "- dkct_run_for_file" +} + + + +/** Run for a directory. + @param j Job structure. + @param dn Directory name. + @param fcd Flag: Use chdir() to enter directory (ignored). +*/ +static +void +dkct_run_for_directory(DKCT_J *j, dkChar const *dn, int fcd) +{ + int ok = 1; /* Flag: Ok so far. */ + dk3_dir_t *dir; /* Directory. */ + dkChar const *en; /* Current file name. */ + dkChar const *su; /* File name suffix. */ + dk3_stat_t const *es; /* Stat information for current file. */ + int ai; /* Source suffix type. */ + + if(fcd) { +#if 0 + /* Change into directory dn. */ + if(!dk3sf_chdir_app(dn, j->app)) { + ok = 0; + } +#endif + } + if(ok) { + dir = dk3dir_open_app(dn, j->app); + if(dir) { + while(dk3dir_get_next_file(dir)) { + en = dk3dir_get_fullname(dir); + es = dk3dir_get_stat(dir); + if((en) && (es)) { + switch((es->ft) & (~(DK3_FT_SYMLINK))) { + case DK3_FT_REGULAR: { + su = dk3str_get_suffix(en); + if(su) { +#if DK3_ON_WINDOWS || DK3_HAVE_FNCASEINS + ai = dk3str_array_index(dkct_str_get_source_suffixes(), su, 0); +#else + ai = dk3str_array_index(dkct_str_get_source_suffixes(), su, 1); +#endif + if(ai >= 0) { + dkct_run_for_file(j, en); + } + } + } break; + } + } + } + dk3dir_close(dir); + } else { + /* ERROR: Failed to open directory! */ + j->exval = DKT_RESULT_ERR_OPENDIR; + } + } + if(fcd) { +#if 0 + /* Change back into previous current directory. */ + if(ok) { + dk3sf_chdir_app(j->sCwd, j->app); + } +#endif + } +} + + + +/** Run for a directory, test for current directory before running. + @param j Job structure. + @param fn Directory name. +*/ +static +void +dkct_run_for_directory_test_current(DKCT_J *j, dkChar const *fn) +{ + if(dk3str_cmp(fn, dkct_not_localized[0]) == 0) { + j->curdi = 1; + dkct_run_for_directory(j, fn, 0); + } else { + dkct_run_for_directory(j, fn, 1); + } +} + + + +/** Run for the given file names. + @param j Job structure. +*/ +static +void +dkct_run(DKCT_J *j) +{ + int nfn; /* Number of file names. */ + dkChar const *arg; /* Current argument. */ + dkChar const *en; /* File name. */ + dkChar bu[DK3_MAX_PATH]; /* Buffer input file name. */ + dk3_stat_t stb; /* Stat inf for input file. */ + dk3_stat_t const *es; /* Stat inf for output file. */ + dk3_dir_t *fne; /* File name expander. */ + int i; /* Current argument index. */ + int found = 0; /* Flag: Matching file found. */ + + nfn = dk3opt_get_num_args(j->opt); + if(nfn > 0) { + for(i = 0; i < nfn; i++) { + arg = dk3opt_get_arg(j->opt, i); + if(arg) { + if(dk3str_len(arg) < DK3_SIZEOF(bu,dkChar)) { + dk3str_cpy_not_overlapped(bu, arg); + dk3str_correct_filename(bu); + if(dk3sf_must_expand(bu)) { + fne = dk3dir_fne_open_app(bu, j->app); + if(fne) { + found = 0; + while(dk3dir_get_next_file(fne)) { + en = dk3dir_get_fullname(fne); + es = dk3dir_get_stat(fne); + if((en) && (es)) { + switch((es->ft) & (~(DK3_FT_SYMLINK))) { + case DK3_FT_REGULAR: { + found = 1; + dkct_run_for_file(j, en); + } break; + default: { + /* Illegal file type! */ + dk3app_log_3(j->app, DK3_LL_ERROR, j->msg, 2, 3, en); + j->exval = DKT_RESULT_ERR_INPUT; + } break; + } + } + } + while(dk3dir_get_next_directory(fne)) { + en = dk3dir_get_fullname(fne); + es = dk3dir_get_stat(fne); + if((en) && (es)) { + switch((es->ft) & (~(DK3_FT_SYMLINK))) { + case DK3_FT_DIRECTORY: { + dkct_run_for_directory_test_current(j, en); + } break; + default: { + /* Illegal file type! */ + dk3app_log_3(j->app, DK3_LL_ERROR, j->msg, 2, 3, en); + j->exval = DKT_RESULT_ERR_INPUT; + } break; + } + } + } + if(!found) { + /* ERROR: No such file or directory! */ + dk3app_log_i3(j->app, DK3_LL_ERROR, 215, 216, bu); + j->exval = DKT_RESULT_ERR_FILENAME; + } + dk3dir_close(fne); + } else { + /* ERROR: No fne */ + j->exval = DKT_RESULT_ERR_MEMORY; + } + } else { + if(dk3sf_stat_app(&stb, bu, j->app)) { + switch((stb.ft) & (~(DK3_FT_SYMLINK))) { + case DK3_FT_REGULAR: { + dkct_run_for_file(j, bu); + } break; + case DK3_FT_DIRECTORY: { + dkct_run_for_directory_test_current(j, bu); + } break; + default: { + /* ERROR: Illegal file type! */ + dk3app_log_3(j->app, DK3_LL_ERROR, j->msg, 2, 3, bu); + j->exval = DKT_RESULT_ERR_FILENAME; + } break; + } + } else { + /* ERROR: No such file or directory! */ + j->exval = DKT_RESULT_ERR_FILENAME; + } + } + } else { + /* ERROR: Name too long! */ + dk3app_log_i3(j->app, DK3_LL_ERROR, 65, 66, arg); + j->exval = DKT_RESULT_ERR_FILENAME; + } + } else { + /* BUG */ + j->exval = DKT_RESULT_ERR_UNSPECIFIC; + } + } + } else { + j->curdi = 1; + dkct_run_for_directory(j, j->sCwd, 0); + } +} + + + +/** Show license conditions. + @param j Job structure. +*/ +static +void +dkct_show_license(DKCT_J *j) +{ + dkChar const * const *sptr; /* Pointer to traverse text. */ + + sptr = dkct_license; + dk3sf_initialize_stdout(); + while(*sptr) { + dk3sf_fputs(*(sptr++), stdout); + dk3sf_fputc(dkT('\n'), stdout); + } +} + + + +/** The main() function. + @param argc Number of command line arguments. + @param argv Command line arguments array. + @return 0 on success, any other value indicates an error. +*/ +DK3_MAIN +{ + int exval = 0; /* Exit status code. */ + DKCT_J j; /* Job structure. */ + dkChar cd[DK3_MAX_PATH]; /* Buffer for current directory. */ + $!trace-init dkct.deb + $? "+ main" + dkct_job_init(&j); + j.app = dk3app_open_command( + argc, (dkChar const * const *)argv, dkct_group_name + ); + if(j.app) { + j.msg = dk3app_messages( + j.app, + dkct_str_get_string_table_file_name(), + (dkChar const **)dkct_str_get_message_texts() + ); + j.nlc = dkct_not_localized; + if(dk3sf_getcwd_app(cd, DK3_SIZEOF(cd,dkChar), j.app)) { + j.sCwd = cd; + if(dkct_process_arguments(&j)) { + j.exval = DKT_RESULT_OK; + if(j.cmd) { + /* Help, version, license */ + if((j.cmd) & DK3_APP_CMD_VERSION) { + dk3sf_initialize_stdout(); + dk3sf_fputs(dkct_version, stdout); + dk3sf_fputc(dkT('\n'), stdout); + } + if((j.cmd) & DK3_APP_CMD_LICENSE) { + dkct_show_license(&j); + } + if((j.cmd) & DK3_APP_CMD_HELP) { + dk3app_help(j.app, dkct_help_file_name, dkct_help_text); + } + } else { + dkct_run(&j); + } + } + } + } + exval = j.exval; + dkct_job_cleanup(&j); + $? "- main %d", exval + $!trace-end + fflush(stdout); + exit(exval); return exval; +} + + + +/* vim: set ai sw=2 : */ + |