[Asterisk-cvs] asterisk Makefile,1.27,1.28 pbx.c,1.50,1.51 say.c,1.4,1.5

markster at lists.digium.com markster at lists.digium.com
Sat Sep 13 15:50:39 CDT 2003


Update of /usr/cvsroot/asterisk
In directory mongoose.digium.com:/tmp/cvs-serv28534

Modified Files:
	Makefile pbx.c say.c 
Log Message:
CLeanup PBX patch and add localtime stuff for saytime (bug #168)


Index: Makefile
===================================================================
RCS file: /usr/cvsroot/asterisk/Makefile,v
retrieving revision 1.27
retrieving revision 1.28
diff -u -d -r1.27 -r1.28
--- Makefile	2 Sep 2003 00:33:42 -0000	1.27
+++ Makefile	13 Sep 2003 20:51:48 -0000	1.28
@@ -153,12 +153,7 @@
 all: depend asterisk subdirs
 
 editline/config.h:
-	@if [ -d editline ]; then \
-		cd editline && unset CFLAGS LIBS && ./configure ; \
-	else \
-		echo "You need to do a cvs update -d not just cvs update"; \
-		exit 1; \
-	fi
+	cd editline && unset CFLAGS LIBS && ./configure ; \
 
 editline/libedit.a: editline/config.h
 	$(MAKE) -C editline libedit.a
@@ -199,8 +194,16 @@
 	./make_build_h
 endif
 
-asterisk: editline/libedit.a db1-ast/libdb1.a $(OBJS)
-	$(CC) $(DEBUG) -o asterisk -rdynamic $(OBJS) $(LIBS) $(LIBEDIT) db1-ast/libdb1.a
+stdtime/localtime.o:
+	@if [ -d stdtime ]; then \
+		$(MAKE) -C stdtime; \
+	else \
+		echo "You need to do a cvs update -d not just cvs update"; \
+		exit 1; \
+	fi
+
+asterisk: editline/libedit.a db1-ast/libdb1.a stdtime/localtime.o $(OBJS)
+	$(CC) $(DEBUG) -o asterisk -rdynamic $(OBJS) $(LIBS) $(LIBEDIT) db1-ast/libdb1.a stdtime/localtime.o
 
 subdirs: 
 	for x in $(SUBDIRS); do $(MAKE) -C $$x || exit 1 ; done
@@ -212,6 +215,7 @@
 	rm -f ast_expr.c
 	@if [ -e editline/Makefile ]; then $(MAKE) -C editline clean ; fi
 	$(MAKE) -C db1-ast clean
+	$(MAKE) -C stdtime clean
 
 datafiles: all
 	mkdir -p $(ASTVARLIBDIR)/sounds/digits

Index: pbx.c
===================================================================
RCS file: /usr/cvsroot/asterisk/pbx.c,v
retrieving revision 1.50
retrieving revision 1.51
diff -u -d -r1.50 -r1.51
--- pbx.c	13 Sep 2003 20:20:14 -0000	1.50
+++ pbx.c	13 Sep 2003 20:51:48 -0000	1.51
@@ -144,8 +144,6 @@
     struct ast_hint *next;
 };
 
-int ast_extension_patmatch(const char *pattern, const char *data);
-
 static int pbx_builtin_prefix(struct ast_channel *, void *);
 static int pbx_builtin_suffix(struct ast_channel *, void *);
 static int pbx_builtin_stripmsd(struct ast_channel *, void *);
@@ -172,6 +170,7 @@
 static int pbx_builtin_saydigits(struct ast_channel *, void *);
 void pbx_builtin_setvar_helper(struct ast_channel *chan, char *name, char *value);
 char *pbx_builtin_getvar_helper(struct ast_channel *chan, char *name);
+static int ast_extension_patmatch_repeated(const char *pattern, const char *data, const int num);
 
 static struct varshead globals = AST_LIST_HEAD_INITIALIZER(varshead);
 
@@ -522,14 +521,13 @@
    variables, starting with $1, $2 and so on.
  * alternation as in (01|0|99) ("01 or 0 or 99")
  */
-int ast_extension_patmatch(const char *pattern, char *data) 
+int ast_extension_patmatch(const char *pattern, const char *data) 
 {
     int i,border=0;
     char *where;
     static char prev = '\0';
     static char groupdata[80] = "";
     static char *group = patmatch_group;
-    int groupcounter = patmatch_groupcounter;
 
     if (option_debug)
 	ast_log(LOG_DEBUG, " >>> \"%s\" =~ /%s/\n", data, pattern);
@@ -571,7 +569,7 @@
 
 	case '{': /* quantifier {n[,m]} */
 	  {
-	    char *comma;
+	    char *comma=NULL;
 	    int cpos;
 	    where=strchr(pattern,'}');
 	    if (where) {
@@ -636,11 +634,10 @@
 		}
 		prev = *tmp;
 		if (i >= from || !from) { /* if found */
+		    int l = strlen(groupdata) - strlen(data);
 		    if (option_debug)
 			ast_log(LOG_DEBUG, " >>>> found '%s' in data '%s' after %d runs\n", group, data, i);
-		    char name[16];
 		    data = data + (i * (strlen(group)- 1)) - 1;
-		    int l = strlen(groupdata) - strlen(data);
 		    /* data = data-i+from-1; */		/* possible failure here! */
 		    if (prev == ')') {			/* grouping => capture */
 			*(group+strlen(group)-1) = '\0';
@@ -708,7 +705,7 @@
 		s = scopy = (char *) malloc(strlen(pattern));
 		sepcopy   = (char *) malloc(strlen(pattern));
 		strcpy(s,group);
-		while (sep = strsep(&s,"|")) {
+		while ((sep = strsep(&s,"|"))) {
 		    strcpy(sepcopy,sep);
 		    strcat(sepcopy,pattern+border+1);
 		    if (option_debug)
@@ -737,7 +734,6 @@
 		return 0;
 	    } else {
 		if (pattern[1] != '{') { /* capture without quantifiers */
-		    char name[16];
 		    int l = strlen(groupdata) - strlen(data);
 		    groupdata[l-1] = '\0';
 		    *(group+strlen(group)-1) = '\0';
@@ -810,7 +806,7 @@
 }
 
 /* try exactly num repetitions, from high to from */
-int ast_extension_patmatch_repeated(const char *pattern, char *data, const int num) 
+static int ast_extension_patmatch_repeated(const char *pattern, const char *data, const int num) 
 {
     int i;
     ast_log(LOG_DEBUG, "  >>> try %d repetitions of '%s' in data '%s'\n", num, pattern, data);
@@ -848,7 +844,7 @@
 
 static int extension_close(char *pattern, char *data, int needmore)
 {
-	int match;
+	int match=1;
 	/* If "data" is longer, it can'be a subset of pattern unless
 	   pattern is a pattern match */
 	if ((strlen(pattern) < strlen(data)) && (pattern[0] != '_'))

Index: say.c
===================================================================
RCS file: /usr/cvsroot/asterisk/say.c,v
retrieving revision 1.4
retrieving revision 1.5
diff -u -d -r1.4 -r1.5
--- say.c	18 Aug 2003 05:50:10 -0000	1.4
+++ say.c	13 Sep 2003 20:51:48 -0000	1.5
@@ -12,12 +12,21 @@
  */
 
 #include <sys/types.h>
+#include <string.h>
+#include <stdlib.h>
+#include <netinet/in.h>
+#include <time.h>
 #include <asterisk/file.h>
 #include <asterisk/channel.h>
 #include <asterisk/logger.h>
 #include <asterisk/say.h>
+#include <asterisk/lock.h>
+#include <asterisk/localtime.h>
+#include "asterisk.h"
 #include <stdio.h>
 
+#define DIGITS_DIR	AST_SOUNDS "/digits/"
+
 int ast_say_digit_str(struct ast_channel *chan, char *fn2, char *ints, char *lang)
 {
 	/* XXX Merge with full version? XXX */
@@ -105,14 +114,14 @@
 					playh++;
 					num -= ((num / 100) * 100);
 				} else {
-					if (num < 1000000) {
+					if (num < 1000000) { /* 1,000,000 */
 						res = ast_say_number_full(chan, num / 1000, ints, language, audiofd, ctrlfd);
 						if (res)
 							return res;
 						num = num % 1000;
 						snprintf(fn, sizeof(fn), "digits/thousand");
 					} else {
-						if (num < 1000000000) {
+						if (num < 1000000000) {	/* 1,000,000,000 */
 							res = ast_say_number_full(chan, num / 1000000, ints, language, audiofd, ctrlfd);
 							if (res)
 								return res;
@@ -204,11 +213,7 @@
 	struct tm tm;
 	char fn[256];
 	int res = 0;
-	localtime_r(&t,&tm);
-	if (!&tm) {
-		ast_log(LOG_WARNING, "Unable to derive local time\n");
-		return -1;
-	}
+	ast_localtime(&t,&tm,NULL);
 	if (!res) {
 		snprintf(fn, sizeof(fn), "digits/day-%d", tm.tm_wday);
 		res = ast_streamfile(chan, fn, lang);
@@ -231,16 +236,267 @@
 	return res;
 }
 
+static int wait_file(struct ast_channel *chan, char *ints, char *file, char *lang) 
+{
+	int res;
+	if ((res = ast_streamfile(chan, file, lang)))
+		ast_log(LOG_WARNING, "Unable to play message %s\n", file);
+	if (!res)
+		res = ast_waitstream(chan, ints);
+	return res;
+}
+
+int ast_say_date_with_format(struct ast_channel *chan, time_t time, char *ints, char *lang, char *format, char *timezone)
+{
+	struct tm tm;
+	int res=0, offset, sndoffset;
+	char sndfile[256], nextmsg[256];
+
+	ast_log(LOG_DEBUG, "ast_say_date_with_format() called\n");
+
+	ast_localtime(&time,&tm,timezone);
+
+	ast_log(LOG_DEBUG, "ast_localtime() returned\n");
+
+	for (offset=0 ; format[offset] != '\0' ; offset++) {
+		ast_log(LOG_DEBUG, "Parsing %c (offset %d) in %s\n", format[offset], offset, format);
+		switch (format[offset]) {
+			/* NOTE:  if you add more options here, please try to be consistent with strftime(3) */
+			case '\'':
+				/* Literal name of a sound file */
+				sndoffset=0;
+				for (sndoffset=0 ; (format[++offset] != '\'') && (sndoffset < 256) ; sndoffset++)
+					sndfile[sndoffset] = format[offset];
+				sndfile[sndoffset] = '\0';
+				snprintf(nextmsg,sizeof(nextmsg), AST_SOUNDS "/%s", sndfile);
+				res = wait_file(chan,ints,nextmsg,lang);
+				break;
+			case 'A':
+			case 'a':
+				/* Sunday - Saturday */
+				snprintf(nextmsg,sizeof(nextmsg), DIGITS_DIR "day-%d", tm.tm_wday);
+				res = wait_file(chan,ints,nextmsg,lang);
+				break;
+			case 'B':
+			case 'b':
+			case 'h':
+				/* January - December */
+				snprintf(nextmsg,sizeof(nextmsg), DIGITS_DIR "mon-%d", tm.tm_mon);
+				res = wait_file(chan,ints,nextmsg,lang);
+				break;
+			case 'd':
+			case 'e':
+				/* First - Thirtyfirst */
+				if ((tm.tm_mday < 21) || (tm.tm_mday == 30)) {
+					snprintf(nextmsg,sizeof(nextmsg), DIGITS_DIR "h-%d", tm.tm_mday);
+					res = wait_file(chan,ints,nextmsg,lang);
+				} else if (tm.tm_mday == 31) {
+					/* "Thirty" and "first" */
+					res = wait_file(chan,ints,DIGITS_DIR "30",lang);
+					if (!res) {
+						res = wait_file(chan,ints,DIGITS_DIR "h-1",lang);
+					}
+				} else {
+					/* Between 21 and 29 - two sounds */
+					res = wait_file(chan,ints,DIGITS_DIR "20",lang);
+					if (!res) {
+						snprintf(nextmsg,sizeof(nextmsg),DIGITS_DIR "h-%d", tm.tm_mday - 20);
+						res = wait_file(chan,ints,nextmsg,lang);
+					}
+				}
+				break;
+			case 'Y':
+				/* Year */
+				if (tm.tm_year > 99) {
+					res = wait_file(chan,ints,DIGITS_DIR "2",lang);
+					if (!res) {
+						res = wait_file(chan,ints,DIGITS_DIR "thousand",lang);
+					}
+					if (tm.tm_year > 100) {
+						if (!res) {
+							/* This works until the end of 2020 */
+							snprintf(nextmsg,sizeof(nextmsg),DIGITS_DIR "%d", tm.tm_year - 100);
+							res = wait_file(chan,ints,nextmsg,lang);
+						}
+					}
+				} else {
+					if (tm.tm_year < 1) {
+						/* I'm not going to handle 1900 and prior */
+						/* We'll just be silent on the year, instead of bombing out. */
+					} else {
+						res = wait_file(chan,ints,DIGITS_DIR "19",lang);
+						if (!res) {
+							if (tm.tm_year <= 9) {
+								/* 1901 - 1909 */
+								res = wait_file(chan,ints,DIGITS_DIR "oh",lang);
+								if (!res) {
+									snprintf(nextmsg,sizeof(nextmsg),DIGITS_DIR "%d", tm.tm_year);
+									res = wait_file(chan,ints,nextmsg,lang);
+								}
+							} else if (tm.tm_year <= 20) {
+								/* 1910 - 1920 */
+								snprintf(nextmsg,sizeof(nextmsg),DIGITS_DIR "%d", tm.tm_year);
+								res = wait_file(chan,ints,nextmsg,lang);
+							} else {
+								/* 1921 - 1999 */
+								int ten, one;
+								ten = tm.tm_year / 10;
+								one = tm.tm_year % 10;
+								snprintf(nextmsg,sizeof(nextmsg),DIGITS_DIR "%d", ten * 10);
+								res = wait_file(chan,ints,nextmsg,lang);
+								if (!res) {
+									if (one != 0) {
+										snprintf(nextmsg,sizeof(nextmsg),DIGITS_DIR "%d", one);
+										res = wait_file(chan,ints,nextmsg,lang);
+									}
+								}
+							}
+						}
+					}
+				}
+				break;
+			case 'I':
+			case 'l':
+				/* 12-Hour */
+				if (tm.tm_hour == 0)
+					snprintf(nextmsg,sizeof(nextmsg),DIGITS_DIR "12");
+				else if (tm.tm_hour > 12)
+					snprintf(nextmsg,sizeof(nextmsg),DIGITS_DIR "%d", tm.tm_hour - 12);
+				else
+					snprintf(nextmsg,sizeof(nextmsg),DIGITS_DIR "%d", tm.tm_hour);
+				res = wait_file(chan,ints,nextmsg,lang);
+				break;
+			case 'H':
+			case 'k':
+				/* 24-Hour */
+				if (format[offset] == 'H') {
+					/* e.g. oh-eight */
+					if (tm.tm_hour < 10) {
+						res = wait_file(chan,ints,DIGITS_DIR "oh",lang);
+					}
+				} else {
+					/* e.g. eight */
+					if (tm.tm_hour == 0) {
+						res = wait_file(chan,ints,DIGITS_DIR "oh",lang);
+					}
+				}
+				if (!res) {
+					if (tm.tm_hour != 0) {
+						snprintf(nextmsg,sizeof(nextmsg), AST_SOUNDS "/digits/%d", tm.tm_hour);
+						res = wait_file(chan,ints,nextmsg,lang);
+					}
+				}
+				break;
+			case 'M':
+				/* Minute */
+				if (tm.tm_min == 0) {
+					res = wait_file(chan,ints,DIGITS_DIR "oclock",lang);
+				} else if (tm.tm_min < 10) {
+					res = wait_file(chan,ints,DIGITS_DIR "oh",lang);
+					if (!res) {
+						snprintf(nextmsg,sizeof(nextmsg),DIGITS_DIR "%d", tm.tm_min);
+						res = wait_file(chan,ints,nextmsg,lang);
+					}
+				} else if ((tm.tm_min < 21) || (tm.tm_min % 10 == 0)) {
+					snprintf(nextmsg,sizeof(nextmsg),DIGITS_DIR "%d", tm.tm_min);
+					res = wait_file(chan,ints,nextmsg,lang);
+				} else {
+					int ten, one;
+					ten = (tm.tm_min / 10) * 10;
+					one = (tm.tm_min % 10);
+					snprintf(nextmsg,sizeof(nextmsg),DIGITS_DIR "%d", ten);
+					res = wait_file(chan,ints,nextmsg,lang);
+					if (!res) {
+						/* Fifty, not fifty-zero */
+						if (one != 0) {
+							snprintf(nextmsg,sizeof(nextmsg),DIGITS_DIR "%d", one);
+							res = wait_file(chan,ints,nextmsg,lang);
+						}
+					}
+				}
+				break;
+			case 'P':
+			case 'p':
+				/* AM/PM */
+				if ((tm.tm_hour == 0) || (tm.tm_hour > 11))
+					snprintf(nextmsg,sizeof(nextmsg), DIGITS_DIR "p-m");
+				else
+					snprintf(nextmsg,sizeof(nextmsg), DIGITS_DIR "a-m");
+				res = wait_file(chan,ints,nextmsg,lang);
+				break;
+			case 'Q':
+				/* Shorthand for "Today", "Yesterday", or ABdY */
+				{
+					struct timeval now;
+					struct tm tmnow;
+					time_t beg_today;
+
+					gettimeofday(&now,NULL);
+					ast_localtime(&now.tv_sec,&tmnow,timezone);
+					/* This might be slightly off, if we transcend a leap second, but never more off than 1 second */
+					/* In any case, it saves not having to do ast_mktime() */
+					beg_today = now.tv_sec - (tmnow.tm_hour * 3600) - (tmnow.tm_min * 60) - (tmnow.tm_sec);
+					if (beg_today < time) {
+						/* Today */
+						res = wait_file(chan,ints,DIGITS_DIR "today",lang);
+					} else if (beg_today - 86400 < time) {
+						/* Yesterday */
+						res = wait_file(chan,ints,DIGITS_DIR "yesterday",lang);
+					} else {
+						res = ast_say_date_with_format(chan, time, ints, lang, "ABdY", timezone);
+					}
+				}
+				break;
+			case 'q':
+				/* Shorthand for "" (today), "Yesterday", A (weekday), or ABdY */
+				{
+					struct timeval now;
+					struct tm tmnow;
+					time_t beg_today;
+
+					gettimeofday(&now,NULL);
+					ast_localtime(&now.tv_sec,&tmnow,timezone);
+					/* This might be slightly off, if we transcend a leap second, but never more off than 1 second */
+					/* In any case, it saves not having to do ast_mktime() */
+					beg_today = now.tv_sec - (tmnow.tm_hour * 3600) - (tmnow.tm_min * 60) - (tmnow.tm_sec);
+					if (beg_today < time) {
+						/* Today */
+					} else if ((beg_today - 86400) < time) {
+						/* Yesterday */
+						res = wait_file(chan,ints,DIGITS_DIR "yesterday",lang);
+					} else if (beg_today - 86400 * 6 < time) {
+						/* Within the last week */
+						res = ast_say_date_with_format(chan, time, ints, lang, "A", timezone);
+					} else {
+						res = ast_say_date_with_format(chan, time, ints, lang, "ABdY", timezone);
+					}
+				}
+				break;
+			case 'R':
+				res = ast_say_date_with_format(chan, time, ints, lang, "HM", timezone);
+				break;
+			case ' ':
+			case '	':
+				/* Just ignore spaces and tabs */
+				break;
+			default:
+				/* Unknown character */
+				ast_log(LOG_WARNING, "Unknown character in datetime format %s: %c at pos %d\n", format, format[offset], offset);
+		}
+		/* Jump out on DTMF */
+		if (res) {
+			break;
+		}
+	}
+	return res;
+}
+
 int ast_say_time(struct ast_channel *chan, time_t t, char *ints, char *lang)
 {
 	struct tm tm;
 	int res = 0;
 	int hour, pm=0;
 	localtime_r(&t,&tm);
-	if (!&tm) {
-		ast_log(LOG_WARNING, "Unable to derive local time\n");
-		return -1;
-	}
 	hour = tm.tm_hour;
 	if (!hour)
 		hour = 12;
@@ -288,10 +544,6 @@
 	int res = 0;
 	int hour, pm=0;
 	localtime_r(&t,&tm);
-	if (!&tm) {
-		ast_log(LOG_WARNING, "Unable to derive local time\n");
-		return -1;
-	}
 	if (!res) {
 		snprintf(fn, sizeof(fn), "digits/day-%d", tm.tm_wday);
 		res = ast_streamfile(chan, fn, lang);
@@ -361,10 +613,6 @@
 	time(&nowt);
 
 	localtime_r(&t,&tm);
-	if (!&tm) {
-		ast_log(LOG_WARNING, "Unable to derive local time\n");
-		return -1;
-	}
 	localtime_r(&nowt,&now);
 	daydiff = now.tm_yday - tm.tm_yday;
 	if ((daydiff < 0) || (daydiff > 6)) {




More information about the svn-commits mailing list