#define _POSIX_C_SOURCE 199509L
 
+#include <unistd.h>
+
+#include <errno.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
 #include "param.h"
 
 int conParam(Param *my)
 {
-       return 0;
+       int retVal;
+       char *fileName;
+       int code;
+
+       fileName = getenv("DAQSLOW_PARAM_FILE");
+       if (fileName == NULL) {
+               fileName = "param.tcl";
+       }
+       my->interp = Tcl_CreateInterp();
+       code = Tcl_EvalFile(my->interp, fileName);
+       if (*my->interp->result != 0) {
+               fprintf(stderr, "opening param file: %s\n", my->interp->result);
+               retVal = -1;
+       } else {
+               if (code != TCL_OK) {
+                       retVal = -1;
+               } else {
+                       retVal = 0;
+               }
+       }
+       return retVal;
 }
 
 void desParam(Param *my)
 {
+       Tcl_DeleteInterp(my->interp);
 }
 
-int Param_getInt(const Param *my, const char *n, const char *i, int *v)
+int Param_getInt(const Param *my, const char *name, const char *idx, int *val)
 {
-       return Param_getIntArray(my, n, i, 1, v);
+       int status;
+       char valstr[PARAM_MAX_VALUE_LEN];
+       char *endptr;
+       if ((status = Param_getString(my, name, idx, valstr)) != 1) {
+               msglog(LOG_ERR, "Error: cannot get Parameter %s as a string", idx);
+               return status;
+       }
+       *val = strtoul(valstr, &endptr, 0);
+       if (*endptr == '\0') {
+               return PARAM_RV_NO_INT;
+       }
+       return 1;
 }
 
-int Param_getString(const Param *my, const char *n, const char *i, char *v)
+int Param_getString(const Param *my, const char *name, const char *idx, char *val)
 {
-       return Param_getStringArray(my, n, i, 1, &v);
+       strcpy(val, Tcl_GetVar2(my->interp, (char *) name, (char *) idx, 0));
+       if (val == NULL) {
+               val = "";
+               fprintf(stderr,
+                       "Parameter %s(%s) not found, default is \"\"\n", name, idx);
+               return 0;
+       }
+       return 1;
 }
 
-int Param_getIntArray(const Param *my, const char *n, const char *i, int num, int *v)
+int Param_getIntArray(const Param *my, const char *name, const char *idx, int num, int *val)
 {
-       for (int i = 0 ; i<num ; i++) {
-               v[i] = 0;
+       int status;
+       int tmp;
+       char index[PARAM_MAX_NAME_LEN];
+       for (int i = 0 ; i < num ; i++) {
+               sprintf(index,"%s%d", idx, i);
+               if ((tmp = Param_getInt(my, name, index, val[i]) == 1) && (status >= 0)) {
+                       status++;
+               } else {
+                       status = tmp;
+               }
        }
-       return num;
+
+       return status;
 }
 
-int Param_getStringArray(const Param *my, const char *n, const char *i, int num, char **v)
+int Param_getStringArray(const Param *my, const char *name, const char *idx, int num, char **val)
 {
-       for (int i = 0 ; i<num ; i++) {
-               v[i] = "Blub";
+       int status;
+       int tmp;
+       char index[PARAM_MAX_NAME_LEN];
+       for (int i = 0 ; i < num ; i++) {
+               sprintf(index,"%s%d", idx, i);
+               if ((tmp = Param_getString(my, name, index, val[i]) == 1) && (status >= 0)) {
+                       status++;
+               } else {
+                       status = tmp;
+               }
        }
-       return num;
+
+       return status;
 }