@@ -76,20 +76,19 @@ static void casthook(initHookState state)
7676}
7777
7878/* Helper function to add items from iocsh calls to internal linked lists
79+ * self is the caster instance
80+ * itemCount is the number of items in the items array
81+ * items is the array of strings to add to the list
82+ * reccastList is the linked list to add the items to
7983 * funcName is the name of the IOC shell function being called (for error messages)
8084 * 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
8285 */
83- static void addToReccasterLinkedList (caster_t * self , int argc , char * * argv , ELLLIST * list , const char * funcName , const char * itemDesc , const char * * defaultArray )
86+ void addToReccasterLinkedList (caster_t * self , size_t itemCount , const char * * items , ELLLIST * reccastList , const char * funcName , const char * itemDesc )
8487{
85- size_t i , j ;
88+ size_t i ;
8689 int dup ;
8790 ELLNODE * cur ;
88- argv ++ ; argc -- ; /* skip function arg */
89- if (argc < 1 ) {
90- errlogSevPrintf (errlogMinor , "At least one argument expected for %s\n" , funcName );
91- return ;
92- }
91+
9392 epicsMutexMustLock (self -> lock );
9493 if (self -> shutdown ) {
9594 /* shutdown in progress, silent no-op */
@@ -105,61 +104,58 @@ static void addToReccasterLinkedList(caster_t* self, int argc, char **argv, ELLL
105104 }
106105
107106 /* sanitize input - check for dups and empty args */
108- for (i = 0 ; i < argc ; i ++ ) {
109- const size_t arg_len = strlen (argv [i ]) + 1 ;
110- if (argv [i ][0 ] == '\0' ) {
107+ for (i = 0 ; i < itemCount ; i ++ ) {
108+ const size_t arg_len = strlen (items [i ]) + 1 ;
109+ if (items [i ][0 ] == '\0' ) {
111110 errlogSevPrintf (errlogMinor , "Arg is empty for %s\n" , funcName );
112111 continue ;
113112 }
114113 dup = 0 ;
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 ;
126- }
127- }
128114 /* check if dup in existing linked list */
129- for (cur = ellFirst (list ); cur ; cur = ellNext (cur )) {
115+ for (cur = ellFirst (reccastList ); cur ; cur = ellNext (cur )) {
130116 string_list_t * pitem = CONTAINER (cur , string_list_t , node );
131- if (strcmp (argv [i ], pitem -> item_str ) == 0 ) {
117+ if (strcmp (items [i ], pitem -> item_str ) == 0 ) {
132118 dup = 1 ;
133119 break ;
134120 }
135121 }
136122 if (dup ) {
137- errlogSevPrintf (errlogMinor , "%s %s already in list for %s\n" , itemDesc , argv [i ], funcName );
123+ errlogSevPrintf (errlogMinor , "%s %s already in list for %s\n" , itemDesc , items [i ], funcName );
138124 continue ;
139125 }
140126 string_list_t * new_node = mallocMustSucceed (sizeof (string_list_t ) + arg_len , funcName );
141127 new_node -> item_str = (char * )(new_node + 1 );
142- memcpy (new_node -> item_str , argv [i ], arg_len );
128+ memcpy (new_node -> item_str , items [i ], arg_len );
143129
144- ellAdd (list , & new_node -> node );
130+ ellAdd (reccastList , & new_node -> node );
145131 }
146132 epicsMutexUnlock (self -> lock );
147133}
148134
149135/* 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
136+ * Appends the given env variables to the envs list to be sent. This includes some hard-coded env vars sent by default
151137 */
152138void addReccasterEnvVars (caster_t * self , int argc , char * * argv )
153139{
154- addToReccasterLinkedList (self , argc , argv , & self -> extra_envs , "addReccasterEnvVars" , "Environment variable" , (const char * * )default_envs );
140+ argv ++ ; argc -- ; /* skip function arg */
141+ if (argc < 1 ) {
142+ errlogSevPrintf (errlogMinor , "At least one argument expected for addReccasterEnvVars\n" );
143+ return ;
144+ }
145+ addToReccasterLinkedList (self , argc , (const char * * )argv , & self -> envs , "addReccasterEnvVars" , "Environment variable" );
155146}
156147
157148/* Example call: addReccasterExcludePattern("TEST:*") or addReccasterExcludePattern("TEST:*", "*_")
158149 * Appends the given patterns to the exclude_patterns list so those PVs and their meta-data are not sent
159150 */
160151void addReccasterExcludePattern (caster_t * self , int argc , char * * argv )
161152{
162- addToReccasterLinkedList (self , argc , argv , & self -> exclude_patterns , "addReccasterExcludePattern" , "Exclude pattern" , NULL );
153+ argv ++ ; argc -- ; /* skip function arg */
154+ if (argc < 1 ) {
155+ errlogSevPrintf (errlogMinor , "At least one argument expected for addReccasterExcludePattern\n" );
156+ return ;
157+ }
158+ addToReccasterLinkedList (self , argc , (const char * * )argv , & self -> exclude_patterns , "addReccasterExcludePattern" , "Exclude pattern" );
163159}
164160
165161static const iocshArg addReccasterEnvVarsArg0 = { "environmentVar" , iocshArgArgv };
0 commit comments