aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorkpfleming <kpfleming@f38db490-d61c-443f-a65b-d21fe96a405b>2005-06-02 21:26:02 +0000
committerkpfleming <kpfleming@f38db490-d61c-443f-a65b-d21fe96a405b>2005-06-02 21:26:02 +0000
commit502b2d00e6f1f0058dfe3260a991f4b0a8537907 (patch)
treea680483fc42b5ff741bc184fd69b25cf346e0825
parent7309cfd429142c62fe452932bccec8b07b7a156b (diff)
consolidate API functions for saying numbers/digits/alpha/phonetic into less functions, using more efficient and clearer code (inspired by bug #4414)
git-svn-id: http://svn.digium.com/svn/asterisk/trunk@5819 f38db490-d61c-443f-a65b-d21fe96a405b
-rwxr-xr-xfile.c2
-rwxr-xr-xsay.c499
2 files changed, 175 insertions, 326 deletions
diff --git a/file.c b/file.c
index f4dbe6268..831b2ec2e 100755
--- a/file.c
+++ b/file.c
@@ -1126,8 +1126,6 @@ char ast_waitstream_full(struct ast_channel *c, const char *breakon, int audiofd
ast_frfree(fr);
}
ast_sched_runq(c->sched);
-
-
}
return (c->_softhangup ? -1 : 0);
}
diff --git a/say.c b/say.c
index 40c17659b..65f8fe7c6 100755
--- a/say.c
+++ b/say.c
@@ -39,377 +39,228 @@
/* Forward declaration */
static int wait_file(struct ast_channel *chan, const char *ints, const char *file, const char *lang);
-int ast_say_digit_str(struct ast_channel *chan, const char *fn2, const char *ints, const char *lang)
+int ast_say_character_str_full(struct ast_channel *chan, const char *str, const char *ints, const char *lang, int audiofd, int ctrlfd)
{
- /* XXX Merge with full version? XXX */
- char fn[256] = "";
- int num = 0;
- int res = 0;
- while(fn2[num] && !res) {
- fn[0] = '\0';
- switch (fn2[num]) {
- case ('*'):
- snprintf(fn, sizeof(fn), "digits/star");
- break;
- case ('#'):
- snprintf(fn, sizeof(fn), "digits/pound");
- break;
- case ('-'):
- snprintf(fn, sizeof(fn), "digits/minus");
- break;
- default:
- if((fn2[num] >= '0') && (fn2[num] <= '9')){ /* Must be in {0-9} */
- snprintf(fn, sizeof(fn), "digits/%c", fn2[num]);
- }
- }
- if(!ast_strlen_zero(fn)){ /* if length == 0, then skip this digit as it is invalid */
- res = ast_streamfile(chan, fn, lang);
- if (!res)
- res = ast_waitstream(chan, ints);
- ast_stopstream(chan);
- }
- num++;
- }
- return res;
-}
-
-int ast_say_character_str(struct ast_channel *chan, const char *fn2, const char *ints, const char *lang)
-{
- /* XXX Merge with full version? XXX */
- char fn[256] = "";
+ const char *fn;
+ char fnbuf[256];
char ltr;
int num = 0;
int res = 0;
- while(fn2[num] && !res) {
- fn[0] = '\0';
- switch (fn2[num]) {
- case ('*'):
- snprintf(fn, sizeof(fn), "digits/star");
- break;
- case ('#'):
- snprintf(fn, sizeof(fn), "digits/pound");
- break;
- case ('0'):
- case ('1'):
- case ('2'):
- case ('3'):
- case ('4'):
- case ('5'):
- case ('6'):
- case ('7'):
- case ('8'):
- case ('9'):
- snprintf(fn, sizeof(fn), "digits/%c", fn2[num]);
- break;
- case ('!'):
- strncpy(fn, "letters/exclaimation-point", sizeof(fn));
- break;
- case ('@'):
- strncpy(fn, "letters/at", sizeof(fn));
- break;
- case ('$'):
- strncpy(fn, "letters/dollar", sizeof(fn));
- break;
- case ('-'):
- strncpy(fn, "letters/dash", sizeof(fn));
- break;
- case ('.'):
- strncpy(fn, "letters/dot", sizeof(fn));
- break;
- case ('='):
- strncpy(fn, "letters/equals", sizeof(fn));
- break;
- case ('+'):
- strncpy(fn, "letters/plus", sizeof(fn));
- break;
- case ('/'):
- strncpy(fn, "letters/slash", sizeof(fn));
- break;
- case (' '):
- strncpy(fn, "letters/space", sizeof(fn));
- break;
- default:
- ltr = fn2[num];
- if ('A' <= ltr && ltr <= 'Z') ltr += 'a' - 'A'; /* file names are all lower-case */
- snprintf(fn, sizeof(fn), "letters/%c", ltr);
- }
- if(!ast_strlen_zero(fn)) { /* if length == 0, then skip this digit as it is invalid */
- res = ast_streamfile(chan, fn, lang);
- if (!res)
- res = ast_waitstream(chan, ints);
- } ast_stopstream(chan);
- num++;
- }
- return res;
-}
-int ast_say_phonetic_str(struct ast_channel *chan, const char *fn2, const char *ints, const char *lang)
-{
- /* XXX Merge with full version? XXX */
- char fn[256] = "";
- char ltr;
- int num = 0;
- int res = 0;
- int temp;
- int play;
- char hex[3];
-/* while(fn2[num] && !res) { */
- while(fn2[num]) {
- play=1;
- switch (fn2[num]) {
- case ('*'):
- snprintf(fn, sizeof(fn), "digits/star");
- break;
- case ('#'):
- snprintf(fn, sizeof(fn), "digits/pound");
- break;
- case ('0'):
- case ('1'):
- case ('2'):
- case ('3'):
- case ('4'):
- case ('5'):
- case ('6'):
- case ('7'):
- case ('8'):
- snprintf(fn, sizeof(fn), "digits/%c", fn2[num]);
- break;
- case ('!'):
- strncpy(fn, "letters/exclaimation-point", sizeof(fn));
- break;
- case ('@'):
- strncpy(fn, "letters/at", sizeof(fn));
- break;
- case ('$'):
- strncpy(fn, "letters/dollar", sizeof(fn));
- break;
- case ('-'):
- strncpy(fn, "letters/dash", sizeof(fn));
- break;
- case ('.'):
- strncpy(fn, "letters/dot", sizeof(fn));
- break;
- case ('='):
- strncpy(fn, "letters/equals", sizeof(fn));
- break;
- case ('+'):
- strncpy(fn, "letters/plus", sizeof(fn));
- break;
- case ('/'):
- strncpy(fn, "letters/slash", sizeof(fn));
- break;
- case (' '):
- strncpy(fn, "letters/space", sizeof(fn));
- break;
- case ('%'):
- play=0;
- /* check if we have 2 chars after the % */
- if (strlen(fn2) > num+2)
- {
- hex[0]=fn2[num+1];
- hex[1]=fn2[num+2];
- hex[2]='\0';
- if (sscanf(hex,"%x", &temp))
- { /* Hex to char convertion successfull */
- num++;
- if (temp==37)
- { /* If it is a percent, play it now */
- strncpy(fn, "percent", sizeof(fn));
- num++;
- play=1;
- }
- /* check for invalid characters */
- if ((temp<32) || (temp>126))
- {
- num++;
- }
- }
- }
- else
- num++;
- break;
- default: /* '9' falls through to here, too */
- ltr = tolower(fn2[num]);
- snprintf(fn, sizeof(fn), "phonetic/%c_p", ltr);
- }
- if (play)
- {
- res = ast_streamfile(chan, fn, lang);
- if (!res)
- res = ast_waitstream(chan, ints);
- ast_stopstream(chan);
+ while (str[num]) {
+ fn = NULL;
+ switch (str[num]) {
+ case ('*'):
+ fn = "digits/star";
+ break;
+ case ('#'):
+ fn = "digits/pound";
+ break;
+ case ('!'):
+ fn = "letters/exclaimation-point";
+ break;
+ case ('@'):
+ fn = "letters/at";
+ break;
+ case ('$'):
+ fn = "letters/dollar";
+ break;
+ case ('-'):
+ fn = "letters/dash";
+ break;
+ case ('.'):
+ fn = "letters/dot";
+ break;
+ case ('='):
+ fn = "letters/equals";
+ break;
+ case ('+'):
+ fn = "letters/plus";
+ break;
+ case ('/'):
+ fn = "letters/slash";
+ break;
+ case (' '):
+ fn = "letters/space";
+ break;
+ case ('0'):
+ case ('1'):
+ case ('2'):
+ case ('3'):
+ case ('4'):
+ case ('5'):
+ case ('6'):
+ case ('7'):
+ case ('8'):
+ strcpy(fnbuf, "digits/X");
+ fnbuf[7] = str[num];
+ fn = fnbuf;
+ break;
+ default: /* '9' falls here... */
+ ltr = str[num];
+ if ('A' <= ltr && ltr <= 'Z') ltr += 'a' - 'A'; /* file names are all lower-case */
+ strcpy(fnbuf, "letters/X");
+ fnbuf[8] = ltr;
+ fn = fnbuf;
}
- num++;
- }
- return res;
-}
-
-int ast_say_digit_str_full(struct ast_channel *chan, const char *fn2, const char *ints, const char *lang, int audiofd, int ctrlfd)
-{
- char fn[256] = "";
- int num = 0;
- int res = 0;
- while(fn2[num] && !res) {
- snprintf(fn, sizeof(fn), "digits/%c", fn2[num]);
res = ast_streamfile(chan, fn, lang);
if (!res)
res = ast_waitstream_full(chan, ints, audiofd, ctrlfd);
ast_stopstream(chan);
num++;
}
+
return res;
}
-int ast_say_character_str_full(struct ast_channel *chan, const char *fn2, const char *ints, const char *lang, int audiofd, int ctrlfd)
+int ast_say_character_str(struct ast_channel *chan, const char *str, const char *ints, const char *lang)
{
- char fn[256] = "";
+ return ast_say_character_str_full(chan, str, ints, lang, -1, -1);
+}
+
+int ast_say_phonetic_str_full(struct ast_channel *chan, const char *str, const char *ints, const char *lang, int audiofd, int ctrlfd)
+{
+ const char *fn;
+ char fnbuf[256];
char ltr;
int num = 0;
int res = 0;
- while(fn2[num] && !res) {
- switch (fn2[num]) {
- case ('*'):
- snprintf(fn, sizeof(fn), "digits/star");
- break;
- case ('#'):
- snprintf(fn, sizeof(fn), "digits/pound");
- break;
- case ('0'):
- case ('1'):
- case ('2'):
- case ('3'):
- case ('4'):
- case ('5'):
- case ('6'):
- case ('7'):
- case ('8'):
- case ('9'):
- snprintf(fn, sizeof(fn), "digits/%c", fn2[num]);
- break;
- case ('!'):
- strncpy(fn, "letters/exclaimation-point", sizeof(fn));
- break;
- case ('@'):
- strncpy(fn, "letters/at", sizeof(fn));
- break;
- case ('$'):
- strncpy(fn, "letters/dollar", sizeof(fn));
- break;
- case ('-'):
- strncpy(fn, "letters/dash", sizeof(fn));
- break;
- case ('.'):
- strncpy(fn, "letters/dot", sizeof(fn));
- break;
- case ('='):
- strncpy(fn, "letters/equals", sizeof(fn));
- break;
- case ('+'):
- strncpy(fn, "letters/plus", sizeof(fn));
- break;
- case ('/'):
- strncpy(fn, "letters/slash", sizeof(fn));
- break;
- case (' '):
- strncpy(fn, "letters/space", sizeof(fn));
- break;
- default:
- ltr = fn2[num];
- if ('A' <= ltr && ltr <= 'Z') ltr += 'a' - 'A'; /* file names are all lower-case */
- snprintf(fn, sizeof(fn), "letters/%c", ltr);
+
+ while (str[num]) {
+ fn = NULL;
+ switch (str[num]) {
+ case ('*'):
+ fn = "digits/star";
+ break;
+ case ('#'):
+ fn = "digits/pound";
+ break;
+ case ('!'):
+ fn = "letters/exclaimation-point";
+ break;
+ case ('@'):
+ fn = "letters/at";
+ break;
+ case ('$'):
+ fn = "letters/dollar";
+ break;
+ case ('-'):
+ fn = "letters/dash";
+ break;
+ case ('.'):
+ fn = "letters/dot";
+ break;
+ case ('='):
+ fn = "letters/equals";
+ break;
+ case ('+'):
+ fn = "letters/plus";
+ break;
+ case ('/'):
+ fn = "letters/slash";
+ break;
+ case (' '):
+ fn = "letters/space";
+ break;
+ case ('0'):
+ case ('1'):
+ case ('2'):
+ case ('3'):
+ case ('4'):
+ case ('5'):
+ case ('6'):
+ case ('7'):
+ case ('8'):
+ strcpy(fnbuf, "digits/X");
+ fnbuf[7] = str[num];
+ fn = fnbuf;
+ break;
+ default: /* '9' falls here... */
+ ltr = str[num];
+ if ('A' <= ltr && ltr <= 'Z') ltr += 'a' - 'A'; /* file names are all lower-case */
+ strcpy(fnbuf, "phonetic/X_p");
+ fnbuf[9] = ltr;
+ fn = fnbuf;
}
- /* snprintf(fn, sizeof(fn), "digits/%c", fn2[num]); */
res = ast_streamfile(chan, fn, lang);
if (!res)
res = ast_waitstream_full(chan, ints, audiofd, ctrlfd);
ast_stopstream(chan);
num++;
}
+
return res;
}
-int ast_say_phonetic_str_full(struct ast_channel *chan, const char *fn2, const char *ints, const char *lang, int audiofd, int ctrlfd)
+int ast_say_phonetic_str(struct ast_channel *chan, const char *str, const char *ints, const char *lang)
{
- char fn[256] = "";
- char ltr;
+ return ast_say_phonetic_str_full(chan, str, ints, lang, -1, -1);
+}
+
+int ast_say_digit_str_full(struct ast_channel *chan, const char *str, const char *ints, const char *lang, int audiofd, int ctrlfd)
+{
+ const char *fn;
+ char fnbuf[256];
int num = 0;
int res = 0;
- while(fn2[num] && !res) {
- switch (fn2[num]) {
- case ('*'):
- snprintf(fn, sizeof(fn), "digits/star");
- break;
- case ('#'):
- snprintf(fn, sizeof(fn), "digits/pound");
- break;
- case ('0'):
- case ('1'):
- case ('2'):
- case ('3'):
- case ('4'):
- case ('5'):
- case ('6'):
- case ('7'):
- case ('8'):
- snprintf(fn, sizeof(fn), "digits/%c", fn2[num]);
- break;
- case ('!'):
- strncpy(fn, "letters/exclaimation-point", sizeof(fn));
- break;
- case ('@'):
- strncpy(fn, "letters/at", sizeof(fn));
- break;
- case ('$'):
- strncpy(fn, "letters/dollar", sizeof(fn));
- break;
- case ('-'):
- strncpy(fn, "letters/dash", sizeof(fn));
- break;
- case ('.'):
- strncpy(fn, "letters/dot", sizeof(fn));
- break;
- case ('='):
- strncpy(fn, "letters/equals", sizeof(fn));
- break;
- case ('+'):
- strncpy(fn, "letters/plus", sizeof(fn));
- break;
- case ('/'):
- strncpy(fn, "letters/slash", sizeof(fn));
- break;
- case (' '):
- strncpy(fn, "letters/space", sizeof(fn));
- break;
- default: /* '9' falls here... */
- ltr = fn2[num];
- if ('A' <= ltr && ltr <= 'Z') ltr += 'a' - 'A'; /* file names are all lower-case */
- snprintf(fn, sizeof(fn), "phonetic/%c", ltr);
- }
- /* snprintf(fn, sizeof(fn), "digits/%c", fn2[num]); */
- res = ast_streamfile(chan, fn, lang);
- if (!res)
- res = ast_waitstream_full(chan, ints, audiofd, ctrlfd);
- ast_stopstream(chan);
+
+ while (str[num]) {
+ fn = NULL;
+ switch (str[num]) {
+ case ('*'):
+ fn = "digits/star";
+ break;
+ case ('#'):
+ fn = "digits/pound";
+ break;
+ case ('-'):
+ fn = "digits/minus";
+ break;
+ case '0':
+ case '1':
+ case '2':
+ case '3':
+ case '4':
+ case '5':
+ case '6':
+ case '7':
+ case '8':
+ case '9':
+ strcpy(fnbuf, "digits/X");
+ fnbuf[7] = str[num];
+ fn = fnbuf;
+ break;
+ }
+ if (fn) {
+ res = ast_streamfile(chan, fn, lang);
+ if (!res)
+ res = ast_waitstream_full(chan, ints, audiofd, ctrlfd);
+ ast_stopstream(chan);
+ }
num++;
}
+
return res;
}
-int ast_say_digits(struct ast_channel *chan, int num, const char *ints, const char *lang)
+int ast_say_digit_str(struct ast_channel *chan, const char *str, const char *ints, const char *lang)
{
- /* XXX Should I be merged with say_digits_full XXX */
- char fn2[256];
- snprintf(fn2, sizeof(fn2), "%d", num);
- return ast_say_digit_str(chan, fn2, ints, lang);
+ return ast_say_digit_str_full(chan, str, ints, lang, -1, -1);
}
int ast_say_digits_full(struct ast_channel *chan, int num, const char *ints, const char *lang, int audiofd, int ctrlfd)
{
char fn2[256];
+
snprintf(fn2, sizeof(fn2), "%d", num);
return ast_say_digit_str_full(chan, fn2, ints, lang, audiofd, ctrlfd);
}
+int ast_say_digits(struct ast_channel *chan, int num, const char *ints, const char *lang)
+{
+ return ast_say_digits_full(chan, num, ints, lang, -1, -1);
+}
+
/* Forward declarations */
/* Syntaxes supported, not really language codes.
da - Danish