diff options
| author | Lars Hjemli <hjemli@gmail.com> | 2008-03-28 00:09:11 +0100 | 
|---|---|---|
| committer | Lars Hjemli <hjemli@gmail.com> | 2008-03-28 00:09:11 +0100 | 
| commit | 20a33548b9a87a6eb23162ee5d137daa46d78613 (patch) | |
| tree | 9c4ca364df64dcce640a531c7f515ee48bc99387 | |
| parent | Add cache.h (diff) | |
| download | cgit-20a33548b9a87a6eb23162ee5d137daa46d78613.tar.gz cgit-20a33548b9a87a6eb23162ee5d137daa46d78613.tar.bz2 cgit-20a33548b9a87a6eb23162ee5d137daa46d78613.zip | |
Move function for configfile parsing into configfile.[ch]
This is a generic function which wanted its own little object file.
Signed-off-by: Lars Hjemli <hjemli@gmail.com>
Diffstat (limited to '')
| -rw-r--r-- | Makefile | 1 | ||||
| -rw-r--r-- | cgit.c | 5 | ||||
| -rw-r--r-- | cgit.h | 1 | ||||
| -rw-r--r-- | configfile.c | 87 | ||||
| -rw-r--r-- | configfile.h | 8 | ||||
| -rw-r--r-- | parsing.c | 75 | 
6 files changed, 99 insertions, 78 deletions
| @@ -51,6 +51,7 @@ OBJECTS =  OBJECTS += cache.o  OBJECTS += cgit.o  OBJECTS += cmd.o +OBJECTS += configfile.o  OBJECTS += html.o  OBJECTS += parsing.o  OBJECTS += shared.o @@ -9,6 +9,7 @@  #include "cgit.h"  #include "cache.h"  #include "cmd.h" +#include "configfile.h"  #include "ui-shared.h"  const char *cgit_version = CGIT_VERSION; @@ -103,7 +104,7 @@ void config_cb(const char *name, const char *value)  		else  			ctx.repo->readme = xstrdup(fmt("%s/%s", ctx.repo->path, value));  	} else if (!strcmp(name, "include")) -		cgit_read_config(value, config_cb); +		parse_configfile(value, config_cb);  }  static void querystring_cb(const char *name, const char *value) @@ -436,7 +437,7 @@ int main(int argc, const char **argv)  	cgit_repolist.count = 0;  	cgit_repolist.repos = NULL; -	cgit_read_config(cgit_config_env ? cgit_config_env : CGIT_CONFIG, +	parse_configfile(cgit_config_env ? cgit_config_env : CGIT_CONFIG,  			 config_cb);  	if (getenv("SCRIPT_NAME"))  		ctx.cfg.script_name = xstrdup(getenv("SCRIPT_NAME")); @@ -214,7 +214,6 @@ extern void cgit_diff_commit(struct commit *commit, filepair_fn fn);  extern char *fmt(const char *format,...); -extern int cgit_read_config(const char *filename, configfn fn);  extern int cgit_parse_query(char *txt, configfn fn);  extern struct commitinfo *cgit_parse_commit(struct commit *commit);  extern struct taginfo *cgit_parse_tag(struct tag *tag); diff --git a/configfile.c b/configfile.c new file mode 100644 index 0000000..4908058 --- /dev/null +++ b/configfile.c @@ -0,0 +1,87 @@ +/* configfile.c: parsing of config files + * + * Copyright (C) 2008 Lars Hjemli + * + * Licensed under GNU General Public License v2 + *   (see COPYING for full license text) + */ + +#include <ctype.h> +#include <stdio.h> +#include "configfile.h" + +int next_char(FILE *f) +{ +	int c = fgetc(f); +	if (c=='\r') { +		c = fgetc(f); +		if (c!='\n') { +			ungetc(c, f); +			c = '\r'; +		} +	} +	return c; +} + +void skip_line(FILE *f) +{ +	int c; + +	while((c=next_char(f)) && c!='\n' && c!=EOF) +		; +} + +int read_config_line(FILE *f, char *line, const char **value, int bufsize) +{ +	int i = 0, isname = 0; + +	*value = NULL; +	while(i<bufsize-1) { +		int c = next_char(f); +		if (!isname && (c=='#' || c==';')) { +			skip_line(f); +			continue; +		} +		if (!isname && isspace(c)) +			continue; + +		if (c=='=' && !*value) { +			line[i] = 0; +			*value = &line[i+1]; +		} else if (c=='\n' && !isname) { +			i = 0; +			continue; +		} else if (c=='\n' || c==EOF) { +			line[i] = 0; +			break; +		} else { +			line[i]=c; +		} +		isname = 1; +		i++; +	} +	line[i+1] = 0; +	return i; +} + +int parse_configfile(const char *filename, configfile_value_fn fn) +{ +	static int nesting; +	int len; +	char line[256]; +	const char *value; +	FILE *f; + +	/* cancel deeply nested include-commands */ +	if (nesting > 8) +		return -1; +	if (!(f = fopen(filename, "r"))) +		return -1; +	nesting++; +	while((len = read_config_line(f, line, &value, sizeof(line))) > 0) +		fn(line, value); +	nesting--; +	fclose(f); +	return 0; +} + diff --git a/configfile.h b/configfile.h new file mode 100644 index 0000000..04235e5 --- /dev/null +++ b/configfile.h @@ -0,0 +1,8 @@ +#ifndef CONFIGFILE_H +#define CONFIGFILE_H + +typedef void (*configfile_value_fn)(const char *name, const char *value); + +extern int parse_configfile(const char *filename, configfile_value_fn fn); + +#endif /* CONFIGFILE_H */ @@ -8,81 +8,6 @@  #include "cgit.h" -int next_char(FILE *f) -{ -	int c = fgetc(f); -	if (c=='\r') { -		c = fgetc(f); -		if (c!='\n') { -			ungetc(c, f); -			c = '\r'; -		} -	} -	return c; -} - -void skip_line(FILE *f) -{ -	int c; - -	while((c=next_char(f)) && c!='\n' && c!=EOF) -		; -} - -int read_config_line(FILE *f, char *line, const char **value, int bufsize) -{ -	int i = 0, isname = 0; - -	*value = NULL; -	while(i<bufsize-1) { -		int c = next_char(f); -		if (!isname && (c=='#' || c==';')) { -			skip_line(f); -			continue; -		} -		if (!isname && isspace(c)) -			continue; - -		if (c=='=' && !*value) { -			line[i] = 0; -			*value = &line[i+1]; -		} else if (c=='\n' && !isname) { -			i = 0; -			continue; -		} else if (c=='\n' || c==EOF) { -			line[i] = 0; -			break; -		} else { -			line[i]=c; -		} -		isname = 1; -		i++; -	} -	line[i+1] = 0; -	return i; -} - -int cgit_read_config(const char *filename, configfn fn) -{ -	static int nesting; -	int len; -	char line[256]; -	const char *value; -	FILE *f; - -	/* cancel deeply nested include-commands */ -	if (nesting > 8) -		return -1; -	if (!(f = fopen(filename, "r"))) -		return -1; -	nesting++; -	while((len = read_config_line(f, line, &value, sizeof(line))) > 0) -		(*fn)(line, value); -	nesting--; -	fclose(f); -	return 0; -} -  char *convert_query_hexchar(char *txt)  {  	int d1, d2; | 
