Пример #1
0
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;
}
Пример #2
0
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;
}
Пример #3
0
//
// 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);
}
Пример #4
0
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;
}
Пример #5
0
/* ----------------------------------------------------------------
 * 功    能:设置密钥参数(包括长度类型与分量值)
 * 输入参数: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';
}
Пример #6
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;
}
Пример #7
0
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();
}
Пример #8
0
// Definition of a function to call a function
int any_function(int(*pfun)(int, int), int x, int y)
{
  return pfun(x, y);
}
Пример #9
0
//using pointer to func_type
void process_string1(fun_type* pfun,char *s){
	pfun(s);
}
Пример #10
0
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);

}
Пример #11
0
color PaletteFunc::getSwap(const color& c){
	return pfun(c);
}
Пример #12
0
 void set_message_handler(T pfun) {
   companion_->become(pfun(companion_.get()));
 }
Пример #13
0
Файл: Ex11.c Проект: marrusian/C
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]);
}
Пример #14
0
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;
}
Пример #15
0
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;
}
Пример #16
0
 void set_message_handler(T pfun) {
     m_companion->become(pfun(m_companion.get()));
 }
Пример #17
0
int main( int argc , char * argv[] )  {
	fun pfun = NULL;
        pfun = &min;
        pfun(1,2);
    return EXIT_SUCCESS;
}