[svn-commits] murf: branch murf/cel2cdr r180119 - in /team/murf/cel2cdr: ./ apps/ cel/ conf...

SVN commits to the Digium repositories svn-commits at lists.digium.com
Wed Mar 4 01:06:51 CST 2009


Author: murf
Date: Wed Mar  4 01:06:42 2009
New Revision: 180119

URL: http://svn.digium.com/svn-view/asterisk?view=rev&rev=180119
Log:
Merged revisions 179972-179973,180007,180011,180032,180079 via svnmerge from 
https://origsvn.digium.com/svn/asterisk/trunk

................
  r179972 | dvossel | 2009-03-03 15:01:24 -0700 (Tue, 03 Mar 2009) | 13 lines
  
  app_meetme not setting filename and fileformat correctly for realtime
  
  When app_meetme finds a realtime conference, it doesn't get the filename and fileformat correctly when 'r' is set.  Now app_meetme first checks to see if fileformat and filename are declared in the db, if they're not it checks the .conf file, if its not declared there either it then uses defaults. 
  
  (closes issue #14545)
  Reported by: dalbaech
  Patches:
  	app_meetme-realtime5.patch uploaded by dvossel (license 671)
  	Realtime_Conference_Record_workaround.txt uploaded by dalbaech (license 705)
  Tested by: dvossel, dalbaech
  Review: http://reviewboard.digium.com/r/180/
................
  r179973 | murf | 2009-03-03 15:12:02 -0700 (Tue, 03 Mar 2009) | 33 lines
  
  Merged revisions 179807 via svnmerge from 
  https://origsvn.digium.com/svn/asterisk/branches/1.4
  
  I had some work to do to port these changes to trunk; the 
  check_expr stuff hasn't been updated here for quite some
  time, it appears. I added some more tests to the check_expr2
  suite. I had to play around with the makefile a bit, etc.
  
  I added STANDALONE2 #ifdefs to ast_expr2.y so as not to
  conflict structure with aelparse.
  
  ........
    r179807 | murf | 2009-03-03 11:11:34 -0700 (Tue, 03 Mar 2009) | 19 lines
    
    These changes allow AEL to better check ${} constructs within $[...], that are concatenated with text.
    
    I modified and added rules in ast_expr2.fl to better handle
    the concatenations.
    
    I added some default routines to ast_expr2.y so the standalone would
    compile. It also looks like I haven't run this thru bison since 2.1, so
    it's good to get this updated.
    
    The Makefile has comments added now for check_expr2 and check_expr to
    explain what they are for, and how to run them. 
    
    The testexpr2s stuff has been removed, in favor of check_expr2.
    
    expr2.testinput has been updated to include the two expressions
    that inspired these changes (from mcnobody on #asterisk this morning)
    The regression has been run and all looks well.
  ........
................
  r180007 | mmichelson | 2009-03-03 15:49:07 -0700 (Tue, 03 Mar 2009) | 22 lines
  
  Merged revisions 180006 via svnmerge from 
  https://origsvn.digium.com/svn/asterisk/branches/1.4
  
  ........
    r180006 | mmichelson | 2009-03-03 16:48:18 -0600 (Tue, 03 Mar 2009) | 17 lines
    
    Clarify some documentation of queues.conf.sample
    
    It had always been possible to explicitly specify a "blank"
    value for a sound file in queues.conf and have no sound played
    back. The problem with this is that it would result in some ugly
    CLI warnings from file.c.
    
    This commit introduces a check when playing a file in app_queue
    to see if the name of the file is zero-length and return early if
    that is the case. Also, the ability to specify the blank sound
    files in queues.conf is now mentioned more clearly in queues.conf.sample
    
    (closes issue #14227)
    Reported by: caspy
  ........
................
  r180011 | qwell | 2009-03-03 16:02:04 -0700 (Tue, 03 Mar 2009) | 8 lines
  
  Blocked revisions 180010 via svnmerge
  
  ........
    r180010 | qwell | 2009-03-03 17:01:06 -0600 (Tue, 03 Mar 2009) | 1 line
    
    Make sure we still support zapchan in users.conf, in addition to dahdichan.
  ........
................
  r180032 | dvossel | 2009-03-03 16:21:18 -0700 (Tue, 03 Mar 2009) | 14 lines
  
  app_read does not break from prompt loop with user terminated empty string
  
  In app.c, ast_app_getdata is called to stream the prompts and receive DTMF input.  If ast_app_getdata() receives an empty string caused by the user inputing the end of string character, in this case '#', it should break from the prompt loop and return to app_read, but instead it cycles through all the prompts.  I've added a return value for this special case in ast_readstring() which uses an enum I've delcared in apps.h.  This enum is now used as a return value for ast_app_getdata().
  
  (closes issue #14279)
  Reported by: Marquis
  Patches:
  	fix_app_read.patch uploaded by Marquis (license 32)
  	read-ampersanmd.patch2 uploaded by dvossel (license 671)
  Tested by: Marquis, dvossel
  Review: http://reviewboard.digium.com/r/177/
................
  r180079 | murf | 2009-03-03 16:35:26 -0700 (Tue, 03 Mar 2009) | 1 line
  
  My bad! left check_expr2 in the ALL_UTILS list by mistake. Already done to 1.6.x
................

Modified:
    team/murf/cel2cdr/   (props changed)
    team/murf/cel2cdr/apps/app_meetme.c
    team/murf/cel2cdr/apps/app_queue.c
    team/murf/cel2cdr/apps/app_read.c
    team/murf/cel2cdr/cel/cel_cel2cdr.c
    team/murf/cel2cdr/configs/queues.conf.sample
    team/murf/cel2cdr/include/asterisk/app.h
    team/murf/cel2cdr/main/app.c
    team/murf/cel2cdr/main/ast_expr2.c
    team/murf/cel2cdr/main/ast_expr2.fl
    team/murf/cel2cdr/main/ast_expr2.h
    team/murf/cel2cdr/main/ast_expr2.y
    team/murf/cel2cdr/main/ast_expr2f.c
    team/murf/cel2cdr/main/channel.c
    team/murf/cel2cdr/utils/Makefile
    team/murf/cel2cdr/utils/expr2.testinput

Propchange: team/murf/cel2cdr/
------------------------------------------------------------------------------
    automerge = yes

Propchange: team/murf/cel2cdr/
------------------------------------------------------------------------------
Binary property 'branch-1.4-blocked' - no diff available.

Propchange: team/murf/cel2cdr/
------------------------------------------------------------------------------
Binary property 'branch-1.4-merged' - no diff available.

Propchange: team/murf/cel2cdr/
------------------------------------------------------------------------------
--- svnmerge-integrated (original)
+++ svnmerge-integrated Wed Mar  4 01:06:42 2009
@@ -1,1 +1,1 @@
-/trunk:1-179958
+/trunk:1-180115

Modified: team/murf/cel2cdr/apps/app_meetme.c
URL: http://svn.digium.com/svn-view/asterisk/team/murf/cel2cdr/apps/app_meetme.c?view=diff&rev=180119&r1=180118&r2=180119
==============================================================================
--- team/murf/cel2cdr/apps/app_meetme.c (original)
+++ team/murf/cel2cdr/apps/app_meetme.c Wed Mar  4 01:06:42 2009
@@ -3347,6 +3347,8 @@
 		char *pin = NULL, *pinadmin = NULL; /* For temp use */
 		int maxusers = 0;
 		struct timeval now;
+		char recordingfilename[256] = "";
+		char recordingformat[10] = "";
 		char currenttime[19] = "";
 		char eatime[19] = "";
 		char bookid[19] = "";
@@ -3355,6 +3357,7 @@
 		char adminopts[OPTIONS_LEN];
 		struct ast_tm tm, etm;
 		struct timeval endtime = { .tv_sec = 0 };
+		const char *var2;
 
 		if (rt_schedule) {
 			now = ast_tvnow();
@@ -3420,6 +3423,10 @@
 				maxusers = atoi(var->value);
 			} else if (!strcasecmp(var->name, "adminopts")) {
 				ast_copy_string(adminopts, var->value, sizeof(char[OPTIONS_LEN]));
+			} else if (!strcasecmp(var->name, "recordingfilename")) {
+				ast_copy_string(recordingfilename, var->value, sizeof(recordingfilename));
+			} else if (!strcasecmp(var->name, "recordingformat")) {
+				ast_copy_string(recordingformat, var->value, sizeof(recordingformat));
 			} else if (!strcasecmp(var->name, "endtime")) {
 				struct ast_tm endtime_tm;
 				ast_strptime(var->value, "%Y-%m-%d %H:%M:%S", &endtime_tm);
@@ -3438,9 +3445,37 @@
 			cnf->useropts = ast_strdup(useropts);
 			cnf->adminopts = ast_strdup(adminopts);
 			cnf->bookid = ast_strdup(bookid);
-			snprintf(recordingtmp, sizeof(recordingtmp), "%s/meetme/meetme-conf-rec-%s-%s", ast_config_AST_SPOOL_DIR, confno, bookid);
-			cnf->recordingfilename = ast_strdup(recordingtmp);
-			cnf->recordingformat = ast_strdup("wav");
+			cnf->recordingfilename = ast_strdup(recordingfilename);
+			cnf->recordingformat = ast_strdup(recordingformat);
+
+			if (strchr(cnf->useropts, 'r')) {
+				if (ast_strlen_zero(recordingfilename)) { /* If the recordingfilename in the database is empty, use the channel definition or use the default. */
+					ast_channel_lock(chan);
+					if ((var2 = pbx_builtin_getvar_helper(chan, "MEETME_RECORDINGFILE"))) {
+						ast_free(cnf->recordingfilename);
+						cnf->recordingfilename = ast_strdup(var2);
+					}
+					ast_channel_unlock(chan);
+					if (ast_strlen_zero(cnf->recordingfilename)) {
+						snprintf(recordingtmp, sizeof(recordingtmp), "meetme-conf-rec-%s-%s", cnf->confno, chan->uniqueid);
+						ast_free(cnf->recordingfilename);
+						cnf->recordingfilename = ast_strdup(recordingtmp);
+					}
+				}
+				if (ast_strlen_zero(cnf->recordingformat)) {/* If the recording format is empty, use the wav as default */
+					ast_channel_lock(chan);
+					if ((var2 = pbx_builtin_getvar_helper(chan, "MEETME_RECORDINGFORMAT"))) {
+						ast_free(cnf->recordingformat);
+						cnf->recordingformat = ast_strdup(var2);
+					}
+					ast_channel_unlock(chan);
+					if (ast_strlen_zero(cnf->recordingformat)) {
+						ast_free(cnf->recordingformat);
+						cnf->recordingformat = ast_strdup("wav");
+					}
+				}
+				ast_verb(4, "Starting recording of MeetMe Conference %s into file %s.%s.\n", cnf->confno, cnf->recordingfilename, cnf->recordingformat);
+			}
 		}
 	}
 
@@ -3816,6 +3851,7 @@
 									}
 								}
 								/* Run the conference */
+								ast_verb(4, "Starting recording of MeetMe Conference %s into file %s.%s.\n", cnf->confno, cnf->recordingfilename, cnf->recordingformat);
 								res = conf_run(chan, cnf, confflags.flags, optargs);
 								break;
 							} else {

Modified: team/murf/cel2cdr/apps/app_queue.c
URL: http://svn.digium.com/svn-view/asterisk/team/murf/cel2cdr/apps/app_queue.c?view=diff&rev=180119&r1=180118&r2=180119
==============================================================================
--- team/murf/cel2cdr/apps/app_queue.c (original)
+++ team/murf/cel2cdr/apps/app_queue.c Wed Mar  4 01:06:42 2009
@@ -1974,6 +1974,10 @@
 {
 	int res;
 
+	if (ast_strlen_zero(filename)) {
+		return 0;
+	}
+
 	ast_stopstream(chan);
 
 	res = ast_streamfile(chan, filename, chan->language);

Modified: team/murf/cel2cdr/apps/app_read.c
URL: http://svn.digium.com/svn-view/asterisk/team/murf/cel2cdr/apps/app_read.c?view=diff&rev=180119&r1=180118&r2=180119
==============================================================================
--- team/murf/cel2cdr/apps/app_read.c (original)
+++ team/murf/cel2cdr/apps/app_read.c Wed Mar  4 01:06:42 2009
@@ -231,11 +231,11 @@
 				}
 			} else {
 				res = ast_app_getdata(chan, arglist.filename, tmp, maxdigits, to);
-				if (res == 0)
+				if (res == AST_GETDATA_COMPLETE || res == AST_GETDATA_EMPTY_END_TERMINATED)
 					status = "OK";
-				else if (res == 1)
+				else if (res == AST_GETDATA_TIMEOUT)
 					status = "TIMEOUT";
-				else if (res == 2)
+				else if (res == AST_GETDATA_INTERRUPTED)
 					status = "INTERRUPTED";
 			}
 			if (res > -1) {

Modified: team/murf/cel2cdr/cel/cel_cel2cdr.c
URL: http://svn.digium.com/svn-view/asterisk/team/murf/cel2cdr/cel/cel_cel2cdr.c?view=diff&rev=180119&r1=180118&r2=180119
==============================================================================
--- team/murf/cel2cdr/cel/cel_cel2cdr.c (original)
+++ team/murf/cel2cdr/cel/cel_cel2cdr.c Wed Mar  4 01:06:42 2009
@@ -25,6 +25,14 @@
 #include "asterisk/hashtab.h"
 #include "asterisk/event.h"
 #include "asterisk/module.h"
+#include "asterisk/cdr.h"
+
+struct channel_entry
+{
+	char *channame; /* strdup; free on destroy */
+	
+	struct ast_cdr *cdr; /* slots for all the info to reside until publishing */
+};
 
 struct event_list_member
 {
@@ -34,8 +42,10 @@
 
 struct event_list 
 {
-	char *linkedid; /* will be the channel name for simple CDR's; the linkedid for leg-based */
-
+	char *linkedid; /* The linkedid should serve both simple and leg-based CDR worlds */
+
+	struct ast_hashtab *channel_table;
+	
 	/* I'm trying to think of any other stuff I might need here... */
 
 	/* you know, maybe a DLL isn't so good here...
@@ -63,6 +73,7 @@
 
 /* the funcs for hashing */
 
+/* master table */
 static int table_compare_func(const void *a, const void *b)
 {
 	const struct event_list *ev_a = a;
@@ -76,6 +87,22 @@
 	return ast_hashtab_hash_string(obj_a->linkedid);
 }
 
+/* channel tables */
+
+static int chantable_compare_func(const void *a, const void *b)
+{
+	const struct channel_entry *ch_a = a;
+	const struct channel_entry *ch_b = b;
+	return strcmp(ch_a->channame, ch_b->channame);
+}
+
+static unsigned int chantable_hash_func(const void *obj)
+{
+	const struct channel_entry *obj_a = obj;
+	return ast_hashtab_hash_string(obj_a->channame);
+}
+
+
 /* destruction is really boring stuff....
    until it doesn't work, or doesn't work right! */
 
@@ -84,6 +111,17 @@
 	ast_event_destroy(m->ev);
 	m->ev = NULL;
 	free(m);
+}
+
+static void destroy_channel_entry(struct channel_entry *ce)
+{
+	free(ce->channame);
+	ce->channame = NULL;
+	if (ce->cdr) {
+		ast_cdr_discard(ce->cdr);
+	}
+	ce->cdr = NULL;
+	free(ce);
 }
 
 static void destroy_event_list(void *lv)
@@ -99,8 +137,30 @@
 	free(l->linkedid);
 	l->linkedid = NULL;
 	free(l);
-}
-
+	if (l->channel_table) {
+		ast_hashtab_destroy(l->channel_table, destroy_channel_entry);
+		l->channel_table = NULL;
+	}
+}
+
+/* creation */
+
+static struct event_list *event_list_new(char *linkedid)
+{
+	struct event_list *n = ast_calloc(sizeof(struct event_list),1);
+	n->linkedid = strdup(linkedid);
+	n->channel_table = ast_hashtab_create(7,chantable_compare_func, ast_hashtab_resize_java,
+										  ast_hashtab_newsize_java, chantable_hash_func, 1);
+	return n;
+}
+
+static struct event_list *channel_entry_new(char *channame)
+{
+	struct channel_entry *n = ast_calloc(sizeof(struct channel_entry),1);
+	n->channame = strdup(channame);
+	n->cdr = ast_cdr_alloc();
+	return n;
+}
 
 /* mode == 0;  SIMPLE
    mode == 1;  LEG_BASED
@@ -149,14 +209,154 @@
 }
 
 
+
 void cel2cdr_handle_event(const struct ast_event *event, void *userdata);
 
 void cel2cdr_handle_event(const struct ast_event *event, void *userdata)
 {
+	struct event_list *el, el_search;
+	struct channel_entry *ce, ce_search;
+	enum ast_cel_eventtype event_type;
+	struct timeval event_time;
+	int event_amaflags;
+	char *event_linkedid;
+	char *event_userevent_name;
+	char *event_cidname;
+	char *event_cidnum;
+	char *event_cidani;
+	char *event_cidrdnis;
+	char *event_ciddnid;
+	char *event_exten;
+	char *event_context;
+	char *event_channame;
+	char *event_peer;
+	char *event_peeracct;
+	char *event_appname;
+	char *event_appdata;
+	char *event_acctcode;
+	char *event_uniqueid;
+	char *event_userfield;
+	char *event_extra;
+	
 	if (cel2cdr_enabled) {
 		if (cdr_mode == CEL2CDR_MODE_SIMPLE) {
-			/* save up start, answer, end event times and on END
+			/* GENERAL: save up start, answer, end event times and on END
 			   events, generate a CDR and post it */
+
+			/* fetch info from the event */
+			event_type = ast_event_get_ie_uint(event, AST_EVENT_IE_CEL_EVENT_TYPE);
+			event_channame = ast_event_get_ie_str(event, AST_EVENT_IE_CEL_CHANNAME);
+			/* At this point, we could save some time and skip events that
+			   are totally un-interesting: zombie and local chan start/stop, etc.*/
+			event_time.tv_sec = ast_event_get_ie_uint(event,AST_EVENT_IE_CEL_EVENT_TIME);
+			event_time.tv_usec = ast_event_get_ie_uint(event,AST_EVENT_IE_CEL_EVENT_TIME_USEC);
+			event_amaflags = ast_event_get_ie_uint(event, AST_EVENT_IE_CEL_AMAFLAGS);
+			event_linkedid = ast_event_get_ie_str(event, AST_EVENT_IE_CEL_LINKEDID);
+			event_userevent_name = ast_event_get_ie_str(event, AST_EVENT_IE_CEL_USEREVENT_NAME);
+			event_cidname = ast_event_get_ie_str(event, AST_EVENT_IE_CEL_CIDNAME);
+			event_cidnum = ast_event_get_ie_str(event, AST_EVENT_IE_CEL_CIDNUM);
+			event_exten = ast_event_get_ie_str(event, AST_EVENT_IE_CEL_EXTEN);
+			event_context = ast_event_get_ie_str(event, AST_EVENT_IE_CEL_CONTEXT);
+			event_appname = ast_event_get_ie_str(event, AST_EVENT_IE_CEL_APPNAME);
+			event_appdata = ast_event_get_ie_str(event, AST_EVENT_IE_CEL_APPDATA);
+			event_acctcode = ast_event_get_ie_str(event, AST_EVENT_IE_CEL_ACCTCODE);
+			event_uniqueid = ast_event_get_ie_str(event, AST_EVENT_IE_CEL_UNIQUEID);
+			event_userfield	= ast_event_get_ie_str(event, AST_EVENT_IE_CEL_USERFIELD);
+			event_cidani	= ast_event_get_ie_str(event, AST_EVENT_IE_CEL_CIDANI);
+			event_cidrdnis	= ast_event_get_ie_str(event, AST_EVENT_IE_CEL_CIDRDNIS);
+			event_ciddnid	= ast_event_get_ie_str(event, AST_EVENT_IE_CEL_CIDDNID);
+			event_peer	    = ast_event_get_ie_str(event, AST_EVENT_IE_CEL_PEER);
+			event_peeracct	= ast_event_get_ie_str(event, AST_EVENT_IE_CEL_PEERACCT);
+			event_extra   	= ast_event_get_ie_str(event, AST_EVENT_IE_CEL_EXTRA);
+			
+			/* is there an existing event_list in the
+			   master_table with this linkedid? Do a lookup.
+			   If not there, create one. */
+
+			/* set up el_search for the search */
+			el_search.linkedid = event_linkedid;
+			
+			el = ast_hashtab_lookup(master_table, &el_search);
+			if (el) {
+				/* a list already exists for this linkedid */
+			} else {
+				/* create a new list with this linkedid */
+				el = event_list_new(event_linkedid);
+				if (!ast_hashtab_insert_immediate(master_table, el)) {
+					printf("WHAT HAPPENED? I couldn't put linkedid %s into the master_table\n",
+						   event_linkedid);
+				} else {
+					/* success! */
+					/* 
+					   see if we can find this channel in the channel_table
+					*/
+					ce_search.channame = event_channame;
+					ce = ast_hashtab_lookup(el->channel_table, &ce_search);
+					if (ce) {
+						/* a list already exists for this linkedid */
+					} else {
+						/* create a new list with this linkedid */
+						ce = channel_entry_new(event_channame);
+						/* put it in the channel_table */
+						if (!ast_hashtab_insert_immediate(el->channel_table, ce)) {
+							printf("WHAT HAPPENED? I couldn't put %s into the channel_table for linkedid=%s\n",
+								   event_channame, event_linkedid);
+						} else {
+							/* success! */
+							/* at this point, we have an event_list for this linkedid;
+							   and a channel_entry for the channame involved. We may
+							   need another channel entry for the peer; we'll handle that
+							   at the necessary moments */
+							/* react by the event type */
+							switch (event_type) {
+							case CEL_CHANNEL_START:
+								/* make sure the channel start time is set, and all the goodies. */
+								break;
+							case CEL_CHANNEL_END:
+								/* CHANNEL_END events should publish a CDR */
+								ast_cdr_end(ce->cdr);
+								ast_cdr_detach(ce->cdr);
+								ce->cdr = NULL;
+								break;
+							case CEL_ANSWER:
+								/* We can fill in the CDR answer time on the peer channel here */
+								/* what do we put for the unanswered/busy peers? */
+								break;
+							case CEL_LINKEDID_END:
+								/* we could use this event to flush the event_list from the
+								   table */
+								break;
+								
+								/* for the rest, we might as well just use a default: */
+							case CEL_HANGUP:
+							case CEL_APP_START:
+							case CEL_APP_END:
+							case CEL_BRIDGE_START:
+							case CEL_BRIDGE_END:
+							case CEL_CONF_START:
+							case CEL_CONF_END:
+							case CEL_PARK_START:
+							case CEL_PARK_END:
+							case CEL_BLINDTRANSFER:
+							case CEL_ATTENDEDTRANSFER:
+							case CEL_TRANSFERL:
+							case CEL_HOOKFLASH:
+							case CEL_3WAY_START:
+							case CEL_3WAY_END:
+							case CEL_CONF_ENTER:
+							case CEL_CONF_EXIT:
+							case CEL_USER_DEFINED:
+							case CEL_BRIDGE_UPDATE:
+							case CEL_PICKUP:
+							case CEL_FORWARD:
+							default:
+								break;
+							}
+						}
+					}
+				}
+			}
+			
 		} else { /* then LEGBASED by elimination! */
 
 		}

Modified: team/murf/cel2cdr/configs/queues.conf.sample
URL: http://svn.digium.com/svn-view/asterisk/team/murf/cel2cdr/configs/queues.conf.sample?view=diff&rev=180119&r1=180118&r2=180119
==============================================================================
--- team/murf/cel2cdr/configs/queues.conf.sample (original)
+++ team/murf/cel2cdr/configs/queues.conf.sample Wed Mar  4 01:06:42 2009
@@ -292,6 +292,13 @@
 ;
 ; Use these sound files in making position/holdtime announcements.  The
 ; defaults are as listed below -- change only if you need to.
+;
+; Keep in mind that you may also prevent a sound from being played if you
+; explicitly set a sound to be an empty string. For example, if you want to
+; prevent the queue from playing queue-thankyou, you may set the sound using
+; the following line:
+;
+; queue-thankyou=
 ;
 			;	("You are now first in line.")
 ;queue-youarenext = queue-youarenext		

Modified: team/murf/cel2cdr/include/asterisk/app.h
URL: http://svn.digium.com/svn-view/asterisk/team/murf/cel2cdr/include/asterisk/app.h?view=diff&rev=180119&r1=180118&r2=180119
==============================================================================
--- team/murf/cel2cdr/include/asterisk/app.h (original)
+++ team/murf/cel2cdr/include/asterisk/app.h Wed Mar  4 01:06:42 2009
@@ -209,6 +209,16 @@
     'silencethreshold' or use '-1' for either or both parameters for defaults. */
 int ast_play_and_prepend(struct ast_channel *chan, char *playfile, char *recordfile, int maxtime_sec, char *fmt, int *duration, int beep, int silencethreshold, int maxsilence_ms);
 
+enum ast_getdata_result {
+	AST_GETDATA_FAILED = -1,
+	AST_GETDATA_COMPLETE = 0,
+	AST_GETDATA_TIMEOUT = 1,
+	AST_GETDATA_INTERRUPTED = 2,
+	/*! indicates a user terminated empty string rather than an empty string resulting 
+	 * from a timeout or other factors */
+	AST_GETDATA_EMPTY_END_TERMINATED = 3,
+};
+
 enum AST_LOCK_RESULT {
 	AST_LOCK_SUCCESS = 0,
 	AST_LOCK_TIMEOUT = -1,

Modified: team/murf/cel2cdr/main/app.c
URL: http://svn.digium.com/svn-view/asterisk/team/murf/cel2cdr/main/app.c?view=diff&rev=180119&r1=180118&r2=180119
==============================================================================
--- team/murf/cel2cdr/main/app.c (original)
+++ team/murf/cel2cdr/main/app.c Wed Mar  4 01:06:42 2009
@@ -121,7 +121,7 @@
  * \param maxlen How many digits to read (maximum)
  * \param timeout set timeout to 0 for "standard" timeouts. Set timeout to -1 for 
  *      "ludicrous time" (essentially never times out) */
-int ast_app_getdata(struct ast_channel *c, const char *prompt, char *s, int maxlen, int timeout)
+enum ast_getdata_result ast_app_getdata(struct ast_channel *c, const char *prompt, char *s, int maxlen, int timeout)
 {
 	int res = 0, to, fto;
 	char *front, *filename;
@@ -158,10 +158,14 @@
 			to = c->pbx ? c->pbx->dtimeoutms : 2000;
 		}
 		res = ast_readstring(c, s, maxlen, to, fto, "#");
-		if (!ast_strlen_zero(s))
+		if (res == AST_GETDATA_EMPTY_END_TERMINATED) {
 			return res;
-	}
-	
+		}
+		if (!ast_strlen_zero(s)) {
+			return res;
+		}
+	}
+
 	return res;
 }
 

Modified: team/murf/cel2cdr/main/ast_expr2.c
URL: http://svn.digium.com/svn-view/asterisk/team/murf/cel2cdr/main/ast_expr2.c?view=diff&rev=180119&r1=180118&r2=180119
==============================================================================
--- team/murf/cel2cdr/main/ast_expr2.c (original)
+++ team/murf/cel2cdr/main/ast_expr2.c Wed Mar  4 01:06:42 2009
@@ -128,7 +128,7 @@
 
 
 /* Copy the first part of user declarations.  */
-#line 1 "ast_expr2.y"
+#line 1 "/home/murf/asterisk/cel2cdr/main/ast_expr2.y"
 
 /* Written by Pace Willisson (pace at blitz.com) 
  * and placed in the public domain.
@@ -148,7 +148,8 @@
 #include <sys/types.h>
 #include <stdio.h>
 
-#if !defined(STANDALONE)
+#if !defined(STANDALONE) && !defined(STANDALONE2)	\
+	
 ASTERISK_FILE_VERSION(__FILE__, "$Revision$")
 #else
 #ifndef __USE_ISOC99
@@ -343,7 +344,7 @@
 
 #include "asterisk/ast_expr.h"
 #include "asterisk/logger.h"
-#ifndef STANDALONE
+#if !defined(STANDALONE) && !defined(STANDALONE2)
 #include "asterisk/pbx.h"
 #endif
 
@@ -371,7 +372,7 @@
 	AST_EXPR_number, AST_EXPR_numeric_string, AST_EXPR_string
 } ;
 
-#ifdef STANDALONE
+#if defined(STANDALONE) || defined(STANDALONE2)
 void ast_log(int level, const char *file, int line, const char *function, const char *fmt, ...) __attribute__ ((format (printf,5,6)));
 #endif
 
@@ -485,13 +486,13 @@
 
 #if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED
 typedef union YYSTYPE
-#line 344 "ast_expr2.y"
+#line 345 "/home/murf/asterisk/cel2cdr/main/ast_expr2.y"
 {
 	struct val *val;
 	struct expr_node *arglist;
 }
 /* Line 187 of yacc.c.  */
-#line 495 "ast_expr2.c"
+#line 496 "/home/murf/asterisk/cel2cdr/main/ast_expr2.c"
 	YYSTYPE;
 # define yystype YYSTYPE /* obsolescent; will be withdrawn */
 # define YYSTYPE_IS_DECLARED 1
@@ -513,13 +514,13 @@
 
 
 /* Copy the second part of user declarations.  */
-#line 349 "ast_expr2.y"
+#line 350 "/home/murf/asterisk/cel2cdr/main/ast_expr2.y"
 
 extern int		ast_yylex __P((YYSTYPE *, YYLTYPE *, yyscan_t));
 
 
 /* Line 216 of yacc.c.  */
-#line 523 "ast_expr2.c"
+#line 524 "/home/murf/asterisk/cel2cdr/main/ast_expr2.c"
 
 #ifdef short
 # undef short
@@ -817,9 +818,9 @@
 /* YYRLINE[YYN] -- source line where rule number YYN was defined.  */
 static const yytype_uint16 yyrline[] =
 {
-       0,   373,   373,   381,   388,   389,   395,   404,   410,   411,
-     415,   419,   423,   427,   431,   435,   439,   443,   447,   451,
-     455,   459,   463,   467,   471,   475,   479,   483,   488
+       0,   374,   374,   382,   389,   390,   396,   405,   411,   412,
+     416,   420,   424,   428,   432,   436,   440,   444,   448,   452,
+     456,   460,   464,   468,   472,   476,   480,   484,   489
 };
 #endif
 
@@ -1472,119 +1473,119 @@
   switch (yytype)
     {
       case 4: /* "TOK_COLONCOLON" */
-#line 367 "ast_expr2.y"
+#line 368 "/home/murf/asterisk/cel2cdr/main/ast_expr2.y"
 	{  free_value((yyvaluep->val)); };
-#line 1478 "ast_expr2.c"
+#line 1479 "/home/murf/asterisk/cel2cdr/main/ast_expr2.c"
 	break;
       case 5: /* "TOK_COND" */
-#line 367 "ast_expr2.y"
+#line 368 "/home/murf/asterisk/cel2cdr/main/ast_expr2.y"
 	{  free_value((yyvaluep->val)); };
-#line 1483 "ast_expr2.c"
+#line 1484 "/home/murf/asterisk/cel2cdr/main/ast_expr2.c"
 	break;
       case 6: /* "TOK_OR" */
-#line 367 "ast_expr2.y"
+#line 368 "/home/murf/asterisk/cel2cdr/main/ast_expr2.y"
 	{  free_value((yyvaluep->val)); };
-#line 1488 "ast_expr2.c"
+#line 1489 "/home/murf/asterisk/cel2cdr/main/ast_expr2.c"
 	break;
       case 7: /* "TOK_AND" */
-#line 367 "ast_expr2.y"
+#line 368 "/home/murf/asterisk/cel2cdr/main/ast_expr2.y"
 	{  free_value((yyvaluep->val)); };
-#line 1493 "ast_expr2.c"
+#line 1494 "/home/murf/asterisk/cel2cdr/main/ast_expr2.c"
 	break;
       case 8: /* "TOK_NE" */
-#line 367 "ast_expr2.y"
+#line 368 "/home/murf/asterisk/cel2cdr/main/ast_expr2.y"
 	{  free_value((yyvaluep->val)); };
-#line 1498 "ast_expr2.c"
+#line 1499 "/home/murf/asterisk/cel2cdr/main/ast_expr2.c"
 	break;
       case 9: /* "TOK_LE" */
-#line 367 "ast_expr2.y"
+#line 368 "/home/murf/asterisk/cel2cdr/main/ast_expr2.y"
 	{  free_value((yyvaluep->val)); };
-#line 1503 "ast_expr2.c"
+#line 1504 "/home/murf/asterisk/cel2cdr/main/ast_expr2.c"
 	break;
       case 10: /* "TOK_GE" */
-#line 367 "ast_expr2.y"
+#line 368 "/home/murf/asterisk/cel2cdr/main/ast_expr2.y"
 	{  free_value((yyvaluep->val)); };
-#line 1508 "ast_expr2.c"
+#line 1509 "/home/murf/asterisk/cel2cdr/main/ast_expr2.c"
 	break;
       case 11: /* "TOK_LT" */
-#line 367 "ast_expr2.y"
+#line 368 "/home/murf/asterisk/cel2cdr/main/ast_expr2.y"
 	{  free_value((yyvaluep->val)); };
-#line 1513 "ast_expr2.c"
+#line 1514 "/home/murf/asterisk/cel2cdr/main/ast_expr2.c"
 	break;
       case 12: /* "TOK_GT" */
-#line 367 "ast_expr2.y"
+#line 368 "/home/murf/asterisk/cel2cdr/main/ast_expr2.y"
 	{  free_value((yyvaluep->val)); };
-#line 1518 "ast_expr2.c"
+#line 1519 "/home/murf/asterisk/cel2cdr/main/ast_expr2.c"
 	break;
       case 13: /* "TOK_EQ" */
-#line 367 "ast_expr2.y"
+#line 368 "/home/murf/asterisk/cel2cdr/main/ast_expr2.y"
 	{  free_value((yyvaluep->val)); };
-#line 1523 "ast_expr2.c"
+#line 1524 "/home/murf/asterisk/cel2cdr/main/ast_expr2.c"
 	break;
       case 14: /* "TOK_MINUS" */
-#line 367 "ast_expr2.y"
+#line 368 "/home/murf/asterisk/cel2cdr/main/ast_expr2.y"
 	{  free_value((yyvaluep->val)); };
-#line 1528 "ast_expr2.c"
+#line 1529 "/home/murf/asterisk/cel2cdr/main/ast_expr2.c"
 	break;
       case 15: /* "TOK_PLUS" */
-#line 367 "ast_expr2.y"
+#line 368 "/home/murf/asterisk/cel2cdr/main/ast_expr2.y"
 	{  free_value((yyvaluep->val)); };
-#line 1533 "ast_expr2.c"
+#line 1534 "/home/murf/asterisk/cel2cdr/main/ast_expr2.c"
 	break;
       case 16: /* "TOK_MOD" */
-#line 367 "ast_expr2.y"
+#line 368 "/home/murf/asterisk/cel2cdr/main/ast_expr2.y"
 	{  free_value((yyvaluep->val)); };
-#line 1538 "ast_expr2.c"
+#line 1539 "/home/murf/asterisk/cel2cdr/main/ast_expr2.c"
 	break;
       case 17: /* "TOK_DIV" */
-#line 367 "ast_expr2.y"
+#line 368 "/home/murf/asterisk/cel2cdr/main/ast_expr2.y"
 	{  free_value((yyvaluep->val)); };
-#line 1543 "ast_expr2.c"
+#line 1544 "/home/murf/asterisk/cel2cdr/main/ast_expr2.c"
 	break;
       case 18: /* "TOK_MULT" */
-#line 367 "ast_expr2.y"
+#line 368 "/home/murf/asterisk/cel2cdr/main/ast_expr2.y"
 	{  free_value((yyvaluep->val)); };
-#line 1548 "ast_expr2.c"
+#line 1549 "/home/murf/asterisk/cel2cdr/main/ast_expr2.c"
 	break;
       case 19: /* "TOK_COMPL" */
-#line 367 "ast_expr2.y"
+#line 368 "/home/murf/asterisk/cel2cdr/main/ast_expr2.y"
 	{  free_value((yyvaluep->val)); };
-#line 1553 "ast_expr2.c"
+#line 1554 "/home/murf/asterisk/cel2cdr/main/ast_expr2.c"
 	break;
       case 20: /* "TOK_TILDETILDE" */
-#line 367 "ast_expr2.y"
+#line 368 "/home/murf/asterisk/cel2cdr/main/ast_expr2.y"
 	{  free_value((yyvaluep->val)); };
-#line 1558 "ast_expr2.c"
+#line 1559 "/home/murf/asterisk/cel2cdr/main/ast_expr2.c"
 	break;
       case 21: /* "TOK_EQTILDE" */
-#line 367 "ast_expr2.y"
+#line 368 "/home/murf/asterisk/cel2cdr/main/ast_expr2.y"
 	{  free_value((yyvaluep->val)); };
-#line 1563 "ast_expr2.c"
+#line 1564 "/home/murf/asterisk/cel2cdr/main/ast_expr2.c"
 	break;
       case 22: /* "TOK_COLON" */
-#line 367 "ast_expr2.y"
+#line 368 "/home/murf/asterisk/cel2cdr/main/ast_expr2.y"
 	{  free_value((yyvaluep->val)); };
-#line 1568 "ast_expr2.c"
+#line 1569 "/home/murf/asterisk/cel2cdr/main/ast_expr2.c"
 	break;
       case 23: /* "TOK_LP" */
-#line 367 "ast_expr2.y"
+#line 368 "/home/murf/asterisk/cel2cdr/main/ast_expr2.y"
 	{  free_value((yyvaluep->val)); };
-#line 1573 "ast_expr2.c"
+#line 1574 "/home/murf/asterisk/cel2cdr/main/ast_expr2.c"
 	break;
       case 24: /* "TOK_RP" */
-#line 367 "ast_expr2.y"
+#line 368 "/home/murf/asterisk/cel2cdr/main/ast_expr2.y"
 	{  free_value((yyvaluep->val)); };
-#line 1578 "ast_expr2.c"
+#line 1579 "/home/murf/asterisk/cel2cdr/main/ast_expr2.c"
 	break;
       case 25: /* "TOKEN" */
-#line 367 "ast_expr2.y"
+#line 368 "/home/murf/asterisk/cel2cdr/main/ast_expr2.y"
 	{  free_value((yyvaluep->val)); };
-#line 1583 "ast_expr2.c"
+#line 1584 "/home/murf/asterisk/cel2cdr/main/ast_expr2.c"
 	break;
       case 29: /* "expr" */
-#line 367 "ast_expr2.y"
+#line 368 "/home/murf/asterisk/cel2cdr/main/ast_expr2.y"
 	{  free_value((yyvaluep->val)); };
-#line 1588 "ast_expr2.c"
+#line 1589 "/home/murf/asterisk/cel2cdr/main/ast_expr2.c"
 	break;
 
       default:
@@ -1907,7 +1908,7 @@
   switch (yyn)
     {
         case 2:
-#line 373 "ast_expr2.y"
+#line 374 "/home/murf/asterisk/cel2cdr/main/ast_expr2.y"
     { ((struct parse_io *)parseio)->val = (struct val *)calloc(sizeof(struct val),1);
               ((struct parse_io *)parseio)->val->type = (yyvsp[(1) - (1)].val)->type;
               if( (yyvsp[(1) - (1)].val)->type == AST_EXPR_number )
@@ -1919,7 +1920,7 @@
     break;
 
   case 3:
-#line 381 "ast_expr2.y"
+#line 382 "/home/murf/asterisk/cel2cdr/main/ast_expr2.y"
     {/* nothing */ ((struct parse_io *)parseio)->val = (struct val *)calloc(sizeof(struct val),1);
               ((struct parse_io *)parseio)->val->type = AST_EXPR_string;
 			  ((struct parse_io *)parseio)->val->u.s = strdup(""); 
@@ -1927,12 +1928,12 @@
     break;
 
   case 4:
-#line 388 "ast_expr2.y"
+#line 389 "/home/murf/asterisk/cel2cdr/main/ast_expr2.y"
     { (yyval.arglist) = alloc_expr_node(AST_EXPR_NODE_VAL); (yyval.arglist)->val = (yyvsp[(1) - (1)].val);;}
     break;
 
   case 5:
-#line 389 "ast_expr2.y"
+#line 390 "/home/murf/asterisk/cel2cdr/main/ast_expr2.y"
     {struct expr_node *x = alloc_expr_node(AST_EXPR_NODE_VAL);
                                  struct expr_node *t;
 								 DESTROY((yyvsp[(2) - (3)].val));
@@ -1942,7 +1943,7 @@
     break;
 
   case 6:
-#line 395 "ast_expr2.y"
+#line 396 "/home/murf/asterisk/cel2cdr/main/ast_expr2.y"
     {struct expr_node *x = alloc_expr_node(AST_EXPR_NODE_VAL);
                                  struct expr_node *t;  /* NULL args should OK */
 								 DESTROY((yyvsp[(2) - (2)].val));
@@ -1952,7 +1953,7 @@
     break;
 
   case 7:
-#line 404 "ast_expr2.y"
+#line 405 "/home/murf/asterisk/cel2cdr/main/ast_expr2.y"
     { (yyval.val) = op_func((yyvsp[(1) - (4)].val),(yyvsp[(3) - (4)].arglist), ((struct parse_io *)parseio)->chan);
 		                            DESTROY((yyvsp[(2) - (4)].val));
 									DESTROY((yyvsp[(4) - (4)].val));
@@ -1962,12 +1963,12 @@
     break;
 
   case 8:
-#line 410 "ast_expr2.y"
+#line 411 "/home/murf/asterisk/cel2cdr/main/ast_expr2.y"
     {(yyval.val) = (yyvsp[(1) - (1)].val);;}
     break;
 
   case 9:
-#line 411 "ast_expr2.y"
+#line 412 "/home/murf/asterisk/cel2cdr/main/ast_expr2.y"
     { (yyval.val) = (yyvsp[(2) - (3)].val);
 	                       (yyloc).first_column = (yylsp[(1) - (3)]).first_column; (yyloc).last_column = (yylsp[(3) - (3)]).last_column; 
 						   (yyloc).first_line=0; (yyloc).last_line=0;
@@ -1975,7 +1976,7 @@
     break;
 
   case 10:
-#line 415 "ast_expr2.y"
+#line 416 "/home/murf/asterisk/cel2cdr/main/ast_expr2.y"
     { (yyval.val) = op_or ((yyvsp[(1) - (3)].val), (yyvsp[(3) - (3)].val));
 						DESTROY((yyvsp[(2) - (3)].val));	
                          (yyloc).first_column = (yylsp[(1) - (3)]).first_column; (yyloc).last_column = (yylsp[(3) - (3)]).last_column; 
@@ -1983,7 +1984,7 @@
     break;
 
   case 11:
-#line 419 "ast_expr2.y"
+#line 420 "/home/murf/asterisk/cel2cdr/main/ast_expr2.y"
     { (yyval.val) = op_and ((yyvsp[(1) - (3)].val), (yyvsp[(3) - (3)].val)); 
 						DESTROY((yyvsp[(2) - (3)].val));	
 	                      (yyloc).first_column = (yylsp[(1) - (3)]).first_column; (yyloc).last_column = (yylsp[(3) - (3)]).last_column; 
@@ -1991,7 +1992,7 @@
     break;
 
   case 12:
-#line 423 "ast_expr2.y"
+#line 424 "/home/murf/asterisk/cel2cdr/main/ast_expr2.y"
     { (yyval.val) = op_eq ((yyvsp[(1) - (3)].val), (yyvsp[(3) - (3)].val));
 						DESTROY((yyvsp[(2) - (3)].val));	
 	                     (yyloc).first_column = (yylsp[(1) - (3)]).first_column; (yyloc).last_column = (yylsp[(3) - (3)]).last_column;
@@ -1999,7 +2000,7 @@
     break;
 
   case 13:
-#line 427 "ast_expr2.y"
+#line 428 "/home/murf/asterisk/cel2cdr/main/ast_expr2.y"
     { (yyval.val) = op_gt ((yyvsp[(1) - (3)].val), (yyvsp[(3) - (3)].val));
 						DESTROY((yyvsp[(2) - (3)].val));	
                          (yyloc).first_column = (yylsp[(1) - (3)]).first_column; (yyloc).last_column = (yylsp[(3) - (3)]).last_column;
@@ -2007,7 +2008,7 @@
     break;
 
   case 14:
-#line 431 "ast_expr2.y"
+#line 432 "/home/murf/asterisk/cel2cdr/main/ast_expr2.y"
     { (yyval.val) = op_lt ((yyvsp[(1) - (3)].val), (yyvsp[(3) - (3)].val)); 
 						DESTROY((yyvsp[(2) - (3)].val));	
 	                     (yyloc).first_column = (yylsp[(1) - (3)]).first_column; (yyloc).last_column = (yylsp[(3) - (3)]).last_column; 
@@ -2015,7 +2016,7 @@
     break;
 
   case 15:
-#line 435 "ast_expr2.y"
+#line 436 "/home/murf/asterisk/cel2cdr/main/ast_expr2.y"
     { (yyval.val) = op_ge ((yyvsp[(1) - (3)].val), (yyvsp[(3) - (3)].val)); 
 						DESTROY((yyvsp[(2) - (3)].val));	
 	                      (yyloc).first_column = (yylsp[(1) - (3)]).first_column; (yyloc).last_column = (yylsp[(3) - (3)]).last_column; 
@@ -2023,7 +2024,7 @@
     break;
 
   case 16:
-#line 439 "ast_expr2.y"
+#line 440 "/home/murf/asterisk/cel2cdr/main/ast_expr2.y"
     { (yyval.val) = op_le ((yyvsp[(1) - (3)].val), (yyvsp[(3) - (3)].val)); 
 						DESTROY((yyvsp[(2) - (3)].val));	
 	                      (yyloc).first_column = (yylsp[(1) - (3)]).first_column; (yyloc).last_column = (yylsp[(3) - (3)]).last_column; 
@@ -2031,7 +2032,7 @@
     break;
 
   case 17:
-#line 443 "ast_expr2.y"
+#line 444 "/home/murf/asterisk/cel2cdr/main/ast_expr2.y"
     { (yyval.val) = op_ne ((yyvsp[(1) - (3)].val), (yyvsp[(3) - (3)].val)); 
 						DESTROY((yyvsp[(2) - (3)].val));	
 	                      (yyloc).first_column = (yylsp[(1) - (3)]).first_column; (yyloc).last_column = (yylsp[(3) - (3)]).last_column; 
@@ -2039,7 +2040,7 @@
     break;
 
   case 18:
-#line 447 "ast_expr2.y"
+#line 448 "/home/murf/asterisk/cel2cdr/main/ast_expr2.y"
     { (yyval.val) = op_plus ((yyvsp[(1) - (3)].val), (yyvsp[(3) - (3)].val)); 
 						DESTROY((yyvsp[(2) - (3)].val));	
 	                       (yyloc).first_column = (yylsp[(1) - (3)]).first_column; (yyloc).last_column = (yylsp[(3) - (3)]).last_column; 
@@ -2047,7 +2048,7 @@
     break;
 
   case 19:
-#line 451 "ast_expr2.y"
+#line 452 "/home/murf/asterisk/cel2cdr/main/ast_expr2.y"
     { (yyval.val) = op_minus ((yyvsp[(1) - (3)].val), (yyvsp[(3) - (3)].val)); 
 						DESTROY((yyvsp[(2) - (3)].val));	
 	                        (yyloc).first_column = (yylsp[(1) - (3)]).first_column; (yyloc).last_column = (yylsp[(3) - (3)]).last_column; 
@@ -2055,7 +2056,7 @@
     break;
 
   case 20:
-#line 455 "ast_expr2.y"
+#line 456 "/home/murf/asterisk/cel2cdr/main/ast_expr2.y"
     { (yyval.val) = op_negate ((yyvsp[(2) - (2)].val)); 
 						DESTROY((yyvsp[(1) - (2)].val));	
 	                        (yyloc).first_column = (yylsp[(1) - (2)]).first_column; (yyloc).last_column = (yylsp[(2) - (2)]).last_column; 
@@ -2063,7 +2064,7 @@
     break;
 
   case 21:
-#line 459 "ast_expr2.y"
+#line 460 "/home/murf/asterisk/cel2cdr/main/ast_expr2.y"
     { (yyval.val) = op_compl ((yyvsp[(2) - (2)].val)); 
 						DESTROY((yyvsp[(1) - (2)].val));	
 	                        (yyloc).first_column = (yylsp[(1) - (2)]).first_column; (yyloc).last_column = (yylsp[(2) - (2)]).last_column; 
@@ -2071,7 +2072,7 @@
     break;
 
   case 22:
-#line 463 "ast_expr2.y"
+#line 464 "/home/murf/asterisk/cel2cdr/main/ast_expr2.y"
     { (yyval.val) = op_times ((yyvsp[(1) - (3)].val), (yyvsp[(3) - (3)].val)); 
 						DESTROY((yyvsp[(2) - (3)].val));	
 	                       (yyloc).first_column = (yylsp[(1) - (3)]).first_column; (yyloc).last_column = (yylsp[(3) - (3)]).last_column; 
@@ -2079,7 +2080,7 @@
     break;
 
   case 23:
-#line 467 "ast_expr2.y"
+#line 468 "/home/murf/asterisk/cel2cdr/main/ast_expr2.y"
     { (yyval.val) = op_div ((yyvsp[(1) - (3)].val), (yyvsp[(3) - (3)].val)); 
 						DESTROY((yyvsp[(2) - (3)].val));	
 	                      (yyloc).first_column = (yylsp[(1) - (3)]).first_column; (yyloc).last_column = (yylsp[(3) - (3)]).last_column; 
@@ -2087,7 +2088,7 @@
     break;
 
   case 24:
-#line 471 "ast_expr2.y"
+#line 472 "/home/murf/asterisk/cel2cdr/main/ast_expr2.y"
     { (yyval.val) = op_rem ((yyvsp[(1) - (3)].val), (yyvsp[(3) - (3)].val)); 
 						DESTROY((yyvsp[(2) - (3)].val));	
 	                      (yyloc).first_column = (yylsp[(1) - (3)]).first_column; (yyloc).last_column = (yylsp[(3) - (3)]).last_column; 
@@ -2095,7 +2096,7 @@
     break;
 
   case 25:
-#line 475 "ast_expr2.y"
+#line 476 "/home/murf/asterisk/cel2cdr/main/ast_expr2.y"

[... 787 lines stripped ...]



More information about the svn-commits mailing list