git/list[1] front-page[2] threads[3] people[4] search[5] about
 

[PATCH 3/5] Convert prefix_pathspec() to produce struct pathspec_item

From
Nguyễn Thái Ngọc Duy <pclouds@gmail.com>
Date
Apr 9, 2011, 16:54 UTC
Message-ID
<1302368060-23827-4-git-send-email-pclouds@gmail.com>
In-Reply-To
<1302368060-23827-1-git-send-email-pclouds@gmail.com>
New field plain_len is used to mark the first part of 'match' where no
magic can be applied.
---
 cache.h |    1 +
 setup.c |   26 ++++++++++++++++++--------
 2 files changed, 19 insertions(+), 8 deletions(-)
diff --git a/cache.h b/cache.h
index da1a46c..08b4633 100644
--- a/cache.h
+++ b/cache.h
@@ -528,6 +528,7 @@ struct pathspec {
 	struct pathspec_item {
 		const char *match;
 		int len;
+		int plain_len;	/* match[0..plain_len-1] does not have any kind of magic*/
 		unsigned magic;
 	} *items;
 };
diff --git a/setup.c b/setup.c
index 1e7dfb1..8a4a9d0 100644
--- a/setup.c
+++ b/setup.c
@@ -148,11 +148,12 @@ struct pathspec_magic {
  * the prefix part must always match literally, and a single stupid
  * string cannot express such a case.
  */
-const char *prefix_pathspec(const char *prefix, int prefixlen, const char *elt)
+int prefix_pathspec(struct pathspec_item *item,
+		    const char *prefix, int prefixlen,
+		    const char *elt)
 {
 	unsigned magic = 0;
 	const char *copyfrom = elt;
-	const char *retval;
 	int i, free_source = 0;
 
 	if (elt[0] != ':') {
@@ -184,7 +185,8 @@ const char *prefix_pathspec(const char *prefix, int prefixlen, const char *elt)
 			copyfrom++;
 	} else if (!elt[1]) {
 		/* Just ':' -- no element! */
-		return NULL;
+		memset(item, 0, sizeof(*item));
+		return -1;
 	} else {
 		/* shorthand */
 		for (copyfrom = elt + 1;
@@ -225,13 +227,19 @@ const char *prefix_pathspec(const char *prefix, int prefixlen, const char *elt)
 		}
 	}
 
+	memset(item, 0, sizeof(*item));
+	item->magic = magic;
+
 	if (magic & PATHSPEC_FROMTOP)
-		retval = xstrdup(copyfrom);
-	else
-		retval = prefix_path(prefix, prefixlen, copyfrom);
+		item->match = xstrdup(copyfrom);
+	else {
+		item->match = prefix_path(prefix, prefixlen, copyfrom);
+		item->plain_len = prefixlen;
+	}
+	item->len = strlen(item->match);
 	if (free_source)
 		free((char *)copyfrom);
-	return retval;
+	return 0;
 }
 
 const char **get_pathspec_old(const char *prefix, const char **pathspec)
@@ -255,7 +263,9 @@ const char **get_pathspec_old(const char *prefix, const char **pathspec)
 	dst = pathspec;
 	prefixlen = prefix ? strlen(prefix) : 0;
 	while (*src) {
-		*(dst++) = prefix_pathspec(prefix, prefixlen, *src);
+		struct pathspec_item item;
+		prefix_pathspec(&item, prefix, prefixlen, *src);
+		*(dst++) = item.match;
 		src++;
 	}
 	*dst = NULL;
-- 
1.7.4.74.g639db
Previous: Nguyen Thai Ngoc DuyNext: Nguyễn Thái Ngọc Duy
Message 6 of 11 in “New get_pathspec()”
  1. 0/5 New get_pathspec()Nguyễn Thái Ngọc Duy, Apr 9, 2011
  2. 1/5 Rename functions in preparation for get_pathspec() restructureNguyễn Thái Ngọc Duy, Apr 9, 2011
  3. 2/5 Replace has_wildcard with PATHSPEC_NOGLOBNguyễn Thái Ngọc Duy, Apr 9, 2011
  4. Junio C HamanoApr 10, 2011
  5. Nguyen Thai Ngoc DuyApr 10, 2011
  6. 3/5 Convert prefix_pathspec() to produce struct pathspec_itemNguyễn Thái Ngọc Duy, Apr 9, 2011
  7. 4/5 Implement new get_pathspec()Nguyễn Thái Ngọc Duy, Apr 9, 2011
  8. 5/5 grep: convert to use the new get_pathspec()Nguyễn Thái Ngọc Duy, Apr 9, 2011
  9. Junio C HamanoApr 10, 2011
  10. Nguyen Thai Ngoc DuyApr 10, 2011
  11. Junio C HamanoApr 9, 2011

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.