From cb1cae303f6ad9f28a07336c6c66011fd482b949 Mon Sep 17 00:00:00 2001 From: Olle Johansson Date: Fri, 26 Nov 2010 22:02:00 +0000 Subject: Merged revisions 296391 via svnmerge from https://origsvn.digium.com/svn/asterisk/branches/1.8 ................ r296391 | oej | 2010-11-26 22:37:21 +0100 (Fre, 26 Nov 2010) | 24 lines Merged revisions 296351 via svnmerge from https://origsvn.digium.com/svn/asterisk/branches/1.6.2 ................ r296351 | oej | 2010-11-26 13:23:03 +0100 (Fre, 26 Nov 2010) | 17 lines Merged revisions 296309 via svnmerge from https://origsvn.digium.com/svn/asterisk/branches/1.4 ........ r296309 | oej | 2010-11-26 10:53:31 +0100 (Fre, 26 Nov 2010) | 11 lines Fix bugs in saying numbers using the Swedish language syntax (closes issue #18355) Reported by: oej Patch by: oej Much help from Peter Lindahl. Testing by the ClearIT team during a coffee break. Review: https://reviewboard.asterisk.org/r/1033/ ........ ................ ................ git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@296393 65c4cc65-6c06-0410-ace0-fbb531ad65f3 --- main/say.c | 86 ++++++++++++++++++++++++++++++++++---------------------------- 1 file changed, 47 insertions(+), 39 deletions(-) (limited to 'main/say.c') diff --git a/main/say.c b/main/say.c index 5ae7c1298..3faf01bca 100644 --- a/main/say.c +++ b/main/say.c @@ -2212,73 +2212,81 @@ static int ast_say_number_full_pt(struct ast_channel *chan, int num, const char */ static int ast_say_number_full_se(struct ast_channel *chan, int num, const char *ints, const char *language, const char *options, int audiofd, int ctrlfd) { - int res = 0; int playh = 0; + int start = 1; char fn[256] = ""; int cn = 1; /* +1 = commune; -1 = neuter */ - if (!num) + int res = 0; + + if (!num) { return ast_say_digits_full(chan, 0, ints, language, audiofd, ctrlfd); + } if (options && !strncasecmp(options, "n", 1)) cn = -1; - while (!res && (num || playh)) { + while (num || playh) { if (num < 0) { ast_copy_string(fn, "digits/minus", sizeof(fn)); if ( num > INT_MIN ) { num = -num; } else { num = 0; - } + } } else if (playh) { ast_copy_string(fn, "digits/hundred", sizeof(fn)); playh = 0; + } else if (start && num < 200 && num > 99 && cn == -1) { + /* Don't say "en hundra" just say "hundra". */ + snprintf(fn, sizeof(fn), "digits/hundred"); + num -= 100; } else if (num == 1 && cn == -1) { /* En eller ett? */ ast_copy_string(fn, "digits/1N", sizeof(fn)); num = 0; } else if (num < 20) { snprintf(fn, sizeof(fn), "digits/%d", num); num = 0; - } else if (num < 100) { + } else if (num < 100) { /* Below hundreds - teens and tens */ snprintf(fn, sizeof(fn), "digits/%d", (num /10) * 10); num %= 10; - } else { - if (num < 1000){ - snprintf(fn, sizeof(fn), "digits/%d", (num/100)); - playh++; - num %= 100; - } else { - if (num < 1000000) { /* 1,000,000 */ - res = ast_say_number_full_se(chan, num / 1000, ints, language, options, audiofd, ctrlfd); - if (res) { - return res; - } - num %= 1000; - ast_copy_string(fn, "digits/thousand", sizeof(fn)); - } else { - if (num < 1000000000) { /* 1,000,000,000 */ - res = ast_say_number_full_se(chan, num / 1000000, ints, language, options, audiofd, ctrlfd); - if (res) { - return res; - } - num %= 1000000; - ast_copy_string(fn, "digits/million", sizeof(fn)); - } else { - ast_debug(1, "Number '%d' is too big for me\n", num); - res = -1; - } - } + } else if (num < 1000) { + /* Hundreds */ + snprintf(fn, sizeof(fn), "digits/%d", (num/100)); + playh++; + num %= 100; + } else if (num < 1000000) { /* 1,000,000 */ + /* Always say "ett hundra tusen", not "en hundra tusen" */ + res = ast_say_number_full_se(chan, num / 1000, ints, language, "c", audiofd, ctrlfd); + if (res) { + return res; } + num %= 1000; + ast_copy_string(fn, "digits/thousand", sizeof(fn)); + } else if (num < 1000000000) { /* 1,000,000,000 */ + /* Always say "en miljon", not "ett miljon" */ + res = ast_say_number_full_se(chan, num / 1000000, ints, language, "n", audiofd, ctrlfd); + if (res) { + return res; + } + num %= 1000000; + ast_copy_string(fn, "digits/million", sizeof(fn)); + } else { /* Miljarder - Billions */ + ast_log(LOG_DEBUG, "Number '%d' is too big for me\n", num); + return -1; } - if (!res) { - if (!ast_streamfile(chan, fn, language)) { - if ((audiofd > -1) && (ctrlfd > -1)) - res = ast_waitstream_full(chan, ints, audiofd, ctrlfd); - else - res = ast_waitstream(chan, ints); - ast_stopstream(chan); + + if (!ast_streamfile(chan, fn, language)) { + if ((audiofd > -1) && (ctrlfd > -1)) { + res = ast_waitstream_full(chan, ints, audiofd, ctrlfd); + } else { + res = ast_waitstream(chan, ints); + } + ast_stopstream(chan); + if (res) { + return res; } } + start = 0; } - return res; + return 0; } /*! \brief ast_say_number_full_zh: Taiwanese / Chinese syntax */ -- cgit v1.2.3