2 * Asterisk -- A telephony toolkit for Linux.
4 * Say numbers and dates (maybe words one day too)
6 * Copyright (C) 1999, Mark Spencer
8 * Mark Spencer <markster@linux-support.net>
10 * This program is free software, distributed under the terms of
11 * the GNU General Public License
14 #include <asterisk/file.h>
15 #include <asterisk/channel.h>
16 #include <asterisk/logger.h>
17 #include <asterisk/say.h>
20 int ast_say_digit_str(struct ast_channel *chan, char *fn2, char *ints, char *lang)
25 while(fn2[num] && !res) {
26 snprintf(fn, sizeof(fn), "digits/%c", fn2[num]);
27 res = ast_streamfile(chan, fn, lang);
29 res = ast_waitstream(chan, ints);
36 int ast_say_digits(struct ast_channel *chan, int num, char *ints, char *lang)
39 snprintf(fn2, sizeof(fn2), "%d", num);
40 return ast_say_digit_str(chan, fn2, ints, lang);
42 int ast_say_number(struct ast_channel *chan, int num, char *ints, char *language)
48 return ast_say_digits(chan, 0,ints, language);
50 /* XXX Only works for english XXX */
52 /* Use english numbers */
54 while(!res && (num || playh)) {
56 snprintf(fn, sizeof(fn), "digits/hundred");
60 snprintf(fn, sizeof(fn), "digits/%d", num);
64 snprintf(fn, sizeof(fn), "digits/%d", (num /10) * 10);
65 num -= ((num / 10) * 10);
68 snprintf(fn, sizeof(fn), "digits/%d", (num/100));
70 num -= ((num / 100) * 100);
73 res = ast_say_number(chan, num / 1000, ints, language);
77 snprintf(fn, sizeof(fn), "digits/thousand");
79 if (num < 1000000000) {
80 res = ast_say_number(chan, num / 1000000, ints, language);
84 snprintf(fn, sizeof(fn), "digits/million");
86 ast_log(LOG_DEBUG, "Number '%d' is too big for me\n", num);
93 res = ast_streamfile(chan, fn, language);
95 res = ast_waitstream(chan, ints);
104 int ast_say_date(struct ast_channel *chan, time_t t, char *ints, char *lang)
111 ast_log(LOG_WARNING, "Unable to derive local time\n");
115 snprintf(fn, sizeof(fn), "digits/day-%d", tm->tm_wday);
116 res = ast_streamfile(chan, fn, lang);
118 res = ast_waitstream(chan, ints);
121 snprintf(fn, sizeof(fn), "digits/mon-%d", tm->tm_mon);
122 res = ast_streamfile(chan, fn, lang);
124 res = ast_waitstream(chan, ints);
127 res = ast_say_number(chan, tm->tm_mday, ints, lang);
130 res = ast_waitstream(chan, ints);
132 res = ast_say_number(chan, tm->tm_year + 1900, ints, lang);
136 int ast_say_time(struct ast_channel *chan, time_t t, char *ints, char *lang)
143 ast_log(LOG_WARNING, "Unable to derive local time\n");
151 else if (hour > 12) {
156 res = ast_say_number(chan, hour, ints, lang);
158 if (tm->tm_min > 9) {
160 res = ast_say_number(chan, tm->tm_min, ints, lang);
161 } else if (tm->tm_min) {
163 res = ast_streamfile(chan, "digits/oh", lang);
165 res = ast_waitstream(chan, ints);
167 res = ast_say_number(chan, tm->tm_min, ints, lang);
170 res = ast_streamfile(chan, "digits/oclock", lang);
172 res = ast_waitstream(chan, ints);
176 res = ast_streamfile(chan, "digits/p-m", lang);
179 res = ast_streamfile(chan, "digits/a-m", lang);
182 res = ast_waitstream(chan, ints);
186 int ast_say_datetime(struct ast_channel *chan, time_t t, char *ints, char *lang)
194 ast_log(LOG_WARNING, "Unable to derive local time\n");
198 snprintf(fn, sizeof(fn), "digits/day-%d", tm->tm_wday);
199 res = ast_streamfile(chan, fn, lang);
201 res = ast_waitstream(chan, ints);
204 snprintf(fn, sizeof(fn), "digits/mon-%d", tm->tm_mon);
205 res = ast_streamfile(chan, fn, lang);
207 res = ast_waitstream(chan, ints);
210 res = ast_say_number(chan, tm->tm_mday, ints, lang);
217 else if (hour > 12) {
222 res = ast_say_number(chan, hour, ints, lang);
224 if (tm->tm_min > 9) {
226 res = ast_say_number(chan, tm->tm_min, ints, lang);
227 } else if (tm->tm_min) {
229 res = ast_streamfile(chan, "digits/oh", lang);
231 res = ast_waitstream(chan, ints);
233 res = ast_say_number(chan, tm->tm_min, ints, lang);
236 res = ast_streamfile(chan, "digits/oclock", lang);
238 res = ast_waitstream(chan, ints);
242 res = ast_streamfile(chan, "digits/p-m", lang);
245 res = ast_streamfile(chan, "digits/a-m", lang);
248 res = ast_waitstream(chan, ints);
250 res = ast_say_number(chan, tm->tm_year + 1900, ints, lang);
254 int ast_say_datetime_from_now(struct ast_channel *chan, time_t t, char *ints, char *lang)
268 ast_log(LOG_WARNING, "Unable to derive local time\n");
271 memcpy(&tm2, tm, sizeof(struct tm));
273 now = localtime(&nowt);
274 daydiff = now->tm_yday - tm->tm_yday;
275 if ((daydiff < 0) || (daydiff > 6)) {
276 /* Day of month and month */
278 snprintf(fn, sizeof(fn), "digits/mon-%d", tm->tm_mon);
279 res = ast_streamfile(chan, fn, lang);
281 res = ast_waitstream(chan, ints);
284 res = ast_say_number(chan, tm->tm_mday, ints, lang);
286 } else if (daydiff) {
287 /* Just what day of the week */
289 snprintf(fn, sizeof(fn), "digits/day-%d", tm->tm_wday);
290 res = ast_streamfile(chan, fn, lang);
292 res = ast_waitstream(chan, ints);
294 } /* Otherwise, it was today */
296 res = ast_say_time(chan, t, ints, lang);