vcs-svn: drop string_pool
This reverts commit 1d73b52f5b
(Add string-specific memory pool, 2010-08-09).  Now that svn-fe
does not need to maintain a growing collection of strings (paths)
over a long period of time, the string_pool is not needed.
Signed-off-by: David Barr <david.barr@cordelta.com>
Signed-off-by: Jonathan Nieder <jrnieder@gmail.com>
			
			
				maint
			
			
		
							parent
							
								
									030879718f
								
							
						
					
					
						commit
						28c5d9ed2a
					
				|  | @ -177,7 +177,6 @@ | ||||||
| /test-run-command | /test-run-command | ||||||
| /test-sha1 | /test-sha1 | ||||||
| /test-sigchain | /test-sigchain | ||||||
| /test-string-pool |  | ||||||
| /test-subprocess | /test-subprocess | ||||||
| /test-svn-fe | /test-svn-fe | ||||||
| /test-treap | /test-treap | ||||||
|  |  | ||||||
							
								
								
									
										12
									
								
								Makefile
								
								
								
								
							
							
						
						
									
										12
									
								
								Makefile
								
								
								
								
							|  | @ -430,7 +430,6 @@ TEST_PROGRAMS_NEED_X += test-path-utils | ||||||
| TEST_PROGRAMS_NEED_X += test-run-command | TEST_PROGRAMS_NEED_X += test-run-command | ||||||
| TEST_PROGRAMS_NEED_X += test-sha1 | TEST_PROGRAMS_NEED_X += test-sha1 | ||||||
| TEST_PROGRAMS_NEED_X += test-sigchain | TEST_PROGRAMS_NEED_X += test-sigchain | ||||||
| TEST_PROGRAMS_NEED_X += test-string-pool |  | ||||||
| TEST_PROGRAMS_NEED_X += test-subprocess | TEST_PROGRAMS_NEED_X += test-subprocess | ||||||
| TEST_PROGRAMS_NEED_X += test-svn-fe | TEST_PROGRAMS_NEED_X += test-svn-fe | ||||||
| TEST_PROGRAMS_NEED_X += test-treap | TEST_PROGRAMS_NEED_X += test-treap | ||||||
|  | @ -1838,10 +1837,9 @@ ifndef NO_CURL | ||||||
| endif | endif | ||||||
| XDIFF_OBJS = xdiff/xdiffi.o xdiff/xprepare.o xdiff/xutils.o xdiff/xemit.o \ | XDIFF_OBJS = xdiff/xdiffi.o xdiff/xprepare.o xdiff/xutils.o xdiff/xemit.o \ | ||||||
| 	xdiff/xmerge.o xdiff/xpatience.o | 	xdiff/xmerge.o xdiff/xpatience.o | ||||||
| VCSSVN_OBJS = vcs-svn/string_pool.o vcs-svn/line_buffer.o \ | VCSSVN_OBJS = vcs-svn/line_buffer.o vcs-svn/repo_tree.o \ | ||||||
| 	vcs-svn/repo_tree.o vcs-svn/fast_export.o vcs-svn/svndump.o | 	vcs-svn/fast_export.o vcs-svn/svndump.o | ||||||
| VCSSVN_TEST_OBJS = test-obj-pool.o test-string-pool.o \ | VCSSVN_TEST_OBJS = test-obj-pool.o test-line-buffer.o test-treap.o | ||||||
| 	test-line-buffer.o test-treap.o |  | ||||||
| OBJECTS := $(GIT_OBJS) $(XDIFF_OBJS) $(VCSSVN_OBJS) | OBJECTS := $(GIT_OBJS) $(XDIFF_OBJS) $(VCSSVN_OBJS) | ||||||
|  |  | ||||||
| dep_files := $(foreach f,$(OBJECTS),$(dir $f).depend/$(notdir $f).d) | dep_files := $(foreach f,$(OBJECTS),$(dir $f).depend/$(notdir $f).d) | ||||||
|  | @ -1965,7 +1963,7 @@ xdiff-interface.o $(XDIFF_OBJS): \ | ||||||
| 	xdiff/xutils.h xdiff/xprepare.h xdiff/xdiffi.h xdiff/xemit.h | 	xdiff/xutils.h xdiff/xprepare.h xdiff/xdiffi.h xdiff/xemit.h | ||||||
|  |  | ||||||
| $(VCSSVN_OBJS) $(VCSSVN_TEST_OBJS): $(LIB_H) \ | $(VCSSVN_OBJS) $(VCSSVN_TEST_OBJS): $(LIB_H) \ | ||||||
| 	vcs-svn/obj_pool.h vcs-svn/trp.h vcs-svn/string_pool.h \ | 	vcs-svn/obj_pool.h vcs-svn/trp.h \ | ||||||
| 	vcs-svn/line_buffer.h vcs-svn/repo_tree.h vcs-svn/fast_export.h \ | 	vcs-svn/line_buffer.h vcs-svn/repo_tree.h vcs-svn/fast_export.h \ | ||||||
| 	vcs-svn/svndump.h | 	vcs-svn/svndump.h | ||||||
|  |  | ||||||
|  | @ -2133,8 +2131,6 @@ test-line-buffer$X: vcs-svn/lib.a | ||||||
|  |  | ||||||
| test-parse-options$X: parse-options.o | test-parse-options$X: parse-options.o | ||||||
|  |  | ||||||
| test-string-pool$X: vcs-svn/lib.a |  | ||||||
|  |  | ||||||
| test-svn-fe$X: vcs-svn/lib.a | test-svn-fe$X: vcs-svn/lib.a | ||||||
|  |  | ||||||
| .PRECIOUS: $(TEST_OBJS) | .PRECIOUS: $(TEST_OBJS) | ||||||
|  |  | ||||||
|  | @ -76,22 +76,6 @@ test_expect_success 'obj pool: high-water mark' ' | ||||||
| 	test_cmp expected actual | 	test_cmp expected actual | ||||||
| ' | ' | ||||||
|  |  | ||||||
| test_expect_success 'string pool' ' |  | ||||||
| 	echo a does not equal b >expected.differ && |  | ||||||
| 	echo a equals a >expected.match && |  | ||||||
| 	echo equals equals equals >expected.matchmore && |  | ||||||
|  |  | ||||||
| 	test-string-pool "a,--b" >actual.differ && |  | ||||||
| 	test-string-pool "a,a" >actual.match && |  | ||||||
| 	test-string-pool "equals-equals" >actual.matchmore && |  | ||||||
| 	test_must_fail test-string-pool a,a,a && |  | ||||||
| 	test_must_fail test-string-pool a && |  | ||||||
|  |  | ||||||
| 	test_cmp expected.differ actual.differ && |  | ||||||
| 	test_cmp expected.match actual.match && |  | ||||||
| 	test_cmp expected.matchmore actual.matchmore |  | ||||||
| ' |  | ||||||
|  |  | ||||||
| test_expect_success 'treap sort' ' | test_expect_success 'treap sort' ' | ||||||
| 	cat <<-\EOF >unsorted && | 	cat <<-\EOF >unsorted && | ||||||
| 	68 | 	68 | ||||||
|  |  | ||||||
|  | @ -1,31 +0,0 @@ | ||||||
| /* |  | ||||||
|  * test-string-pool.c: code to exercise the svn importer's string pool |  | ||||||
|  */ |  | ||||||
|  |  | ||||||
| #include "git-compat-util.h" |  | ||||||
| #include "vcs-svn/string_pool.h" |  | ||||||
|  |  | ||||||
| int main(int argc, char *argv[]) |  | ||||||
| { |  | ||||||
| 	const uint32_t unequal = pool_intern("does not equal"); |  | ||||||
| 	const uint32_t equal = pool_intern("equals"); |  | ||||||
| 	uint32_t buf[3]; |  | ||||||
| 	uint32_t n; |  | ||||||
|  |  | ||||||
| 	if (argc != 2) |  | ||||||
| 		usage("test-string-pool <string>,<string>"); |  | ||||||
|  |  | ||||||
| 	n = pool_tok_seq(3, buf, ",-", argv[1]); |  | ||||||
| 	if (n >= 3) |  | ||||||
| 		die("too many strings"); |  | ||||||
| 	if (n <= 1) |  | ||||||
| 		die("too few strings"); |  | ||||||
|  |  | ||||||
| 	buf[2] = buf[1]; |  | ||||||
| 	buf[1] = (buf[0] == buf[2]) ? equal : unequal; |  | ||||||
| 	pool_print_seq(3, buf, ' ', stdout); |  | ||||||
| 	fputc('\n', stdout); |  | ||||||
|  |  | ||||||
| 	pool_reset(); |  | ||||||
| 	return 0; |  | ||||||
| } |  | ||||||
|  | @ -1,113 +0,0 @@ | ||||||
| /* |  | ||||||
|  * Licensed under a two-clause BSD-style license. |  | ||||||
|  * See LICENSE for details. |  | ||||||
|  */ |  | ||||||
|  |  | ||||||
| #include "git-compat-util.h" |  | ||||||
| #include "quote.h" |  | ||||||
| #include "trp.h" |  | ||||||
| #include "obj_pool.h" |  | ||||||
| #include "string_pool.h" |  | ||||||
|  |  | ||||||
| static struct trp_root tree = { ~0 }; |  | ||||||
|  |  | ||||||
| struct node { |  | ||||||
| 	uint32_t offset; |  | ||||||
| 	struct trp_node children; |  | ||||||
| }; |  | ||||||
|  |  | ||||||
| /* Two memory pools: one for struct node, and another for strings */ |  | ||||||
| obj_pool_gen(node, struct node, 4096) |  | ||||||
| obj_pool_gen(string, char, 4096) |  | ||||||
|  |  | ||||||
| static char *node_value(struct node *node) |  | ||||||
| { |  | ||||||
| 	return node ? string_pointer(node->offset) : NULL; |  | ||||||
| } |  | ||||||
|  |  | ||||||
| static int node_cmp(struct node *a, struct node *b) |  | ||||||
| { |  | ||||||
| 	return strcmp(node_value(a), node_value(b)); |  | ||||||
| } |  | ||||||
|  |  | ||||||
| /* Build a Treap from the node structure (a trp_node w/ offset) */ |  | ||||||
| trp_gen(static, tree_, struct node, children, node, node_cmp); |  | ||||||
|  |  | ||||||
| const char *pool_fetch(uint32_t entry) |  | ||||||
| { |  | ||||||
| 	return node_value(node_pointer(entry)); |  | ||||||
| } |  | ||||||
|  |  | ||||||
| uint32_t pool_intern(const char *key) |  | ||||||
| { |  | ||||||
| 	/* Canonicalize key */ |  | ||||||
| 	struct node *match = NULL, *node; |  | ||||||
| 	uint32_t key_len; |  | ||||||
| 	if (key == NULL) |  | ||||||
| 		return ~0; |  | ||||||
| 	key_len = strlen(key) + 1; |  | ||||||
| 	node = node_pointer(node_alloc(1)); |  | ||||||
| 	node->offset = string_alloc(key_len); |  | ||||||
| 	strcpy(node_value(node), key); |  | ||||||
| 	match = tree_search(&tree, node); |  | ||||||
| 	if (!match) { |  | ||||||
| 		tree_insert(&tree, node); |  | ||||||
| 	} else { |  | ||||||
| 		node_free(1); |  | ||||||
| 		string_free(key_len); |  | ||||||
| 		node = match; |  | ||||||
| 	} |  | ||||||
| 	return node_offset(node); |  | ||||||
| } |  | ||||||
|  |  | ||||||
| uint32_t pool_tok_r(char *str, const char *delim, char **saveptr) |  | ||||||
| { |  | ||||||
| 	char *token = strtok_r(str, delim, saveptr); |  | ||||||
| 	return token ? pool_intern(token) : ~0; |  | ||||||
| } |  | ||||||
|  |  | ||||||
| void pool_print_seq(uint32_t len, const uint32_t *seq, char delim, FILE *stream) |  | ||||||
| { |  | ||||||
| 	uint32_t i; |  | ||||||
| 	for (i = 0; i < len && ~seq[i]; i++) { |  | ||||||
| 		fputs(pool_fetch(seq[i]), stream); |  | ||||||
| 		if (i < len - 1 && ~seq[i + 1]) |  | ||||||
| 			fputc(delim, stream); |  | ||||||
| 	} |  | ||||||
| } |  | ||||||
|  |  | ||||||
| void pool_print_seq_q(uint32_t len, const uint32_t *seq, char delim, FILE *stream) |  | ||||||
| { |  | ||||||
| 	uint32_t i; |  | ||||||
| 	for (i = 0; i < len && ~seq[i]; i++) { |  | ||||||
| 		quote_c_style(pool_fetch(seq[i]), NULL, stream, 1); |  | ||||||
| 		if (i < len - 1 && ~seq[i + 1]) |  | ||||||
| 			fputc(delim, stream); |  | ||||||
| 	} |  | ||||||
| } |  | ||||||
|  |  | ||||||
| uint32_t pool_tok_seq(uint32_t sz, uint32_t *seq, const char *delim, char *str) |  | ||||||
| { |  | ||||||
| 	char *context = NULL; |  | ||||||
| 	uint32_t token = ~0; |  | ||||||
| 	uint32_t length; |  | ||||||
|  |  | ||||||
| 	if (sz == 0) |  | ||||||
| 		return ~0; |  | ||||||
| 	if (str) |  | ||||||
| 		token = pool_tok_r(str, delim, &context); |  | ||||||
| 	for (length = 0; length < sz; length++) { |  | ||||||
| 		seq[length] = token; |  | ||||||
| 		if (token == ~0) |  | ||||||
| 			return length; |  | ||||||
| 		token = pool_tok_r(NULL, delim, &context); |  | ||||||
| 	} |  | ||||||
| 	seq[sz - 1] = ~0; |  | ||||||
| 	return sz; |  | ||||||
| } |  | ||||||
|  |  | ||||||
| void pool_reset(void) |  | ||||||
| { |  | ||||||
| 	node_reset(); |  | ||||||
| 	string_reset(); |  | ||||||
| } |  | ||||||
|  | @ -1,12 +0,0 @@ | ||||||
| #ifndef STRING_POOL_H_ |  | ||||||
| #define STRING_POOL_H_ |  | ||||||
|  |  | ||||||
| uint32_t pool_intern(const char *key); |  | ||||||
| const char *pool_fetch(uint32_t entry); |  | ||||||
| uint32_t pool_tok_r(char *str, const char *delim, char **saveptr); |  | ||||||
| void pool_print_seq(uint32_t len, const uint32_t *seq, char delim, FILE *stream); |  | ||||||
| void pool_print_seq_q(uint32_t len, const uint32_t *seq, char delim, FILE *stream); |  | ||||||
| uint32_t pool_tok_seq(uint32_t sz, uint32_t *seq, const char *delim, char *str); |  | ||||||
| void pool_reset(void); |  | ||||||
|  |  | ||||||
| #endif |  | ||||||
|  | @ -1,43 +0,0 @@ | ||||||
| string_pool API |  | ||||||
| =============== |  | ||||||
|  |  | ||||||
| The string_pool API provides facilities for replacing strings |  | ||||||
| with integer keys that can be more easily compared and stored. |  | ||||||
| The facilities are designed so that one could teach Git without |  | ||||||
| too much trouble to store the information needed for these keys to |  | ||||||
| remain valid over multiple executions. |  | ||||||
|  |  | ||||||
| Functions |  | ||||||
| --------- |  | ||||||
|  |  | ||||||
| pool_intern:: |  | ||||||
| 	Include a string in the string pool and get its key. |  | ||||||
| 	If that string is already in the pool, retrieves its |  | ||||||
| 	existing key. |  | ||||||
|  |  | ||||||
| pool_fetch:: |  | ||||||
| 	Retrieve the string associated to a given key. |  | ||||||
|  |  | ||||||
| pool_tok_r:: |  | ||||||
| 	Extract the key of the next token from a string. |  | ||||||
| 	Interface mimics strtok_r. |  | ||||||
|  |  | ||||||
| pool_print_seq:: |  | ||||||
| 	Print a sequence of strings named by key to a file, using the |  | ||||||
| 	specified delimiter to separate them. |  | ||||||
|  |  | ||||||
| 	If NULL (key ~0) appears in the sequence, the sequence ends |  | ||||||
| 	early. |  | ||||||
|  |  | ||||||
| pool_tok_seq:: |  | ||||||
| 	Split a string into tokens, storing the keys of segments |  | ||||||
| 	into a caller-provided array. |  | ||||||
|  |  | ||||||
| 	Unless sz is 0, the array will always be ~0-terminated. |  | ||||||
| 	If there is not enough room for all the tokens, the |  | ||||||
| 	array holds as many tokens as fit in the entries before |  | ||||||
| 	the terminating ~0.  Return value is the index after the |  | ||||||
| 	last token, or sz if the tokens did not fit. |  | ||||||
|  |  | ||||||
| pool_reset:: |  | ||||||
| 	Deallocate storage for the string pool. |  | ||||||
		Loading…
	
		Reference in New Issue
	
	 David Barr
						David Barr