From: Stefan Beller <sbeller@google.com>
To: gitster@pobox.com
Cc: bmwill@google.com, pclouds@gmail.com, git@vger.kernel.org,
Stefan Beller <sbeller@google.com>
Subject: [PATCHv2 15/36] attr: add counted string version of git_check_attr()
Date: Fri, 28 Oct 2016 11:54:41 -0700 [thread overview]
Message-ID: <20161028185502.8789-16-sbeller@google.com> (raw)
In-Reply-To: <20161028185502.8789-1-sbeller@google.com>
From: Junio C Hamano <gitster@pobox.com>
Often a potential caller has <path, pathlen> pair that
represents the path it wants to ask attributes for; when
path[pathlen] is not NUL, the caller has to xmemdupz()
only to call git_check_attr().
Add git_check_attr_counted() that takes such a counted
string instead of "const char *path".
Signed-off-by: Junio C Hamano <gitster@pobox.com>
Signed-off-by: Stefan Beller <sbeller@google.com>
---
attr.c | 23 ++++++++++++++---------
attr.h | 1 +
2 files changed, 15 insertions(+), 9 deletions(-)
diff --git a/attr.c b/attr.c
index 30953c905b..dc9d61b411 100644
--- a/attr.c
+++ b/attr.c
@@ -738,20 +738,19 @@ static int attr_check_is_dynamic(const struct git_attr_check *check)
* check_all_attr. If num is non-zero, only attributes in check[] are
* collected. Otherwise all attributes are collected.
*/
-static void collect_some_attrs(const char *path, int num,
+static void collect_some_attrs(const char *path, int pathlen, int num,
struct git_attr_check_elem *check)
{
struct attr_stack *stk;
- int i, pathlen, rem, dirlen;
+ int i, rem, dirlen;
const char *cp, *last_slash = NULL;
int basename_offset;
- for (cp = path; *cp; cp++) {
+ for (cp = path; cp < path + pathlen; cp++) {
if (*cp == '/' && cp[1])
last_slash = cp;
}
- pathlen = cp - path;
if (last_slash) {
basename_offset = last_slash + 1 - path;
dirlen = last_slash - path;
@@ -782,12 +781,12 @@ static void collect_some_attrs(const char *path, int num,
rem = fill(path, pathlen, basename_offset, stk, rem);
}
-static int git_check_attrs(const char *path, int num,
+static int git_check_attrs(const char *path, int pathlen, int num,
struct git_attr_check_elem *check)
{
int i;
- collect_some_attrs(path, num, check);
+ collect_some_attrs(path, pathlen, num, check);
for (i = 0; i < num; i++) {
const char *value = check_all_attr[check[i].attr->attr_nr].value;
@@ -804,7 +803,7 @@ void git_all_attrs(const char *path, struct git_attr_check *check)
int i;
git_attr_check_clear(check);
- collect_some_attrs(path, 0, NULL);
+ collect_some_attrs(path, strlen(path), 0, NULL);
for (i = 0; i < attr_nr; i++) {
const char *name = check_all_attr[i].attr->name;
@@ -829,10 +828,16 @@ void git_attr_set_direction(enum git_attr_direction new, struct index_state *ist
use_index = istate;
}
-int git_check_attr(const char *path, struct git_attr_check *check)
+int git_check_attr_counted(const char *path, int pathlen,
+ struct git_attr_check *check)
{
check->finalized = 1;
- return git_check_attrs(path, check->check_nr, check->check);
+ return git_check_attrs(path, pathlen, check->check_nr, check->check);
+}
+
+int git_check_attr(const char *path, struct git_attr_check *check)
+{
+ return git_check_attr_counted(path, strlen(path), check);
}
struct git_attr_check *git_attr_check_initl(const char *one, ...)
diff --git a/attr.h b/attr.h
index 506db0ca74..c84f164b8e 100644
--- a/attr.h
+++ b/attr.h
@@ -38,6 +38,7 @@ struct git_attr_check {
extern struct git_attr_check *git_attr_check_initl(const char *, ...);
extern int git_check_attr(const char *path, struct git_attr_check *);
+extern int git_check_attr_counted(const char *, int, struct git_attr_check *);
extern struct git_attr_check *git_attr_check_alloc(void);
extern struct git_attr_check_elem *git_attr_check_append(struct git_attr_check *, const struct git_attr *);
--
2.10.1.714.ge3da0db
next prev parent reply other threads:[~2016-10-28 18:57 UTC|newest]
Thread overview: 50+ messages / expand[flat|nested] mbox.gz Atom feed top
2016-10-28 18:54 [PATCHv2 00/36] Revamp the attr subsystem! Stefan Beller
2016-10-28 18:54 ` [PATCHv2 01/36] commit.c: use strchrnul() to scan for one line Stefan Beller
2016-10-28 18:54 ` [PATCHv2 02/36] attr.c: " Stefan Beller
2016-10-28 18:54 ` [PATCHv2 03/36] attr.c: update a stale comment on "struct match_attr" Stefan Beller
2016-10-28 18:54 ` [PATCHv2 04/36] attr.c: explain the lack of attr-name syntax check in parse_attr() Stefan Beller
2016-10-28 18:54 ` [PATCHv2 05/36] attr.c: complete a sentence in a comment Stefan Beller
2016-10-28 18:54 ` [PATCHv2 06/36] attr.c: mark where #if DEBUG ends more clearly Stefan Beller
2016-10-28 18:54 ` [PATCHv2 07/36] attr.c: simplify macroexpand_one() Stefan Beller
2016-10-28 18:54 ` [PATCHv2 08/36] attr.c: tighten constness around "git_attr" structure Stefan Beller
2016-10-28 18:54 ` [PATCHv2 09/36] attr.c: plug small leak in parse_attr_line() Stefan Beller
2016-10-28 18:54 ` [PATCHv2 10/36] attr: rename function and struct related to checking attributes Stefan Beller
2016-10-28 18:54 ` [PATCHv2 11/36] attr: (re)introduce git_check_attr() and struct git_attr_check Stefan Beller
2016-10-28 18:54 ` [PATCHv2 12/36] attr: convert git_all_attrs() to use "struct git_attr_check" Stefan Beller
2016-10-28 18:54 ` [PATCHv2 13/36] attr: convert git_check_attrs() callers to use the new API Stefan Beller
2016-10-28 18:54 ` [PATCHv2 14/36] attr: retire git_check_attrs() API Stefan Beller
2016-10-28 18:54 ` Stefan Beller [this message]
2016-10-28 18:54 ` [PATCHv2 16/36] attr: add counted string version of git_attr() Stefan Beller
2016-10-28 18:54 ` [PATCHv2 17/36] attr: expose validity check for attribute names Stefan Beller
2016-10-28 18:54 ` [PATCHv2 18/36] attr: support quoting pathname patterns in C style Stefan Beller
2016-10-28 18:54 ` [PATCHv2 19/36] attr.c: add push_stack() helper Stefan Beller
2016-10-28 18:54 ` [PATCHv2 20/36] attr.c: pass struct git_attr_check down the callchain Stefan Beller
2016-10-28 18:54 ` [PATCHv2 21/36] attr.c: rename a local variable check Stefan Beller
2016-10-28 18:54 ` [PATCHv2 22/36] attr.c: correct ugly hack for git_all_attrs() Stefan Beller
2016-10-28 18:54 ` [PATCHv2 23/36] attr.c: introduce empty_attr_check_elems() Stefan Beller
2016-10-28 18:54 ` [PATCHv2 24/36] attr.c: always pass check[] to collect_some_attrs() Stefan Beller
2016-10-28 18:54 ` [PATCHv2 25/36] attr.c: outline the future plans by heavily commenting Stefan Beller
2016-10-28 18:54 ` [PATCHv2 26/36] attr: make git_check_attr_counted static Stefan Beller
2016-10-28 18:54 ` [PATCHv2 27/36] attr: convert to new threadsafe API Stefan Beller
2016-10-28 22:06 ` Junio C Hamano
2016-10-28 22:08 ` Stefan Beller
2016-10-28 22:25 ` Junio C Hamano
2016-10-29 7:10 ` Johannes Sixt
2016-10-28 18:54 ` [PATCHv2 28/36] attr: keep attr stack for each check Stefan Beller
2016-10-28 21:35 ` Junio C Hamano
2016-10-28 18:54 ` [PATCHv2 29/36] Documentation: fix a typo Stefan Beller
2016-10-28 18:54 ` [PATCHv2 30/36] pathspec: move long magic parsing out of prefix_pathspec Stefan Beller
2016-10-28 18:54 ` [PATCHv2 31/36] pathspec: move prefix check out of the inner loop Stefan Beller
2016-10-28 18:54 ` [PATCHv2 32/36] pathspec: allow querying for attributes Stefan Beller
2016-11-09 9:57 ` Duy Nguyen
2016-11-09 22:42 ` Stefan Beller
2016-10-28 18:54 ` [PATCHv2 33/36] pathspec: allow escaped query values Stefan Beller
2016-10-28 18:55 ` [PATCHv2 34/36] submodule update: add `--init-default-path` switch Stefan Beller
2016-11-03 17:46 ` [PATCH] SQUASH to: " Stefan Beller
2016-10-28 18:55 ` [PATCHv2 35/36] clone: add --init-submodule=<pathspec> switch Stefan Beller
2016-10-28 18:55 ` [PATCHv2 36/36] completion: clone can initialize specific submodules Stefan Beller
2016-10-28 21:43 ` [PATCHv2 00/36] Revamp the attr subsystem! Junio C Hamano
2016-10-28 22:02 ` Stefan Beller
2016-10-28 23:59 ` Ramsay Jones
2016-11-03 20:47 ` Johannes Sixt
2016-11-03 20:53 ` Stefan Beller
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20161028185502.8789-16-sbeller@google.com \
--to=sbeller@google.com \
--cc=bmwill@google.com \
--cc=git@vger.kernel.org \
--cc=gitster@pobox.com \
--cc=pclouds@gmail.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).