Blob Blame History Raw
--- cscope-15.6/src/display.c.orig	2006-09-30 04:13:00.000000000 -0400
+++ cscope-15.6/src/display.c	2007-05-25 10:15:14.000000000 -0400
@@ -113,6 +113,7 @@
 	{"Find this", "file",				findfile},
 	{"Find", "files #including this file",		findinclude},
 	{"Find all", "function definitions",		findallfcns},	/* samuel only */
+	{"Find all", "symbol assignments",		findassign},
 };
 
 /* Internal prototypes: */
--- cscope-15.6/src/global.h.orig	2006-09-30 04:13:00.000000000 -0400
+++ cscope-15.6/src/global.h	2007-05-25 10:15:14.000000000 -0400
@@ -327,6 +327,7 @@
 char	*findfile(char *dummy);
 char	*findinclude(char *pattern);
 char	*findsymbol(char *pattern);
+char	*findassign(char *pattern);
 char	*findregexp(char *egreppat);
 char	*findstring(char *pattern);
 char	*inviewpath(char *file);
--- cscope-15.6/src/find.c.orig	2006-09-30 04:13:00.000000000 -0400
+++ cscope-15.6/src/find.c	2007-05-25 10:15:27.000000000 -0400
@@ -79,6 +79,8 @@
 static	void	findcalledbysub(char *file, BOOL macro);
 static	void	findterm(char *pattern);
 static	void	putline(FILE *output);
+static  char    *find_symbol_or_assignment(char *pattern, BOOL assign_flag);
+static  BOOL    check_for_assignment(void);
 static	void	putpostingref(POSTING *p, char *pat);
 static	void	putref(int seemore, char *file, char *func);
 static	void	putsource(int seemore, FILE *output);
@@ -88,6 +90,77 @@
 char *
 findsymbol(char *pattern)
 {
+	return find_symbol_or_assignment(pattern, NO);
+}
+
+/* find the symbol in the cross-reference, and look for assignments */
+char *
+findassign(char *pattern)
+{
+	return find_symbol_or_assignment(pattern, YES);
+}
+
+/* Test reference whether it's an assignment to the symbol found at
+ * (global variable) 'blockp' */
+static BOOL
+check_for_assignment(void) 
+{
+	/* Do the extra work here to determine if this is an
+	* assignment or not Do this by examining the next character
+	* or two in blockp */
+	char *asgn_char = blockp;
+	int i = 1; /*skip any leading \n*/
+
+	while(1) {
+		if (asgn_char[i] == blockmark) {
+			/* get the next block when we reach the end of
+			* the current block */
+			asgn_char = read_block();
+			i=0;
+		}
+		while (isspace((unsigned char) asgn_char[i])) {
+			/* skip any whitespace or \n */
+			i++;
+		}
+		/* this next character better be one of the assignment
+		* characters, ie: =, +=, -=, *=, %=, /=, &=, |=, ^=,
+		* ~= if not, then its a notmatched case */
+		if ((asgn_char[i] != '=') &&
+		   (asgn_char[i] != '+') && 
+		   (asgn_char[i] != '-') && 
+		   (asgn_char[i] != '*') && 
+		   (asgn_char[i] != '/') && 
+		   (asgn_char[i] != '%') && 
+		   (asgn_char[i] != '&') && 
+		   (asgn_char[i] != '|') && 
+		   (asgn_char[i] != '^') && 
+		   (asgn_char[i] != '~')) {
+			return NO;
+		} else {
+			/* if the first found character is = and the
+			* next found character is also =, then this
+			* is not an assignment.  likewise if the
+			* first character is not = (i.e. one of the
+			* +,-,*,etc. chars and the next character is
+			* not =, then this is not an assignment */
+			if ((((asgn_char[i] == '=')
+			     && (asgn_char[i+1] == '='))) 
+			   || ((asgn_char[i] != '=')
+				&& (asgn_char[i+1] != '='))) {
+				return NO;
+			}
+			/* if we pass all these filters then this is
+			* an assignment */
+			return YES;
+		} /* else(operator char?) */
+	} /* while(endless) */
+}
+
+/* The actual routine that does the work for findsymbol() and
+* findassign() */
+static char *
+find_symbol_or_assignment(char *pattern, BOOL assign_flag)
+{
 	char	file[PATHLEN + 1];	/* source file name */
 	char	function[PATLEN + 1];	/* function name */
 	char	macro[PATLEN + 1];	/* macro name */
@@ -249,6 +322,14 @@
 			if (matchrest()) {
 				s = NULL;
 		matched:
+				/* if the assignment flag is set then
+				 * we are looking for assignments and
+				 * some extra filtering is needed */
+				if(assign_flag == YES
+				  && ! check_for_assignment())
+				       goto notmatched;
+
+
 				/* output the file, function or macro, and source line */
 				if (strcmp(macro, global) && s != macro) {
 					putref(0, file, macro);
--- cscope-15.6/src/constants.h.orig	2006-09-30 04:13:00.000000000 -0400
+++ cscope-15.6/src/constants.h	2007-05-25 10:15:14.000000000 -0400
@@ -101,7 +101,7 @@
 #define	REGEXP		6
 #define FILENAME	7
 #define INCLUDES	8
-#define	FIELDS		9
+#define	FIELDS		11
 
 #if (BSD || V9) && !__NetBSD__ && !__FreeBSD__
 # define TERMINFO	0	/* no terminfo curses */