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-sha1 | ||||
| /test-sigchain | ||||
| /test-string-pool | ||||
| /test-subprocess | ||||
| /test-svn-fe | ||||
| /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-sha1 | ||||
| TEST_PROGRAMS_NEED_X += test-sigchain | ||||
| TEST_PROGRAMS_NEED_X += test-string-pool | ||||
| TEST_PROGRAMS_NEED_X += test-subprocess | ||||
| TEST_PROGRAMS_NEED_X += test-svn-fe | ||||
| TEST_PROGRAMS_NEED_X += test-treap | ||||
|  | @ -1838,10 +1837,9 @@ ifndef NO_CURL | |||
| endif | ||||
| XDIFF_OBJS = xdiff/xdiffi.o xdiff/xprepare.o xdiff/xutils.o xdiff/xemit.o \ | ||||
| 	xdiff/xmerge.o xdiff/xpatience.o | ||||
| VCSSVN_OBJS = vcs-svn/string_pool.o vcs-svn/line_buffer.o \ | ||||
| 	vcs-svn/repo_tree.o vcs-svn/fast_export.o vcs-svn/svndump.o | ||||
| VCSSVN_TEST_OBJS = test-obj-pool.o test-string-pool.o \ | ||||
| 	test-line-buffer.o test-treap.o | ||||
| VCSSVN_OBJS = vcs-svn/line_buffer.o vcs-svn/repo_tree.o \ | ||||
| 	vcs-svn/fast_export.o vcs-svn/svndump.o | ||||
| VCSSVN_TEST_OBJS = test-obj-pool.o test-line-buffer.o test-treap.o | ||||
| OBJECTS := $(GIT_OBJS) $(XDIFF_OBJS) $(VCSSVN_OBJS) | ||||
|  | ||||
| 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 | ||||
|  | ||||
| $(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/svndump.h | ||||
|  | ||||
|  | @ -2133,8 +2131,6 @@ test-line-buffer$X: vcs-svn/lib.a | |||
|  | ||||
| test-parse-options$X: parse-options.o | ||||
|  | ||||
| test-string-pool$X: vcs-svn/lib.a | ||||
|  | ||||
| test-svn-fe$X: vcs-svn/lib.a | ||||
|  | ||||
| .PRECIOUS: $(TEST_OBJS) | ||||
|  |  | |||
|  | @ -76,22 +76,6 @@ test_expect_success 'obj pool: high-water mark' ' | |||
| 	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' ' | ||||
| 	cat <<-\EOF >unsorted && | ||||
| 	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