[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