[asterisk-commits] murf: branch 1.4 r52052 - in /branches/1.4: ./
utils/Makefile utils/check_expr.c
asterisk-commits at lists.digium.com
asterisk-commits at lists.digium.com
Wed Jan 24 11:26:23 MST 2007
Author: murf
Date: Wed Jan 24 12:26:22 2007
New Revision: 52052
URL: http://svn.digium.com/view/asterisk?view=rev&rev=52052
Log:
Merged revisions 52002 via svnmerge from
https://origsvn.digium.com/svn/asterisk/branches/1.2
........
r52002 | murf | 2007-01-24 10:43:50 -0700 (Wed, 24 Jan 2007) | 1 line
updated check_expr via 8322 (refactoring of expression checking impl); elfring contributed a nice code reorg, I contributed some time to get it working again, better messages
........
Modified:
branches/1.4/ (props changed)
branches/1.4/utils/Makefile
branches/1.4/utils/check_expr.c
Propchange: branches/1.4/
------------------------------------------------------------------------------
Binary property 'branch-1.2-merged' - no diff available.
Modified: branches/1.4/utils/Makefile
URL: http://svn.digium.com/view/asterisk/branches/1.4/utils/Makefile?view=diff&rev=52052&r1=52051&r2=52052
==============================================================================
--- branches/1.4/utils/Makefile (original)
+++ branches/1.4/utils/Makefile Wed Jan 24 12:26:22 2007
@@ -13,6 +13,7 @@
.PHONY: clean all uninstall
+# to get check_expr, add it to the ALL_UTILS list
ALL_UTILS:=astman smsq stereorize streamplayer aelparse muted
UTILS:=$(ALL_UTILS)
@@ -85,7 +86,7 @@
ast_expr2f.o: ASTCFLAGS+=-DSTANDALONE_AEL -I../main
-check_expr: check_expr.c ast_expr2.o ast_expr2f.o
+check_expr: check_expr.o ast_expr2.o ast_expr2f.o
aelbison.c: ../pbx/ael/ael.tab.c
@cp $< $@
Modified: branches/1.4/utils/check_expr.c
URL: http://svn.digium.com/view/asterisk/branches/1.4/utils/check_expr.c?view=diff&rev=52052&r1=52051&r2=52052
==============================================================================
--- branches/1.4/utils/check_expr.c (original)
+++ branches/1.4/utils/check_expr.c Wed Jan 24 12:26:22 2007
@@ -23,12 +23,12 @@
#include <stdlib.h>
#include <../include/asterisk/ast_expr.h>
-int global_lineno = 1;
-int global_expr_count = 0;
-int global_expr_max_size = 0;
-int global_expr_tot_size = 0;
-int global_warn_count = 0;
-int global_OK_count = 0;
+static int global_lineno = 1;
+static int global_expr_count=0;
+static int global_expr_max_size=0;
+static int global_expr_tot_size=0;
+static int global_warn_count=0;
+static int global_OK_count=0;
struct varz
{
@@ -54,6 +54,22 @@
fflush(stdout);
va_end(vars);
}
+void ast_register_file_version(const char *file, const char *version);
+void ast_unregister_file_version(const char *file);
+
+char *find_var(const char *varname);
+void set_var(const char *varname, const char *varval);
+unsigned int check_expr(char* buffer, char* error_report);
+int check_eval(char *buffer, char *error_report);
+void parse_file(const char *fname);
+
+void ast_register_file_version(const char *file, const char *version)
+{
+}
+
+void ast_unregister_file_version(const char *file)
+{
+}
char *find_var(const char *varname) /* the list should be pretty short, if there's any list at all */
{
@@ -68,82 +84,86 @@
void set_var(const char *varname, const char *varval)
{
- struct varz *t = calloc(1,sizeof(struct varz));
+ struct varz *t = (struct varz*)calloc(1,sizeof(struct varz));
strcpy(t->varname, varname);
strcpy(t->varval, varval);
t->next = global_varlist;
global_varlist = t;
}
-int check_expr(char *buffer, char *error_report)
-{
- char *cp;
- int oplen = 0;
- int warn_found = 0;
+unsigned int check_expr(char* buffer, char* error_report)
+{
+ char* cp;
+ unsigned int warn_found = 0;
error_report[0] = 0;
- for (cp=buffer;*cp;cp++) {
-
- if (*cp == '|'
- || *cp == '&'
- || *cp == '='
- || *cp == '>'
- || *cp == '<'
- || *cp == '+'
- || *cp == '-'
- || *cp == '*'
- || *cp == '/'
- || *cp == '%'
- || *cp == '?'
- || *cp == ':'
- /* || *cp == '('
- || *cp == ')' These are pretty hard to track, as they are in funcalls, etc. */
- || *cp == '"') {
- if (*cp == '"') {
+ for (cp = buffer; *cp; ++cp)
+ {
+ switch (*cp)
+ {
+ case '"':
/* skip to the other end */
- cp++;
- while (*cp && *cp != '"')
- cp++;
- if (*cp == 0) {
- fprintf(stderr,"Trouble? Unterminated double quote found at line %d\n",
- global_lineno);
- }
- }
- else {
- if ((*cp == '>'||*cp == '<' ||*cp=='!') && (*(cp+1) == '=')) {
- oplen = 2;
- }
- else {
- oplen = 1;
- }
-
- if ((cp > buffer && *(cp-1) != ' ') || *(cp+oplen) != ' ') {
- char tbuf[1000];
- if (oplen == 1)
- sprintf(tbuf,"WARNING: line %d, '%c' operator not separated by spaces. This may lead to confusion. You may wish to use double quotes to quote the grouping it is in. Please check!\n",
- global_lineno, *cp);
- else
- sprintf(tbuf,"WARNING: line %d, '%c%c' operator not separated by spaces. This may lead to confusion. You may wish to use double quotes to quote the grouping it is in. Please check!\n",
- global_lineno, *cp, *(cp+1));
- strcat(error_report,tbuf);
-
- global_warn_count++;
- warn_found++;
- }
- }
- }
- }
+ while (*(++cp) && *cp != '"') ;
+
+ if (*cp == 0)
+ {
+ fprintf(stderr,
+ "Trouble? Unterminated double quote found at line %d\n",
+ global_lineno);
+ }
+ break;
+
+ case '>':
+ case '<':
+ case '!':
+ if ( (*(cp + 1) == '=')
+ && ( ( (cp > buffer) && (*(cp - 1) != ' ') ) || (*(cp + 2) != ' ') ) )
+ {
+ char msg[200];
+ snprintf(msg,
+ sizeof(msg),
+ "WARNING: line %d: '%c%c' operator not separated by spaces. This may lead to confusion. You may wish to use double quotes to quote the grouping it is in. Please check!\n",
+ global_lineno, *cp, *(cp + 1));
+ strcat(error_report, msg);
+ ++global_warn_count;
+ ++warn_found;
+ }
+ break;
+
+ case '|':
+ case '&':
+ case '=':
+ case '+':
+ case '-':
+ case '*':
+ case '/':
+ case '%':
+ case '?':
+ case ':':
+ if ( ( (cp > buffer) && (*(cp - 1) != ' ') ) || (*(cp + 1) != ' ') )
+ {
+ char msg[200];
+ snprintf(msg,
+ sizeof(msg),
+ "WARNING: line %d: '%c' operator not separated by spaces. This may lead to confusion. You may wish to use double quotes to quote the grouping it is in. Please check!\n",
+ global_lineno, *cp );
+ strcat(error_report, msg);
+ ++global_warn_count;
+ ++warn_found;
+ }
+ break;
+ }
+ }
+
return warn_found;
}
int check_eval(char *buffer, char *error_report)
{
- char *cp, *ep, *xp;
+ char *cp, *ep;
char s[4096];
char evalbuf[80000];
- int oplen = 0;
- int warn_found = 0;
int result;
error_report[0] = 0;
@@ -219,7 +239,7 @@
char buffer[30000]; /* I sure hope no expr gets this big! */
if (!f) {
- fprintf(stderr,"Couldn't open %s for reading... need an extensions.conf file to parse!\n");
+ fprintf(stderr,"Couldn't open %s for reading... need an extensions.conf file to parse!\n",fname);
exit(20);
}
if (!l) {
@@ -301,13 +321,23 @@
}
-main(int argc,char **argv)
+int main(int argc,char **argv)
{
int argc1;
char *eq;
if (argc < 2) {
+ printf("check_expr -- a program to look thru extensions.conf files for $[...] expressions,\n");
+ printf(" and run them thru the parser, looking for problems\n");
printf("Hey-- give me a path to an extensions.conf file!\n");
+ printf(" You can also follow the file path with a series of variable decls,\n");
+ printf(" of the form, varname=value, each separated from the next by spaces.\n");
+ printf(" (this might allow you to avoid division by zero messages, check that math\n");
+ printf(" is being done correctly, etc.)\n");
+ printf(" Note that messages about operators not being surrounded by spaces is merely to alert\n");
+ printf(" you to possible problems where you might be expecting those operators as part of a string.\n");
+ printf(" (to include operators in a string, wrap with double quotes!)\n");
+
exit(19);
}
global_varlist = 0;
@@ -321,4 +351,5 @@
/* parse command args for x=y and set varz */
parse_file(argv[1]);
-}
+ return 0;
+}
More information about the asterisk-commits
mailing list