diff --git a/src/parse.cpp b/src/parse.cpp
new file mode 100644
--- /dev/null
+++ b/src/parse.cpp
@@ -0,0 +1,397 @@
+/*
+ *
+ * This file is part of the Virtual Leaf.
+ *
+ * The Virtual Leaf is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * The Virtual Leaf is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with the Virtual Leaf. If not, see .
+ *
+ * Copyright 2010 Roeland Merks.
+ *
+ */
+
+#include
+#include
+#include
+#include
+#include
+#include "warning.h"
+#include "parse.h"
+#include "output.h"
+#include
+
+static const std::string _module_id("$Id$");
+
+using namespace MyWarning;
+
+char *ParsePar(FILE *fp, char *parameter, bool wrapflag)
+{
+ char *line,*token;
+ char *value;
+
+ line=SearchToken(fp,parameter, wrapflag);
+ if (line==NULL) {
+ warning("Warning: Token %s not found.",parameter);
+ value=0;
+ return value;
+ }
+
+ /* parse the line on = sign */
+ token=strtok(line,"=");
+ if (token==NULL) {
+ error("Parse error: no '=' sign found next to token %s, in line: \n %s.",
+ parameter,line);
+ }
+
+ // warning("Reading value for token %s...",token);
+ fprintf(stderr, "[%s = ",token);
+
+ token=strtok(NULL,"=");
+ if (token==NULL)
+ error("\nParse error: no value found after '=' sign, in line: \n %s",
+ line);
+
+ value=strdup(token);
+ free(line);
+
+ return value;
+
+}
+
+
+int igetpar(FILE *fp,char *parameter, bool wrapflag) {
+
+ // overloaded compatibility function. Doesn't need default parameter
+ // default = 0
+
+ return igetpar(fp, parameter, 0, wrapflag);
+}
+
+int igetpar(FILE *fp,char *parameter, int default_val, bool wrapflag)
+{
+ char *token;
+ int value;
+
+ /* Get token representing the value */
+ token=ParsePar(fp,parameter, wrapflag);
+
+ if (token==0) {
+ /* default value */
+ warning("No token %s found. Using default value %d.\n", parameter, default_val);
+ return default_val;
+ }
+ /* read it */
+ sscanf(token,"%d",&value);
+ fprintf(stderr, "%d]\n",value);
+
+ free(token);
+
+ return value;
+
+}
+
+float fgetpar(FILE *fp,char *parameter, bool wrapflag) {
+
+ // overloaded compatibility function. Doesn't need default parameter
+ // default = 0
+
+ return fgetpar(fp, parameter, 0., wrapflag);
+
+}
+
+float fgetpar(FILE *fp, char *parameter, double default_val, bool wrapflag)
+{
+ char *token;
+ float value;
+
+ /* Get token representing the value */
+ token=ParsePar(fp,parameter, wrapflag);
+
+ if (token==0) {
+ /* default value */
+ warning("No token %s found. Using default value %f.\n", parameter, default_val);
+ return default_val;
+ }
+
+ /* read it */
+ sscanf(token,"%e",&value);
+
+ fprintf(stderr,"%e]\n",value);
+
+ free(token);
+
+ return value;
+
+}
+
+
+double *dgetparlist(FILE *fp,char *parameter, int n, bool wrapflag)
+{
+ /* Get a list of n comma separated doubles */
+ char *token;
+ double *value;
+ char *number;
+ int i;
+
+ value=(double *)malloc(n*sizeof(double));
+
+ /* Get token representing the value */
+ token=ParsePar(fp,parameter, wrapflag);
+
+ if (token==0) {
+ error("No token %s found.\n", parameter);
+ }
+ /* parse it */
+ number=strtok(token,","); /* make a pointer to "token" */
+
+ i=0;
+ while (number!=NULL) {
+
+ if (i>=n) {
+ error("\nToo many values found for parameterlist '%s' (%d expected).",parameter,n);
+ }
+
+ sscanf(number,"%le",&value[i]);
+ fprintf(stderr,"[%f]",value[i]);
+
+ /* next value */
+ number=strtok(NULL,",");
+ i++;
+ }
+
+ fprintf(stderr,"]\n");
+
+ if (i=initial_position)) {
+
+ /* As long as the search was not wrapped and we are not
+ * back to where we were, continue searching */
+
+ /* Read a line, and check whether an EOF was found */
+ if ((line=ReadLine(fp))==NULL) {
+ /* Yes? wrapflag on? => Wrap. */
+ if (wrapflag) {
+ wrapped=true;
+ fseek(fp,0L,SEEK_SET);
+ continue;
+ } else
+ break;
+ }
+
+ /* strip leading spaces */
+ int pos=strspn(line," \t\n");
+
+ if (line[pos]=='#') {
+
+ continue;
+ }
+
+ len=strlen(line);
+ if (strlen(tokenplusspace)<=len) {
+
+ /* only if the line is longer than the token, it might be found */
+ // if (strstr(line,tokenplusspace)!=NULL) /* FOUND */
+ if (strstr(line,tokenplusspace)==(&line[pos])) /* FOUND */
+ {
+ free(tokenplusspace);
+ return line;
+ }
+ }
+
+
+ free(line);
+
+ }
+ free(tokenplusspace);
+ return NULL; /* Token Not Found in the file */
+}
+
+int TokenInLineP(char *line,char *token)
+{
+ if (strstr(token, line)!=NULL)
+ return true;
+ else
+ return false;
+}
+
+
+void SkipLine(FILE *fp) {
+
+ /* Just skips a line in FILE *fp */
+ char *tmpstring;
+ tmpstring=ReadLine(fp);
+ free(tmpstring);
+
+}
+
+void SkipToken(FILE *fp,char *token, bool wrapflag)
+{
+ /* A very simple function:
+ call SearchToken() and get rid of the memory returned by
+ it.
+ Also, return an error if the desired token was not found in the file.
+ */
+ char *tmppointer;
+
+ tmppointer=SearchToken(fp,token, wrapflag);
+
+ if (tmppointer==NULL) {
+ error("Token `%s' not found by function SkipToken.\n",token);
+ }
+
+ free(tmppointer);
+
+}
+