[svn-commits] murf: branch murf/config_comments r40862 - /team/murf/config_comments/main/

svn-commits at lists.digium.com svn-commits at lists.digium.com
Tue Aug 22 15:31:03 MST 2006


Author: murf
Date: Tue Aug 22 17:31:02 2006
New Revision: 40862

URL: http://svn.digium.com/view/asterisk?rev=40862&view=rev
Log:
This was almost disaster! If the file you were editing
was moved to like, main, then, after you svnmerge, the
old version of the file ends up in main, and your copy is
tossed in the bit bucket. beware!


Modified:
    team/murf/config_comments/main/config.c

Modified: team/murf/config_comments/main/config.c
URL: http://svn.digium.com/view/asterisk/team/murf/config_comments/main/config.c?rev=40862&r1=40861&r2=40862&view=diff
==============================================================================
--- team/murf/config_comments/main/config.c (original)
+++ team/murf/config_comments/main/config.c Tue Aug 22 17:31:02 2006
@@ -62,6 +62,77 @@
 
 static char *extconfig_conf = "extconfig.conf";
 
+/* Growable string buffer */
+static char *comment_buffer;   /* this will be a comment collector.*/
+static int   comment_buffer_size;  /* the amount of storage so far alloc'd for the comment_buffer */
+
+static char *lline_buffer;    /* A buffer for stuff behind the ; */
+static int  lline_buffer_size;
+
+
+#define CB_INCR 250
+
+#define CB_INIT()								\
+	{											\
+		if( !comment_buffer ) {					\
+			comment_buffer = (char*)malloc(CB_INCR);	\
+			comment_buffer_size = CB_INCR;		\
+			lline_buffer = (char*)malloc(CB_INCR);	\
+			lline_buffer_size = CB_INCR;		\
+		}  else {                               \
+			comment_buffer[0] = 0;              \
+			lline_buffer[0] = 0;              \
+        }                                       \
+	}
+
+#define CB_ADD(str)								\
+	{							\
+		char *x = (str);											\
+		int rem = comment_buffer_size - strlen(comment_buffer) - 1;	\
+		int siz = strlen(x);										\
+		if( rem < siz+1 )										\
+		{															\
+			comment_buffer = (char*)realloc(comment_buffer,comment_buffer_size+CB_INCR+siz+1); \
+			comment_buffer_size += CB_INCR+siz+1;						\
+		}																\
+		strcat(comment_buffer,x);													\
+	}
+
+#define CB_ADD_LEN(str, len)		\
+	{							\
+		char *x = (str);											\
+		int cbl = strlen(comment_buffer)+1;							\
+		int rem = comment_buffer_size - cbl;	\
+		if( rem < len+1 )										\
+		{															\
+			comment_buffer = (char*)realloc(comment_buffer,comment_buffer_size+CB_INCR+len+1); \
+			comment_buffer_size += CB_INCR+len+1;						\
+		}																\
+		strncat(comment_buffer,x,len);													\
+		comment_buffer[cbl+len-1] = 0;													\
+	}
+
+#define LLB_ADD(str)								\
+	{							\
+		char *x = (str);											\
+		int rem = lline_buffer_size - strlen(lline_buffer) - 1;	\
+		int siz = strlen(x);										\
+		if( rem < siz+1 )										\
+		{															\
+			lline_buffer = (char*)realloc(lline_buffer,lline_buffer_size+CB_INCR+siz+1); \
+			lline_buffer_size += CB_INCR+siz+1;						\
+		}																\
+		strcat(lline_buffer,x);													\
+	}
+
+#define CB_RESET()  comment_buffer[0] = 0; lline_buffer[0] = 0
+
+#define CB_DESTROY if (comment_buffer) { free(comment_buffer);free(lline_buffer);  \
+                                             comment_buffer=0; lline_buffer=0; comment_buffer_size=0; lline_buffer_size=0;}
+
+#define ALLOC_COMMENT(buffer) (struct ast_comment *)calloc(1,sizeof(struct ast_comment)+strlen(buffer)+1)
+#define COPY_COMMENT(ptr,buffer) strcpy((ptr)->cmt,buffer)
+
 static struct ast_config_map {
 	struct ast_config_map *next;
 	char *name;
@@ -84,6 +155,8 @@
 struct ast_category {
 	char name[80];
 	int ignored;			/* do not let user of the config see this category */
+	struct ast_comment *precomments;
+	struct ast_comment *sameline;
 	struct ast_variable *root;
 	struct ast_variable *last;
 	struct ast_category *next;
@@ -524,6 +597,18 @@
 		if (!(*cat = newcat = ast_category_new(catname))) {
 			return -1;
 		}
+		/* add comments */
+		if (withcomments && comment_buffer && comment_buffer[0] ) {
+			newcat->precomments = ALLOC_COMMENT(comment_buffer);
+			COPY_COMMENT(newcat->precomments,comment_buffer);
+		}
+		if (withcomments && lline_buffer && lline_buffer[0] ) {
+			newcat->sameline = ALLOC_COMMENT(lline_buffer);
+			COPY_COMMENT(newcat->sameline,lline_buffer);
+		}
+		if( withcomments )
+			CB_RESET();
+		
  		/* If there are options or categories to inherit from, process them now */
  		if (c) {
  			if (!(cur = strchr(c, ')'))) {
@@ -646,13 +731,24 @@
 				/* Put and reset comments */
 				v->blanklines = 0;
 				ast_variable_append(*cat, v);
+				/* add comments */
+				if (withcomments && comment_buffer && comment_buffer[0] ) {
+					v->precomments = ALLOC_COMMENT(comment_buffer);
+					COPY_COMMENT(v->precomments,comment_buffer);
+				}
+				if (withcomments && lline_buffer && lline_buffer[0] ) {
+					v->sameline = ALLOC_COMMENT(lline_buffer);
+					COPY_COMMENT(v->sameline,lline_buffer);
+				}
+				if( withcomments )
+					CB_RESET();
+				
 			} else {
 				return -1;
 			}
 		} else {
 			ast_log(LOG_WARNING, "No '=' (equal sign) in line %d of %s\n", lineno, configfile);
 		}
-
 	}
 	return 0;
 }
@@ -677,6 +773,10 @@
 		snprintf(fn, sizeof(fn), "%s/%s", (char *)ast_config_AST_CONFIG_DIR, filename);
 	}
 
+	if (withcomments) {
+		CB_INIT();
+	}
+	
 #ifdef AST_INCLUDE_GLOB
 	{
 		int glob_ret;
@@ -726,11 +826,17 @@
 		while(!feof(f)) {
 			lineno++;
 			if (fgets(buf, sizeof(buf), f)) {
+				if ( withcomments ) {    
+					CB_ADD(lline_buffer);       /* add the current lline buffer to the comment buffer */
+					lline_buffer[0] = 0;        /* erase the lline buffer */
+				}
+				
 				new_buf = buf;
-				if (comment)
+				if (comment) 
 					process_buf = NULL;
 				else
 					process_buf = buf;
+				
 				while ((comment_p = strchr(new_buf, COMMENT_META))) {
 					if ((comment_p > new_buf) && (*(comment_p-1) == '\\')) {
 						/* Yuck, gotta memmove */
@@ -758,6 +864,11 @@
 								/* Actually have to move what's left over the top, then continue */
 								char *oldptr;
 								oldptr = process_buf + strlen(process_buf);
+								if ( withcomments ) {
+									CB_ADD(";");
+									CB_ADD_LEN(oldptr+1,new_buf-oldptr-1);
+								}
+								
 								memmove(oldptr, new_buf, strlen(new_buf) + 1);
 								new_buf = oldptr;
 							} else
@@ -767,12 +878,20 @@
 						if (!comment) {
 							/* If ; is found, and we are not nested in a comment, 
 							   we immediately stop all comment processing */
+							if ( withcomments ) {
+								LLB_ADD(comment_p);
+							}
 							*comment_p = '\0'; 
 							new_buf = comment_p;
 						} else
 							new_buf = comment_p + 1;
 					}
 				}
+				if( comment && !process_buf )
+				{
+					CB_ADD(buf);  /* the whole line is a comment, store it */
+				}
+				
 				if (process_buf) {
 					char *buf = ast_strip(process_buf);
 					if (!ast_strlen_zero(buf)) {
@@ -797,6 +916,16 @@
 			}
 		}
 #endif
+	if (withcomments) {
+		if (comment_buffer) { 
+			free(comment_buffer);
+			free(lline_buffer);
+			comment_buffer=0; 
+			lline_buffer=0; 
+			comment_buffer_size=0; 
+			lline_buffer_size=0;
+		}
+	}
 	if (count == 0)
 		return NULL;
 
@@ -1071,7 +1200,7 @@
 	char db[256];
 	char table[256];
 	struct ast_config_engine *loader = &text_file_engine;
-	struct ast_config *result;
+	struct ast_config *result; 
 
 	if (cfg->include_level == cfg->max_include_level) {
 		ast_log(LOG_WARNING, "Maximum Include level (%d) exceeded\n", cfg->max_include_level);



More information about the svn-commits mailing list