static void test_string_field() { StringField_t sf; InitializeStringField(&sf); InsertStringField(&sf,"b",false); InsertStringField(&sf,"a",false); InsertStringField(&sf,"c",false); InsertStringField(&sf,"b",false); int i; for ( i = 0; i < sf.used; i++ ) printf("%4d.: |%s|\n",i,sf.field[i]); ResetStringField(&sf); }
static void print_links ( control_t * ctrl ) { ASSERT(ctrl); FILE * cf = ctrl->cf; ASSERT(cf); print_section(cf,sep1,"InfoOption tabs"); char * temp_param = iobuf; char * temp_help = iobuf + sizeof(iobuf)/8; char * sum_beg = iobuf + sizeof(iobuf)/2; char * sum_end = iobuf + sizeof(iobuf); char * sum = sum_beg; const info_t * info_cmd = ctrl->info; ASSERT ( info_cmd->type & T_DEF_TOOL ); fprintf(cf,"const InfoOption_t * option_tab_tool[] =\n{\n"); ctrl->n_cmd_opt = 0; ctrl->need_sep = false; print_links_iterator(ctrl,info_cmd,"def"); fprintf(cf,"\n\t0\n};\n\n"); DumpText(0,temp_param,iobuf+sizeof(iobuf),info_cmd->param,0,""); DumpText(0,temp_help,iobuf+sizeof(iobuf),info_cmd->help,0,""); sum += snprintf(sum,sum_end-sum, " {\t0,\n" // id "\tfalse,\n" // hidden "\tfalse,\n" // separator "\t\"%s\",\n" // name1 "\t0,\n" // name2 "%s,\n" // param "%s,\n" // help "\t%u,\n" // n_opt "\toption_tab_tool,\n" // opt "\t0\n" // opt_allowed " },\n\n" ,info_cmd->c_name ,temp_param ,temp_help ,ctrl->n_cmd_opt ); bool separator = false; for ( info_cmd++; info_cmd < ctrl->end; info_cmd++ ) { if ( info_cmd->type & T_SEP_CMD ) separator = true; //if ( !( info_cmd->type & T_DEF_CMD ) || info_cmd->type & F_HIDDEN ) if ( !( info_cmd->type & T_DEF_CMD ) ) continue; fprintf(cf,"static const InfoOption_t * option_tab_cmd_%s[] =\n{\n", info_cmd->c_name); ctrl->n_cmd_opt = 0; ctrl->need_sep = false; ctrl->cmd_name = info_cmd->c_name; ResetStringField(&ctrl->opt_done); const info_t * info; for ( info = info_cmd; info < ctrl->end; info++ ) if ( info->type & T_CMD_BEG && !strcmp(info->c_name,info_cmd->c_name) ) { print_links_iterator(ctrl,info,"cmd"); break; } fprintf(cf,"\n\t0\n};\n\n"); ccp name1 = info_cmd->namelist, ptr = name1; while ( *ptr && *ptr != '|' ) ptr++; const int len1 = ptr - name1; char name2[100] = "0"; if ( *ptr == '|' ) { ccp n2 = ++ptr; while ( *ptr && *ptr != '|' ) ptr++; if ( ptr > n2 ) snprintf(name2,sizeof(name2),"\"%.*s\"",(int)(ptr-n2),n2); } DumpText(0,temp_param,iobuf+sizeof(iobuf),info_cmd->param,0,""); DumpText(0,temp_help,iobuf+sizeof(iobuf),info_cmd->help,0,""); sum += snprintf(sum,sum_end-sum, " {\tCMD_%s,\n" // id "\t%s,\n" // hidden "\t%s,\n" // separator "\t\"%.*s\",\n" // name1 "\t%s,\n" // name2 "%s,\n" // param "%s,\n" // help "\t%u,\n" // n_opt "\toption_tab_cmd_%s,\n" // opt "\toption_allowed_cmd_%s\n" // opt_allowed " },\n\n" ,info_cmd->c_name ,info_cmd->type & F_HIDDEN ? "true" : "false" ,separator ? "true" : "false" ,len1 ,name1 ,name2 ,temp_param ,temp_help ,ctrl->n_cmd_opt ,info_cmd->c_name ,info_cmd->c_name ); separator = false; } print_section(cf,sep1,"InfoCommand"); fprintf(cf,"const InfoCommand_t CommandInfo[CMD__N+1] =\n{\n"); fputs(sum_beg,cf); fprintf(cf," {0,0,0,0,0,0,0,0,0}\n};\n"); }
int main ( int argc, char ** argv ) { SetupLib(argc,argv,"gen-ui",PROG_UNKNOWN); static ccp def_null_name = "/dev/null"; FILE * nf = fopen(def_null_name,"wb"); if (!nf) { fprintf(stderr,"!!! Can't create file: %s\n",def_null_name); return ERR_CANT_CREATE; } static ccp def_fname = "src/ui/ui.def"; FILE * df = fopen(def_fname,"wb"); if (!df) { fprintf(stderr,"!!! Can't create file: %s\n",def_fname); return ERR_CANT_CREATE; } char fname[200]; info_t * info = info_tab; while ( info->type != T_END ) { if ( ! ( info->type & T_DEF_TOOL ) ) { fprintf(stderr,"!!! Missing T_DEF_TOOL entry.\n"); return ERR_SYNTAX; } control_t ctrl; memset(&ctrl,0,sizeof(ctrl)); ctrl.df = nf; ctrl.opt_prefix = ""; InitializeStringField(&ctrl.gopt); InitializeStringField(&ctrl.copt); InitializeStringField(&ctrl.opt_done); if ( !( info->type & F_HIDDEN ) ) { ctrl.df = df; snprintf(iobuf,sizeof(iobuf),"Tool '%s'",info->c_name); print_section(df,sep2,iobuf); fprintf(df,"#:def_tool( \"%s\", \\\n",info->c_name); DumpText(df,0,0,info->param,1,", \\\n"); DumpText(df,0,0,info->help,1," )\n\n"); } snprintf(fname,sizeof(fname),"src/ui/ui-%s.c",info->c_name); ctrl.cf = fopen(fname,"wb"); if (!ctrl.cf) { fprintf(stderr,"!!! Can't create file: %s\n",fname); return ERR_CANT_CREATE; } snprintf(fname,sizeof(fname),"src/ui/ui-%s.h",info->c_name); ctrl.hf = fopen(fname,"wb"); if (!ctrl.hf) { fprintf(stderr,"!!! Can't create file: %s\n",fname); return ERR_CANT_CREATE; } ctrl.info = info++; while ( ! ( info->type & (T_END|T_DEF_TOOL)) ) { if ( info->type & T_DEF_OPT ) { if ( info->type & F_OPT_GLOBAL ) { InsertStringField(&ctrl.gopt,info->c_name,false); ++ctrl.n_opt; //opt_index = 0 for global options } else { InsertStringField(&ctrl.copt,info->c_name,false); info->index = ++ctrl.n_opt_specific; } if ( !info->help ) { // copy 'param' and 'help' info from previous tool const info_t * search; for ( search = info; search >= info_tab; search-- ) if ( search->type & T_DEF_OPT && search->help && !strcmp(search->c_name,info->c_name) ) { info->help = search->help; if (!info->param) info->param = search->param; break; } } if ( !( info->type & F_HIDDEN ) ) { fprintf(ctrl.df,"#:def_opt( \"%s\", \"%s\", \"%s%s%s%s%s\", \\\n", info->c_name, info->namelist, info->type & F_OPT_COMMAND ? "C" : "", info->type & F_OPT_GLOBAL ? "G" : "", info->type & F_OPT_MULTIUSE ? "M" : "", info->type & F_OPT_PARAM ? "P" : "", info->type & F_OPT_OPTPARAM ? "O" : "" ); DumpText(ctrl.df,0,0,info->param,1,", \\\n"); DumpText(ctrl.df,0,0,info->help,1," )\n\n"); } } else if ( info->type & T_DEF_CMD ) { info->index = ++ctrl.n_cmd; if ( !info->help ) { // copy 'param' and 'help' info from previous tool const info_t * search = info-1; for ( search = info; search >= info_tab; search-- ) if ( search->type & T_DEF_CMD && search->help && !strcmp(search->c_name,info->c_name) ) { info->help = search->help; if (!info->param) info->param = search->param; break; } } if ( !( info->type & F_HIDDEN ) ) { fprintf(ctrl.df,"#:def_cmd( \"%s\", \"%s\", \\\n", info->c_name, info->namelist ); DumpText(ctrl.df,0,0,info->param,1,", \\\n"); DumpText(ctrl.df,0,0,info->help,1," )\n\n"); } } else if ( info->type & T_GRP_BEG ) info->index = ctrl.n_grp++; // NULL based else if ( info->type & (T_CMD_OPT|T_CMD_BEG|T_COPY_GRP|T_COPY_CMD) ) { const int type = info->type & T_CMD_OPT ? T_DEF_OPT : info->type & T_COPY_GRP ? T_GRP_BEG : T_DEF_CMD; const info_t * search; for ( search = ctrl.info; search < info; search++ ) if ( search->type & type && !strcmp(search->c_name,info->c_name) ) { //PRINT("COPY INDEX #%x: %s\n",info->type,info->c_name); info->index = search->index; break; } } info++; } ctrl.end = info; if (ctrl.n_cmd) ctrl.n_cmd++; // one more for CMD_NONE; if (ctrl.n_opt_specific) ctrl.n_opt += ++ctrl.n_opt_specific; TRACE("N: cmd=%u, grp=%u, opt=%d/%d\n", ctrl.n_cmd, ctrl.n_grp, ctrl.n_opt_specific, ctrl.n_opt ); const enumError err = Generate(&ctrl); fclose(ctrl.cf); fclose(ctrl.hf); ResetStringField(&ctrl.gopt); ResetStringField(&ctrl.copt); ResetStringField(&ctrl.opt_done); if (err) return err; } AddTables(df); print_section(df,sep2,"END"); fclose(df); fclose(nf); CloseAll(); return ERR_OK; }