Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Define correctly variables for windows.
[simgrid.git] / tools / tesh2 / src / fstream.c
index 166e256..f0e3911 100644 (file)
 #include <readline.h>\r
 \r
 #include <is_cmd.h>\r
+#include <getpath.h>\r
 \r
-#ifndef WIN32\r
+#ifndef _XBT_WIN32\r
 #include <xsignal.h>\r
 #endif\r
 \r
+#ifdef _XBT_WIN32\r
+static int\r
+is_w32_cmd(char* cmd, char** path)\r
+{\r
+       size_t i = 0;\r
+       struct stat stat_buff = {0};\r
+       char buff[PATH_MAX + 1] = {0};\r
+       \r
 \r
 \r
-XBT_LOG_EXTERNAL_DEFAULT_CATEGORY(tesh);\r
+       if(!cmd)\r
+       {\r
+               errno = EINVAL;\r
+               return 0;\r
+       }\r
+       \r
+       if(stat(cmd, &stat_buff) || !S_ISREG(stat_buff.st_mode))\r
+       {\r
+               if(path)\r
+               {\r
+                       for (i = 0; path[i] != NULL; i++)\r
+                       {\r
+                               /* use Cat.exe on Windows */\r
+                               if(!strcmp(cmd, "cat"))\r
+                                       cmd[0] = 'C';\r
+                               \r
+                               sprintf(buff,"%s\\%s",path[i], cmd);\r
+                               \r
+                               if(!stat(buff, &stat_buff) && S_ISREG(stat_buff.st_mode))\r
+                                       return 1;\r
+                       }\r
+               }\r
+       }\r
+       else\r
+               return 1;\r
+               \r
 \r
+       return 0;\r
+}\r
+#endif\r
 \r
 \r
+XBT_LOG_EXTERNAL_DEFAULT_CATEGORY(tesh);\r
+\r
 \r
 long fstream_getline(fstream_t fstream, char **buf, size_t *n) {\r
 \r
@@ -142,7 +181,7 @@ fstream_open(fstream_t fstream)
                return 0;\r
        }\r
        \r
-       #ifndef WIN32\r
+       #ifndef _XBT_WIN32\r
        sprintf(path,"%s/%s",fstream->directory, fstream->name);\r
        #else\r
        sprintf(path,"%s\\%s",fstream->directory, fstream->name);\r
@@ -265,7 +304,7 @@ fstream_parse(fstream_t fstream, xbt_os_mutex_t mutex)
                                snprintf(file_pos,256,"%s:%d",fstream->name, line_num);\r
                                ERROR1("[%s] Error : no command found in the last chunk of lines", file_pos);\r
                                \r
-                               unit_set_error(fstream->unit, ESYNTAX, 1);\r
+                               unit_set_error(fstream->unit, ESYNTAX, 1, file_pos);\r
 \r
                                failure(unit);\r
                                break;\r
@@ -279,7 +318,7 @@ fstream_parse(fstream_t fstream, xbt_os_mutex_t mutex)
                                {\r
                                        ERROR2("[%s] Malformated suite `(%s)' : include missing", file_pos, (*current_suite)->description);\r
                                \r
-                                       unit_set_error(*current_suite, ESYNTAX, 1);\r
+                                       unit_set_error(*current_suite, ESYNTAX, 1, file_pos);\r
 \r
                                        failure(unit);\r
                                        \r
@@ -290,8 +329,16 @@ fstream_parse(fstream_t fstream, xbt_os_mutex_t mutex)
                                \r
                        if(context->command_line)\r
                        {\r
+                               #ifdef _XBT_WIN32\r
+                               if(!context->is_not_found)\r
+                               {\r
+                               #endif\r
                                if(fstream_launch_command(fstream, context, mutex) < 0)\r
                                                break;\r
+\r
+                               #ifdef _XBT_WIN32\r
+                               }\r
+                               #endif\r
                        }\r
                \r
                        continue;\r
@@ -337,8 +384,17 @@ fstream_parse(fstream_t fstream, xbt_os_mutex_t mutex)
        /* Check that last command of the file ran well */\r
        if(context->command_line)\r
        {\r
+               #ifdef _XBT_WIN32\r
+               if(!context->is_not_found)\r
+               {\r
+               #endif\r
+\r
                if(fstream_launch_command(fstream, context, mutex) < 0)\r
                        return -1;\r
+\r
+               #ifdef _XBT_WIN32\r
+               }\r
+               #endif\r
        }\r
        \r
        /* clear buffers */\r
@@ -360,9 +416,20 @@ fstream_lex_line(fstream_t fstream, context_t context, xbt_os_mutex_t mutex, con
        char* line2;\r
        variable_t variable;\r
        unsigned int i;\r
-       char name[VAR_NAME_MAX + 1] = {0};\r
+       char exp[PATH_MAX + 1] = {0};\r
        unit_t unit = fstream->unit;\r
        xbt_dynar_t variables = unit->runner->variables;\r
+       char* p= NULL;\r
+       char* end = NULL;\r
+       char* val = NULL;\r
+       char buff[PATH_MAX + 1] = {0}; \r
+       size_t len;\r
+       char delimiters[4] = {' ', '\t', '\n', '\0'}; \r
+       \r
+       int j;\r
+       \r
+       if(line[0] == '#')\r
+               return;\r
 \r
        if(unit->is_running_suite && strncmp(line, "! include", strlen("! include")))\r
        {/* it's the end of a suite */\r
@@ -374,38 +441,608 @@ fstream_lex_line(fstream_t fstream, context_t context, xbt_os_mutex_t mutex, con
                else\r
                        ERROR2("[%s] Malformated suite `(%s)': blank line missing", filepos, (*current_suite)->description);\r
                \r
-               unit_set_error(*current_suite, ESYNTAX, 1);\r
+               unit_set_error(*current_suite, ESYNTAX, 1, filepos);\r
 \r
                failure(fstream->unit);\r
-                       \r
-               \r
        }\r
        \r
        context->line = strdup(filepos);\r
        \r
-       \r
        /* search end */\r
        xbt_str_rtrim(line + 2,"\n");\r
        \r
        line2 = strdup(line);\r
-       \r
+\r
+       len = strlen(line2 + 2) + 1;\r
+\r
        /* replace each variable by its value */\r
        xbt_os_mutex_acquire(unit->mutex);\r
+       \r
+\r
+       /* replace all existing\r
+          ${var}\r
+          ${var:=val}\r
+          ${var:+val}\r
+          ${var:-val}\r
+          ${var:?val}\r
+          ${#var}\r
+   */\r
+       \r
+       xbt_dynar_foreach(variables, i, variable)\r
+       {\r
+               if(!(p = strstr(line2 + 2, "${")))\r
+                       break;\r
+\r
+               memset(buff, 0, len);\r
+\r
+               sprintf(buff,"${%s",variable->name);\r
+               \r
+               /* FALSE */\r
+               if((p = strstr(line2 + 2, buff)))\r
+               {\r
+                       memset(buff, 0, len);\r
+                       p--;\r
+                       j = 0;\r
+\r
+                       while(*(p++) != '\0')\r
+                       {\r
+                               buff[j++] = *p;\r
+\r
+                               if(*p == '}')\r
+                                       break;\r
+                       }\r
+\r
+                       if(buff[j - 1] != '}')\r
+                       {\r
+                               xbt_os_mutex_release(unit->mutex);      \r
+                               \r
+                               \r
+                               ERROR2("[%s] Syntax error : `%s'.",filepos, p - j);\r
+                               \r
+                               unit_set_error(fstream->unit, ESYNTAX, 1, filepos);\r
+                               failure(fstream->unit);\r
+                               return;\r
+                       }\r
+\r
+                       if((p = strstr(buff , ":=")))\r
+                       {\r
+                               /* ${var:=val} */\r
+                               \r
+                               /* if the value of the variable is empty, update its value by the value*/\r
+                               p += 2;\r
+                               \r
+                               end = strchr(p, '}');\r
+\r
+                               if(!end || (end == p))\r
+                               {\r
+                                       xbt_os_mutex_release(unit->mutex);      \r
+                               \r
+                               \r
+                                       ERROR2("[%s] Bad substitution : `%s'.",filepos, strstr(buff, "${"));\r
+                               \r
+                                       unit_set_error(fstream->unit, ESYNTAX, 1, filepos);\r
+                                       failure(fstream->unit);\r
+                                       return;\r
+                               }\r
+\r
+                               val = (char*) calloc((size_t)(end - p) + 1, sizeof(char));\r
+\r
+                               strncpy(val, p,(end - p));\r
+                               \r
+                               \r
+                               /* replace the expression by the expression of the value of the variable*/\r
+                               sprintf(exp, "${%s:=%s}", variable->name, val);\r
+\r
+                               if(variable->val)\r
+                                       str_replace_all(&line2, exp, variable->val, NULL);\r
+                               else\r
+                               {\r
+                                       str_replace_all(&line2, exp, val, NULL);\r
+\r
+                                       variable->val = strdup(val);\r
+                               }\r
+\r
+                               memset(exp, 0, VAR_NAME_MAX + 1);\r
+\r
+                               if(val)\r
+                               {\r
+                                       free(val);\r
+                                       val = NULL;\r
+                               }\r
+\r
+                       }\r
+                       else if((p = strstr(buff, ":-")))\r
+                       {\r
+                               /* ${var:-val} */\r
+                               \r
+                               /* if the value of the variable is empty, replace the expression by the value */\r
+                               p += 2;\r
+                               end = strchr(p, '}');\r
+\r
+                               if(!end || (end == p))\r
+                               {\r
+                                       xbt_os_mutex_release(unit->mutex);      \r
+                               \r
+                                       ERROR2("[%s] Bad substitution : `%s'.",filepos, strstr(line2, "${"));\r
+                               \r
+                                       unit_set_error(fstream->unit, ESYNTAX, 1, filepos);\r
+                                       failure(fstream->unit);\r
+                                       return;\r
+                               }\r
+\r
+                               val = (char*) calloc((size_t)(end - p) + 1, sizeof(char));\r
+\r
+                               strncpy(val, p,(end - p)); \r
+\r
+                               sprintf(exp, "${%s:-%s}", variable->name, val);\r
+                               \r
+                               str_replace_all(&line2, exp, variable->val ? variable->val : val, NULL);\r
+                               \r
+\r
+                               memset(exp, 0, VAR_NAME_MAX + 1);\r
+                               \r
+                               if(val)\r
+                               {\r
+                                       free(val);\r
+                                       val = NULL;\r
+                               }\r
+\r
+                       }\r
+                       else if((p = strstr(buff, ":+")))\r
+                       {\r
+                               /* ${var:+val} */\r
+       \r
+                               /* if the value of the variable is not empty, replace the expression by the value */\r
+                               p += 2;\r
+\r
+                               end = strchr(p, '}');\r
+\r
+                               if(!end || (end == p))\r
+                               {\r
+                                       xbt_os_mutex_release(unit->mutex);      \r
+                               \r
+                               \r
+                                       ERROR2("[%s] Bad substitution : `%s'.",filepos, strstr(line2, "${"));\r
+                               \r
+                                       unit_set_error(fstream->unit, ESYNTAX, 1, filepos);\r
+                                       failure(fstream->unit);\r
+                                       return;\r
+                               }\r
+\r
+                               val = (char*) calloc((size_t)(end - p) + 1, sizeof(char));\r
+\r
+                               strncpy(val, p,(end - p));\r
+\r
+                               sprintf(exp, "${%s:+%s}", variable->name, val);\r
+\r
+                               if(variable->val)\r
+                               {\r
+                                       str_replace_all(&line2, exp, val, NULL);\r
+                               }\r
+                               else\r
+                               {\r
+                                       str_replace_all(&line2, exp, NULL , NULL);\r
+                                       variable->val = strdup(val);\r
+                               }\r
+                               \r
+                               memset(exp, 0, VAR_NAME_MAX + 1);\r
+                               \r
+                               if(val)\r
+                               {\r
+                                       free(val);\r
+                                       val = NULL;\r
+                               }\r
+                       }\r
+                       else if((p = strstr(buff, ":?")))\r
+                       {\r
+                               /*  ${var:?val} */\r
+       \r
+                               /* if the value of the variable is not empty, replace the expression by the value */\r
+                               p += 2;\r
+                               end = strchr(p, '}');\r
+\r
+                               if(!end || (end == p))\r
+                               {\r
+                                       xbt_os_mutex_release(unit->mutex);      \r
+                               \r
+                                       ERROR2("[%s] Bad substitution : `%s'.",filepos, strstr(line2, "${"));\r
+                               \r
+                                       unit_set_error(fstream->unit, ESYNTAX, 1, filepos);\r
+                                       failure(fstream->unit);\r
+                                       return;\r
+                               }\r
+\r
+                               val = (char*) calloc((size_t)(end - p) + 1, sizeof(char));\r
+\r
+                               strncpy(val, p,(end - p));\r
+\r
+                               sprintf(exp, "${%s:?%s}", variable->name, val);\r
+                               \r
+                               if(variable->val)\r
+                                       str_replace_all(&line2, exp, variable->val, NULL);\r
+                               else\r
+                               {\r
+\r
+                                       xbt_os_mutex_release(unit->mutex);      \r
 \r
+                                       ERROR2("[%s] %s.",filepos, val);\r
+\r
+                                       unit_set_error(fstream->unit, ESYNTAX, 1, filepos);\r
+                                       failure(fstream->unit);\r
+                                       return;\r
+                               }\r
+                               \r
+                               memset(exp, 0, VAR_NAME_MAX + 1);\r
+                               \r
+                               if(val)\r
+                               {\r
+                                       free(val);\r
+                                       val = NULL;\r
+                               }\r
+                       }\r
+               }\r
+       }\r
+\r
+       /* replace all existing $var */\r
        xbt_dynar_foreach(variables, i, variable)\r
        {\r
-               sprintf(name, "$%s", variable->name);\r
-               str_replace_all(&line2, name, variable->val);\r
-               memset(name, 0, VAR_NAME_MAX + 1);\r
+               if(!strchr(line2 + 2, '$'))\r
+                       break;\r
+\r
+               if(strstr(line2 + 2, variable->name))\r
+               {\r
+\r
+                       sprintf(exp, "${#%s}", variable->name);\r
+                       \r
+                       if(strstr(line2 + 2, exp))\r
+                       {\r
+\r
+                               if(variable->val)\r
+                               {\r
+                                       char slen[4] = {0};\r
+                                       sprintf(slen,"%d", (int)strlen(variable->val));\r
+                                       str_replace_all(&line2, exp, slen, NULL);\r
+                               }\r
+                               else\r
+                                       str_replace_all(&line2, exp, "0", NULL);\r
+                       }\r
+\r
+                       memset(exp, 0, VAR_NAME_MAX + 1);\r
+\r
+                       sprintf(exp, "${%s}", variable->name);\r
+\r
+                       if(strstr(line2 + 2, exp))\r
+                       {\r
+                               if(variable->val)\r
+                                       str_replace_all(&line2, exp, variable->val, NULL);\r
+                               else\r
+                                       str_replace_all(&line2, exp, NULL, NULL);\r
+                       }\r
+\r
+                       memset(exp, 0, VAR_NAME_MAX + 1);\r
+\r
+                       sprintf(exp, "$%s", variable->name);\r
+                       \r
+                       if((p = strstr(line2 + 2, exp)))\r
+                       {\r
+                               if((p + strlen(variable->name) + 1)[0] != '\0' && !(isalpha((p + strlen(variable->name) + 1)[0])))\r
+                                       delimiters[0] = (p + strlen(variable->name) + 1)[0];\r
+\r
+                               if(variable->val)\r
+                                       str_replace_all(&line2, exp, variable->val,  delimiters);\r
+                               else\r
+                                       str_replace_all(&line2, exp, NULL, delimiters);\r
+                       }\r
+\r
+                       memset(exp, 0, VAR_NAME_MAX + 1);\r
+\r
+               }\r
+       }\r
+\r
+       while((p = strstr(line2 + 2, "${")))\r
+       {\r
+               /*if(*(p+1) != '{')\r
+               {\r
+                       j = 0;\r
+                       p --;\r
+\r
+                       while(*(p++) != '\0')\r
+                       {\r
+                               if(*p != ' ' && *p !='\t')\r
+                                       exp[j++] = *p;\r
+                               else\r
+                                       break;\r
+\r
+                       }\r
+                       \r
+                       str_replace_all(&line2, exp, NULL, " \t\n\r");\r
+                       memset(exp, 0, VAR_NAME_MAX + 1);\r
+               }.\r
+               else\r
+               */\r
+               {\r
+                       char* begin = NULL;\r
+                       \r
+                       j = 0;\r
+                       p --;\r
+\r
+                       while(*(p++) != '\0')\r
+                       {\r
+                               if((!begin && *p != ' ' && *p !='\t') || begin)\r
+                               {\r
+                                       /* `:' must be before this caracter, bad substitution : exit loop \r
+                                           ||\r
+                                               the current character is already present, bad substitution : exit loop\r
+                                               */\r
+                                       if(\r
+                                                       (\r
+                                                               *(p - 1) != ':' && (\r
+                                                                                                               (*p == '=') || (*p == '-') || (*p == '+') || (*p == '?')\r
+                                                                                                       )\r
+                                                       )\r
+                                               || \r
+                                                       (\r
+                                                               begin &&        (\r
+                                                                                               (*p == ':') || (*p == '=') || (*p == '-') || (*p == '+') || (*p == '?')\r
+                                                                                       )\r
+                                                       )\r
+                                               )\r
+                                               break;\r
+                                       else\r
+                                               exp[j++] = *p;\r
+\r
+                                       if(*p == ':')\r
+                                       {\r
+                                               /* save the begining of the value */\r
+                                               if((*(p+1) == '=') || (*(p+1) == '-') || (*(p+1) == '+') || (*(p+1) == '?'))\r
+                                               {\r
+                                                       begin = p + 2;\r
+                                                       exp[j++] = *(p+1);\r
+                                                       p++;\r
+                                                       continue;\r
+\r
+                                               }\r
+                                               else\r
+                                               /* the current char is `:' but the next is invalid, bad substitution : exit loop */\r
+                                                       break;\r
+                                       }\r
+                                       /* end of the substitution : exit loop */\r
+                                       else if(*p == '}')\r
+                                               break;\r
+                               }\r
+                               else\r
+                                       break;\r
+                       }\r
+                       \r
+                       if(exp[j - 1] == '}')\r
+                       {\r
+                               if(exp[2] == '#')\r
+                               {\r
+                                       /* ${#var} */\r
+\r
+\r
+                                       if(4 == strlen(exp))\r
+                                       {\r
+                                               xbt_os_mutex_release(unit->mutex);      \r
+                                       \r
+                                               ERROR2("[%s] Bad substitution : `%s'.",filepos, strchr(line2 + 2, '$'));\r
+                                       \r
+                                               unit_set_error(fstream->unit, ESYNTAX, 1, filepos);\r
+                                               failure(fstream->unit);\r
+                                               return;\r
+                                       }\r
+                                       \r
+                                       str_replace_all(&line2, exp, "0", NULL);        \r
+                               }\r
+                               else if(strstr(exp,":="))\r
+                               {\r
+                                       /* ${var:=value} */     \r
+                                       \r
+                                       end = strchr(p, '}');\r
+\r
+                                       if(!end || (end == begin))\r
+                                       {\r
+                                               xbt_os_mutex_release(unit->mutex);      \r
+                                       \r
+                                       \r
+                                               ERROR2("[%s] Bad substitution : `%s'.",filepos, strchr(line2 + 2, '$'));\r
+                                       \r
+                                               unit_set_error(fstream->unit, ESYNTAX, 1, filepos);\r
+                                               failure(fstream->unit);\r
+                                               return;\r
+                                       }\r
+\r
+                                       variable = xbt_new0(s_variable_t, 1);\r
+\r
+                                       variable->val = (char*) calloc((size_t)(end - begin) + 1, sizeof(char));\r
+\r
+                                       strncpy(variable->val, begin ,(end - begin));\r
+\r
+                                       begin = exp + 2;\r
+                                       end = strchr(exp, ':');\r
+\r
+                                       if(!end || (end == begin))\r
+                                       {\r
+                                               xbt_os_mutex_release(unit->mutex);      \r
+                                       \r
+                                       \r
+                                               ERROR2("[%s] Bad substitution : `%s'.",filepos, strchr(line2 + 2, '$'));\r
+                                       \r
+                                               unit_set_error(fstream->unit, ESYNTAX, 1, filepos);\r
+                                               failure(fstream->unit);\r
+                                               return;\r
+                                       }\r
+\r
+                                       variable->name = (char*) calloc((size_t)(end - begin) + 1, sizeof(char));\r
+\r
+                                       strncpy(variable->name, exp + 2 ,(end - begin));\r
+\r
+                                       str_replace_all(&line2, exp, variable->val, NULL);\r
+\r
+                                       xbt_dynar_push(variables, &variable);\r
+\r
+                               }\r
+                               else if(strstr(exp,":-"))\r
+                               {\r
+                                       /* ${var:-value} */     \r
+\r
+                                       \r
+                                       end = strchr(p, '}');\r
+\r
+                                       if(!end || (end == begin))\r
+                                       {\r
+                                               xbt_os_mutex_release(unit->mutex);      \r
+                                       \r
+                                       \r
+                                               ERROR2("[%s] Bad substitution : `%s'.",filepos, strchr(line2 + 2, '$'));\r
+                                       \r
+                                               unit_set_error(fstream->unit, ESYNTAX, 1, filepos);\r
+                                               failure(fstream->unit);\r
+                                               return;\r
+                                       }\r
+\r
+                                       val = (char*) calloc((size_t)(end - begin) + 1, sizeof(char));\r
+\r
+                                       strncpy(val, begin ,(end - begin));\r
+\r
+                                       str_replace_all(&line2, exp, val, NULL);\r
+\r
+                                       if(val)\r
+                                               free(val);\r
+\r
+                               }\r
+                               else if(strstr(exp,":+"))\r
+                               {\r
+                                       /* ${var:+value} */     \r
+\r
+                                       end = strchr(p, '}');\r
+\r
+                                       if(!end || (end == begin))\r
+                                       {\r
+                                               xbt_os_mutex_release(unit->mutex);      \r
+                                       \r
+                                               ERROR2("[%s] Bad substitution : `%s'.",filepos, strchr(line2 + 2, '$'));\r
+                                       \r
+                                               unit_set_error(fstream->unit, ESYNTAX, 1, filepos);\r
+                                               failure(fstream->unit);\r
+                                               return;\r
+                                       }\r
+\r
+                                       str_replace_all(&line2, exp, NULL, NULL);\r
+                               }\r
+                               else if(strstr(exp,":?"))\r
+                               {\r
+                                       /* ${var:?value} */\r
+                                       \r
+                                       end = strchr(p, '}');\r
+\r
+                                       if(!end || (end == begin))\r
+                                       {\r
+                                               xbt_os_mutex_release(unit->mutex);      \r
+                                       \r
+                                               ERROR2("[%s] Bad substitution : `%s'.",filepos, strchr(line2 + 2, '$'));\r
+                                       \r
+                                               unit_set_error(fstream->unit, ESYNTAX, 1, filepos);\r
+                                               failure(fstream->unit);\r
+                                               return;\r
+                                       }\r
+\r
+                                       val = (char*) calloc((size_t)(end - begin) + 1, sizeof(char));\r
+\r
+                                       strncpy(val, begin ,(end - begin));\r
+\r
+                                       xbt_os_mutex_release(unit->mutex);      \r
+                                       \r
+                                       ERROR2("[%s] : `%s'.",filepos, val);\r
+\r
+                                       if(val)\r
+                                               free(val);\r
+                                       \r
+                                       unit_set_error(fstream->unit, ESYNTAX, 1, filepos);\r
+                                       failure(fstream->unit);\r
+\r
+                                       return;\r
+                                       \r
+                               }\r
+                               else\r
+                               {\r
+                                       /* ${var} */\r
+\r
+                                       if(3 == strlen(exp))\r
+                                       {\r
+                                               xbt_os_mutex_release(unit->mutex);      \r
+                                       \r
+                                               ERROR2("[%s] Bad substitution : `%s'.",filepos, strchr(line2 + 2, '$'));\r
+                                       \r
+                                               unit_set_error(fstream->unit, ESYNTAX, 1, filepos);\r
+                                               failure(fstream->unit);\r
+                                               return;\r
+                                       }\r
+\r
+                                       str_replace_all(&line2, exp, NULL, NULL);\r
+                                       \r
+                               }\r
+\r
+                               memset(exp, 0, VAR_NAME_MAX + 1);\r
+                       }\r
+                       else\r
+                       {\r
+                               xbt_os_mutex_release(unit->mutex);      \r
+                               \r
+                               if(strstr(line2 + 2, "${"))\r
+                                       ERROR2("[%s] Bad substitution : `%s'.",filepos, strstr(line2, "${"));\r
+                               else\r
+                                       ERROR2("[%s] Syntax error : `%s'.",filepos, strstr(line2, "${"));\r
+\r
+                               unit_set_error(fstream->unit, ESYNTAX, 1, filepos);\r
+                               failure(fstream->unit);\r
+                               return;\r
+                       }\r
+\r
+               }\r
+               \r
        }\r
        \r
-       xbt_os_mutex_release(unit->mutex);\r
+       while(1)\r
+       {\r
+               p = line2 + (line2[0] =='<' ? 4 : 2);\r
+               \r
+               if((p = strchr(p, '$')))\r
+               {\r
+                       if(*(p+1) != ' ')\r
+                       {\r
+                               j = 0;\r
+                               p --;\r
 \r
+                               while(*(p++) != '\0')\r
+                               {\r
+                                       if(*p != ' ' && *p !='\t')\r
+                                               exp[j++] = *p;\r
+                                       else\r
+                                               break;\r
+\r
+                               }\r
+                               \r
+                               str_replace_all(&line2, exp, NULL, " \t\n\r");\r
+                               memset(exp, 0, VAR_NAME_MAX + 1);\r
+                       }\r
+                       else\r
+                       {\r
+                               /* maybe < $ cmd */\r
+                               p++;\r
+                       }\r
+               }\r
+               else\r
+                       break;\r
+       }\r
+\r
+       xbt_os_mutex_release(unit->mutex);      \r
        \r
        switch(line2[0]) \r
        {\r
-               case '#': \r
+               /*case '#': \r
                break;\r
+               */\r
                \r
                case '$':\r
                case '&':\r
@@ -418,7 +1055,7 @@ fstream_lex_line(fstream_t fstream, context_t context, xbt_os_mutex_t mutex, con
                        else\r
                                ERROR1("[%s] Missing space after & `(usage : & <command>)'", filepos);\r
                \r
-                       unit_set_error(fstream->unit, ESYNTAX, 1);\r
+                       unit_set_error(fstream->unit, ESYNTAX, 1, filepos);\r
 \r
                        failure(unit);\r
                        return;\r
@@ -456,7 +1093,7 @@ fstream_lex_line(fstream_t fstream, context_t context, xbt_os_mutex_t mutex, con
                                        if(chdir(dir))\r
                                        {\r
                                                ERROR3("[%s] Chdir to %s failed: %s",filepos, dir,error_to_string(errno, 0));\r
-                                               unit_set_error(fstream->unit, errno, 0);\r
+                                               unit_set_error(fstream->unit, errno, 0, filepos);\r
 \r
                                                failure(unit);\r
                                        }\r
@@ -479,7 +1116,7 @@ fstream_lex_line(fstream_t fstream, context_t context, xbt_os_mutex_t mutex, con
                {\r
                        ERROR1("[%s] Missing space after `!' `(usage : ! <command> [[=]value])'", filepos);\r
                \r
-                       unit_set_error(fstream->unit, ESYNTAX, 1);\r
+                       unit_set_error(fstream->unit, ESYNTAX, 1, filepos);\r
 \r
                        failure(unit);\r
                        return;\r
@@ -496,15 +1133,20 @@ fstream_lex_line(fstream_t fstream, context_t context, xbt_os_mutex_t mutex, con
                        \r
                        char* prompt = line2 + 2;\r
 \r
-                       for(j = 0; j < strlen(prompt); j++) \r
+                       for(j = 0; j < strlen(prompt); j++)\r
+                       {\r
                                if (prompt[j] != ' ' && prompt[j] != '\t')\r
+                               {\r
                                        is_blank = 0;\r
+                                       break;\r
+                               }\r
+                       }\r
 \r
                        if(is_blank)\r
                        {\r
                                ERROR1("[%s] Bad usage of the metacommand p `(usage : p <prompt>)'", filepos);\r
                                \r
-                               unit_set_error(fstream->unit, ESYNTAX, 1);\r
+                               unit_set_error(fstream->unit, ESYNTAX, 1, filepos);\r
 \r
                                failure(unit);\r
                                return;\r
@@ -533,7 +1175,7 @@ fstream_lex_line(fstream_t fstream, context_t context, xbt_os_mutex_t mutex, con
                        {\r
                                ERROR1("[%s] Bad usage of the metacommand P `(usage : P <prompt>)'", filepos);\r
                                \r
-                               unit_set_error(fstream->unit, ESYNTAX, 1);\r
+                               unit_set_error(fstream->unit, ESYNTAX, 1, filepos);\r
 \r
                                failure(unit);\r
                                return;\r
@@ -563,7 +1205,7 @@ fstream_lex_line(fstream_t fstream, context_t context, xbt_os_mutex_t mutex, con
                                {\r
                                        ERROR1("[%s] Bad usage of the metacommand D `(usage : D <Description>)'", filepos);\r
                                        \r
-                                       unit_set_error(fstream->unit, ESYNTAX, 1);\r
+                                       unit_set_error(fstream->unit, ESYNTAX, 1, filepos);\r
 \r
                                        failure(unit);\r
                                        return;\r
@@ -575,7 +1217,7 @@ fstream_lex_line(fstream_t fstream, context_t context, xbt_os_mutex_t mutex, con
                \r
                default:\r
                ERROR2("[%s] Syntax error `%s'", filepos, line2);\r
-               unit_set_error(fstream->unit, ESYNTAX, 1);\r
+               unit_set_error(fstream->unit, ESYNTAX, 1, filepos);\r
                failure(unit);\r
                break;\r
        }\r
@@ -600,7 +1242,7 @@ fstream_process_token(fstream_t fstream, context_t context, xbt_os_mutex_t mutex
                        {\r
                                ERROR2("[%s] More than one command in this chunk of lines (previous: %s).\nDunno which input/output belongs to which command.",filepos, context->command_line);\r
 \r
-                               unit_set_error(fstream->unit, ESYNTAX, 1);\r
+                               unit_set_error(fstream->unit, ESYNTAX, 1, filepos);\r
                                failure(unit);\r
                                return;\r
                        }\r
@@ -626,7 +1268,7 @@ fstream_process_token(fstream_t fstream, context_t context, xbt_os_mutex_t mutex
                                else\r
                                ERROR1("[%s] Undefinite command for `&' `(usage: & <command>)'", filepos);\r
 \r
-                               unit_set_error(fstream->unit, ESYNTAX, 1);\r
+                               unit_set_error(fstream->unit, ESYNTAX, 1, filepos);\r
 \r
                                failure(unit);\r
                                return;\r
@@ -634,8 +1276,121 @@ fstream_process_token(fstream_t fstream, context_t context, xbt_os_mutex_t mutex
                }\r
                \r
                context->command_line = strdup(line);\r
+\r
+               xbt_str_ltrim(context->command_line," ");\r
+               \r
                context->line = /*strdup(filepos)*/ filepos;\r
                context->pos = strdup(filepos);\r
+               \r
+               #ifdef _XBT_WIN32\r
+               {\r
+\r
+               /* translate the command line */\r
+\r
+               char* path = NULL;\r
+               char* delimiter;\r
+               char command_line[PATH_MAX + 1] = {0};\r
+               size_t i = 0;\r
+               char* args = NULL;\r
+\r
+               \r
+\r
+               /*if(strstr(context->command_line,".exe"))\r
+                       strcpy(command_line,context->command_line);*/\r
+               \r
+               {\r
+                       size_t len;\r
+                       \r
+                       size_t j = 0;\r
+       \r
+                       len = strlen(context->command_line);\r
+                       \r
+                       while(i < len)\r
+                       {\r
+                               if(context->command_line[i] != ' ' && context->command_line[i] != '\t' && context->command_line[i] != '>')\r
+                                       command_line[j++] = context->command_line[i];\r
+                               else\r
+                                       break;\r
+                                       \r
+                               i++;\r
+                       }\r
+                       \r
+                       if(!strstr(context->command_line,".exe"))\r
+                               strcat(command_line,".exe");\r
+\r
+                       args = strdup(context->command_line + i);\r
+               }\r
+               \r
+               if(!is_w32_cmd(command_line, fstream->unit->runner->path) && getpath(command_line, &path) < 0)\r
+               {\r
+                       command_t command;\r
+\r
+                       ERROR3("[%s] `%s' : NOK (%s)", filepos, command_line, error_to_string(ECMDNOTFOUND, 1));\r
+                       unit_set_error(fstream->unit, ECMDNOTFOUND, 1, filepos);\r
+\r
+                       context->is_not_found = 1;\r
+                       \r
+                       command = command_new(fstream->unit, context, mutex);\r
+\r
+                       command->status = cs_failed;\r
+                       command->reason = csr_command_not_found;\r
+\r
+                       failure(unit);\r
+                       \r
+                       \r
+                       return;\r
+               }\r
+               \r
+               delimiter = strrchr(command_line,'/');\r
+\r
+               if(!delimiter)\r
+                       delimiter = strrchr(command_line,'\\');\r
+               \r
+               /*free(context->command_line);*/\r
+               \r
+               \r
+               if(path)\r
+               {\r
+                       if(args)\r
+                       {\r
+                               context->t_command_line = (char*)calloc(strlen(path) + strlen(delimiter ? delimiter + 1 : command_line) + strlen(args) + 2, sizeof(char));\r
+                               sprintf(context->t_command_line,"%s\\%s%s",path,delimiter ? delimiter + 1 : command_line, args);\r
+\r
+                               free(args);\r
+\r
+                       }\r
+                       else\r
+                       {\r
+                               context->t_command_line = (char*)calloc(strlen(path) + strlen(delimiter ? delimiter + 1 : command_line) + 2, sizeof(char));\r
+                               sprintf(context->t_command_line,"%s\\%s",path,delimiter ? delimiter + 1 : command_line);\r
+                       }\r
+               \r
+                       free(path);\r
+               }\r
+               else\r
+               {\r
+                       if(args)\r
+                       {\r
+\r
+                               context->t_command_line = (char*)calloc(strlen(command_line) + strlen(args) + 1, sizeof(char));\r
+                               sprintf(context->t_command_line,"%s%s",command_line, args);\r
+\r
+                       \r
+                               free(args);\r
+\r
+                       }\r
+                       else\r
+                       {\r
+                               context->t_command_line = (char*)calloc(strlen(command_line) + 1, sizeof(char));\r
+                               strcpy(context->t_command_line,command_line);\r
+                       }\r
+               }\r
+\r
+\r
+               }\r
+               #endif\r
+\r
+\r
                break;\r
                \r
                case '<':\r
@@ -677,7 +1432,7 @@ fstream_process_token(fstream_t fstream, context_t context, xbt_os_mutex_t mutex
                        {\r
                                ERROR1("[%s] Undefinite timeout value `(usage :timeout <seconds>)'", filepos);\r
                                \r
-                               unit_set_error(fstream->unit, ESYNTAX, 1);\r
+                               unit_set_error(fstream->unit, ESYNTAX, 1, filepos);\r
 \r
                                failure(unit);\r
                                return;\r
@@ -689,7 +1444,7 @@ fstream_process_token(fstream_t fstream, context_t context, xbt_os_mutex_t mutex
                                {\r
                                        ERROR2("[%s] Invalid timeout value `(%s)' : `(usage :timeout <seconds>)'", filepos, line + strlen("timeout "));\r
 \r
-                                       unit_set_error(fstream->unit, ESYNTAX, 1);\r
+                                       unit_set_error(fstream->unit, ESYNTAX, 1, filepos);\r
  \r
                                        failure(unit);\r
                                        return;\r
@@ -719,7 +1474,7 @@ fstream_process_token(fstream_t fstream, context_t context, xbt_os_mutex_t mutex
                        {\r
                                ERROR1("[%s] Undefinite signal name `(usage :expect signal <signal name>)'", filepos);\r
                                \r
-                               unit_set_error(fstream->unit, ESYNTAX, 1);\r
+                               unit_set_error(fstream->unit, ESYNTAX, 1, filepos);\r
 \r
                                failure(unit);\r
                                return;\r
@@ -729,12 +1484,12 @@ fstream_process_token(fstream_t fstream, context_t context, xbt_os_mutex_t mutex
                        \r
                        xbt_str_trim(context->signal," \n");\r
 \r
-                       #ifdef WIN32\r
+                       #ifdef _XBT_WIN32\r
                        if(!strstr("SIGSEGVSIGTRAPSIGBUSSIGFPESIGILL", context->signal))\r
                        {\r
                                ERROR2("[%s] Signal `%s' not supported by this platform", filepos, context->signal);\r
 \r
-                               unit_set_error(fstream->unit, ESYNTAX, 1);\r
+                               unit_set_error(fstream->unit, ESYNTAX, 1, filepos);\r
 \r
 \r
                                failure(unit);\r
@@ -745,7 +1500,7 @@ fstream_process_token(fstream_t fstream, context_t context, xbt_os_mutex_t mutex
                        {\r
                                ERROR2("[%s] Signal `%s' not supported by Tesh", filepos, context->signal);\r
                                \r
-                               unit_set_error(fstream->unit, ESYNTAX, 1);\r
+                               unit_set_error(fstream->unit, ESYNTAX, 1, filepos);\r
 \r
 \r
                                failure(unit);\r
@@ -775,7 +1530,7 @@ fstream_process_token(fstream_t fstream, context_t context, xbt_os_mutex_t mutex
                        {\r
                                ERROR1("[%s] Undefinite return value `(usage :expect return <return value>)'", filepos);\r
                                \r
-                               unit_set_error(fstream->unit, ESYNTAX, 1);\r
+                               unit_set_error(fstream->unit, ESYNTAX, 1, filepos);\r
 \r
                                failure(unit);\r
                                return;\r
@@ -787,7 +1542,7 @@ fstream_process_token(fstream_t fstream, context_t context, xbt_os_mutex_t mutex
                                {\r
                                        ERROR2("[%s] Invalid exit code value `(%s)' : must be an integer >= 0 and <=255",  filepos, line + strlen("expect return "));\r
 \r
-                                       unit_set_error(fstream->unit, ESYNTAX, 1);\r
+                                       unit_set_error(fstream->unit, ESYNTAX, 1, filepos);\r
 \r
                                        failure(unit);\r
                                        return;\r
@@ -827,7 +1582,7 @@ fstream_process_token(fstream_t fstream, context_t context, xbt_os_mutex_t mutex
                        {\r
                                ERROR1("[%s] no file specified : `(usage : include <file> [<description>])'", filepos);\r
 \r
-                               unit_set_error(fstream->unit, ESYNTAX, 1);\r
+                               unit_set_error(fstream->unit, ESYNTAX, 1, filepos);\r
 \r
                                failure(unit);\r
                                return;\r
@@ -867,7 +1622,7 @@ fstream_process_token(fstream_t fstream, context_t context, xbt_os_mutex_t mutex
                        {\r
                                ERROR1("[%s] Undefinite suit description : `(usage : suite <description>)", filepos);\r
 \r
-                               unit_set_error(fstream->unit, ESYNTAX, 1);\r
+                               unit_set_error(fstream->unit, ESYNTAX, 1, filepos);\r
 \r
                                failure(unit);\r
                                return;\r
@@ -877,7 +1632,7 @@ fstream_process_token(fstream_t fstream, context_t context, xbt_os_mutex_t mutex
                        {\r
                                ERROR1("[%s] Suite already in progress", filepos);\r
 \r
-                               unit_set_error(fstream->unit, ESYNTAX, 1);\r
+                               unit_set_error(fstream->unit, ESYNTAX, 1, filepos);\r
 \r
                                failure(unit);\r
                                return;\r
@@ -906,7 +1661,7 @@ fstream_process_token(fstream_t fstream, context_t context, xbt_os_mutex_t mutex
                        {\r
                                ERROR1("[%s] Bad usage of the metacommand unsetenv : `(usage : unsetenv variable)'", filepos);\r
                                \r
-                               unit_set_error(fstream->unit, ESYNTAX, 1);\r
+                               unit_set_error(fstream->unit, ESYNTAX, 1, filepos);\r
 \r
                                failure(unit);\r
                                return;\r
@@ -930,7 +1685,7 @@ fstream_process_token(fstream_t fstream, context_t context, xbt_os_mutex_t mutex
                        {\r
                                if(exists)\r
                                {\r
-                                       #ifndef WIN32\r
+                                       #ifndef _XBT_WIN32\r
                                        unsetenv(name);\r
                                        #else\r
                                        SetEnvironmentVariable(name, NULL);\r
@@ -940,7 +1695,7 @@ fstream_process_token(fstream_t fstream, context_t context, xbt_os_mutex_t mutex
                                else\r
                                {\r
                                        ERROR2("[%s] `(%s)' environment variable not found : impossible to unset it",filepos, name);    \r
-                                       unit_set_error(fstream->unit, ESYNTAX, 1);\r
+                                       unit_set_error(fstream->unit, ESYNTAX, 1, filepos);\r
                                        xbt_os_mutex_release(unit->mutex);\r
                                        failure(unit);\r
                                        return;\r
@@ -953,7 +1708,7 @@ fstream_process_token(fstream_t fstream, context_t context, xbt_os_mutex_t mutex
                                        if(!err)\r
                                        {\r
                                                ERROR2("[%s] `(%s)' is not an environment variable : use `unset' instead `unsetenv'",filepos, name);    \r
-                                               unit_set_error(fstream->unit, ESYNTAX, 1);\r
+                                               unit_set_error(fstream->unit, ESYNTAX, 1, filepos);\r
                                                failure(unit);\r
                                                xbt_os_mutex_release(unit->mutex);\r
                                                return;\r
@@ -961,7 +1716,7 @@ fstream_process_token(fstream_t fstream, context_t context, xbt_os_mutex_t mutex
                                        else\r
                                        {\r
                                                ERROR2("[%s] `(%s)' is not an environment variable (it's a system variable) : impossible to unset it",filepos, name);   \r
-                                               unit_set_error(fstream->unit, ESYNTAX, 1);\r
+                                               unit_set_error(fstream->unit, ESYNTAX, 1, filepos);\r
                                                xbt_os_mutex_release(unit->mutex);\r
                                                failure(unit);\r
                                                return;\r
@@ -970,7 +1725,7 @@ fstream_process_token(fstream_t fstream, context_t context, xbt_os_mutex_t mutex
                                else\r
                                {\r
                                        ERROR2("[%s] `(%s)' environment variable not found : impossible to unset it",filepos, name);    \r
-                                       unit_set_error(fstream->unit, ESYNTAX, 1);\r
+                                       unit_set_error(fstream->unit, ESYNTAX, 1, filepos);\r
                                        xbt_os_mutex_release(unit->mutex);\r
                                        failure(unit);\r
                                        return;\r
@@ -1007,7 +1762,7 @@ fstream_process_token(fstream_t fstream, context_t context, xbt_os_mutex_t mutex
                                {\r
                                        ERROR1("[%s] Bad usage of the metacommand setenv `(usage : setenv variable=value)'", filepos);  \r
 \r
-                                       unit_set_error(fstream->unit, ESYNTAX, 1);\r
+                                       unit_set_error(fstream->unit, ESYNTAX, 1, filepos);\r
 \r
                                        failure(unit);\r
                                        return;\r
@@ -1028,7 +1783,7 @@ fstream_process_token(fstream_t fstream, context_t context, xbt_os_mutex_t mutex
                                        \r
                                        ERROR1("[%s] Bad usage of the metacommand setenv `(usage : setenv variable=value)'", filepos);\r
                                        \r
-                                       unit_set_error(fstream->unit, ESYNTAX, 1);\r
+                                       unit_set_error(fstream->unit, ESYNTAX, 1, filepos);\r
 \r
                                        failure(unit);\r
                                        return;\r
@@ -1061,7 +1816,7 @@ fstream_process_token(fstream_t fstream, context_t context, xbt_os_mutex_t mutex
                                                free(variable->val);\r
                                                variable->val = strdup(val);\r
 \r
-                                               #ifdef WIN32\r
+                                               #ifdef _XBT_WIN32\r
                                                SetEnvironmentVariable(variable->name, variable->val);\r
                                                #else\r
                                                setenv(variable->name, variable->val, 1);\r
@@ -1074,7 +1829,7 @@ fstream_process_token(fstream_t fstream, context_t context, xbt_os_mutex_t mutex
                                                else\r
                                                        ERROR2("[%s] Conflict : (none environment) variable `(%s)' already exists", filepos, name);     \r
 \r
-                                               unit_set_error(fstream->unit, ESYNTAX, 1);\r
+                                               unit_set_error(fstream->unit, ESYNTAX, 1, filepos);\r
                                                xbt_os_mutex_release(unit->mutex);\r
                                                failure(unit);\r
                                                return;\r
@@ -1086,7 +1841,7 @@ fstream_process_token(fstream_t fstream, context_t context, xbt_os_mutex_t mutex
                                        {\r
                                                ERROR2("[%s] A system variable named `(%s)' already exists", filepos, name);\r
                                        \r
-                                               unit_set_error(fstream->unit, ESYNTAX, 1);\r
+                                               unit_set_error(fstream->unit, ESYNTAX, 1, filepos);\r
                                                xbt_os_mutex_release(unit->mutex);\r
                                                failure(unit);\r
                                                return;\r
@@ -1098,7 +1853,7 @@ fstream_process_token(fstream_t fstream, context_t context, xbt_os_mutex_t mutex
                                                \r
                                                xbt_dynar_push(unit->runner->variables, &variable);\r
                                                \r
-                                               #ifdef WIN32\r
+                                               #ifdef _XBT_WIN32\r
                                                SetEnvironmentVariable(variable->name, variable->val);\r
                                                #else\r
                                                setenv(variable->name, variable->val, 0);\r
@@ -1113,7 +1868,7 @@ fstream_process_token(fstream_t fstream, context_t context, xbt_os_mutex_t mutex
                        {\r
                                ERROR1("[%s] Bad usage of the metacommand setenv `(usage : setenv variable=value)'", filepos);\r
                                        \r
-                               unit_set_error(fstream->unit, ESYNTAX, 1);\r
+                               unit_set_error(fstream->unit, ESYNTAX, 1, filepos);\r
                                failure(unit);\r
                                return;\r
                        }\r
@@ -1140,7 +1895,7 @@ fstream_process_token(fstream_t fstream, context_t context, xbt_os_mutex_t mutex
                                \r
                                ERROR1("[%s] Bad usage of the metacommand unset `(usage : unset variable)'", filepos);\r
                                \r
-                               unit_set_error(fstream->unit, ESYNTAX, 1);\r
+                               unit_set_error(fstream->unit, ESYNTAX, 1, filepos);\r
 \r
                                failure(unit);\r
                                return;\r
@@ -1163,12 +1918,23 @@ fstream_process_token(fstream_t fstream, context_t context, xbt_os_mutex_t mutex
                        if(!env && !err)\r
                        {\r
                                if(exists)\r
+                               {\r
                                        /*xbt_dynar_remove_at(unit->runner->variables, i, NULL);*/\r
-                                       xbt_dynar_cursor_rm(unit->runner->variables, &i);\r
+                                       /*xbt_dynar_cursor_rm(unit->runner->variables, &i);*/\r
+                                       if(variable->val)\r
+                                       {\r
+                                               free(variable->val);\r
+                                               variable->val = NULL;\r
+                                       }\r
+                                       else\r
+                                       {\r
+                                               WARN2("[%s] Variable `(%s)' already unseted",filepos, variable->name);\r
+                                       }\r
+                               }       \r
                                else\r
                                {\r
                                        ERROR2("[%s] `(%s)' variable not found",filepos, name); \r
-                                       unit_set_error(fstream->unit, ESYNTAX, 1);\r
+                                       unit_set_error(fstream->unit, ESYNTAX, 1, filepos);\r
                                        xbt_os_mutex_release(unit->mutex);\r
                                        failure(unit);\r
                                        return;\r
@@ -1177,7 +1943,7 @@ fstream_process_token(fstream_t fstream, context_t context, xbt_os_mutex_t mutex
                        else if(env)\r
                        {\r
                                ERROR2("[%s] `(%s)' is an environment variable use `unsetenv' instead `unset'",filepos, name);  \r
-                               unit_set_error(fstream->unit, ESYNTAX, 1);\r
+                               unit_set_error(fstream->unit, ESYNTAX, 1, filepos);\r
                                xbt_os_mutex_release(unit->mutex);\r
                                failure(unit);\r
                                return;\r
@@ -1185,7 +1951,7 @@ fstream_process_token(fstream_t fstream, context_t context, xbt_os_mutex_t mutex
                        else if(err)\r
                        {\r
                                ERROR2("[%s] `(%s)' is system variable : you can unset it",filepos, name);      \r
-                               unit_set_error(fstream->unit, ESYNTAX, 1);\r
+                               unit_set_error(fstream->unit, ESYNTAX, 1, filepos);\r
                                xbt_os_mutex_release(unit->mutex);\r
                                failure(unit);\r
                                return;\r
@@ -1219,7 +1985,7 @@ fstream_process_token(fstream_t fstream, context_t context, xbt_os_mutex_t mutex
                                {\r
                                        ERROR1("[%s] Bad usage of the metacommand set `(usage : set variable=value)'", filepos);\r
                                        \r
-                                       unit_set_error(fstream->unit, ESYNTAX, 1);\r
+                                       unit_set_error(fstream->unit, ESYNTAX, 1, filepos);\r
 \r
                                        failure(unit);\r
                                        return;\r
@@ -1230,7 +1996,7 @@ fstream_process_token(fstream_t fstream, context_t context, xbt_os_mutex_t mutex
 \r
                                        ERROR2("[%s] No space avaible after`(%s)'", filepos, name);\r
 \r
-                                       unit_set_error(fstream->unit, ESYNTAX, 1);\r
+                                       unit_set_error(fstream->unit, ESYNTAX, 1, filepos);\r
 \r
                                        failure(unit);\r
                                        return;\r
@@ -1252,7 +2018,7 @@ fstream_process_token(fstream_t fstream, context_t context, xbt_os_mutex_t mutex
                                        \r
                                        ERROR1("[%s] Bad usage of the metacommand set `(usage : set variable=value)'", filepos);\r
                                        \r
-                                       unit_set_error(fstream->unit, ESYNTAX, 1);\r
+                                       unit_set_error(fstream->unit, ESYNTAX, 1, filepos);\r
 \r
                                        failure(unit);\r
                                        return;\r
@@ -1281,7 +2047,7 @@ fstream_process_token(fstream_t fstream, context_t context, xbt_os_mutex_t mutex
                                        {\r
                                                ERROR2("[%s] A system variable named `(%s)' already exists", filepos, name);\r
                                        \r
-                                               unit_set_error(fstream->unit, ESYNTAX, 1);\r
+                                               unit_set_error(fstream->unit, ESYNTAX, 1, filepos);\r
                                                xbt_os_mutex_release(unit->mutex);\r
 \r
                                                failure(unit);\r
@@ -1291,7 +2057,7 @@ fstream_process_token(fstream_t fstream, context_t context, xbt_os_mutex_t mutex
                                        {\r
                                                ERROR2("[%s] `(%s)' is an environment variable use `setenv' instead `set'", filepos, name);\r
                                        \r
-                                               unit_set_error(fstream->unit, ESYNTAX, 1);\r
+                                               unit_set_error(fstream->unit, ESYNTAX, 1, filepos);\r
                                                xbt_os_mutex_release(unit->mutex);\r
 \r
                                                failure(unit);\r
@@ -1319,7 +2085,7 @@ fstream_process_token(fstream_t fstream, context_t context, xbt_os_mutex_t mutex
                        {\r
                                ERROR1("[%s] Bad usage of the metacommand set `(usage : set variable=value)'", filepos);\r
                                        \r
-                               unit_set_error(fstream->unit, ESYNTAX, 1);\r
+                               unit_set_error(fstream->unit, ESYNTAX, 1, filepos);\r
                                failure(unit);\r
                                return;\r
                        }\r
@@ -1362,7 +2128,7 @@ fstream_process_token(fstream_t fstream, context_t context, xbt_os_mutex_t mutex
                                        else\r
                                                ERROR2("[%s] Undefined variable `(%s)'", filepos, name);\r
 \r
-                                       unit_set_error(fstream->unit, ESYNTAX, 1);\r
+                                       unit_set_error(fstream->unit, ESYNTAX, 1, filepos);\r
 \r
                                        failure(unit);\r
                                        return;\r
@@ -1373,7 +2139,7 @@ fstream_process_token(fstream_t fstream, context_t context, xbt_os_mutex_t mutex
 \r
                                        ERROR2("[%s] No space avaible after`(%s)'", filepos, name);\r
 \r
-                                       unit_set_error(fstream->unit, ESYNTAX, 1);\r
+                                       unit_set_error(fstream->unit, ESYNTAX, 1, filepos);\r
 \r
                                        failure(unit);   \r
                                }\r
@@ -1394,7 +2160,7 @@ fstream_process_token(fstream_t fstream, context_t context, xbt_os_mutex_t mutex
                                        \r
                                        ERROR1("[%s] Bad usage of Tesh variable capability `(usage : variable=value)'", filepos);\r
 \r
-                                       unit_set_error(fstream->unit, ESYNTAX, 1);\r
+                                       unit_set_error(fstream->unit, ESYNTAX, 1, filepos);\r
 \r
                                        failure(unit);\r
                                        return;\r
@@ -1404,7 +2170,7 @@ fstream_process_token(fstream_t fstream, context_t context, xbt_os_mutex_t mutex
                                {\r
                                        ERROR1("[%s] Bad usage of the metacommand set `(usage : set variable=value)'", filepos);\r
                                        \r
-                                       unit_set_error(fstream->unit, ESYNTAX, 1);\r
+                                       unit_set_error(fstream->unit, ESYNTAX, 1, filepos);\r
                                        failure(unit);\r
                                        return;\r
                                }\r
@@ -1412,7 +2178,7 @@ fstream_process_token(fstream_t fstream, context_t context, xbt_os_mutex_t mutex
                                {\r
                                        ERROR1("[%s] Bad usage of the metacommand setenv `(usage : setenv variable=value)'", filepos);\r
                                        \r
-                                       unit_set_error(fstream->unit, ESYNTAX, 1);\r
+                                       unit_set_error(fstream->unit, ESYNTAX, 1, filepos);\r
                                        failure(unit);\r
                                        return;\r
                                }\r
@@ -1440,7 +2206,7 @@ fstream_process_token(fstream_t fstream, context_t context, xbt_os_mutex_t mutex
                                        {\r
                                                ERROR2("[%s] A system variable named `(%s)' already exists", filepos, name);\r
                                        \r
-                                               unit_set_error(fstream->unit, ESYNTAX, 1);\r
+                                               unit_set_error(fstream->unit, ESYNTAX, 1, filepos);\r
                                                xbt_os_mutex_release(unit->mutex);\r
                                                failure(unit);\r
                                                return;\r
@@ -1449,7 +2215,7 @@ fstream_process_token(fstream_t fstream, context_t context, xbt_os_mutex_t mutex
                                        {\r
                                                ERROR2("[%s] `(%s)' is an environment variable use `setenv' metacommand", filepos, name);\r
                                        \r
-                                               unit_set_error(fstream->unit, ESYNTAX, 1);\r
+                                               unit_set_error(fstream->unit, ESYNTAX, 1, filepos);\r
                                                xbt_os_mutex_release(unit->mutex);\r
 \r
                                                failure(unit);\r
@@ -1497,7 +2263,7 @@ fstream_process_token(fstream_t fstream, context_t context, xbt_os_mutex_t mutex
                                else\r
                                        ERROR2("[%s] Unknown metacommand: `%s'",filepos,line);\r
 \r
-                               unit_set_error(fstream->unit, ESYNTAX, 1);\r
+                               unit_set_error(fstream->unit, ESYNTAX, 1, filepos);\r
 \r
                                failure(unit);\r
                                return;\r
@@ -1555,7 +2321,6 @@ fstream_handle_include(fstream_t fstream, context_t context, xbt_os_mutex_t mute
                }\r
                else\r
                {\r
-\r
                        /* may be a variable */\r
                        variable_t variable;\r
                        int exists = 0;\r
@@ -1576,9 +2341,11 @@ fstream_handle_include(fstream_t fstream, context_t context, xbt_os_mutex_t mute
                                ERROR2("[%s] Include file `(%s)' not found",context->line, file_name);\r
                }\r
                \r
-               unit_set_error(fstream->unit, EINCLUDENOTFOUND, 1);\r
+               unit_set_error(fstream->unit, EINCLUDENOTFOUND, 1, context->line);\r
 \r
-               failure(unit);\r
+               failure(fstream->unit);\r
+\r
+               return;\r
        }\r
        else\r
        {\r
@@ -1594,7 +2361,13 @@ fstream_handle_include(fstream_t fstream, context_t context, xbt_os_mutex_t mute
                        xbt_dynar_push(unit->includes, &include);\r
                 \r
                        if(!dry_run_flag)\r
-                               INFO1("Include from %s", _fstream->name);\r
+                       {\r
+                               if(description)\r
+                                       INFO2("Include from %s (%s)", _fstream->name, description);\r
+                               else\r
+                                       INFO1("Include from %s", _fstream->name);\r
+\r
+                       }\r
                        else\r
                                INFO1("Checking include %s...",_fstream->name);\r
                        \r
@@ -1618,7 +2391,12 @@ fstream_handle_include(fstream_t fstream, context_t context, xbt_os_mutex_t mute
                        xbt_dynar_push((*owner)->includes, &include);\r
                        \r
                        if(!dry_run_flag)\r
-                               INFO1("Include from %s", _fstream->name);\r
+                       {\r
+                               if(description)\r
+                                       INFO2("Include from %s (%s)", _fstream->name, description);\r
+                               else\r
+                                       INFO1("Include from %s", _fstream->name);\r
+                       }\r
                        else\r
                                INFO1("Checking include %s...",_fstream->name);\r
                        \r
@@ -1663,7 +2441,7 @@ fstream_launch_command(fstream_t fstream, context_t context, xbt_os_mutex_t mute
                        {\r
                                ERROR3("[%s] Cannot instantiate the command `%s' (%d)",context->pos, strerror(errno), errno);   \r
 \r
-                               unit_set_error(unit, errno, 0);\r
+                               unit_set_error(unit, errno, 0, context->pos);\r
                                failure(unit);\r
                                return -1;\r
                        }\r
@@ -1671,7 +2449,7 @@ fstream_launch_command(fstream_t fstream, context_t context, xbt_os_mutex_t mute
                        {\r
                                ERROR3("[%s] Cannot instantiate the command `%s' (%d)",context->pos, strerror(errno), errno);\r
 \r
-                               unit_set_error(unit, errno, 0);\r
+                               unit_set_error(unit, errno, 0, context->pos);\r
 \r
                                failure(unit);\r
                                return -1;\r
@@ -1681,7 +2459,7 @@ fstream_launch_command(fstream_t fstream, context_t context, xbt_os_mutex_t mute
                if(command_run(command) < 0)\r
                {\r
                        ERROR3("[%s] Cannot run the command `%s' (%d)",context->pos, strerror(errno), errno);   \r
-                       unit_set_error(unit, errno, 0);\r
+                       unit_set_error(unit, errno, 0, context->pos);\r
                        failure(unit);\r
                        return -1;      \r
                }\r
@@ -1691,7 +2469,7 @@ fstream_launch_command(fstream_t fstream, context_t context, xbt_os_mutex_t mute
        {\r
                ERROR3("[%s] Cannot reset the context of the command `%s' (%d)",context->pos, strerror(errno), errno);  \r
 \r
-               unit_set_error(fstream->unit, errno, 0);\r
+               unit_set_error(fstream->unit, errno, 0, context->pos);\r
 \r
                failure(unit);\r
                return -1;      \r