+ 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