diff -Naur asterisk_org/apps/app_sayunixtime.c asterisk/apps/app_sayunixtime.c --- asterisk_org/apps/app_sayunixtime.c 2005-11-30 17:49:59.000000000 +0900 +++ asterisk/apps/app_sayunixtime.c 2005-12-03 10:52:21.000000000 +0900 @@ -29,7 +29,7 @@ #include "asterisk.h" -ASTERISK_FILE_VERSION(__FILE__, "Revision: 7221 ") +ASTERISK_FILE_VERSION(__FILE__, "$Revision: 1.16 $") #include "asterisk/file.h" #include "asterisk/logger.h" @@ -85,6 +85,8 @@ format = "A dBY HMS"; } else if ( !strcasecmp(chan->language, "de" ) ) { format = "A dBY HMS"; + } else if ( !strcasecmp(chan->language, "jp" ) ) { + format = "YBd A HMS"; } else { format = "ABdY 'digits/at' IMp"; } diff -Naur asterisk_org/say/say_jp.c asterisk/say/say_jp.c --- asterisk_org/say/say_jp.c 1970-01-01 09:00:00.000000000 +0900 +++ asterisk/say/say_jp.c 2005-12-03 10:46:58.000000000 +0900 @@ -0,0 +1,258 @@ +/* + * say_jp.c + */ + +/*! \brief say_number_full_jp: Japanese syntax */ +static int say_number_full_jp(const say_args_t *a, int num, const char *options) +{ + int playh = 0 ; + int res = 0 ; + char fn[256] = ""; + + if (!num) { + return say_digits_full(a, 0); + } + + while( !res && (num || playh) ) { + ast_log(LOG_WARNING, "PLAYING Number '%d' \n", num); + if (playh > 0) { + switch( playh ) { + case 10: + snprintf(fn, sizeof(fn), "digits/10"); + break ; + case 100: + snprintf(fn, sizeof(fn), "digits/100"); + break ; + case 1000: + snprintf(fn, sizeof(fn), "digits/1000"); + break ; + case 10000: + snprintf(fn, sizeof(fn), "digits/10000"); + break ; + case 100000000: + snprintf(fn, sizeof(fn), "digits/100000000"); + break ; + } + playh = 0; + } else if (num < 10) { + snprintf(fn, sizeof(fn), "digits/%d", num); + num = 0; + } else if (num < 100) { + if ( num / 10 != 1 ) + { + snprintf( fn, sizeof(fn), "digits/%d", (num/10)) ; + playh = 10 ; + num -= ((num / 10) * 10); + } else { + snprintf(fn, sizeof(fn), "digits/10" ) ; + num -= 10 ; + } + } else if (num < 1000) { + if ( num / 100 != 1 ) { + snprintf(fn, sizeof(fn), "digits/%d", (num/100)); + playh = 100 ; + num -= ((num / 100) * 100); + } else { + snprintf(fn, sizeof(fn), "digits/100"); + num -= 100 ; + } + } else if (num < 10000) { + if ( num / 1000 != 1 ) { + snprintf(fn, sizeof(fn), "digits/%d", (num/1000)) ; + playh = 1000 ; + num -= ((num / 1000) * 1000); + } else { + snprintf(fn, sizeof(fn), "digits/1000") ; + num -= 1000 ; + } + } else if (num < 100000000) { + res = say_number_full_jp(a, num / 10000, (char *)NULL ) ; + if (res) + return res; + playh = 10000 ; + num -= ((num / 10000) * 10000); + } else { + ast_log(LOG_WARNING, "Number '%d' is too big for me\n", num); + res = -1; + } + if (!res) { + res = s_streamwait3(a, fn) ; + } + } + return res; +} + +/* Japanese syntax */ +static int say_date_with_format_jp(const say_args_t *a, const struct tm *tm1, + const char *format, time_t delta) +{ + struct tm tm = *tm1; + int res=0, offset, sndoffset; + char sndfile[256]; + + 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'; + res = s_streamwait3(a,sndfile); + break; + case 'A': + case 'a': + /* Sunday - Saturday */ + res = s_streamwait(a,"digits/day-%d",tm.tm_wday); + break; + case 'B': + case 'b': + case 'h': + /* January - December */ + res = s_streamwait(a,"digits/mon-%d", tm.tm_mon); + break; + case 'm': + /* Month enumerated */ + res = say_number_full_jp(a, tm.tm_mon + 1, (char *)NULL ) ; + break; + case 'd': + case 'e': + /* First - Thirtyfirst */ + res = s_streamwait(a, "digits/%02dday", tm.tm_mday); + break; + case 'Y': + /* Year */ + res = say_number_full_jp(a, tm.tm_year + 1900, (char *) NULL); + if (!res) { + res = s_streamwait3(a, "digits/year"); + } + break; + case 'I': + case 'l': + /* 12-Hour */ + if (tm.tm_hour == 0) { + res = s_streamwait3(a,"digits/zero"); + } else { + res = say_number_full_jp(a, tm.tm_hour, (char *) NULL); + } + if (!res) { + res = s_streamwait3(a, "digits/hour"); + } + break; + case 'H': + case 'k': + /* 24-Hour */ + if (tm.tm_hour == 0) { + res = s_streamwait3(a,"digits/zero"); + } else { + res = say_number_full_jp(a, tm.tm_hour, (char *) NULL); + } + if ( !res ) { + res = s_streamwait3(a, "digits/hour"); + } + break; + case 'M': + case 'N': + /* Minute */ + if ( !tm.tm_min ) + { + res = s_streamwait3(a, "digits/zero") ; + } else { + res = say_number_full_jp(a, tm.tm_min, (char *) NULL); + } + if (!res) { + res = s_streamwait3(a, "digits/minutes"); + } + break; + case 'P': + case 'p': + /* AM/PM */ + if (tm.tm_hour > 11) { + res = s_streamwait3(a, "digits/p-m"); + } else { + res = s_streamwait3(a, "digits/a-m"); + } + break; + case 'R': + res = say_date_with_format_jp(a, &tm, "HM", delta ) ; + break; + case 'S': + /* Seconds */ + if ( !tm.tm_sec ) + { + res = s_streamwait3(a, "digits/zero") ; + } else { + res = say_number_full_jp(a, tm.tm_sec, (char *) NULL); + } + if (!res) { + res = s_streamwait3(a, "digits/second"); + } + break; + case 'T': + res = say_date_with_format_jp(a, &tm, "HMS", delta ) ; + break; + case 'x': + res = say_date_with_format_jp(a, &tm, "YBdA", delta ) ; + 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; +} + +static int say_datetime_from_now_jp(const say_args_t *a, time_t t) +{ + int res=0; + time_t nowt; + int daydiff; + struct tm tm; + struct tm now; + + time(&nowt); + + localtime_r(&t,&tm); + localtime_r(&nowt,&now); + daydiff = now.tm_yday - tm.tm_yday; + + if ((daydiff < 0) || (daydiff > 6)) { + /* Day of month and month */ + if (!res) { + res = s_streamwait(a, "digits/mon-%d", tm.tm_mon); + } + if (!res) { + res = s_streamwait(a, "digits/%02dday", tm.tm_mday); + } + + } else if (daydiff) { + /* Just what day of the week */ + if (!res) { + res = s_streamwait(a, "digits/day-%d", tm.tm_wday); + } + } /* Otherwise, it was today */ + if (!res) + res = ast_say_time(a->chan, t, a->ints, a->language); + return res; +} + + +static struct _lang_sw map_jp = { + .language = "jp", + .say_number_full = say_number_full_jp, + .say_date_with_format = say_date_with_format_jp, + .say_datetime_from_now = say_datetime_from_now_jp, + .time_fmt = "PIM", + .datetime_fmt = "YBdAPIM", +}; + diff -Naur asterisk_org/say.c asterisk/say.c --- asterisk_org/say.c 2005-11-16 01:48:25.000000000 +0900 +++ asterisk/say.c 2005-12-03 10:47:18.000000000 +0900 @@ -1067,6 +1067,7 @@ #include "say/say_ru.c" #include "say/say_se.c" #include "say/say_tw.c" +#include "say/say_jp.c" static struct _lang_sw map_en = { .language = "en", @@ -1098,5 +1099,6 @@ &map_ru, &map_se, &map_tw, + &map_jp, NULL };