From 4ae048572a79db693f3051e8193a83540b2f6dd4 Mon Sep 17 00:00:00 2001 From: Andrew Johnson Date: Fri, 13 Sep 2013 11:36:52 -0500 Subject: [PATCH] Added dbTemplateMaxVars variable Allows users to configure dbLoadTemplate command to accept more than 100 variables or a larger string buffer for variables. --- src/dbtools/dbLoadTemplate.y | 49 +++++++++++++++++++++++++----------- src/misc/base.dbd | 2 ++ 2 files changed, 37 insertions(+), 14 deletions(-) diff --git a/src/dbtools/dbLoadTemplate.y b/src/dbtools/dbLoadTemplate.y index 0a919dda6..6d45472b9 100644 --- a/src/dbtools/dbLoadTemplate.y +++ b/src/dbtools/dbLoadTemplate.y @@ -17,21 +17,27 @@ #include "dbAccess.h" #include "dbmf.h" #include "epicsVersion.h" - -#define epicsExportSharedSymbols +#include "epicsExport.h" #include "dbLoadTemplate.h" static int line_num; -static int yyerror(); - -#define VAR_MAX_VAR_STRING 5000 -#define VAR_MAX_VARS 100 +static int yyerror(char *str); static char *sub_collect = NULL; -static char** vars = NULL; -static char* db_file_name = NULL; +static char **vars = NULL; +static char *db_file_name = NULL; static int var_count,sub_count; +/* We allocate MAX_VAR_FACTOR chars in the sub_collect string for each + * "variable=value," segment, and will accept at most dbTemplateMaxVars + * template variables. The user can adjust that variable to increase + * the number of variables or the length allocated for the buffer. + */ +#define MAX_VAR_FACTOR 50 + +int dbTemplateMaxVars = 100; +epicsExportAddress(int, dbTemplateMaxVars); + %} %start template @@ -111,10 +117,18 @@ vars: vars var var: WORD { - vars[var_count] = dbmfMalloc(strlen($1)+1); - strcpy(vars[var_count],$1); - var_count++; - dbmfFree($1); + if (var_count >= dbTemplateMaxVars) { + fprintf(stderr, + "More than dbTemplateMaxVars = %d macro variables used\n", + dbTemplateMaxVars); + yyerror(NULL); + } + else { + vars[var_count] = dbmfMalloc(strlen($1)+1); + strcpy(vars[var_count],$1); + var_count++; + dbmfFree($1); + } } ; @@ -269,14 +283,21 @@ int epicsShareAPI dbLoadTemplate(char* sub_file) return -1; } + if (dbTemplateMaxVars < 1) + { + fprintf(stderr,"Error: dbTemplateMaxVars = %d, must be +ve\n", + dbTemplateMaxVars); + return -1; + } + if( !(fp=fopen(sub_file,"r")) ) { fprintf(stderr,"dbLoadTemplate: error opening sub file %s\n",sub_file); return -1; } - vars = (char**)malloc(VAR_MAX_VARS * sizeof(char*)); - sub_collect = malloc(VAR_MAX_VAR_STRING); + vars = malloc(dbTemplateMaxVars * sizeof(char*)); + sub_collect = malloc(dbTemplateMaxVars * MAX_VAR_FACTOR); if (!vars || !sub_collect) { free(vars); diff --git a/src/misc/base.dbd b/src/misc/base.dbd index 7c7e99ed2..ec702801d 100644 --- a/src/misc/base.dbd +++ b/src/misc/base.dbd @@ -48,3 +48,5 @@ variable(asCaDebug,int) variable(dbRecordsOnceOnly,int) variable(dbBptNotMonotonic,int) +# dbLoadTemplate settings +variable(dbTemplateMaxVars,int)