24 #include "epicsStdlib.h"
25 #include "epicsString.h"
26 #include "epicsStdio.h"
28 #include "epicsMutex.h"
30 #include "dbStaticLib.h"
31 #include "dbFldTypes.h"
33 #include "dbAccessDefs.h"
34 #include <epicsTypes.h>
35 #include <epicsTime.h>
36 #include <epicsThread.h>
37 #include <epicsString.h>
38 #include <epicsTimer.h>
39 #include <epicsMutex.h>
46 #include <registryFunction.h>
48 #include <epicsExport.h>
55 for(
char** cp = environ; *cp != NULL; ++cp)
57 char* str_tmp = strdup(*cp);
58 char* equals_loc = strchr(str_tmp,
'=');
59 if (equals_loc != NULL)
62 macPutValue(pmh, str_tmp, equals_loc + 1);
69 static void subMacros(std::string& new_macros,
const char* macros,
const char* loopVar)
71 char loopSubFrom[32], loopSubTo[32];
72 epicsSnprintf(loopSubFrom,
sizeof(loopSubFrom),
"\\$(%s)", loopVar);
73 epicsSnprintf(loopSubTo,
sizeof(loopSubTo),
"$(%s)", loopVar);
75 size_t start_pos = 0, lf = strlen(loopSubFrom), lt = strlen(loopSubTo);
76 while( (start_pos = new_macros.find(loopSubFrom, start_pos)) != std::string::npos )
78 new_macros.replace(start_pos, lf, loopSubTo);
81 epicsSnprintf(loopSubFrom,
sizeof(loopSubFrom),
"\\${%s}", loopVar);
82 epicsSnprintf(loopSubTo,
sizeof(loopSubTo),
"${%s}", loopVar);
84 while( (start_pos = new_macros.find(loopSubFrom, start_pos)) != std::string::npos )
86 new_macros.replace(start_pos, lf, loopSubTo);
112 epicsShareFunc
void dbLoadRecordsLoop(
const char* dbFile,
const char* macros,
const char* loopVar,
int start,
int stop,
int step)
117 dbLoadRecords(dbFile, macros);
124 std::string macros_s, dbFile_s;
127 MAC_HANDLE* mh = NULL;
128 char macros_exp[1024], dbFile_exp[1024];
129 macCreateHandle(&mh, NULL);
131 for(
int i = start; i <= stop; i += step)
134 epicsSnprintf(loopVal,
sizeof(loopVal),
"%d", i);
135 macPutValue(mh, loopVar, loopVal);
136 macExpandString(mh, macros_s.c_str(), macros_exp,
sizeof(macros_exp));
137 macExpandString(mh, dbFile_s.c_str(), dbFile_exp,
sizeof(dbFile_exp));
138 std::ostringstream new_macros;
139 new_macros << macros_exp << (strlen(macros_exp) > 0 ?
"," :
"") << loopVar <<
"=" << i;
140 std::cout <<
"--> (" << i <<
") dbLoadRecords(\"" << dbFile_exp <<
"\",\"" << new_macros.str() <<
"\")" << std::endl;
141 dbLoadRecords(dbFile_exp, new_macros.str().c_str());
167 epicsShareFunc
void dbLoadRecordsList(
const char* dbFile,
const char* macros,
const char* loopVar,
const char* list,
const char* sep)
169 static const char* default_sep =
";";
170 if (loopVar == NULL || list == NULL)
172 dbLoadRecords(dbFile, macros);
179 std::string macros_s, dbFile_s;
182 MAC_HANDLE* mh = NULL;
183 char macros_exp[1024], dbFile_exp[1024];
184 macCreateHandle(&mh, NULL);
186 char* saveptr = NULL;
187 char* list_tmp = strdup(list);
188 char* list_item = epicsStrtok_r(list_tmp, sep, &saveptr);
189 while(list_item != NULL)
192 macPutValue(mh, loopVar, list_item);
193 macExpandString(mh, macros_s.c_str(), macros_exp,
sizeof(macros_exp));
194 macExpandString(mh, dbFile_s.c_str(), dbFile_exp,
sizeof(dbFile_exp));
195 std::ostringstream new_macros;
196 new_macros << macros_exp << (strlen(macros_exp) > 0 ?
"," :
"") << loopVar <<
"=" << list_item;
197 std::cout <<
"--> (" << list_item <<
") dbLoadRecords(\"" << dbFile_exp <<
"\",\"" << new_macros.str() <<
"\")" << std::endl;
198 dbLoadRecords(dbFile_exp, new_macros.str().c_str());
199 list_item = epicsStrtok_r(NULL, sep, &saveptr);
233 dbLoadRecordsLoop(args[0].sval, args[1].sval, args[2].sval, args[3].ival, args[4].ival, args[5].ival);
238 dbLoadRecordsList(args[0].sval, args[1].sval, args[2].sval, args[3].sval, args[4].sval);
static const iocshFuncDef dbLoadRecordsLoopDef
static const iocshArg dbLoadRecordsLoopInitArg3
start loop value
static void subMacros(std::string &new_macros, const char *macros, const char *loopVar)
look for e.g. $(I) and replace with so we can substitute later with macEnvExpand() ...
static const iocshArg *const dbLoadRecordsLoopInitArgs[]
static const iocshArg dbLoadRecordsListInitArg1
macros to pass to dbFile
static const iocshArg *const dbLoadRecordsListInitArgs[]
epicsShareFunc void dbLoadRecordsList(const char *dbFile, const char *macros, const char *loopVar, const char *list, const char *sep)
Load a db file multiple times according to a list of items separated by known separator(s).
static const iocshArg dbLoadRecordsLoopInitArg0
DB filename.
static const iocshArg dbLoadRecordsLoopInitArg2
loop macro variable name
static const iocshArg dbLoadRecordsLoopInitArg1
macros to pass to dbFile
static const iocshArg dbLoadRecordsListInitArg2
list macro variable name
static const iocshArg dbLoadRecordsListInitArg4
list value separator character
static const iocshFuncDef dbLoadRecordsListDef
static const iocshArg dbLoadRecordsLoopInitArg5
loop step (default: 1)
static void dbLoadRecordsLoopInitCallFunc(const iocshArgBuf *args)
static const iocshArg dbLoadRecordsListInitArg3
list of values to substitute
static const iocshArg dbLoadRecordsListInitArg0
DB filename.
static void dbLoadRecordsListInitCallFunc(const iocshArgBuf *args)
static const iocshArg dbLoadRecordsLoopInitArg4
end loop value
static void dbLoadRecordsFuncsRegister(void)
epicsExportRegistrar(dbLoadRecordsFuncsRegister)
static void loadMacEnviron(MAC_HANDLE *pmh)
load current environment into mac handle
epicsShareFunc void dbLoadRecordsLoop(const char *dbFile, const char *macros, const char *loopVar, int start, int stop, int step)
Load a db file multiple times substituting a specified macro according to a number range...