ConversionResult MBCToUC(const char*& c, Encoding enc, ConversionState&& st) { if(const auto pfun = FetchMapperPtr<ConversionResult, ystdex::pseudo_output&&, const char*&, ConversionState&&>(enc)) return pfun(ystdex::pseudo_output(), c, std::move(st)); return ConversionResult::Unhandled; }
ConversionResult MBCToUC(const char*& c, const char* e, Encoding enc, ConversionState&& st) { yconstraint(c <= e); if(const auto pfun = FetchMapperPtr<ConversionResult, ystdex::pseudo_output&&, GuardPair<const char*>&&, ConversionState&&>(enc)) return pfun(ystdex::pseudo_output(), {c, e}, std::move(st)); return ConversionResult::Unhandled; }
// // utility functions // ////////////////////////////////////////////////////////////////////////////// void PrintStringF(void pfun(const char *),const char * fmt, ...) { va_list args; char buffy[512]; va_start(args, fmt); vsnprintf(buffy, arrsize(buffy), fmt, args); va_end(args); pfun(buffy); }
size_t UCToMBC(char* d, const char16_t& s, Encoding enc) { yconstraint(d); size_t l(0); if(const auto pfun = FetchMapperPtr<size_t, char*, char32_t>(enc)) l = pfun(d, s); return l; }
/* ---------------------------------------------------------------- * 功 能:设置密钥参数(包括长度类型与分量值) * 输入参数:pfun 指具体函数 * 输出参数: * 返 回 值:菜单对应值 * 作 者:陈建荣 * 日 期:2012/12/7 * 调用说明: * 修改日志:修改日期 修改者 修改内容简述 * ---------------------------------------------------------------- */ int setKeyArgu(void(*pfun)(void)) { int iTmp = 0; do{ pfun(); printf("\t"); iTmp = getchar(); getchar(); /* 接收回车,丢弃 */ if (iTmp == 'Q' || iTmp == 'q') { exit(0); } }while (iTmp != '1' && iTmp != '2' && iTmp != '3'); return iTmp - '0'; }
int main(int argc, char const **argv) { int __retres; __e_acsl_memory_init(& argc,(char ***)(& argv),(size_t)8); int a = 1; __e_acsl_store_block((void *)(& a),(size_t)4); __e_acsl_full_init((void *)(& a)); int *p = & a; __e_acsl_store_block((void *)(& p),(size_t)8); __e_acsl_full_init((void *)(& p)); __e_acsl_temporal_store_nblock((void *)(& p),(void *)(& a)); uintptr_t addr = (unsigned long)(& addr); __e_acsl_temporal_reset_parameters(); __e_acsl_temporal_reset_return(); __e_acsl_temporal_save_nreferent_parameter((void *)(& p),1U); __e_acsl_temporal_save_nblock_parameter((void *)(& a),2U); __e_acsl_full_init((void *)(& p)); p = pfun((char)'a',p,& a,(int *)0,(int *)addr,2); __e_acsl_temporal_pull_return((void *)(& p)); /*@ assert \valid(p); */ { int __gen_e_acsl_initialized; int __gen_e_acsl_and; __gen_e_acsl_initialized = __e_acsl_initialized((void *)(& p), sizeof(int *)); if (__gen_e_acsl_initialized) { int __gen_e_acsl_valid; __gen_e_acsl_valid = __e_acsl_valid((void *)p,sizeof(int),(void *)p, (void *)(& p)); __gen_e_acsl_and = __gen_e_acsl_valid; } else __gen_e_acsl_and = 0; __e_acsl_assert(__gen_e_acsl_and,(char *)"Assertion",(char *)"main", (char *)"\\valid(p)",28); } __retres = 0; __e_acsl_delete_block((void *)(& p)); __e_acsl_delete_block((void *)(& a)); __e_acsl_memory_clean(); return __retres; }
static void __checkConsole( iOAppData data ) { /* Check for command. */ int c = getchar(); if( c == wConCmd.debug ) { TraceOp.trc( name, TRCLEVEL_INFO, __LINE__, 9999, "Toggle debug tracelevel." ); TraceOp.setLevel( NULL, TraceOp.getLevel( NULL ) ^ TRCLEVEL_DEBUG ); TraceOp.setLevel( NULL, TraceOp.getLevel( NULL ) ^ TRCLEVEL_XMLH ); } else if( c == wConCmd.byte ) { TraceOp.trc( name, TRCLEVEL_INFO, __LINE__, 9999, "Toggle byte tracelevel." ); TraceOp.setLevel( NULL, TraceOp.getLevel( NULL ) ^ TRCLEVEL_BYTE ); } else if( c == wConCmd.memtrc ) { TraceOp.trc( name, TRCLEVEL_INFO, __LINE__, 9999, "Toggle memory tracelevel." ); TraceOp.setLevel( NULL, TraceOp.getLevel( NULL ) ^ TRCLEVEL_MEMORY ); } else if( c == wConCmd.automat ) { TraceOp.trc( name, TRCLEVEL_INFO, __LINE__, 9999, "Toggle auto tracelevel." ); TraceOp.setLevel( NULL, TraceOp.getLevel( NULL ) ^ TRCLEVEL_USER1 ); } else if( c == wConCmd.http ) { TraceOp.trc( name, TRCLEVEL_INFO, __LINE__, 9999, "Toggle http tracelevel." ); TraceOp.setLevel( NULL, TraceOp.getLevel( NULL ) ^ TRCLEVEL_USER2 ); } else if( c == wConCmd.monitor ) { TraceOp.trc( name, TRCLEVEL_INFO, __LINE__, 9999, "Toggle monitor tracelevel." ); TraceOp.setLevel( NULL, TraceOp.getLevel( NULL ) ^ TRCLEVEL_MONITOR ); } else if( c == wConCmd.info ) { TraceOp.trc( name, TRCLEVEL_INFO, __LINE__, 9999, "Toggle info tracelevel." ); TraceOp.setLevel( NULL, TraceOp.getLevel( NULL ) ^ TRCLEVEL_INFO ); } else if( c == wConCmd.quit ) { TraceOp.trc( name, TRCLEVEL_INFO, __LINE__, 9999, "Shutdown requested." ); data->consoleMode = False; AppOp.shutdown(0, "Console command"); } else if( c == wConCmd.initfield ) { TraceOp.trc( name, TRCLEVEL_INFO, __LINE__, 9999, "Initfield requested." ); ModelOp.initField( data->model, True ); } else if( c == wConCmd.threads ) { AppOp.listThreads(); } else if( c == wConCmd.poweron ) { AppOp.go(); } else if( c == wConCmd.poweroff ) { AppOp.stop(); } else if( c == wConCmd.slots ) { __syscmd( wSysCmd.slots ); } else if( c == wConCmd.query ) { __queryModules(); } else if( c == wConCmd.sod ) { __syscmd( wSysCmd.sod ); } else if( c == wConCmd.stopautomode ) { iONode cmd = NULL; clntcon_callback pfun = ControlOp.getCallback(data->control); cmd = NodeOp.inst( wAutoCmd.name(), NULL, ELEMENT_NODE ); wAutoCmd.setcmd( cmd, wAutoCmd.off ); pfun( (obj)AppOp.getControl(), cmd ); } else if( c == wConCmd.ebreak ) { iONode cmd = NULL; clntcon_callback pfun = ControlOp.getCallback(data->control); cmd = NodeOp.inst( wSysCmd.name(), NULL, ELEMENT_NODE ); wSysCmd.setcmd( cmd, wSysCmd.ebreak ); pfun( (obj)AppOp.getControl(), cmd ); } else if( c == wConCmd.config ) { __syscmd( wSysCmd.config ); } else if( c == wConCmd.analyse ) { ModelOp.analyse( data->model, False ); } else if( c == wConCmd.analyseclean ) { ModelOp.analyse( data->model, True ); } else if( c == wConCmd.memory ) rocsStatistics( True ); else if( c == wConCmd.help ) __conhelp(); }
// Definition of a function to call a function int any_function(int(*pfun)(int, int), int x, int y) { return pfun(x, y); }
//using pointer to func_type void process_string1(fun_type* pfun,char *s){ pfun(s); }
int cpDoProjection(CPodeMem cp_mem, realtype saved_t, int *npfPtr) { int flag, retval; realtype cnorm; switch (proj_type) { case CP_PROJ_INTERNAL: /* Evaluate constraints at current time and with the corrected y */ retval = cfun(tn, y, ctemp, c_data); nce++; if (retval < 0) {flag = CP_CNSTRFUNC_FAIL; break;} if (retval > 0) {flag = CNSTRFUNC_RECVR; break;} /* * If activated, evaluate WL2 norm of constraint violation. * If the constraint violation is small enough, return. */ if (test_cnstr) { cnorm = N_VWL2Norm(ctemp, ctol); cnorm /= prjcoef; #ifdef CPODES_DEBUG printf(" Constraint violation norm = %lg\n",cnorm); #endif if (cnorm <= ONE) { applyProj = FALSE; return(CP_SUCCESS); } } #ifdef CPODES_DEBUG else { printf(" No constraint testing\n"); } #endif /* Perform projection step * On a successful return, the projection correction is available in acorP. * Also, if projection of the error estimate was enabled, the new error * estimate is available in errP and acnrm contains ||errP||_WRMS. */ nproj++; if (cnstr_type == CP_CNSTR_NONLIN) flag = cpProjNonlinear(cp_mem); else flag = cpProjLinear(cp_mem); break; case CP_PROJ_USER: #ifdef CPODES_DEBUG printf(" User-defined projection\n"); #endif /* Use ftemp to store errP and tempv to store acorP * (recall that in this case we did not allocate memory * errP and acorP). */ errP = ftemp; acorP = tempv; /* Copy acor into errP */ N_VScale(ONE, acor, errP); /* Call the user projection function */ retval = pfun(tn, y, acorP, prjcoef, errP, p_data); nproj++; if (retval < 0) {flag = CP_PROJFUNC_FAIL; break;} if (retval > 0) {flag = PROJFUNC_RECVR; break;} /* Recompute acnrm to be used in error test */ acnrm = N_VWrmsNorm(errP, ewt); flag = CP_SUCCESS; break; } #ifdef CPODES_DEBUG printf(" acnrm = %lg\n",acnrm); #endif /* This is not the first projection anymore */ first_proj = FALSE; /* If the projection was successful, return now. */ if (flag == CP_SUCCESS) { applyProj = TRUE; return(CP_SUCCESS); } /* The projection failed. Increment nprf and restore zn */ nprf++; cpRestore(cp_mem, saved_t); /* Return if lsetupP, lsolveP, cfun, or pfun failed unrecoverably */ if (flag == CP_PLSETUP_FAIL) return(CP_PLSETUP_FAIL); if (flag == CP_PLSOLVE_FAIL) return(CP_PLSOLVE_FAIL); if (flag == CP_CNSTRFUNC_FAIL) return(CP_CNSTRFUNC_FAIL); if (flag == CP_PROJFUNC_FAIL) return(CP_PROJFUNC_FAIL); /* At this point, flag = CONV_FAIL or CNSTRFUNC_RECVR or PRJFUNC_RECVR; increment npf */ (*npfPtr)++; etamax = ONE; /* If we had maxnpf failures or |h| = hmin, return CP_PROJ_FAILURE or CP_REPTD_CNSTRFUNC_ERR or CP_REPTD_PROJFUNC_ERR. */ if ((ABS(h) <= hmin*ONEPSM) || (*npfPtr == maxnpf)) { if (flag == CONV_FAIL) return(CP_PROJ_FAILURE); if (flag == CNSTRFUNC_RECVR) return(CP_REPTD_CNSTRFUNC_ERR); if (flag == PROJFUNC_RECVR) return(CP_REPTD_PROJFUNC_ERR); } /* Reduce step size; return to reattempt the step */ eta = MAX(ETAPR, hmin / ABS(h)); cpRescale(cp_mem); return(PREDICT_AGAIN); }
color PaletteFunc::getSwap(const color& c){ return pfun(c); }
void set_message_handler(T pfun) { companion_->become(pfun(companion_.get())); }
void transform(double source[], double target[], size_t length, double (*pfun)(double)) // Pre-conditions: length(target)>=length(source) { for(size_t i=0; i<length; ++i) target[i] = pfun(source[i]); }
static Boolean __executeCmd(iONode cmd, iOMap map, const char* oid, Boolean* breakloop, Boolean* continueloop, iONode script) { Boolean exit = False; iOModel model = AppOp.getModel(); if( StrOp.equals("function", NodeOp.getName(cmd)) ) { TraceOp.trc( name, TRCLEVEL_INFO, __LINE__, 9999, "skip function [%s]", wItem.getid(cmd)); return exit; } TraceOp.trc( name, TRCLEVEL_INFO, __LINE__, 9999, "execute [%s] id[%s] cmd[%s] oid[%s] callerid[%s]", NodeOp.getName(cmd), wItem.getid(cmd), NodeOp.getStr(cmd, "cmd", "-"), oid!=NULL?oid:"", map != NULL ? (const char*)MapOp.get(map, "callerid"):"-" ); /* loco */ if( StrOp.equals( wFunCmd.name(), NodeOp.getName(cmd)) || StrOp.equals( wLoc.name(), NodeOp.getName(cmd)) || StrOp.equals( wCar.name(), NodeOp.getName(cmd)) ) { char* idRes = VarOp.getText(wItem.getid(cmd), map, ' '); iOLoc lc = ModelOp.getLoc(model, idRes, NULL, False); iOCar car = ModelOp.getCar(model, idRes); iIBlockBase bk = NULL; if( lc == NULL && (bk = ModelOp.getBlock(model, wItem.getid(cmd))) != NULL ) { TraceOp.trc( name, TRCLEVEL_INFO, __LINE__, 9999, "get loco id from block [%s]", wItem.getid(cmd) ); lc = ModelOp.getLoc(model, bk->getLoc(bk), NULL, False); } if( lc == NULL && NodeOp.getStr(cmd, "bkid", NULL) != NULL ) { char* bkidRes = VarOp.getText(NodeOp.getStr(cmd, "bkid", NULL), map, ' '); bk = ModelOp.getBlock(model, bkidRes); TraceOp.trc( name, TRCLEVEL_INFO, __LINE__, 9999, "get loco id from block [%s]", bkidRes ); lc = ModelOp.getLoc(model, bk->getLoc(bk), NULL, False); StrOp.free(bkidRes); } if( lc != NULL ) { iONode clone = (iONode)NodeOp.base.clone(cmd); wLoc.setid(clone, LocOp.getId(lc)); if( StrOp.equals( wFunCmd.name(), NodeOp.getName(cmd)) ) { int fnaction = wFunCmd.getfnchanged(cmd); if( wFunCmd.getfndesc(cmd) != NULL ) { fnaction = LocOp.getFnNrByDesc(lc, wFunCmd.getfndesc(cmd)); } if( fnaction != -1 ) { char fnkey[32]; wFunCmd.setfnchanged(clone, fnaction); StrOp.fmtb(fnkey, "f%d", fnaction); if( wFunCmd.getfncmd(cmd) != NULL ) { const char* fncmd = wFunCmd.getfncmd(cmd); if( StrOp.equals(wFunCmd.on, fncmd) ) NodeOp.setBool(clone, fnkey, True); else if( StrOp.equals(wFunCmd.off, fncmd) ) NodeOp.setBool(clone, fnkey, False); else if( StrOp.equals(wFunCmd.flip, fncmd) ) NodeOp.setBool(clone, fnkey, !LocOp.isFunction(lc, fnaction)); } } } if( wLoc.getblockid(clone) != NULL && StrOp.len(wLoc.getblockid(clone)) > 0 ) { char* bkidRes = VarOp.getText(wLoc.getblockid(clone), map, ' '); wLoc.setblockid(clone, bkidRes); StrOp.free(bkidRes); } if( wLoc.getscheduleid(clone) != NULL && StrOp.len(wLoc.getscheduleid(clone)) > 0 ) { char* scidRes = VarOp.getText(wLoc.getscheduleid(clone), map, ' '); wLoc.setscheduleid(clone, scidRes); StrOp.free(scidRes); } LocOp.cmd(lc, clone); } if( car != NULL ) { iONode clone = (iONode)NodeOp.base.clone(cmd); wCar.setid(clone, wCar.getid(CarOp.base.properties(car))); if( StrOp.equals( wFunCmd.name(), NodeOp.getName(cmd)) ) { int fnaction = wFunCmd.getfnchanged(cmd); if( wFunCmd.getfndesc(cmd) != NULL ) { fnaction = CarOp.getFnNrByDesc(car, wFunCmd.getfndesc(cmd)); } if( fnaction != -1 ) { char fnkey[32]; wFunCmd.setfnchanged(clone, fnaction); StrOp.fmtb(fnkey, "f%d", fnaction); if( wFunCmd.getfncmd(cmd) != NULL ) { const char* fncmd = wFunCmd.getfncmd(cmd); if( StrOp.equals(wFunCmd.on, fncmd) ) NodeOp.setBool(clone, fnkey, True); else if( StrOp.equals(wFunCmd.off, fncmd) ) NodeOp.setBool(clone, fnkey, False); else if( StrOp.equals(wFunCmd.flip, fncmd) ) NodeOp.setBool(clone, fnkey, !CarOp.isFunction(car, fnaction)); } } } CarOp.cmd(car, clone); } StrOp.free(idRes); } /* operator */ else if( StrOp.equals( wOperator.name(), NodeOp.getName(cmd)) ) { char* idRes = VarOp.getText(wItem.getid(cmd), map, ' '); iOOperator op = ModelOp.getOperator(model, idRes); if( op != NULL ) { OperatorOp.cmd(op, (iONode)NodeOp.base.clone(cmd)); } StrOp.free(idRes); } /* block */ else if( StrOp.equals( wBlock.name(), NodeOp.getName(cmd)) ) { char* idRes = VarOp.getText(wItem.getid(cmd), map, ' '); iIBlockBase bk = ModelOp.getBlock(model, idRes); if( bk != NULL ) { if( StrOp.equals(wAction.block_reserve, wBlock.getcmd(cmd) ) ) { char* lcidRes = VarOp.getText(wActionCtrl.getlcid(cmd), map, ' '); bk->lock( bk, lcidRes, NULL, NULL, False, False, False, 0, NULL, True); StrOp.free(lcidRes); } else { bk->cmd(bk, (iONode)NodeOp.base.clone(cmd)); } } StrOp.free(idRes); } /* stage */ else if( StrOp.equals( wStage.name(), NodeOp.getName(cmd)) ) { char* idRes = VarOp.getText(wItem.getid(cmd), map, ' '); iOStage stage = ModelOp.getStage(model, idRes); if( stage != NULL ) { StageOp.cmd( (iIBlockBase)stage, (iONode)NodeOp.base.clone(cmd)); } StrOp.free(idRes); } /* seltab */ else if( StrOp.equals( wSelTab.name(), NodeOp.getName(cmd)) ) { char* idRes = VarOp.getText(wItem.getid(cmd), map, ' '); iOSelTab seltab = ModelOp.getSelectiontable(model, idRes); if( seltab != NULL ) { SelTabOp.cmd( (iIBlockBase)seltab, (iONode)NodeOp.base.clone(cmd)); } StrOp.free(idRes); } /* location */ else if( StrOp.equals( wLocation.name(), NodeOp.getName(cmd)) ) { char* idRes = VarOp.getText(wItem.getid(cmd), map, ' '); iOLocation location = ModelOp.getLocation(model, idRes); if( location != NULL ) { LocationOp.cmd( location, (iONode)NodeOp.base.clone(cmd)); } StrOp.free(idRes); } /* switch */ else if( StrOp.equals( wSwitch.name(), NodeOp.getName(cmd)) ) { char* idRes = VarOp.getText(wItem.getid(cmd), map, ' '); iOSwitch sw = ModelOp.getSwitch(model, idRes); if( sw != NULL ) { SwitchOp.cmd(sw, (iONode)NodeOp.base.clone(cmd), True, 0, NULL, NULL); } StrOp.free(idRes); } /* signal */ else if( StrOp.equals( wSignal.name(), NodeOp.getName(cmd)) ) { char* idRes = VarOp.getText(wItem.getid(cmd), map, ' '); iOSignal sg = ModelOp.getSignal(model, idRes); if( sg != NULL ) { SignalOp.cmd(sg, (iONode)NodeOp.base.clone(cmd), True); } StrOp.free(idRes); } /* route */ else if( StrOp.equals( wRoute.name(), NodeOp.getName(cmd)) ) { char* idRes = VarOp.getText(wItem.getid(cmd), map, ' '); iORoute st = ModelOp.getRoute(model, idRes); if( NodeOp.findAttr(cmd, "locid") != NULL ) { char* locidRes = VarOp.getText(wRoute.getlocid(cmd), map, ' '); wRoute.setlocid(cmd, locidRes); StrOp.free(locidRes); } if( st != NULL ) { RouteOp.cmd(st, (iONode)NodeOp.base.clone(cmd)); } StrOp.free(idRes); } /* output */ else if( StrOp.equals( wOutput.name(), NodeOp.getName(cmd)) ) { char* idRes = VarOp.getText(wItem.getid(cmd), map, ' '); iOOutput co = ModelOp.getOutput(model, idRes); if( co != NULL ) { OutputOp.cmd(co, (iONode)NodeOp.base.clone(cmd), True); } StrOp.free(idRes); } /* sensor */ else if( StrOp.equals( wFeedback.name(), NodeOp.getName(cmd)) ) { char* idRes = VarOp.getText(wItem.getid(cmd), map, ' '); iOFBack fb = ModelOp.getFBack(model, idRes); if( fb != NULL ) { if( StrOp.equals(wOutput.flip, wFeedback.getcmd(cmd)) ) { Boolean state = FBackOp.getState(fb); wFeedback.setstate( cmd, !state ); TraceOp.trc( name, TRCLEVEL_INFO, __LINE__, 9999, "setting sensor [%s] to [%s]", idRes, state?"off":"on" ); FBackOp.event( fb, (iONode)NodeOp.base.clone(cmd) ); } else if( StrOp.equals(wOutput.on, wFeedback.getcmd(cmd)) || StrOp.equals(wOutput.off, wFeedback.getcmd(cmd)) ) { wFeedback.setstate( cmd, StrOp.equals(wOutput.on, wFeedback.getcmd(cmd)) ? True:False); TraceOp.trc( name, TRCLEVEL_INFO, __LINE__, 9999, "setting sensor [%s] to [%s]", idRes, wFeedback.getcmd(cmd) ); FBackOp.event( fb, (iONode)NodeOp.base.clone(cmd) ); } else { FBackOp.cmd(fb, (iONode)NodeOp.base.clone(cmd), True); } } StrOp.free(idRes); } /* actionctrl */ else if( StrOp.equals( wActionCtrl.name(), NodeOp.getName(cmd)) ) { iOAction Action = ModelOp.getAction(model, wActionCtrl.getid( cmd )); if( Action != NULL ) { ActionOp.exec(Action, cmd); } else TraceOp.trc( name, TRCLEVEL_WARNING, __LINE__, 9999, "action [%s] not found", wActionCtrl.getid( cmd ) ); } /* auto */ else if( StrOp.equals( wAutoCmd.name(), NodeOp.getName(cmd)) ) { clntcon_callback pfun = ControlOp.getCallback(AppOp.getControl()); pfun( (obj)AppOp.getControl(), (iONode)NodeOp.base.clone(cmd) ); } /* system */ else if( StrOp.equals( wSysCmd.name(), NodeOp.getName(cmd)) ) { int error = 0; ControlOp.cmd( AppOp.getControl(), (iONode)NodeOp.base.clone(cmd), &error ); } /* sleep */ else if( StrOp.equals( "sleep", NodeOp.getName(cmd)) ) { int sleep = VarOp.getValue(NodeOp.getStr(cmd, "time", "0"), NULL ); if( sleep > 1000 ) { TraceOp.trc( name, TRCLEVEL_WARNING, __LINE__, 9999, "a sleep > 1000ms, %d, is not permitted; Sleep 1000ms...", sleep ); sleep = 1000; } ThreadOp.sleep(sleep); } /* exit */ else if( StrOp.equals( "exit", NodeOp.getName(cmd)) ) { exit = True; TraceOp.trc( name, TRCLEVEL_INFO, __LINE__, 9999, "exit script: %s", NodeOp.getStr(cmd, "cmt", "?") ); } /* continue */ else if( StrOp.equals( "continue", NodeOp.getName(cmd)) ) { if( continueloop != NULL ) { const char* condition = NodeOp.getStr(cmd, "condition", NULL); char* conditionRes = NULL; if( condition != NULL ) { conditionRes = TextOp.replaceAllSubstitutions(condition, map); TraceOp.trc( name, TRCLEVEL_INFO, __LINE__, 9999, "continue condition [%s]", conditionRes ); } if( conditionRes == NULL || __isCondition(conditionRes, NodeOp.getBool(cmd, "alltrue", True)) ) { *continueloop = True; TraceOp.trc( name, TRCLEVEL_INFO, __LINE__, 9999, "continue: %s", NodeOp.getStr(cmd, "cmt", "?") ); } } } /* break */ else if( StrOp.equals( "break", NodeOp.getName(cmd)) ) { if( breakloop != NULL ) { const char* condition = NodeOp.getStr(cmd, "condition", NULL); char* conditionRes = NULL; if( condition != NULL ) { conditionRes = TextOp.replaceAllSubstitutions(condition, map); TraceOp.trc( name, TRCLEVEL_INFO, __LINE__, 9999, "break condition [%s]", conditionRes ); } if( conditionRes == NULL || __isCondition(conditionRes, NodeOp.getBool(cmd, "alltrue", True)) ) { *breakloop = True; TraceOp.trc( name, TRCLEVEL_INFO, __LINE__, 9999, "break: %s", NodeOp.getStr(cmd, "cmt", "?") ); } } } /* sub */ else if( StrOp.equals( "sub", NodeOp.getName(cmd)) ) { const char* scriptFile = NodeOp.getStr(cmd, "file", ""); char* xmlFilename = NULL; if( FileOp.isAbsolute(scriptFile) ) xmlFilename = StrOp.dup(scriptFile); else xmlFilename = StrOp.fmt("%s%c%s", wRocRail.getxmlscriptpath(AppOp.getIni()), SystemOp.getFileSeparator(), scriptFile); TraceOp.trc( name, TRCLEVEL_INFO, __LINE__, 9999, "sub xmlscript: [%s]", xmlFilename ); if( FileOp.exist(xmlFilename) ) { int size = FileOp.fileSize(xmlFilename); char* xmlscript = allocMem( size + 1); iOFile f = FileOp.inst( xmlFilename, OPEN_READONLY); if( f != NULL ) { FileOp.read( f, xmlscript, size); FileOp.base.del(f); TraceOp.trc( name, TRCLEVEL_INFO, __LINE__, 9999, "run sub xmlscript file [%s], size=%d", xmlFilename, size ); XmlScriptOp.run( xmlscript, map, wItem.getid(cmd) ); freeMem(xmlscript); } } StrOp.free(xmlFilename); } /* var */ else if( StrOp.equals( wVariable.name(), NodeOp.getName(cmd)) ) { iOMap map = MapOp.inst(); const char* id = wItem.getid(cmd); MapOp.put(map, "oid", (obj)oid); char* varRes = VarOp.getText(id, map, ' '); MapOp.base.del(map); iONode var = ModelOp.getVariable(model, varRes); if( var == NULL ) var = ModelOp.addVariable( model, varRes ); if( var != NULL ) { if( NodeOp.findAttr(cmd, "text") != NULL) { wVariable.settext(var, VarOp.getText(wVariable.gettext(cmd), NULL, wVariable.gettokeniser(cmd)[0])); TraceOp.trc( name, TRCLEVEL_INFO, __LINE__, 9999, "var [%s] = [%s]", varRes, wVariable.gettext(var) ); } if( NodeOp.findAttr(cmd, "value") != NULL ) { wVariable.setvalue(var, VarOp.getValue(NodeOp.getStr(cmd, "value", ""), NULL)); TraceOp.trc( name, TRCLEVEL_INFO, __LINE__, 9999, "var [%s] = %d", varRes, wVariable.getvalue(var) ); } if( NodeOp.findAttr(cmd, "min") != NULL ) { wVariable.setmin(var, NodeOp.getInt(cmd, "min", 0)); TraceOp.trc( name, TRCLEVEL_INFO, __LINE__, 9999, "var [%s] min = %d", varRes, wVariable.getmin(var) ); } if( NodeOp.findAttr(cmd, "max") != NULL ) { wVariable.setmax(var, NodeOp.getInt(cmd, "max", 0)); TraceOp.trc( name, TRCLEVEL_INFO, __LINE__, 9999, "var [%s] max = %d", varRes, wVariable.getmax(var) ); } if( NodeOp.findAttr(cmd, "cmd") != NULL ) { if( StrOp.equals(NodeOp.getStr(cmd, "cmd", ""), wVariable.op_random ) ) { VarOp.setRandom(var); } else if( StrOp.equals(NodeOp.getStr(cmd, "cmd", ""), wVariable.op_start ) ) { wVariable.settimer(var, True); TraceOp.trc( name, TRCLEVEL_CALC, __LINE__, 9999, "variable [%s] cmd=[%s] timer started with value %d", wVariable.getid(var), wVariable.op_start, wVariable.getvalue(var) ); } else if( StrOp.equals(NodeOp.getStr(cmd, "cmd", ""), wVariable.op_stop ) ) { wVariable.settimer(var, False); TraceOp.trc( name, TRCLEVEL_CALC, __LINE__, 9999, "variable [%s] cmd=[%s] timer stopped with value %d", wVariable.getid(var), wVariable.op_stop, wVariable.getvalue(var) ); } } /* Broadcast to clients. */ { iONode node = NodeOp.inst( wVariable.name(), NULL, ELEMENT_NODE ); wVariable.setid( node, wVariable.getid( var ) ); wVariable.settext( node, wVariable.gettext( var ) ); wVariable.setvalue( node, wVariable.getvalue( var ) ); wVariable.setmin( node, wVariable.getmin( var ) ); wVariable.setmax( node, wVariable.getmax( var ) ); TraceOp.trc( name, TRCLEVEL_INFO, __LINE__, 9999, "broadcast variable %s [%d, \"%s\"]", wVariable.getid(var), wVariable.getvalue(var), wVariable.gettext(var)); AppOp.broadcastEvent( node ); } } StrOp.free( varRes ); } /* text */ else if( StrOp.equals( wText.name(), NodeOp.getName(cmd)) ) { char* oid = VarOp.getText(wItem.getid(cmd), map, ' '); iOText text = ModelOp.getText( model, oid ); if( text != NULL && wText.getformat(cmd) != NULL ) { iONode evt = NodeOp.inst( wText.name(), NULL, ELEMENT_NODE ); wText.setformat(evt, wText.getformat(cmd)); if( map != NULL ) { if( MapOp.haskey(map, "lcid") ) wText.setreflcid(evt, (const char*)MapOp.get(map, "lcid")); if( MapOp.haskey(map, "bkid") ) wText.setrefbkid(evt, (const char*)MapOp.get(map, "bkid")); if( MapOp.haskey(map, "callerid") ) wText.setrefcallerid(evt, (const char*)MapOp.get(map, "callerid")); if( MapOp.haskey(map, "state") ) NodeOp.setStr(evt, "state", (const char*)MapOp.get(map, "state")); if( MapOp.haskey(map, "substate") ) NodeOp.setStr(evt, "substate", (const char*)MapOp.get(map, "substate")); } TextOp.base.event(text, evt); } else if( text != NULL && wText.getformat(cmd) == NULL ) { TraceOp.trc( name, TRCLEVEL_WARNING, __LINE__, 9999, "text [%s] format is missing", oid); } else if( text == NULL ) { TraceOp.trc( name, TRCLEVEL_WARNING, __LINE__, 9999, "text [%s] not found", oid); } StrOp.free(oid); } /* if */ else if( StrOp.equals( "if", NodeOp.getName(cmd)) ) { TraceOp.trc( name, TRCLEVEL_INFO, __LINE__, 9999, "nested if..."); exit = __doIf(cmd, map, script); } /* foreach */ else if( StrOp.equals( "foreach", NodeOp.getName(cmd)) ) { TraceOp.trc( name, TRCLEVEL_INFO, __LINE__, 9999, "nested foreach..."); exit = __doForEach(cmd, map, script); } /* while */ else if( StrOp.equals( "while", NodeOp.getName(cmd)) ) { TraceOp.trc( name, TRCLEVEL_INFO, __LINE__, 9999, "nested while..."); exit = __doWhile(cmd, map, script); } /* switch */ else if( StrOp.equals( "switch", NodeOp.getName(cmd)) ) { TraceOp.trc( name, TRCLEVEL_INFO, __LINE__, 9999, "nested switch..."); exit = __doSwitch(cmd, map, script); } /* call */ else if( StrOp.equals( "call", NodeOp.getName(cmd)) ) { TraceOp.trc( name, TRCLEVEL_INFO, __LINE__, 9999, "call..."); exit = __doCall(cmd, map, script); } return exit; }
static int _Main( iOApp inst, int argc, char** argv ) { iOAppData data = Data(inst); iOTrace trc = NULL; Boolean cd = False; /* check commandline arguments */ iOCmdLn arg = CmdLnOp.inst( argc, (const char**)argv ); tracelevel debug = CmdLnOp.hasKey( arg, wCmdline.debug ) ? TRCLEVEL_DEBUG:0; tracelevel dump = CmdLnOp.hasKey( arg, wCmdline.byte ) ? TRCLEVEL_BYTE:0; tracelevel parse = CmdLnOp.hasKey( arg, wCmdline.parse ) ? TRCLEVEL_PARSE:0; tracelevel monitor = CmdLnOp.hasKey( arg, wCmdline.monitor) ? TRCLEVEL_MONITOR:0; tracelevel info = CmdLnOp.hasKey( arg, wCmdline.info ) ? TRCLEVEL_INFO:0; tracelevel http = CmdLnOp.hasKey( arg, wCmdline.http ) ? TRCLEVEL_USER2:0; const char* wd = CmdLnOp.getStr( arg, wCmdline.workdir ); const char* tf = CmdLnOp.getStr( arg, wCmdline.trcfile ); const char* pf = CmdLnOp.getStr( arg, wCmdline.planfile ); const char* lf = CmdLnOp.getStr( arg, wCmdline.locofile ); const char* port = CmdLnOp.getStr( arg, wCmdline.port ); const char* nf = CmdLnOp.getStr( arg, wCmdline.inifile ); Boolean initfield = CmdLnOp.hasKey( arg, wCmdline.initfield ); Boolean help = CmdLnOp.hasKey( arg, wCmdline.help ) | CmdLnOp.hasKey( arg, "-?" ); Boolean nocom = CmdLnOp.hasKey( arg, wCmdline.nocom ); Boolean console = CmdLnOp.hasKey( arg, wCmdline.console ); Boolean doc = CmdLnOp.hasKey( arg, wCmdline.doc ); Boolean version = CmdLnOp.hasKey( arg, wCmdline.version ); Boolean service = CmdLnOp.hasKey( arg, wCmdline.service ); Boolean lcd = CmdLnOp.hasKey( arg, wCmdline.lcd ); Boolean nodevcheck = CmdLnOp.hasKey( arg, wCmdline.nodevcheck ); Boolean automode = CmdLnOp.hasKey( arg, wCmdline.automode ); Boolean resume = CmdLnOp.hasKey( arg, wCmdline.resume ); data->run = CmdLnOp.hasKey( arg, wCmdline.run ); data->stress = CmdLnOp.hasKey( arg, wCmdline.stress ); data->createmodplan = CmdLnOp.hasKey( arg, wCmdline.modplan ); data->szLibPath = CmdLnOp.getStr( arg, wCmdline.libpath ); data->szImgPath = CmdLnOp.getStr( arg, wCmdline.imgpath ); /* change the programs working directory */ if( wd != NULL ) { cd = FileOp.cd( wd ); } trc = TraceOp.inst( debug | dump | monitor | parse | info | http | TRCLEVEL_WARNING | TRCLEVEL_CALC | TRCLEVEL_STATUS, tf, True ); TraceOp.setAppID( trc, "r" ); if( wd != NULL ) { char* pwd = FileOp.pwd(); TraceOp.trc( name, cd?TRCLEVEL_CALC:TRCLEVEL_EXCEPTION, __LINE__, 9999, "workdir [%s] pwd [%s]", wd, pwd ); StrOp.free(pwd); if( !cd ) { cd = FileOp.cd( wd ); if( !cd ) TraceOp.terrno( name, TRCLEVEL_EXCEPTION, __LINE__, 9999, errno, "Error changing workdir" ); } } data->consoleMode = console; if( service ) { /* block reading console */ console = False; nocom = False; } else { if( help ) { data->revno = __logo(); __help(); return 0; } else if( doc ) { /* Write the embeded documentation into local HTML files: */ extern const char rocrail_doc[]; /* xspooler.ini doc */ char* fname = StrOp.fmt( "%s.html", wGlobal.productname ); iOFile f = FileOp.inst( fname, OPEN_WRITE ); __logo(); if( f != NULL ) { Boolean ok = FileOp.write( f, rocrail_doc, StrOp.len( rocrail_doc ) ); FileOp.base.del( f ); TraceOp.println( "%s %s", fname, ok?"successfully written.":"not written." ); } StrOp.free( fname ); return 0; } else if( version ) { __logo(); return 0; } } /* Read the Inifile: */ { char* iniXml = NULL; iODoc iniDoc = NULL; Boolean newIni = False; data->szIniFile = nf?nf:wRocRail.getfile(NULL); iniXml = __readIniFile(data->szIniFile); if( iniXml == NULL ) { iniXml = StrOp.fmt( "<%s/>", wRocRail.name()); newIni = True; TraceOp.trc( name, TRCLEVEL_EXCEPTION, __LINE__, 9999, "empty ini file! [%s]", data->szIniFile ); } /* Parse the Inifile: */ iniDoc = DocOp.parse( iniXml ); if( iniDoc != NULL ) { data->ini = DocOp.getRootNode( iniDoc ); if( newIni ) { /* activate use block side routes for new work spaces */ iONode ctrl = NodeOp.inst( wCtrl.name(), data->ini, ELEMENT_NODE ); NodeOp.addChild( data->ini, ctrl ); } } else { TraceOp.trc( name, TRCLEVEL_EXCEPTION, __LINE__, 9999, "Invalid ini file! [%s]", nf?nf:wRocRail.getfile(NULL) ); return -1; } } if( nodevcheck ) { wRocRail.setnodevcheck(data->ini, nodevcheck ); } if( FileOp.exist(wRocRail.getkeypath(data->ini)) ) { iOFile f = FileOp.inst( wRocRail.getkeypath(data->ini), OPEN_READONLY ); char* buffer = (char*)allocMem( FileOp.size( f ) +1 ); FileOp.read( f, buffer, FileOp.size( f ) ); FileOp.base.del( f ); iOStrTok tok = StrTokOp.inst( buffer, ';' ); if( StrTokOp.hasMoreTokens(tok)) data->doneml = StrOp.dup(StrTokOp.nextToken(tok) ); if( StrTokOp.hasMoreTokens(tok)) data->donkey = StrOp.dup(StrTokOp.nextToken(tok) ); StrTokOp.base.del( tok ); freeMem(buffer); } if( data->donkey == NULL || StrOp.len(data->donkey) == 0 ) { data->donkey = wRocRail.getdonkey( data->ini ); data->donkey = wRocRail.getdoneml( data->ini ); } if( wRocRail.isrunasroot( data->ini ) ) { TraceOp.trc( name, TRCLEVEL_INFO, __LINE__, 9999, "Try to run rocrail as root..." ); if( !SystemOp.setAdmin() ) { TraceOp.trc( name, TRCLEVEL_EXCEPTION, __LINE__, 9999, "Only user 'root' can start rocrail! Abort!" ); return -1; } } if( data->szLibPath == NULL ) { data->szLibPath = wRocRail.getlibpath( data->ini ); } if( info != TRCLEVEL_INFO ){ /* Check info tracelevel. */ int level = TraceOp.getLevel( trc ); Boolean infoParam = wTrace.isinfo( wRocRail.gettrace( data->ini ) ); Boolean infoCmd = (info & TRCLEVEL_INFO) ? True:False; if( infoCmd != infoParam ) { level &= 0xfffff ^ TRCLEVEL_INFO; level |= infoParam ? TRCLEVEL_INFO:0; TraceOp.setLevel( trc, level ); } } /* Tracefile and listener */ if( wRocRail.gettrace( data->ini ) == NULL ) { iONode trace = NodeOp.inst( wTrace.name(), data->ini, ELEMENT_NODE ); NodeOp.addChild( data->ini, trace ); } if( wTrace.isdebug( wRocRail.gettrace( data->ini ) ) || debug ) TraceOp.setLevel( trc, TraceOp.getLevel( trc ) | TRCLEVEL_DEBUG ); if( wTrace.isautomatic( wRocRail.gettrace( data->ini ) ) ) TraceOp.setLevel( trc, TraceOp.getLevel( trc ) | TRCLEVEL_USER1 ); if( wTrace.ismonitor( wRocRail.gettrace( data->ini ) ) || monitor ) TraceOp.setLevel( trc, TraceOp.getLevel( trc ) | TRCLEVEL_MONITOR ); if( wTrace.isbyte( wRocRail.gettrace( data->ini ) ) || dump ) TraceOp.setLevel( trc, TraceOp.getLevel( trc ) | TRCLEVEL_BYTE ); if( wTrace.isparse( wRocRail.gettrace( data->ini ) ) || parse ) TraceOp.setLevel( trc, TraceOp.getLevel( trc ) | TRCLEVEL_PARSE ); if( wTrace.iscalc( wRocRail.gettrace( data->ini ) ) ) TraceOp.setLevel( trc, TraceOp.getLevel( trc ) | TRCLEVEL_CALC ); /* Tracefile and listener */ { iONode tini = wRocRail.gettrace( data->ini ); char* tracefilename = NULL; const char* protpath = wTrace.getprotpath( tini ); Boolean unique = wTrace.isunique( tini ); const char* tf2 = wTrace.getrfile( tini ); int size = wTrace.getsize( tini ); int nr = wTrace.getnr( tini ); Boolean exceptionfile = wTrace.isexceptionfile( tini ); const char* invoke = wTrace.getinvoke( tini ); Boolean invokeasync = wTrace.isinvokeasync( tini ); int dumpsize = wTrace.getdumpsize( tini ); TraceOp.setFileSize( trc, size ); TraceOp.setNrFiles( trc, nr ); TraceOp.setExceptionFile( trc, exceptionfile ); TraceOp.setInvoke( trc, invoke, invokeasync ); TraceOp.setDumpsize( trc, dumpsize ); if( tf == NULL ) tf = tf2; else { char* p = FileOp.getPath( tf ); TraceOp.trc( name, TRCLEVEL_DEBUG, __LINE__, 9999, "ProtPath set to [%s]. (tf=\"%s\")", p, tf ); wTrace.setprotpath( tini, p ); StrOp.free( p ); protpath = wTrace.getprotpath( tini ); wTrace.setrfile( tini, FileOp.ripPath( tf ) ); } /* Check protpath. */ if( protpath != NULL ) { if( !FileOp.access( protpath ) ) { if( FileOp.mkdir( protpath ) ) TraceOp.trc( name, TRCLEVEL_DEBUG, __LINE__, 9999, "ProtPath [%s] created.", protpath ); else { TraceOp.trc( name, TRCLEVEL_WARNING, __LINE__, 1002, "Protocol path [%s] invalid.(Using current folder.", protpath ); protpath = NULL; } } else TraceOp.trc( name, TRCLEVEL_DEBUG, __LINE__, 9999, "ProtPath [%s] OK.", protpath ); } if( protpath != NULL && !FileOp.isAbsolute( tf ) ) { char* stamp = StrOp.createStamp(); if( !FileOp.isAbsolute( protpath ) ) { char* wd = FileOp.pwd(); tracefilename = StrOp.fmt( "%s%c%s%c%s%s", wd, SystemOp.getFileSeparator(), protpath, SystemOp.getFileSeparator(), tf, unique ? stamp:"" ); StrOp.free( wd ); } else { tracefilename = StrOp.fmt( "%s%c%s%s", protpath, SystemOp.getFileSeparator(), tf, unique ? stamp:"" ); } StrOp.free( stamp ); } else { char* stamp = StrOp.createStamp(); tracefilename = StrOp.fmt( "%s%s", tf, unique ? stamp:"" ); StrOp.free( stamp ); } TraceOp.setFilename( trc, tracefilename ); TraceOp.setExceptionListener( trc, __exception, False, wTrace.islisten2all(tini) ); StrOp.free( tracefilename ); } /* Logo. */ data->revno = __logo(); TraceOp.trc( name, TRCLEVEL_INFO, __LINE__, 9999, "dpIID = [%s]", wRocRail.getdpiid(data->ini) ); TraceOp.trc( name, TRCLEVEL_INFO, __LINE__, 9999, "ptIID = [%s]", wRocRail.getptiid(data->ini) ); TraceOp.trc( name, TRCLEVEL_INFO, __LINE__, 9999, "svIID = [%s]", wRocRail.getsviid(data->ini) ); TraceOp.trc( name, TRCLEVEL_INFO, __LINE__, 9999, "lcIID = [%s]", wRocRail.getlciid(data->ini) ); /* planDoc */ pf = pf?pf:wRocRail.getplanfile(data->ini); lf = lf?lf:wRocRail.getlocs(data->ini); data->model = ModelOp.inst( pf, lf ); if( !ModelOp.init( data->model ) ) { TraceOp.trc( name, TRCLEVEL_EXCEPTION, __LINE__, 9999, "unable to create model: EXIT" ); return 0; } MemOp.setDebug( False ); /* Control */ data->control = ControlOp.inst( nocom ); /* Weather */ data->weather = WeatherOp.inst(ModelOp.getWeather(data->model, wRocRail.getweatherid(data->ini))); /* Client connection */ { iONode tcp = wRocRail.gettcp(data->ini); int iPort = 0; if( tcp == NULL ) { tcp = NodeOp.inst( wTcp.name(), data->ini, ELEMENT_NODE ); NodeOp.addChild( data->ini, tcp ); } iPort = port?atoi(port):wTcp.getport(tcp); data->clntCon = ClntConOp.inst( tcp, iPort, ControlOp.getCallback( data->control), (obj)data->control ); } /* Client connection */ { iONode srcpini = wRocRail.getsrcpcon(data->ini); if( srcpini != NULL && wSrcpCon.getport(srcpini) > 0 && wSrcpCon.isactive(srcpini) ) { data->srcpCon = SrcpConOp.inst( srcpini, ControlOp.getCallback( data->control), (obj)data->control ); } } /* Http (Optional)*/ { iONode http = wRocRail.gethttp( data->ini ); if( http != NULL ) { iONode tcp = wRocRail.gettcp(data->ini); const char* controlcode = NULL; const char* slavecode = NULL; if( tcp != NULL ) { controlcode = wTcp.getcontrolcode(tcp); slavecode = wTcp.getslavecode(tcp); } data->http = HttpOp.inst( http, ControlOp.getCallback( data->control), (obj)data->control, wRocRail.getimgpath(data->ini), controlcode, slavecode ); } } /* Snmp (Optional)*/ { iONode snmp = wRocRail.getSnmpService( data->ini ); if( snmp != NULL && wSnmpService.isactive(snmp) ) data->snmp = SNMPOp.inst( snmp ); } if( wRocRail.ispoweronatinit(data->ini) ) { AppOp.go(); } ModelOp.initField( data->model, initfield ); /* update the feedback arrays */ ModelOp.updateFB( data->model ); /* run every thing at startup */ if( automode ) { iONode cmd = NULL; clntcon_callback pfun = ControlOp.getCallback(data->control); /* power on */ AppOp.go(); /* auto mode on */ cmd = NodeOp.inst( wAutoCmd.name(), NULL, ELEMENT_NODE ); wAutoCmd.setcmd( cmd, wAutoCmd.on ); pfun( (obj)AppOp.getControl(), cmd ); /* start all */ if(data->run || resume) { cmd = NodeOp.inst( wAutoCmd.name(), NULL, ELEMENT_NODE ); wAutoCmd.setcmd( cmd, resume? wAutoCmd.resume:wAutoCmd.start ); pfun( (obj)AppOp.getControl(), cmd ); } } /* Memory watcher */ while( !bShutdown ) { static int cnt1 = 0; int cnt2 = MemOp.getAllocCount(); if( cnt2 > cnt1 ) { TraceOp.trc( name, TRCLEVEL_BYTE, __LINE__, 9999, "memory allocations old=%u new=%u", cnt1, cnt2 ); if(wTrace.ismeminfo( wRocRail.gettrace( data->ini ) )) rocsStatistics( True ); } cnt1 = cnt2; ThreadOp.sleep( 1000 ); /* Check for command. */ if( data->consoleMode ) __checkConsole( data ); }; return 0; }
void set_message_handler(T pfun) { m_companion->become(pfun(m_companion.get())); }
int main( int argc , char * argv[] ) { fun pfun = NULL; pfun = &min; pfun(1,2); return EXIT_SUCCESS; }