private static void SeparateCommandsAndArguments(Expression Expression, out string Command, out string ArgumentSequence, System.Globalization.CultureInfo Culture, bool RaiseErrors) {
bool openingerror = false, closingerror = false;
int i, fcb = 0;
for (i = 0; i < Expression.Text.Length; i++) {
if (Expression.Text[i] == '(') {
bool found = false;
bool stationName = false;
bool replaced = false;
i++;
while (i < Expression.Text.Length) {
if (Expression.Text[i] == ',' || Expression.Text[i] == ';')
{
//Only check parenthesis in the station name field- The comma and semi-colon are the argument separators
stationName = true;
}
if (Expression.Text[i] == '(') {
if (RaiseErrors & !openingerror) {
if (stationName)
{
Interface.AddMessage(Interface.MessageType.Error, false, "Invalid opening parenthesis encountered at line " + Expression.Line.ToString(Culture) + ", column " +
Expression.Column.ToString(Culture) + " in file " + Expression.File);
openingerror = true;
}
else
{
Expression.Text = Expression.Text.Remove(i,1).Insert(i,"[");
replaced = true;
}
}
} else if (Expression.Text[i] == ')') {
if (stationName == false && i != Expression.Text.Length && replaced == true)
{
Expression.Text = Expression.Text.Remove(i, 1).Insert(i, "]");
continue;
}
found = true;
fcb = i;
break;
}
i++;
}
if (!found) {
if (RaiseErrors & !closingerror) {
Interface.AddMessage(Interface.MessageType.Error, false, "Missing closing parenthesis encountered at line " + Expression.Line.ToString(Culture) + ", column " + Expression.Column.ToString(Culture) + " in file " + Expression.File);
closingerror = true;
}
Expression.Text += ")";
}
} else if (Expression.Text[i] == ')') {
if (RaiseErrors & !closingerror) {
Interface.AddMessage(Interface.MessageType.Error, false, "Invalid closing parenthesis encountered at line " + Expression.Line.ToString(Culture) + ", column " + Expression.Column.ToString(Culture) + " in file " + Expression.File);
closingerror = true;
}
} else if (char.IsWhiteSpace(Expression.Text[i])) {
if (i >= Expression.Text.Length - 1 || !char.IsWhiteSpace(Expression.Text[i + 1])) {
break;
}
}
}
if (fcb != 0 && fcb < Expression.Text.Length - 1)
{
if (!Char.IsWhiteSpace(Expression.Text[fcb + 1]) && Expression.Text[fcb + 1] != '.' && Expression.Text[fcb + 1] != ';')
{
Expression.Text = Expression.Text.Insert(fcb + 1, " ");
i = fcb;
}
}
if (i < Expression.Text.Length) {
// white space was found outside of parentheses
string a = Expression.Text.Substring(0, i);
if (a.IndexOf('(') >= 0 & a.IndexOf(')') >= 0) {
// indices found not separated from the command by spaces
Command = Expression.Text.Substring(0, i).TrimEnd();
ArgumentSequence = Expression.Text.Substring(i + 1).TrimStart();
if (ArgumentSequence.StartsWith("(") & ArgumentSequence.EndsWith(")")) {
// arguments are enclosed by parentheses
ArgumentSequence = ArgumentSequence.Substring(1, ArgumentSequence.Length - 2).Trim();
} else if (ArgumentSequence.StartsWith("(")) {
// only opening parenthesis found
if (RaiseErrors & !closingerror) {
Interface.AddMessage(Interface.MessageType.Error, false, "Missing closing parenthesis encountered at line " + Expression.Line.ToString(Culture) + ", column " + Expression.Column.ToString(Culture) + " in file " + Expression.File);
}
ArgumentSequence = ArgumentSequence.Substring(1).TrimStart();
}
} else {
// no indices found before the space
if (i < Expression.Text.Length - 1 && Expression.Text[i + 1] == '(') {
// opening parenthesis follows the space
int j = Expression.Text.IndexOf(')', i + 1);
if (j > i + 1) {
// closing parenthesis found
if (j == Expression.Text.Length - 1) {
// only closing parenthesis found at the end of the expression
Command = Expression.Text.Substring(0, i).TrimEnd();
ArgumentSequence = Expression.Text.Substring(i + 2, j - i - 2).Trim();
} else {
// detect border between indices and arguments
bool found = false;
Command = null; ArgumentSequence = null;
for (int k = j + 1; k < Expression.Text.Length; k++) {
if (char.IsWhiteSpace(Expression.Text[k])) {
Command = Expression.Text.Substring(0, k).TrimEnd();
ArgumentSequence = Expression.Text.Substring(k + 1).TrimStart();
found = true; break;
} else if (Expression.Text[k] == '(') {
Command = Expression.Text.Substring(0, k).TrimEnd();
ArgumentSequence = Expression.Text.Substring(k).TrimStart();
found = true; break;
}
}
if (!found) {
if (RaiseErrors & !openingerror & !closingerror) {
Interface.AddMessage(Interface.MessageType.Error, false, "Invalid syntax encountered at line " + Expression.Line.ToString(Culture) + ", column " + Expression.Column.ToString(Culture) + " in file " + Expression.File);
openingerror = true;
closingerror = true;
}
Command = Expression.Text;
ArgumentSequence = "";
}
if (ArgumentSequence.StartsWith("(") & ArgumentSequence.EndsWith(")")) {
// arguments are enclosed by parentheses
ArgumentSequence = ArgumentSequence.Substring(1, ArgumentSequence.Length - 2).Trim();
} else if (ArgumentSequence.StartsWith("(")) {
// only opening parenthesis found
if (RaiseErrors & !closingerror) {
Interface.AddMessage(Interface.MessageType.Error, false, "Missing closing parenthesis encountered at line " + Expression.Line.ToString(Culture) + ", column " + Expression.Column.ToString(Culture) + " in file " + Expression.File);
}
ArgumentSequence = ArgumentSequence.Substring(1).TrimStart();
}
}
} else {
// no closing parenthesis found
if (RaiseErrors & !closingerror) {
Interface.AddMessage(Interface.MessageType.Error, false, "Missing closing parenthesis encountered at line " + Expression.Line.ToString(Culture) + ", column " + Expression.Column.ToString(Culture) + " in file " + Expression.File);
}
Command = Expression.Text.Substring(0, i).TrimEnd();
ArgumentSequence = Expression.Text.Substring(i + 2).TrimStart();
}
} else {
// no index possible
Command = Expression.Text.Substring(0, i).TrimEnd();
ArgumentSequence = Expression.Text.Substring(i + 1).TrimStart();
if (ArgumentSequence.StartsWith("(") & ArgumentSequence.EndsWith(")")) {
// arguments are enclosed by parentheses
ArgumentSequence = ArgumentSequence.Substring(1, ArgumentSequence.Length - 2).Trim();
} else if (ArgumentSequence.StartsWith("(")) {
// only opening parenthesis found
if (RaiseErrors & !closingerror) {
Interface.AddMessage(Interface.MessageType.Error, false, "Missing closing parenthesis encountered at line " + Expression.Line.ToString(Culture) + ", column " + Expression.Column.ToString(Culture) + " in file " + Expression.File);
}
ArgumentSequence = ArgumentSequence.Substring(1).TrimStart();
}
}
}
} else {
// no single space found
if (Expression.Text.EndsWith(")")) {
i = Expression.Text.LastIndexOf('(');
if (i >= 0) {
Command = Expression.Text.Substring(0, i).TrimEnd();
ArgumentSequence = Expression.Text.Substring(i + 1, Expression.Text.Length - i - 2).Trim();
} else {
Command = Expression.Text;
ArgumentSequence = "";
}
} else {
i = Expression.Text.IndexOf('(');
if (i >= 0) {
if (RaiseErrors & !closingerror) {
Interface.AddMessage(Interface.MessageType.Error, false, "Missing closing parenthesis encountered at line " + Expression.Line.ToString(Culture) + ", column " + Expression.Column.ToString(Culture) + " in file " + Expression.File);
}
Command = Expression.Text.Substring(0, i).TrimEnd();
ArgumentSequence = Expression.Text.Substring(i + 1).TrimStart();
} else {
if (RaiseErrors) {
i = Expression.Text.IndexOf(')');
if (i >= 0 & !closingerror) {
Interface.AddMessage(Interface.MessageType.Error, false, "Invalid closing parenthesis encountered at line " + Expression.Line.ToString(Culture) + ", column " + Expression.Column.ToString(Culture) + " in file " + Expression.File);
}
}
Command = Expression.Text;
ArgumentSequence = "";
}
}
}
// invalid trailing characters
if (Command.EndsWith(";")) {
if (RaiseErrors) {
Interface.AddMessage(Interface.MessageType.Error, false, "Invalid trailing semicolon encountered in " + Command + " at line " + Expression.Line.ToString(Culture) + ", column " + Expression.Column.ToString(Culture) + " in file " + Expression.File);
}
while (Command.EndsWith(";")) {
Command = Command.Substring(0, Command.Length - 1);
}
}
}