Skip to content

Commit

Permalink
use strchrnul() in place of strchr() and strlen()
Browse files Browse the repository at this point in the history
Avoid scanning strings twice, once with strchr() and then with
strlen(), by using strchrnul().

Helped-by: Junio C Hamano <[email protected]>
Signed-off-by: Rohit Mani <[email protected]>
Signed-off-by: Junio C Hamano <[email protected]>
  • Loading branch information
RohitMani authored and gitster committed Mar 10, 2014
1 parent 5f95c9f commit 2c5495f
Show file tree
Hide file tree
Showing 9 changed files with 34 additions and 59 deletions.
4 changes: 2 additions & 2 deletions archive.c
Original file line number Diff line number Diff line change
Expand Up @@ -259,8 +259,8 @@ static void parse_treeish_arg(const char **argv,
/* Remotes are only allowed to fetch actual refs */
if (remote) {
char *ref = NULL;
const char *colon = strchr(name, ':');
int refnamelen = colon ? colon - name : strlen(name);
const char *colon = strchrnul(name, ':');
int refnamelen = colon - name;

if (!dwim_ref(name, refnamelen, sha1, &ref))
die("no such ref: %.*s", refnamelen, name);
Expand Down
15 changes: 6 additions & 9 deletions cache-tree.c
Original file line number Diff line number Diff line change
Expand Up @@ -121,11 +121,11 @@ void cache_tree_invalidate_path(struct cache_tree *it, const char *path)

if (!it)
return;
slash = strchr(path, '/');
slash = strchrnul(path, '/');
namelen = slash - path;
it->entry_count = -1;
if (!slash) {
if (!*slash) {
int pos;
namelen = strlen(path);
pos = subtree_pos(it, path, namelen);
if (0 <= pos) {
cache_tree_free(&it->down[pos]->cache_tree);
Expand All @@ -143,7 +143,6 @@ void cache_tree_invalidate_path(struct cache_tree *it, const char *path)
}
return;
}
namelen = slash - path;
down = find_subtree(it, path, namelen, 0);
if (down)
cache_tree_invalidate_path(down->cache_tree, slash + 1);
Expand Down Expand Up @@ -554,20 +553,18 @@ static struct cache_tree *cache_tree_find(struct cache_tree *it, const char *pat
const char *slash;
struct cache_tree_sub *sub;

slash = strchr(path, '/');
if (!slash)
slash = path + strlen(path);
slash = strchrnul(path, '/');
/* between path and slash is the name of the
* subtree to look for.
*/
sub = find_subtree(it, path, slash - path, 0);
if (!sub)
return NULL;
it = sub->cache_tree;
if (slash)
if (*slash)
while (*slash && *slash == '/')
slash++;
if (!slash || !*slash)
if (!*slash)
return it; /* prefix ended with slashes */
path = slash;
}
Expand Down
9 changes: 3 additions & 6 deletions diff.c
Original file line number Diff line number Diff line change
Expand Up @@ -3365,14 +3365,11 @@ static int opt_arg(const char *arg, int arg_short, const char *arg_long, int *va
if (c != '-')
return 0;
arg++;
eq = strchr(arg, '=');
if (eq)
len = eq - arg;
else
len = strlen(arg);
eq = strchrnul(arg, '=');
len = eq - arg;
if (!len || strncmp(arg, arg_long, len))
return 0;
if (eq) {
if (*eq) {
int n;
char *end;
if (!isdigit(*++eq))
Expand Down
33 changes: 12 additions & 21 deletions fast-import.c
Original file line number Diff line number Diff line change
Expand Up @@ -1485,14 +1485,11 @@ static int tree_content_set(
unsigned int i, n;
struct tree_entry *e;

slash1 = strchr(p, '/');
if (slash1)
n = slash1 - p;
else
n = strlen(p);
slash1 = strchrnul(p, '/');
n = slash1 - p;
if (!n)
die("Empty path component found in input");
if (!slash1 && !S_ISDIR(mode) && subtree)
if (!*slash1 && !S_ISDIR(mode) && subtree)
die("Non-directories cannot have subtrees");

if (!root->tree)
Expand All @@ -1501,7 +1498,7 @@ static int tree_content_set(
for (i = 0; i < t->entry_count; i++) {
e = t->entries[i];
if (e->name->str_len == n && !strncmp_icase(p, e->name->str_dat, n)) {
if (!slash1) {
if (!*slash1) {
if (!S_ISDIR(mode)
&& e->versions[1].mode == mode
&& !hashcmp(e->versions[1].sha1, sha1))
Expand Down Expand Up @@ -1552,7 +1549,7 @@ static int tree_content_set(
e->versions[0].mode = 0;
hashclr(e->versions[0].sha1);
t->entries[t->entry_count++] = e;
if (slash1) {
if (*slash1) {
e->tree = new_tree_content(8);
e->versions[1].mode = S_IFDIR;
tree_content_set(e, slash1 + 1, sha1, mode, subtree);
Expand All @@ -1576,11 +1573,8 @@ static int tree_content_remove(
unsigned int i, n;
struct tree_entry *e;

slash1 = strchr(p, '/');
if (slash1)
n = slash1 - p;
else
n = strlen(p);
slash1 = strchrnul(p, '/');
n = slash1 - p;

if (!root->tree)
load_tree(root);
Expand All @@ -1594,15 +1588,15 @@ static int tree_content_remove(
for (i = 0; i < t->entry_count; i++) {
e = t->entries[i];
if (e->name->str_len == n && !strncmp_icase(p, e->name->str_dat, n)) {
if (slash1 && !S_ISDIR(e->versions[1].mode))
if (*slash1 && !S_ISDIR(e->versions[1].mode))
/*
* If p names a file in some subdirectory, and a
* file or symlink matching the name of the
* parent directory of p exists, then p cannot
* exist and need not be deleted.
*/
return 1;
if (!slash1 || !S_ISDIR(e->versions[1].mode))
if (!*slash1 || !S_ISDIR(e->versions[1].mode))
goto del_entry;
if (!e->tree)
load_tree(e);
Expand Down Expand Up @@ -1644,11 +1638,8 @@ static int tree_content_get(
unsigned int i, n;
struct tree_entry *e;

slash1 = strchr(p, '/');
if (slash1)
n = slash1 - p;
else
n = strlen(p);
slash1 = strchrnul(p, '/');
n = slash1 - p;
if (!n && !allow_root)
die("Empty path component found in input");

Expand All @@ -1664,7 +1655,7 @@ static int tree_content_get(
for (i = 0; i < t->entry_count; i++) {
e = t->entries[i];
if (e->name->str_len == n && !strncmp_icase(p, e->name->str_dat, n)) {
if (!slash1)
if (!*slash1)
goto found_entry;
if (!S_ISDIR(e->versions[1].mode))
return 0;
Expand Down
11 changes: 4 additions & 7 deletions match-trees.c
Original file line number Diff line number Diff line change
Expand Up @@ -182,13 +182,10 @@ static int splice_tree(const unsigned char *hash1,
enum object_type type;
int status;

subpath = strchr(prefix, '/');
if (!subpath)
toplen = strlen(prefix);
else {
toplen = subpath - prefix;
subpath = strchrnul(prefix, '/');
toplen = subpath - prefix;
if (*subpath)
subpath++;
}

buf = read_sha1_file(hash1, &type, &sz);
if (!buf)
Expand All @@ -215,7 +212,7 @@ static int splice_tree(const unsigned char *hash1,
if (!rewrite_here)
die("entry %.*s not found in tree %s",
toplen, prefix, sha1_to_hex(hash1));
if (subpath) {
if (*subpath) {
status = splice_tree(rewrite_here, subpath, hash2, subtree);
if (status)
return status;
Expand Down
5 changes: 1 addition & 4 deletions parse-options.c
Original file line number Diff line number Diff line change
Expand Up @@ -223,13 +223,10 @@ static int parse_long_opt(struct parse_opt_ctx_t *p, const char *arg,
const struct option *options)
{
const struct option *all_opts = options;
const char *arg_end = strchr(arg, '=');
const char *arg_end = strchrnul(arg, '=');
const struct option *abbrev_option = NULL, *ambiguous_option = NULL;
int abbrev_flags = 0, ambiguous_flags = 0;

if (!arg_end)
arg_end = arg + strlen(arg);

for (; options->type != OPTION_END; options++) {
const char *rest, *long_name = options->long_name;
int flags = 0, opt_flags = 0;
Expand Down
5 changes: 2 additions & 3 deletions pretty.c
Original file line number Diff line number Diff line change
Expand Up @@ -549,14 +549,13 @@ static char *get_header(const struct commit *commit, const char *msg,
const char *line = msg;

while (line) {
const char *eol = strchr(line, '\n'), *next;
const char *eol = strchrnul(line, '\n'), *next;

if (line == eol)
return NULL;
if (!eol) {
if (!*eol) {
warning("malformed commit (header is missing newline): %s",
sha1_to_hex(commit->object.sha1));
eol = line + strlen(line);
next = NULL;
} else
next = eol + 1;
Expand Down
4 changes: 2 additions & 2 deletions remote-testsvn.c
Original file line number Diff line number Diff line change
Expand Up @@ -78,8 +78,8 @@ static int parse_rev_note(const char *msg, struct rev_note *res)
size_t len;

while (*msg) {
end = strchr(msg, '\n');
len = end ? end - msg : strlen(msg);
end = strchrnul(msg, '\n');
len = end - msg;

key = "Revision-number: ";
if (starts_with(msg, key)) {
Expand Down
7 changes: 2 additions & 5 deletions ws.c
Original file line number Diff line number Diff line change
Expand Up @@ -33,11 +33,8 @@ unsigned parse_whitespace_rule(const char *string)
int negated = 0;

string = string + strspn(string, ", \t\n\r");
ep = strchr(string, ',');
if (!ep)
len = strlen(string);
else
len = ep - string;
ep = strchrnul(string, ',');
len = ep - string;

if (*string == '-') {
negated = 1;
Expand Down

0 comments on commit 2c5495f

Please sign in to comment.