[asterisk-commits] trunk - r8370 /trunk/callerid.c
asterisk-commits at lists.digium.com
asterisk-commits at lists.digium.com
Fri Jan 20 22:05:46 MST 2006
Author: tilghman
Date: Fri Jan 20 23:05:45 2006
New Revision: 8370
URL: http://svn.digium.com/view/asterisk?rev=8370&view=rev
Log:
Bug 6096 - callerid_parse cleanup
Modified:
trunk/callerid.c
Modified: trunk/callerid.c
URL: http://svn.digium.com/view/asterisk/trunk/callerid.c?rev=8370&r1=8369&r2=8370&view=diff
==============================================================================
--- trunk/callerid.c (original)
+++ trunk/callerid.c Fri Jan 20 23:05:45 2006
@@ -862,6 +862,10 @@
return bytes;
}
+/*
+ * remove '(', ' ', ')', non-trailing '.', and '-' not in square brackets.
+ * Basically, remove anything that could be invalid in a pattern.
+ */
void ast_shrink_phone_number(char *n)
{
int x,y=0;
@@ -908,53 +912,50 @@
}
/*! \brief parse string for caller id information
- \return returns -1 on failure, otherwise 0
+ \return always returns 0, as the code always returns something.
+ XXX note that 'name' is not parsed consistently e.g. we have
+
+ input location name
+ " foo bar " <123> 123 ' foo bar ' (with spaces around)
+ " foo bar " NULL 'foo bar' (without spaces around)
+ " foo bar <123>" 123 '" foo bar'
+ The parsing of leading and trailing space/quotes should be more consistent.
*/
int ast_callerid_parse(char *instr, char **name, char **location)
{
- char *ns, *ne;
- char *ls, *le;
- char tmp[256];
- /* Try for "name" <location> format or
- name <location> format */
+ char *ns, *ne, *ls, *le;
+
+ /* Try "name" <location> format or name <location> format */
if ((ls = strchr(instr, '<')) && (le = strchr(ls, '>'))) {
- /* Found the location */
- *le = '\0';
- *ls = '\0';
- *location = ls + 1;
- if ((ns = strchr(instr, '\"')) && (ne = strchr(ns + 1, '\"'))) {
- /* Get name out of quotes */
- *ns = '\0';
- *ne = '\0';
- *name = ns + 1;
- return 0;
- } else {
- /* Just trim off any trailing spaces */
- *name = instr;
- while(!ast_strlen_zero(instr) && (instr[strlen(instr) - 1] < 33))
- instr[strlen(instr) - 1] = '\0';
- /* And leading spaces */
- *name = ast_skip_blanks(*name);
- return 0;
- }
- } else {
+ *ls = *le = '\0'; /* location found, trim off the brackets */
+ *location = ls + 1; /* and this is the result */
+ if ((ns = strchr(instr, '"')) && (ne = strchr(ns + 1, '"'))) {
+ *ns = *ne = '\0'; /* trim off the quotes */
+ *name = ns + 1; /* and this is the name */
+ } else { /* no quotes, trim off leading and trailing spaces */
+ *name = ast_skip_blanks(instr);
+ ast_trim_blanks(*name);
+ }
+ } else { /* no valid brackets */
+ char tmp[256];
ast_copy_string(tmp, instr, sizeof(tmp));
ast_shrink_phone_number(tmp);
- if (ast_isphonenumber(tmp)) {
- /* Assume it's just a location */
+ if (ast_isphonenumber(tmp)) { /* Assume it's just a location */
*name = NULL;
+ strcpy(instr, tmp); /* safe, because tmp will always be the same size or smaller than instr */
*location = instr;
- } else {
- /* Assume it's just a name. Make sure it's not quoted though */
- *name = instr;
- while(*(*name) && ((*(*name) < 33) || (*(*name) == '\"'))) (*name)++;
- ne = *name + strlen(*name) - 1;
- while((ne > *name) && ((*ne < 33) || (*ne == '\"'))) { *ne = '\0'; ne--; }
+ } else { /* Assume it's just a name. */
*location = NULL;
- }
- return 0;
- }
- return -1;
+ if ((ns = strchr(instr, '"')) && (ne = strchr(ns + 1, '"'))) {
+ *ns = *ne = '\0'; /* trim off the quotes */
+ *name = ns + 1; /* and this is the name */
+ } else { /* no quotes, trim off leading and trailing spaces */
+ *name = ast_skip_blanks(instr);
+ ast_trim_blanks(*name);
+ }
+ }
+ }
+ return 0;
}
static int __ast_callerid_generate(unsigned char *buf, char *name, char *number, int callwaiting, int codec)
More information about the asterisk-commits
mailing list