#include <readline.h>\r
\r
#include <is_cmd.h>\r
+#include <getpath.h>\r
\r
#ifndef WIN32\r
#include <xsignal.h>\r
#endif\r
\r
+#ifdef 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
#endif\r
\r
if(!(fstream->stream = fopen(path, "r")))\r
+ {\r
return -1;\r
+ }\r
\r
return 0;\r
}\r
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
{\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
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
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')\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
+ p = line2 + 2;\r
\r
- xbt_os_mutex_release(unit->mutex);\r
+ while(p && 1)\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
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
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
{\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
\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
{\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
{\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
\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
{\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
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
}\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 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
+ ERROR3("[%s] `%s' : NOK (%s)", filepos, command_line, error_to_string(ECMDNOTFOUND, 1));\r
+ unit_set_error(fstream->unit, ECMDNOTFOUND, 1, filepos);\r
+ failure(unit);\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
{\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
{\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
{\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
{\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
{\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
{\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
{\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
{\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
{\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
{\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
{\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
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
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
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
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
{\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
\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
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
{\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
{\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
\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
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
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
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
{\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
\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
\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
{\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
{\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
{\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
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
\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
\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
{\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
{\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
{\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
{\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
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
}\r
else\r
{\r
-\r
/* may be a variable */\r
variable_t variable;\r
int exists = 0;\r
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
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
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
{\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
{\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
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
{\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