diff --git a/src/dbtools/dbLoadTemplate.h b/src/dbtools/dbLoadTemplate.h index 29f7a0b52..0de0235bb 100644 --- a/src/dbtools/dbLoadTemplate.h +++ b/src/dbtools/dbLoadTemplate.h @@ -12,10 +12,7 @@ #define INCdbLoadTemplateh #include "shareLib.h" -epicsShareFunc int epicsShareAPI dbLoadTemplate(char* sub_file); +epicsShareFunc int epicsShareAPI dbLoadTemplate( + const char *sub_file, const char *cmd_collect); #endif /*INCdbLoadTemplateh*/ - - - - diff --git a/src/dbtools/dbLoadTemplate.y b/src/dbtools/dbLoadTemplate.y index 5fb4fbfa7..a9d8d2eb8 100644 --- a/src/dbtools/dbLoadTemplate.y +++ b/src/dbtools/dbLoadTemplate.y @@ -22,12 +22,13 @@ #include "dbLoadTemplate.h" static int line_num; -static int yyerror(); +static int yyerror(char* str); #define VAR_MAX_VAR_STRING 5000 #define VAR_MAX_VARS 100 static char *sub_collect = NULL; +static char *gbl_collect; static char** vars = NULL; static char* db_file_name = NULL; static int var_count, sub_count; @@ -39,6 +40,7 @@ static int var_count, sub_count; %token WORD QUOTE %token DBFILE %token PATTERN +%token GLOBAL %token EQUALS COMMA %left O_PAREN C_PAREN %left O_BRACE C_BRACE @@ -127,7 +129,7 @@ subs: subs sub sub: WORD O_BRACE vals C_BRACE { - sub_collect[strlen(sub_collect) - 1] = '\0'; + gbl_collect[strlen(gbl_collect) - 1] = '\0'; /* drop ',' */ #ifdef ERROR_STUFF fprintf(stderr, "dbLoadRecords(%s)\n", sub_collect); #endif @@ -136,12 +138,12 @@ sub: WORD O_BRACE vals C_BRACE else fprintf(stderr, "Error: no db file name given\n"); dbmfFree($1); - sub_collect[0] = '\0'; + *gbl_collect = '\0'; sub_count = 0; } | O_BRACE vals C_BRACE { - sub_collect[strlen(sub_collect) - 1] = '\0'; + gbl_collect[strlen(gbl_collect) - 1] = '\0'; /* drop ',' */ #ifdef ERROR_STUFF fprintf(stderr, "dbLoadRecords(%s)\n", sub_collect); #endif @@ -149,7 +151,7 @@ sub: WORD O_BRACE vals C_BRACE dbLoadRecords(db_file_name, sub_collect); else fprintf(stderr, "Error: no db file name given\n"); - sub_collect[0] = '\0'; + *gbl_collect = '\0'; sub_count = 0; } ; @@ -162,10 +164,10 @@ vals: vals val val: QUOTE { if (sub_count <= var_count) { - strcat(sub_collect, vars[sub_count]); - strcat(sub_collect, "=\""); - strcat(sub_collect, $1); - strcat(sub_collect, "\","); + strcat(gbl_collect, vars[sub_count]); + strcat(gbl_collect, "=\""); + strcat(gbl_collect, $1); + strcat(gbl_collect, "\","); sub_count++; } dbmfFree($1); @@ -173,10 +175,10 @@ val: QUOTE | WORD { if (sub_count <= var_count) { - strcat(sub_collect, vars[sub_count]); - strcat(sub_collect, "="); - strcat(sub_collect, $1); - strcat(sub_collect, ","); + strcat(gbl_collect, vars[sub_count]); + strcat(gbl_collect, "="); + strcat(gbl_collect, $1); + strcat(gbl_collect, ","); sub_count++; } dbmfFree($1); @@ -189,7 +191,7 @@ var_subs: var_subs var_sub var_sub: WORD O_BRACE sub_pats C_BRACE { - sub_collect[strlen(sub_collect) - 1] = '\0'; + gbl_collect[strlen(gbl_collect) - 1] = '\0'; /* drop ',' */ #ifdef ERROR_STUFF fprintf(stderr, "dbLoadRecords(%s)\n", sub_collect); #endif @@ -198,12 +200,12 @@ var_sub: WORD O_BRACE sub_pats C_BRACE else fprintf(stderr, "Error: no db file name given\n"); dbmfFree($1); - sub_collect[0] = '\0'; + *gbl_collect = '\0'; sub_count = 0; } | O_BRACE sub_pats C_BRACE { - sub_collect[strlen(sub_collect) - 1] = '\0'; + gbl_collect[strlen(gbl_collect) - 1] = '\0'; /* drop ',' */ #ifdef ERROR_STUFF fprintf(stderr, "dbLoadRecords(%s)\n", sub_collect); #endif @@ -211,7 +213,7 @@ var_sub: WORD O_BRACE sub_pats C_BRACE dbLoadRecords(db_file_name, sub_collect); else fprintf(stderr, "Error: no db file name given\n"); - sub_collect[0] = '\0'; + *gbl_collect = '\0'; sub_count = 0; } ; @@ -223,19 +225,19 @@ sub_pats: sub_pats sub_pat sub_pat: WORD EQUALS WORD { - strcat(sub_collect, $1); - strcat(sub_collect, "="); - strcat(sub_collect, $3); - strcat(sub_collect, ","); + strcat(gbl_collect, $1); + strcat(gbl_collect, "="); + strcat(gbl_collect, $3); + strcat(gbl_collect, ","); dbmfFree($1); dbmfFree($3); sub_count++; } | WORD EQUALS QUOTE { - strcat(sub_collect, $1); - strcat(sub_collect, "=\""); - strcat(sub_collect, $3); - strcat(sub_collect, "\","); + strcat(gbl_collect, $1); + strcat(gbl_collect, "=\""); + strcat(gbl_collect, $3); + strcat(gbl_collect, "\","); dbmfFree($1); dbmfFree($3); sub_count++; } @@ -257,7 +259,7 @@ static int yyerror(char* str) static int is_not_inited = 1; -int epicsShareAPI dbLoadTemplate(char* sub_file) +int epicsShareAPI dbLoadTemplate(const char *sub_file, const char *cmd_collect) { FILE *fp; int ind; @@ -285,7 +287,14 @@ int epicsShareAPI dbLoadTemplate(char* sub_file) return -1; } - sub_collect[0] = '\0'; + if (cmd_collect && *cmd_collect) { + strcpy(sub_collect, cmd_collect); + strcat(sub_collect, ","); + gbl_collect = sub_collect + strlen(sub_collect); + } else { + gbl_collect = sub_collect; + *gbl_collect = '\0'; + } var_count = 0; sub_count = 0; diff --git a/src/dbtools/dbLoadTemplate_lex.l b/src/dbtools/dbLoadTemplate_lex.l index 06b4f22da..afb729517 100644 --- a/src/dbtools/dbLoadTemplate_lex.l +++ b/src/dbtools/dbLoadTemplate_lex.l @@ -20,6 +20,7 @@ bareword [a-zA-Z0-9_\-+:./\\\[\]<>;] "pattern" { return(PATTERN); } "file" { return(DBFILE); } +"global" { return(GLOBAL); } {doublequote}({dstringchar}|{escape})*{doublequote} | {singlequote}({sstringchar}|{escape})*{singlequote} { diff --git a/src/dbtools/dbtoolsIocRegister.c b/src/dbtools/dbtoolsIocRegister.c index 9fbe1096b..3ff446872 100644 --- a/src/dbtools/dbtoolsIocRegister.c +++ b/src/dbtools/dbtoolsIocRegister.c @@ -13,17 +13,20 @@ /* dbLoadTemplate */ -static const iocshArg dbLoadTemplateArg0 = { "file name",iocshArgString}; -static const iocshArg * const dbLoadTemplateArgs[1] = {&dbLoadTemplateArg0}; +static const iocshArg dbLoadTemplateArg0 = {"filename", iocshArgString}; +static const iocshArg dbLoadTemplateArg1 = {"var=value", iocshArgString}; +static const iocshArg * const dbLoadTemplateArgs[2] = { + &dbLoadTemplateArg0, &dbLoadTemplateArg1 +}; static const iocshFuncDef dbLoadTemplateFuncDef = - {"dbLoadTemplate",1,dbLoadTemplateArgs}; + {"dbLoadTemplate", 2, dbLoadTemplateArgs}; static void dbLoadTemplateCallFunc(const iocshArgBuf *args) { - dbLoadTemplate(args[0].sval); + dbLoadTemplate(args[0].sval, args[1].sval); } void epicsShareAPI dbtoolsIocRegister(void) { - iocshRegister(&dbLoadTemplateFuncDef,dbLoadTemplateCallFunc); + iocshRegister(&dbLoadTemplateFuncDef, dbLoadTemplateCallFunc); }