diff options
Diffstat (limited to 'src/librc')
| -rw-r--r-- | src/librc/librc-misc.c | 144 | 
1 files changed, 72 insertions, 72 deletions
| diff --git a/src/librc/librc-misc.c b/src/librc/librc-misc.c index dcecc293..b8f59936 100644 --- a/src/librc/librc-misc.c +++ b/src/librc/librc-misc.c @@ -105,73 +105,109 @@ char *rc_strcatpaths (const char *path1, const char *paths, ...)  }  librc_hidden_def(rc_strcatpaths) - -char **rc_config_load (const char *file) +char **rc_config_list (const char *file)  { -	char **list = NULL;  	FILE *fp;  	char *buffer;  	char *p;  	char *token; -	char *line; -	char *linep; -	char *linetok; -	int i = 0; -	bool replaced; -	char *entry; -	char *newline; +	char **list = NULL; +	size_t buflen = BUFSIZ; +	size_t last; -	if (! (fp = fopen (file, "r")))  +	if (! (fp = fopen (file, "r")))  		return (NULL); -	buffer = xmalloc (sizeof (char) * RC_LINEBUFFER); -	while (fgets (buffer, RC_LINEBUFFER, fp)) { -		p = buffer; +	buffer = xmalloc (sizeof (char) * buflen); +	buffer[buflen - 1] = '\0'; +	while (fgets (buffer, buflen, fp)) { +		/* Increase the buffer to read the rest of the line if needed */ +		last = strlen (buffer) - 1; +		while (! feof (fp) && buffer[last] != '\n') { +			buflen += BUFSIZ; +			buffer = xrealloc (buffer, sizeof (char *) * buflen); +			fgets (buffer + last, BUFSIZ, fp); +			last = strlen (buffer) - 1; +		}  		/* Strip leading spaces/tabs */ +		p = buffer;  		while ((*p == ' ') || (*p == '\t'))  			p++; -		if (! p || strlen (p) < 3 || p[0] == '#') -			continue; +		/* Get entry - we do not want comments */ +		token = strsep (&p, "#"); +		if (token && (strlen (token) > 1)) { +			/* Stip the newline if present */ +			if (token[strlen (token) - 1] == '\n') +				token[strlen (token) - 1] = 0; -		/* Get entry */ -		token = strsep (&p, "="); +			rc_strlist_add (&list, token); +		} +	} +	free (buffer); +	fclose (fp); + +	return (list); +} +librc_hidden_def(rc_config_list) -		if (! token) +char **rc_config_load (const char *file) +{ +	char **list = NULL; +	char **config = NULL; +	char *token; +	char *line; +	char *linep; +	char *linetok; +	int i = 0; +	int j; +	bool replaced; +	char *entry; +	char *newline; + +	list = rc_config_list (file); +	STRLIST_FOREACH (list, line, j) { +		/* Get entry */ +		if (! (token = strsep (&line, "=")))  			continue;  		entry = xstrdup (token); -  		/* Preserve shell coloring */ -		if (*p == '$') -			token = p; +		if (*line == '$') +			token = line;  		else  			do {  				/* Bash variables are usually quoted */ -				token = strsep (&p, "\"\'"); +				token = strsep (&line, "\"\'");  			} while ((token) && (strlen (token) == 0));  		/* Drop a newline if that's all we have */ -		i = strlen (token) - 1; -		if (token[i] == 10) -			token[i] = 0; - -		i = strlen (entry) + strlen (token) + 2; -		newline = xmalloc (i); -		snprintf (newline, i, "%s=%s", entry, token); +		if (token) { +			i = strlen (token) - 1; +			if (token[i] == '\n') +				token[i] = 0; + +			i = strlen (entry) + strlen (token) + 2; +			newline = xmalloc (sizeof (char) * i); +			snprintf (newline, i, "%s=%s", entry, token); +		} else { +			i = strlen (entry) + 2; +			newline = xmalloc (sizeof (char) * i); +			snprintf (newline, i, "%s=", entry); +		}  		replaced = false;  		/* In shells the last item takes precedence, so we need to remove  		   any prior values we may already have */ -		STRLIST_FOREACH (list, line, i) { +		STRLIST_FOREACH (config, line, i) {  			char *tmp = xstrdup (line);  			linep = tmp;   			linetok = strsep (&linep, "=");  			if (strcmp (linetok, entry) == 0) {  				/* We have a match now - to save time we directly replace it */ -				free (list[i - 1]); -				list[i - 1] = newline; +				free (config[i - 1]); +				config[i - 1] = newline;  				replaced = true;  				free (tmp);  				break; @@ -180,15 +216,14 @@ char **rc_config_load (const char *file)  		}  		if (! replaced) { -			rc_strlist_addsort (&list, newline); +			rc_strlist_addsort (&config, newline);  			free (newline);  		}  		free (entry);  	} -	free (buffer); -	fclose (fp); +	rc_strlist_free (list); -	return (list); +	return (config);  }  librc_hidden_def(rc_config_load) @@ -208,38 +243,3 @@ char *rc_config_value (char **list, const char *entry)  }  librc_hidden_def(rc_config_value) -char **rc_config_list (const char *file) -{ -	FILE *fp; -	char *buffer; -	char *p; -	char *token; -	char **list = NULL; - -	if (! (fp = fopen (file, "r"))) -		return (NULL); - -	buffer = xmalloc (sizeof (char) * RC_LINEBUFFER); -	while (fgets (buffer, RC_LINEBUFFER, fp)) { -		p = buffer; - -		/* Strip leading spaces/tabs */ -		while ((*p == ' ') || (*p == '\t')) -			p++; - -		/* Get entry - we do not want comments */ -		token = strsep (&p, "#"); -		if (token && (strlen (token) > 1)) { -			/* Stip the newline if present */ -			if (token[strlen (token) - 1] == '\n') -				token[strlen (token) - 1] = 0; - -			rc_strlist_add (&list, token); -		} -	} -	free (buffer); -	fclose (fp); - -	return (list); -} -librc_hidden_def(rc_config_list) | 
