git@vger.kernel.org list mirror (unofficial, one of many)
 help / color / mirror / code / Atom feed
d5003a79e328cf0b5c7cdb15ff78c7fa37542488 blob 3328 bytes (raw)

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
 
#include "git-compat-util.h"
#include "strmap.h"

static int cmp_strmap_entry(const void *hashmap_cmp_fn_data,
			    const struct hashmap_entry *entry1,
			    const struct hashmap_entry *entry2,
			    const void *keydata)
{
	const struct strmap_entry *e1, *e2;

	e1 = container_of(entry1, const struct strmap_entry, ent);
	e2 = container_of(entry2, const struct strmap_entry, ent);
	return strcmp(e1->key, e2->key);
}

static struct strmap_entry *find_strmap_entry(struct strmap *map,
					      const char *str)
{
	struct strmap_entry entry;
	hashmap_entry_init(&entry.ent, strhash(str));
	entry.key = str;
	return hashmap_get_entry(&map->map, &entry, ent, NULL);
}

void strmap_init(struct strmap *map)
{
	strmap_ocd_init(map, 1);
}

void strmap_ocd_init(struct strmap *map,
		     int strdup_strings)
{
	hashmap_init(&map->map, cmp_strmap_entry, NULL, 0);
	map->strdup_strings = strdup_strings;
}

static void strmap_free_entries_(struct strmap *map, int free_util)
{
	struct hashmap_iter iter;
	struct strmap_entry *e;

	if (!map)
		return;

	/*
	 * We need to iterate over the hashmap entries and free
	 * e->key and e->value ourselves; hashmap has no API to
	 * take care of that for us.  Since we're already iterating over
	 * the hashmap, though, might as well free e too and avoid the need
	 * to make some call into the hashmap API to do that.
	 */
	hashmap_for_each_entry(&map->map, &iter, e, ent) {
		if (free_util)
			free(e->value);
		if (map->strdup_strings)
			free((char*)e->key);
		free(e);
	}
}

void strmap_clear(struct strmap *map, int free_util)
{
	strmap_free_entries_(map, free_util);
	hashmap_free(&map->map);
}

void strmap_partial_clear(struct strmap *map, int free_util)
{
	strmap_free_entries_(map, free_util);
	hashmap_partial_clear(&map->map);
}

void *strmap_put(struct strmap *map, const char *str, void *data)
{
	struct strmap_entry *entry = find_strmap_entry(map, str);
	void *old = NULL;

	if (entry) {
		old = entry->value;
		entry->value = data;
	} else {
		/*
		 * We won't modify entry->key so it really should be const.
		 */
		const char *key = str;

		entry = xmalloc(sizeof(*entry));
		hashmap_entry_init(&entry->ent, strhash(str));

		if (map->strdup_strings)
			key = xstrdup(str);
		entry->key = key;
		entry->value = data;
		hashmap_add(&map->map, &entry->ent);
	}
	return old;
}

struct strmap_entry *strmap_get_entry(struct strmap *map, const char *str)
{
	return find_strmap_entry(map, str);
}

void *strmap_get(struct strmap *map, const char *str)
{
	struct strmap_entry *entry = find_strmap_entry(map, str);
	return entry ? entry->value : NULL;
}

int strmap_contains(struct strmap *map, const char *str)
{
	return find_strmap_entry(map, str) != NULL;
}

void strmap_remove(struct strmap *map, const char *str, int free_util)
{
	struct strmap_entry entry, *ret;
	hashmap_entry_init(&entry.ent, strhash(str));
	entry.key = str;
	ret = hashmap_remove_entry(&map->map, &entry, ent, NULL);
	if (!ret)
		return;
	if (free_util)
		free(ret->value);
	if (map->strdup_strings)
		free((char*)ret->key);
	free(ret);
}

void strintmap_incr(struct strintmap *map, const char *str, intptr_t amt)
{
	struct strmap_entry *entry = find_strmap_entry(&map->map, str);
	if (entry) {
		intptr_t *whence = (intptr_t*)&entry->value;
		*whence += amt;
	}
	else
		strintmap_set(map, str, amt);
}
debug log:

solving d5003a79e3 ...
found d5003a79e3 in https://public-inbox.org/git/cc8d702f98f94fd9202d227d19be43a912467e84.1602549650.git.gitgitgadget@gmail.com/
found 47cbf11ec7 in https://public-inbox.org/git/2ebce0c5d82b87fa9c9ef5dcefc0ac2701654f3b.1602549650.git.gitgitgadget@gmail.com/
found 909b9fbedf in https://public-inbox.org/git/61b5bf11103a7bd12de8fd066e128c469da3a0a4.1602549650.git.gitgitgadget@gmail.com/
found 4b48d64274 in https://public-inbox.org/git/5c7507f55b09e24c0bfe87cc3df06213cfd1235b.1602549650.git.gitgitgadget@gmail.com/

applying [1/4] https://public-inbox.org/git/5c7507f55b09e24c0bfe87cc3df06213cfd1235b.1602549650.git.gitgitgadget@gmail.com/
diff --git a/strmap.c b/strmap.c
new file mode 100644
index 0000000000..4b48d64274


applying [2/4] https://public-inbox.org/git/61b5bf11103a7bd12de8fd066e128c469da3a0a4.1602549650.git.gitgitgadget@gmail.com/
diff --git a/strmap.c b/strmap.c
index 4b48d64274..909b9fbedf 100644


applying [3/4] https://public-inbox.org/git/2ebce0c5d82b87fa9c9ef5dcefc0ac2701654f3b.1602549650.git.gitgitgadget@gmail.com/
diff --git a/strmap.c b/strmap.c
index 909b9fbedf..47cbf11ec7 100644


applying [4/4] https://public-inbox.org/git/cc8d702f98f94fd9202d227d19be43a912467e84.1602549650.git.gitgitgadget@gmail.com/
diff --git a/strmap.c b/strmap.c
index 47cbf11ec7..d5003a79e3 100644

Checking patch strmap.c...
Applied patch strmap.c cleanly.
Checking patch strmap.c...
Applied patch strmap.c cleanly.
Checking patch strmap.c...
Applied patch strmap.c cleanly.
Checking patch strmap.c...
Applied patch strmap.c cleanly.

index at:
100644 d5003a79e328cf0b5c7cdb15ff78c7fa37542488	strmap.c

git@vger.kernel.org list mirror (unofficial, one of many)

This inbox may be cloned and mirrored by anyone:

	git clone --mirror https://public-inbox.org/git
	git clone --mirror http://ou63pmih66umazou.onion/git
	git clone --mirror http://czquwvybam4bgbro.onion/git
	git clone --mirror http://hjrcffqmbrq6wope.onion/git

	# If you have public-inbox 1.1+ installed, you may
	# initialize and index your mirror using the following commands:
	public-inbox-init -V1 git git/ https://public-inbox.org/git \
		git@vger.kernel.org
	public-inbox-index git

Example config snippet for mirrors.
Newsgroups are available over NNTP:
	nntp://news.public-inbox.org/inbox.comp.version-control.git
	nntp://7fh6tueqddpjyxjmgtdiueylzoqt6pt7hec3pukyptlmohoowvhde4yd.onion/inbox.comp.version-control.git
	nntp://ie5yzdi7fg72h7s4sdcztq5evakq23rdt33mfyfcddc5u3ndnw24ogqd.onion/inbox.comp.version-control.git
	nntp://4uok3hntl7oi7b4uf4rtfwefqeexfzil2w6kgk2jn5z2f764irre7byd.onion/inbox.comp.version-control.git
	nntp://news.gmane.io/gmane.comp.version-control.git
 note: .onion URLs require Tor: https://www.torproject.org/

code repositories for project(s) associated with this inbox:

	https://80x24.org/mirrors/git.git

AGPL code for this site: git clone https://public-inbox.org/public-inbox.git