allocate several buffers for the list of words, instead of one strdup
per word (running under efence does not work very well otherwise) git-svn-id: svn://svn.h5l.se/heimdal/trunk/heimdal@10731 ec53bebd-3082-4978-b11e-865c3cabbd6b
This commit is contained in:
		@@ -39,6 +39,8 @@ RCSID("$Id$");
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
#define NUSERS 1000
 | 
					#define NUSERS 1000
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define WORDBUF_SIZE 65535
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static unsigned
 | 
					static unsigned
 | 
				
			||||||
read_words (const char *filename, char ***ret_w)
 | 
					read_words (const char *filename, char ***ret_w)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
@@ -46,19 +48,29 @@ read_words (const char *filename, char ***ret_w)
 | 
				
			|||||||
    FILE *f;
 | 
					    FILE *f;
 | 
				
			||||||
    char buf[256];
 | 
					    char buf[256];
 | 
				
			||||||
    char **w = NULL;
 | 
					    char **w = NULL;
 | 
				
			||||||
 | 
					    char *wbuf = NULL, *wptr = NULL, *wend = NULL;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    f = fopen (filename, "r");
 | 
					    f = fopen (filename, "r");
 | 
				
			||||||
    if (f == NULL)
 | 
					    if (f == NULL)
 | 
				
			||||||
	err (1, "cannot open %s", filename);
 | 
						err (1, "cannot open %s", filename);
 | 
				
			||||||
    alloc = n = 0;
 | 
					    alloc = n = 0;
 | 
				
			||||||
    while (fgets (buf, sizeof(buf), f) != NULL) {
 | 
					    while (fgets (buf, sizeof(buf), f) != NULL) {
 | 
				
			||||||
 | 
						size_t len;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (buf[strlen (buf) - 1] == '\n')
 | 
						if (buf[strlen (buf) - 1] == '\n')
 | 
				
			||||||
	    buf[strlen (buf) - 1] = '\0';
 | 
						    buf[strlen (buf) - 1] = '\0';
 | 
				
			||||||
	if (n >= alloc) {
 | 
						if (n >= alloc) {
 | 
				
			||||||
	    alloc += 16;
 | 
						    alloc = max(alloc + 16, alloc * 2);
 | 
				
			||||||
	    w = erealloc (w, alloc * sizeof(char **));
 | 
						    w = erealloc (w, alloc * sizeof(char **));
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	w[n++] = estrdup (buf);
 | 
						len = strlen(buf);
 | 
				
			||||||
 | 
						if (wptr + len + 1 >= wend) {
 | 
				
			||||||
 | 
						    wptr = wbuf = emalloc (WORDBUF_SIZE);
 | 
				
			||||||
 | 
						    wend = wbuf + WORDBUF_SIZE;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						memmove (wptr, buf, len + 1);
 | 
				
			||||||
 | 
						w[n++] = wptr;
 | 
				
			||||||
 | 
						wptr += len + 1;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    *ret_w = w;
 | 
					    *ret_w = w;
 | 
				
			||||||
    return n;
 | 
					    return n;
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user