Skip to content

Commit e93ca6e

Browse files
committed
Create helper function to handle both addReccasterExcludePattern and addReccasterEnvVars
1 parent d978011 commit e93ca6e

File tree

1 file changed

+44
-79
lines changed

1 file changed

+44
-79
lines changed

client/castApp/src/castinit.c

Lines changed: 44 additions & 79 deletions
Original file line numberDiff line numberDiff line change
@@ -75,21 +75,21 @@ static void casthook(initHookState state)
7575
epicsAtExit(&castexit, NULL);
7676
}
7777

78-
/*
79-
Example call: addReccasterEnvVars("SECTOR") or addReccasterEnvVars("SECTOR", "BUILDING")
80-
Appends the given env variables to the extra_envs list to be sent in addition to the default_envs array
81-
*/
82-
void addReccasterEnvVars(caster_t* self, int argc, char **argv)
78+
/* Helper function to add items from iocsh calls to internal linked lists
79+
* funcName is the name of the IOC shell function being called (for error messages)
80+
* itemDesc is string to describe what is being added (for error messages)
81+
* defaultArray is an optional arg for a default list to also check for duplicates
82+
*/
83+
static void addToReccasterLinkedList(caster_t* self, int argc, char **argv, ELLLIST* list, const char* funcName, const char* itemDesc, const char** defaultArray)
8384
{
8485
size_t i, j;
8586
int dup;
8687
ELLNODE *cur;
8788
argv++; argc--; /* skip function arg */
8889
if(argc < 1) {
89-
errlogSevPrintf(errlogMinor, "At least one argument expected for addReccasterEnvVars\n");
90+
errlogSevPrintf(errlogMinor, "At least one argument expected for %s\n", funcName);
9091
return;
9192
}
92-
9393
epicsMutexMustLock(self->lock);
9494
if(self->shutdown) {
9595
/* shutdown in progress, silent no-op */
@@ -98,8 +98,8 @@ void addReccasterEnvVars(caster_t* self, int argc, char **argv)
9898
}
9999
else if(self->current != casterStateInit) {
100100
/* Attempt to add after iocInit(), when we may be connected.
101-
To fully support, would need to force reconnect or resend w/ updated envs list. */
102-
errlogSevPrintf(errlogMinor, "addReccasterEnvVars called after iocInit() when reccaster might already be connected. Not supported\n");
101+
To fully support, would need to force reconnect or resend w/ updated list. */
102+
errlogSevPrintf(errlogMinor, "%s called after iocInit() when reccaster might already be connected. Not supported\n", funcName);
103103
epicsMutexUnlock(self->lock);
104104
return;
105105
}
@@ -108,43 +108,60 @@ void addReccasterEnvVars(caster_t* self, int argc, char **argv)
108108
for (i = 0; i < argc; i++) {
109109
const size_t arg_len = strlen(argv[i]) + 1;
110110
if(argv[i][0] == '\0') {
111-
errlogSevPrintf(errlogMinor, "Arg is empty for addReccasterEnvVars\n");
111+
errlogSevPrintf(errlogMinor, "Arg is empty for %s\n", funcName);
112112
continue;
113113
}
114114
dup = 0;
115-
/* check if dup in self->default_envs */
116-
for(j = 0; default_envs[j]; j++) {
117-
if(strcmp(argv[i], default_envs[j]) == 0) {
118-
dup = 1;
119-
break;
115+
/* if the defaultArray arg is used, check if this is a duplicate */
116+
if (defaultArray) {
117+
for(j = 0; defaultArray[j]; j++) {
118+
if(strcmp(argv[i], defaultArray[j]) == 0) {
119+
dup = 1;
120+
break;
121+
}
122+
}
123+
if(dup) {
124+
errlogSevPrintf(errlogMinor, "Item %s is already in list sent by reccaster by default\n", argv[i]);
125+
continue;
120126
}
121127
}
122-
if(dup) {
123-
errlogSevPrintf(errlogMinor, "Env var %s is already in env list sent by reccaster by default\n", argv[i]);
124-
continue;
125-
}
126-
/* check if dup in self->extra_envs */
127-
for(cur = ellFirst(&self->extra_envs); cur; cur = ellNext(cur)) {
128-
const string_list_t *penvvar = CONTAINER(cur, string_list_t, node);
129-
if (strcmp(argv[i], penvvar->item_str) == 0) {
128+
/* check if dup in existing linked list */
129+
for(cur = ellFirst(list); cur; cur = ellNext(cur)) {
130+
string_list_t *pitem = CONTAINER(cur, string_list_t, node);
131+
if (strcmp(argv[i], pitem->item_str) == 0) {
130132
dup = 1;
131133
break;
132134
}
133135
}
134136
if(dup) {
135-
errlogSevPrintf(errlogMinor, "Env var %s is already in extra_envs list\n", argv[i]);
137+
errlogSevPrintf(errlogMinor, "%s %s already in list for %s\n", itemDesc, argv[i], funcName);
136138
continue;
137139
}
138-
string_list_t *new_node = mallocMustSucceed(sizeof(string_list_t) + arg_len, "addReccasterEnvVars");
140+
string_list_t *new_node = mallocMustSucceed(sizeof(string_list_t) + arg_len, funcName);
139141
new_node->item_str = (char *)(new_node + 1);
140142
memcpy(new_node->item_str, argv[i], arg_len);
141143

142-
ellAdd(&self->extra_envs, &new_node->node);
144+
ellAdd(list, &new_node->node);
143145
}
144-
145146
epicsMutexUnlock(self->lock);
146147
}
147148

149+
/* Example call: addReccasterEnvVars("SECTOR") or addReccasterEnvVars("SECTOR", "BUILDING")
150+
* Appends the given env variables to the extra_envs list to be sent in addition to the default_envs array
151+
*/
152+
void addReccasterEnvVars(caster_t* self, int argc, char **argv)
153+
{
154+
addToReccasterLinkedList(self, argc, argv, &self->extra_envs, "addReccasterEnvVars", "Environment variable", (const char**)default_envs);
155+
}
156+
157+
/* Example call: addReccasterExcludePattern("TEST:*") or addReccasterExcludePattern("TEST:*", "*_")
158+
* Appends the given patterns to the exclude_patterns list so those PVs and their meta-data are not sent
159+
*/
160+
void addReccasterExcludePattern(caster_t* self, int argc, char **argv)
161+
{
162+
addToReccasterLinkedList(self, argc, argv, &self->exclude_patterns, "addReccasterExcludePattern", "Exclude pattern", NULL);
163+
}
164+
148165
static const iocshArg addReccasterEnvVarsArg0 = { "environmentVar", iocshArgArgv };
149166
static const iocshArg * const addReccasterEnvVarsArgs[] = { &addReccasterEnvVarsArg0 };
150167
static const iocshFuncDef addReccasterEnvVarsFuncDef = {
@@ -163,57 +180,6 @@ static void addReccasterEnvVarsCallFunc(const iocshArgBuf *args)
163180
addReccasterEnvVars(&thecaster, args[0].aval.ac, args[0].aval.av);
164181
}
165182

166-
void addReccasterExcludePattern(caster_t* self, int argc, char **argv) {
167-
size_t i;
168-
int dup;
169-
ELLNODE *cur;
170-
argv++; argc--; /* skip function arg */
171-
if (argc < 1) {
172-
errlogSevPrintf(errlogMinor, "At least one argument expected for addReccasterExcludePattern\n");
173-
return;
174-
}
175-
epicsMutexMustLock(self->lock);
176-
if (self->shutdown) {
177-
/* shutdown in progress, silent no-op */
178-
epicsMutexUnlock(self->lock);
179-
return;
180-
}
181-
/* error if called after iocInit() */
182-
if (self->current != casterStateInit) {
183-
errlogSevPrintf(errlogMinor, "addReccasterExcludePattern called after iocInit() when reccaster might already be connected. Not supported\n");
184-
epicsMutexUnlock(self->lock);
185-
return;
186-
}
187-
188-
for (i = 0; i < argc; i++) {
189-
const size_t arg_len = strlen(argv[i]) + 1;
190-
if (argv[i][0] == '\0') {
191-
errlogSevPrintf(errlogMinor, "Arg is empty for addReccasterExcludePattern\n");
192-
continue;
193-
}
194-
/* check duplicates */
195-
dup = 0;
196-
for(cur = ellFirst(&self->exclude_patterns); cur; cur = ellNext(cur)) {
197-
const string_list_t *ppattern = CONTAINER(cur, string_list_t, node);
198-
if (strcmp(argv[i], ppattern->item_str) == 0) {
199-
dup = 1;
200-
break;
201-
}
202-
}
203-
if (dup) {
204-
errlogSevPrintf(errlogMinor, "Duplicate pattern %s in addReccasterExcludePattern\n", argv[i]);
205-
continue;
206-
}
207-
string_list_t *new_node = mallocMustSucceed(sizeof(string_list_t) + arg_len, "addReccasterExcludePattern");
208-
new_node->item_str = (char *)(new_node + 1);
209-
memcpy(new_node->item_str, argv[i], arg_len);
210-
211-
ellAdd(&self->exclude_patterns, &new_node->node);
212-
}
213-
214-
epicsMutexUnlock(self->lock);
215-
}
216-
217183
static const iocshArg addReccasterExcludePatternArg0 = { "excludePattern", iocshArgArgv };
218184
static const iocshArg * const addReccasterExcludePatternArgs[] = { &addReccasterExcludePatternArg0 };
219185
static const iocshFuncDef addReccasterExcludePatternFuncDef = {
@@ -227,7 +193,6 @@ static const iocshFuncDef addReccasterExcludePatternFuncDef = {
227193
"Example: addReccasterExcludePattern 'TEST:*' '*_'\n"
228194
#endif
229195
};
230-
231196
static void addReccasterExcludePatternCallFunc(const iocshArgBuf *args) {
232197
addReccasterExcludePattern(&thecaster, args[0].aval.ac, args[0].aval.av);
233198
}

0 commit comments

Comments
 (0)