static void check(const char *str, const char *expect) { char *got = macEnvExpand(str); int pass = -1; if (expect && !got) { testDiag("Got NULL, expected \"%s\".\n", expect); pass = 0; } else if (!expect && got) { testDiag("Got \"%s\", expected NULL.\n", got); pass = 0; } else if (expect && got && strcmp(got, expect)) { testDiag("Got \"%s\", expected \"%s\".\n", got, expect); pass = 0; } testOk(pass, "%s", str); }
static void dbIncludeNew(char *filename) { inputFile *pinputFile; FILE *fp; pinputFile = dbCalloc(1,sizeof(inputFile)); pinputFile->filename = macEnvExpand(filename); pinputFile->path = dbOpenFile(pdbbase, pinputFile->filename, &fp); if (!fp) { epicsPrintf("Can't open include file \"%s\"\n", filename); yyerror(NULL); free((void *)pinputFile->filename); free((void *)pinputFile); return; } pinputFile->fp = fp; ellAdd(&inputFileList,&pinputFile->node); pinputFileNow = pinputFile; }
/// \param[in] configSection @copydoc initArg1 /// \param[in] configFile @copydoc initArg2 /// \param[in] options @copydoc initArg4 NetShrVarInterface::NetShrVarInterface(const char *configSection, const char* configFile, int options) : m_configSection(configSection), m_options(options) { epicsThreadOnce(&onceId, initCV, NULL); char* configFile_expanded = macEnvExpand(configFile); m_configFile = configFile_expanded; epicsAtExit(epicsExitFunc, this); pugi::xml_parse_result result = m_xmlconfig.load_file(configFile_expanded); free(configFile_expanded); if (result) { std::cerr << "Loaded XML config file \"" << m_configFile << "\" (expanded from \"" << configFile << "\")" << std::endl; } else { throw std::runtime_error("Cannot load XML \"" + m_configFile + "\" (expanded from \"" + std::string(configFile) + "\"): load failure: " + result.description()); } }
static void daeCASThread(void* arg) { exServer *pCAS; unsigned debugLevel = 0u; double executionTime = 0.0; double asyncDelay = 0.1; const char* pvPrefix; unsigned aliasCount = 1u; unsigned scanOn = true; unsigned syncScan = true; unsigned maxSimultAsyncIO = 1000u; isisdaeInterface* iface = static_cast<isisdaeInterface*>(arg); printf("starting cas server\n"); pvPrefix = macEnvExpand("$(MYPVPREFIX)DAE:"); try { pCAS = new exServer ( pvPrefix, aliasCount, scanOn != 0, syncScan == 0, asyncDelay, maxSimultAsyncIO, iface ); } catch ( ... ) { errlogSevPrintf (errlogMajor, "Server initialization error\n" ); errlogFlush (); return; } pCAS->setDebugLevel(debugLevel); try { while (true) { fileDescriptorManager.process(1000.0); } } catch(const std::exception& ex) { std::cerr << ex.what() << std::endl; } //pCAS->show(2u); delete pCAS; errlogFlush (); }
void isisdaeDriver::updateRunStatus() { static frame_uamp_state fu_state, r_fu_state, p_fu_state; static const char* no_check_frame_uamp = macEnvExpand("$(NOCHECKFUAMP=)"); if (m_inStateTrans) { return; } int rs = m_iface->getRunState(); if (rs == RS_RUNNING && m_vetopc > 50.0) { m_RunStatus = RS_VETOING; } else { m_RunStatus = rs; } long frames = m_iface->getGoodFrames(); double uah = m_iface->getGoodUAH(); // long p_frames = m_iface->getGoodFramesPeriod(); // this currently only works in period card mode // double p_uah = m_iface->getGoodUAHPeriod(); long r_frames = m_iface->getRawFrames(); double r_uah = 0.0; if (no_check_frame_uamp == NULL || *no_check_frame_uamp == '\0') { check_frame_uamp("good", frames, uah, fu_state); check_frame_uamp("raw", r_frames, r_uah, r_fu_state); // check_frame_uamp("period good", p_frames, p_uah, p_fu_state); } setDoubleParam(P_GoodUAH, uah); // setDoubleParam(P_GoodUAHPeriod, p_uah); setIntegerParam(P_TotalCounts, m_iface->getTotalCounts()); setIntegerParam(P_GoodFramesTotal, frames); // setIntegerParam(P_GoodFramesPeriod, p_frames); setIntegerParam(P_RawFramesTotal, r_frames); setIntegerParam(P_RunStatus, m_RunStatus); ///@todo need to update P_RawFramesPeriod, P_RunDurationTotal, P_TotalUAmps, P_RunDurationPeriod,P_TotalDaeCounts, P_MonitorCounts }
/* * The body of the command interpreter */ static int iocshBody (const char *pathname, const char *commandLine) { FILE *fp = NULL; const char *filename = NULL; int icin, icout; char c; int quote, inword, backslash; const char *raw = NULL;; char *line = NULL; int lineno = 0; int argc; char **argv = NULL; int argvCapacity = 0; struct iocshRedirect *redirects = NULL; struct iocshRedirect *redirect = NULL; int sep; const char *prompt = NULL; const char *ifs = " \t(),\r"; iocshArgBuf *argBuf = NULL; int argBufCapacity = 0; struct iocshCommand *found; void *readlineContext = NULL; int wasOkToBlock; /* * See if command interpreter is interactive */ if (commandLine == NULL) { if ((pathname == NULL) || (strcmp (pathname, "<telnet>") == 0)) { if ((prompt = envGetConfigParamPtr(&IOCSH_PS1)) == NULL) prompt = "epics> "; } else { fp = fopen (pathname, "r"); if (fp == NULL) { fprintf(epicsGetStderr(), "Can't open %s: %s\n", pathname, strerror (errno)); return -1; } if ((filename = strrchr (pathname, '/')) == NULL) filename = pathname; else filename++; prompt = NULL; } /* * Create a command-line input context */ if ((readlineContext = epicsReadlineBegin(fp)) == NULL) { fprintf(epicsGetStderr(), "Can't allocate command-line object.\n"); if (fp) fclose(fp); return -1; } } /* * Set up redirection */ redirects = (struct iocshRedirect *)calloc(NREDIRECTS, sizeof *redirects); if (redirects == NULL) { fprintf(epicsGetStderr(), "Out of memory!\n"); return -1; } /* * Read commands till EOF or exit */ argc = 0; wasOkToBlock = epicsThreadIsOkToBlock(); epicsThreadSetOkToBlock(1); for (;;) { /* * Read a line */ if (commandLine) { if (raw != NULL) break; raw = commandLine; } else { if ((raw = epicsReadline(prompt, readlineContext)) == NULL) break; } lineno++; /* * Skip leading white-space */ icin = 0; while ((c = raw[icin]) && isspace(c)) { icin++; } /* * Ignore comment lines other than to echo * them if they came from a script. This * avoids macLib errors from comments. */ if (c == '#') { if ((prompt == NULL) && (commandLine == NULL)) puts(raw); continue; } /* * Expand macros */ free(line); if ((line = macEnvExpand(raw)) == NULL) continue; /* * Skip leading white-space coming from a macro */ while ((c = line[icin]) && isspace(c)) { icin++; } /* * Echo non-empty lines read from a script */ if ((prompt == NULL) && *line && (commandLine == NULL)) puts(line); /* * Ignore lines that became a comment or empty after macro expansion */ if (!c || c == '#') continue; /* * Break line into words */ icout = 0; inword = 0; argc = 0; quote = EOF; backslash = 0; redirect = NULL; for (;;) { if (argc >= argvCapacity) { char **av; argvCapacity += 50; av = (char **)realloc (argv, argvCapacity * sizeof *argv); if (av == NULL) { fprintf (epicsGetStderr(), "Out of memory!\n"); argc = -1; break; } argv = av; } c = line[icin++]; if (c == '\0') break; if ((quote == EOF) && !backslash && (strchr (ifs, c))) sep = 1; else sep = 0; if ((quote == EOF) && !backslash) { int redirectFd = 1; if (c == '\\') { backslash = 1; continue; } if (c == '<') { if (redirect != NULL) { break; } redirect = &redirects[0]; sep = 1; redirect->mode = "r"; } if ((c >= '1') && (c <= '9') && (line[icin] == '>')) { redirectFd = c - '0'; c = '>'; icin++; } if (c == '>') { if (redirect != NULL) break; if (redirectFd >= NREDIRECTS) { redirect = &redirects[1]; break; } redirect = &redirects[redirectFd]; sep = 1; if (line[icin] == '>') { icin++; redirect->mode = "a"; } else { redirect->mode = "w"; } } } if (inword) { if (c == quote) { quote = EOF; } else { if ((quote == EOF) && !backslash) { if (sep) { inword = 0; line[icout++] = '\0'; } else if ((c == '"') || (c == '\'')) { quote = c; } else { line[icout++] = c; } } else { line[icout++] = c; } } } else { if (!sep) { if (((c == '"') || (c == '\'')) && !backslash) quote = c; if (redirect != NULL) { if (redirect->name != NULL) { argc = -1; break; } redirect->name = line + icout; redirect = NULL; } else { argv[argc++] = line + icout; } if (quote == EOF) line[icout++] = c; inword = 1; } } backslash = 0; } if (redirect != NULL) { showError(filename, lineno, "Illegal redirection."); continue; } if (argc < 0) break; if (quote != EOF) { showError(filename, lineno, "Unbalanced quote."); continue; } if (backslash) { showError(filename, lineno, "Trailing backslash."); continue; } if (inword) line[icout++] = '\0'; argv[argc] = NULL; /* * Special case -- Redirected input but no command * Treat as if 'iocsh filename'. */ if ((argc == 0) && (redirects[0].name != NULL)) { const char *commandFile = redirects[0].name; redirects[0].name = NULL; if (openRedirect(filename, lineno, redirects) < 0) continue; startRedirect(filename, lineno, redirects); iocshBody(commandFile, NULL); stopRedirect(filename, lineno, redirects); continue; } /* * Special command? */ if ((argc > 0) && (strcmp(argv[0], "exit") == 0)) break; /* * Set up redirection */ if ((openRedirect(filename, lineno, redirects) == 0) && (argc > 0)) { /* * Look up command */ found = (iocshCommand *)registryFind (iocshCmdID, argv[0]); if (found) { /* * Process arguments and call function */ struct iocshFuncDef const *piocshFuncDef = found->pFuncDef; for (int iarg = 0 ; ; ) { if (iarg == piocshFuncDef->nargs) { startRedirect(filename, lineno, redirects); (*found->func)(argBuf); break; } if (iarg >= argBufCapacity) { void *np; argBufCapacity += 20; np = realloc (argBuf, argBufCapacity * sizeof *argBuf); if (np == NULL) { fprintf (epicsGetStderr(), "Out of memory!\n"); argBufCapacity -= 20; break; } argBuf = (iocshArgBuf *)np; } if (piocshFuncDef->arg[iarg]->type == iocshArgArgv) { argBuf[iarg].aval.ac = argc-iarg; argBuf[iarg].aval.av = argv+iarg; iarg = piocshFuncDef->nargs; } else { if (!cvtArg (filename, lineno, ((iarg < argc) ? argv[iarg+1] : NULL), &argBuf[iarg], piocshFuncDef->arg[iarg])) break; iarg++; } } if ((prompt != NULL) && (strcmp(argv[0], "epicsEnvSet") == 0)) { const char *newPrompt; if ((newPrompt = envGetConfigParamPtr(&IOCSH_PS1)) != NULL) prompt = newPrompt; } } else { showError(filename, lineno, "Command %s not found.", argv[0]); } } stopRedirect(filename, lineno, redirects); } if (fp && (fp != stdin)) fclose (fp); if (redirects != NULL) { stopRedirect(filename, lineno, redirects); free (redirects); } free(line); free (argv); free (argBuf); errlogFlush(); if (readlineContext) epicsReadlineEnd(readlineContext); epicsThreadSetOkToBlock( wasOkToBlock); return 0; }
static int substituteGetNextSet(void *pvt,char **filename) { subInfo *psubInfo = (subInfo *)pvt; subFile *psubFile = psubInfo->psubFile; patternNode *ppatternNode; *filename = 0; while(psubFile->token==tokenSeparater) subGetNextToken(psubFile); if(psubFile->token==tokenEOF) return(0); if(psubFile->token==tokenString && strcmp(psubFile->string,"file")==0) { psubInfo->isFile = 1; if(subGetNextToken(psubFile)!=tokenString) { subFileErrPrint(psubFile,"Expecting filename"); exit(1); } freePattern(psubInfo); free((void *)psubInfo->filename); if(psubFile->string[0]=='"'&&psubFile->string[strlen(psubFile->string)-1]=='"') { psubFile->string[strlen(psubFile->string)-1]='\0'; psubInfo->filename = macEnvExpand(psubFile->string+1); } else { psubInfo->filename = macEnvExpand(psubFile->string); } while(subGetNextToken(psubFile)==tokenSeparater); if(psubFile->token!=tokenLBrace) { subFileErrPrint(psubFile,"Expecting {"); exit(1); } subGetNextToken(psubFile); } *filename = psubInfo->filename; while(psubFile->token==tokenSeparater) subGetNextToken(psubFile); if(psubFile->token==tokenLBrace) return(1); if(psubFile->token==tokenRBrace) return(0); if(psubFile->token!=tokenString || strcmp(psubFile->string,"pattern")!=0) { subFileErrPrint(psubFile,"Expecting pattern"); exit(1); } freePattern(psubInfo); psubInfo->isPattern = 1; while(subGetNextToken(psubFile)==tokenSeparater); if(psubFile->token!=tokenLBrace) { subFileErrPrint(psubFile,"Expecting {"); exit(1); } while(1) { while(subGetNextToken(psubFile)==tokenSeparater); if(psubFile->token!=tokenString) break; ppatternNode = calloc(1,sizeof(patternNode)); ellAdd(&psubInfo->patternList,&ppatternNode->node); ppatternNode->var = calloc(strlen(psubFile->string)+1,sizeof(char)); strcpy(ppatternNode->var,psubFile->string); } if(psubFile->token!=tokenRBrace) { subFileErrPrint(psubFile,"Expecting }"); exit(1); } subGetNextToken(psubFile); return(1); }
static long dbReadCOM(DBBASE **ppdbbase,const char *filename, FILE *fp, const char *path,const char *substitutions) { long status; inputFile *pinputFile = NULL; char *penv; char **macPairs; if(*ppdbbase == 0) *ppdbbase = dbAllocBase(); pdbbase = *ppdbbase; if(path && strlen(path)>0) { dbPath(pdbbase,path); } else { penv = getenv("EPICS_DB_INCLUDE_PATH"); if(penv) { dbPath(pdbbase,penv); } else { dbPath(pdbbase,"."); } } my_buffer = dbCalloc(MY_BUFFER_SIZE,sizeof(char)); freeListInitPvt(&freeListPvt,sizeof(tempListNode),100); if(substitutions) { if(macCreateHandle(&macHandle,NULL)) { epicsPrintf("macCreateHandle error\n"); status = -1; goto cleanup; } macParseDefns(macHandle,(char *)substitutions,&macPairs); if(macPairs ==NULL) { macDeleteHandle(macHandle); macHandle = NULL; } else { macInstallMacros(macHandle,macPairs); free((void *)macPairs); mac_input_buffer = dbCalloc(MY_BUFFER_SIZE,sizeof(char)); } } pinputFile = dbCalloc(1,sizeof(inputFile)); if(filename) { pinputFile->filename = macEnvExpand(filename); } if(!fp) { FILE *fp1; if(pinputFile->filename) pinputFile->path = dbOpenFile(pdbbase,pinputFile->filename,&fp1); if(!pinputFile->filename || !fp1) { errPrintf(0,__FILE__, __LINE__, "dbRead opening file %s",pinputFile->filename); free((void *)pinputFile->filename); free((void *)pinputFile); status = -1; goto cleanup; } pinputFile->fp = fp1; } else { pinputFile->fp = fp; } pinputFile->line_num = 0; pinputFileNow = pinputFile; my_buffer[0] = '\0'; my_buffer_ptr = my_buffer; ellAdd(&inputFileList,&pinputFile->node); status = pvt_yy_parse(); dbFreePath(pdbbase); if(!status) { /*add RTYP and VERS as an attribute */ DBENTRY dbEntry; DBENTRY *pdbEntry = &dbEntry; long localStatus; dbInitEntry(pdbbase,pdbEntry); localStatus = dbFirstRecordType(pdbEntry); while(!localStatus) { localStatus = dbPutRecordAttribute(pdbEntry,"RTYP", dbGetRecordTypeName(pdbEntry)); if(!localStatus) { localStatus = dbPutRecordAttribute(pdbEntry,"VERS", "none specified"); } if(localStatus) { fprintf(stderr,"dbPutRecordAttribute status %ld\n",status); } else { localStatus = dbNextRecordType(pdbEntry); } } dbFinishEntry(pdbEntry); } cleanup: if(macHandle) macDeleteHandle(macHandle); macHandle = NULL; if(mac_input_buffer) free((void *)mac_input_buffer); mac_input_buffer = NULL; if(freeListPvt) freeListCleanup(freeListPvt); freeListPvt = NULL; if(my_buffer) free((void *)my_buffer); my_buffer = NULL; freeInputFileList(); return(status); }