diff options
Diffstat (limited to 'cs/src/Ice/Options.cs')
-rw-r--r-- | cs/src/Ice/Options.cs | 742 |
1 files changed, 371 insertions, 371 deletions
diff --git a/cs/src/Ice/Options.cs b/cs/src/Ice/Options.cs index 8519d487a82..2256ae90937 100644 --- a/cs/src/Ice/Options.cs +++ b/cs/src/Ice/Options.cs @@ -14,392 +14,392 @@ namespace IceUtil { public sealed class Options { - public sealed class BadQuote : System.ApplicationException - { - public BadQuote(string message) : base(message) - { - } - } + public sealed class BadQuote : System.ApplicationException + { + public BadQuote(string message) : base(message) + { + } + } - enum State { Normal, DoubleQuote, SingleQuote, ANSIQuote }; + enum State { Normal, DoubleQuote, SingleQuote, ANSIQuote }; - static public string[] - split(string line) + static public string[] + split(string line) { - string IFS = " \t\n"; - - string l = line.Trim(); - if(l.Length == 0) - { - return new string[0]; - } + string IFS = " \t\n"; + + string l = line.Trim(); + if(l.Length == 0) + { + return new string[0]; + } - State state = State.Normal; + State state = State.Normal; - string arg = ""; - ArrayList vec = new ArrayList(); - - for(int i = 0; i < l.Length; ++i) - { - char c = l[i]; - switch(state) - { - case State.Normal: - { - switch(c) - { - case '\\': - { - // - // Ignore a backslash at the end of the string, - // and strip backslash-newline pairs. If a - // backslash is followed by a space, single quote, - // double quote, or dollar sign, we drop the backslash - // and write the space, single quote, double quote, - // or dollar sign. This is necessary to allow quotes - // to be escaped. Dropping the backslash preceding a - // space deviates from bash quoting rules, but is - // necessary so we don't drop backslashes from Windows - // path names.) - // - if(i < l.Length - 1 && l[++i] != '\n') - { - switch(l[i]) - { - case ' ': - case '$': - case '\'': - case '"': - { - arg += l[i]; - break; - } - default: - { - arg += '\\'; - arg += l[i]; + string arg = ""; + ArrayList vec = new ArrayList(); + + for(int i = 0; i < l.Length; ++i) + { + char c = l[i]; + switch(state) + { + case State.Normal: + { + switch(c) + { + case '\\': + { + // + // Ignore a backslash at the end of the string, + // and strip backslash-newline pairs. If a + // backslash is followed by a space, single quote, + // double quote, or dollar sign, we drop the backslash + // and write the space, single quote, double quote, + // or dollar sign. This is necessary to allow quotes + // to be escaped. Dropping the backslash preceding a + // space deviates from bash quoting rules, but is + // necessary so we don't drop backslashes from Windows + // path names.) + // + if(i < l.Length - 1 && l[++i] != '\n') + { + switch(l[i]) + { + case ' ': + case '$': + case '\'': + case '"': + { + arg += l[i]; + break; + } + default: + { + arg += '\\'; + arg += l[i]; break; - } - } - } - break; - } - case '\'': - { - state = State.SingleQuote; - break; - } - case '"': - { - state = State.DoubleQuote; - break; - } - case '$': - { - if(i < l.Length - 1 && l[i + 1] == '\'') - { - state = State.ANSIQuote; // Bash uses $'<text>' to allow ANSI escape sequences - // within <text>. - ++i; - } - else - { - arg += '$'; - } - break; - } - default: - { - if(IFS.IndexOf(l[i]) != -1) - { - vec.Add(arg); - arg = ""; - - // - // Move to start of next argument. - // - while(++i < l.Length && IFS.IndexOf(l[i]) != -1) - { - ; - } - --i; - } - else - { - arg += l[i]; - } - break; - } - } - break; - } - case State.DoubleQuote: - { - // - // Within double quotes, only backslash retains its special - // meaning, and only if followed by double quote, backslash, - // or newline. If not followed by one of these characters, - // both the backslash and the character are preserved. - // - if(c == '\\' && i < l.Length - 1) - { - switch(c = l[++i]) - { - case '"': - case '\\': - case '\n': - { - arg += c; - break; - } - default: - { - arg += '\\'; - arg += c; - break; - } - } - } - else if(c == '"') // End of double-quote mode. - { - state = State.Normal; - } - else - { - arg += c; // Everything else is taken literally. - } - break; - } - case State.SingleQuote: - { - if(c == '\'') // End of single-quote mode. - { - state = State.Normal; - } - else - { - arg += c; // Everything else is taken literally. - } - break; - } - case State.ANSIQuote: - { - switch(c) - { - case '\\': - { - if(i == l.Length - 1) - { - break; - } - switch(c = l[++i]) - { - // - // Single-letter escape sequences. - // - case 'a': - { - arg += '\a'; - break; - } - case 'b': - { - arg += '\b'; - break; - } - case 'f': - { - arg += '\f'; - break; - } - case 'n': - { - arg += '\n'; - break; - } - case 'r': - { - arg += '\r'; - break; - } - case 't': - { - arg += '\t'; - break; - } - case 'v': - { - arg += '\v'; - break; - } - case '\\': - { - arg += '\\'; - break; - } - case '\'': - { - arg += '\''; - break; - } - case 'e': // Not ANSI-C, but used by bash. - { - arg += '\u001B'; - break; - } + } + } + } + break; + } + case '\'': + { + state = State.SingleQuote; + break; + } + case '"': + { + state = State.DoubleQuote; + break; + } + case '$': + { + if(i < l.Length - 1 && l[i + 1] == '\'') + { + state = State.ANSIQuote; // Bash uses $'<text>' to allow ANSI escape sequences + // within <text>. + ++i; + } + else + { + arg += '$'; + } + break; + } + default: + { + if(IFS.IndexOf(l[i]) != -1) + { + vec.Add(arg); + arg = ""; + + // + // Move to start of next argument. + // + while(++i < l.Length && IFS.IndexOf(l[i]) != -1) + { + ; + } + --i; + } + else + { + arg += l[i]; + } + break; + } + } + break; + } + case State.DoubleQuote: + { + // + // Within double quotes, only backslash retains its special + // meaning, and only if followed by double quote, backslash, + // or newline. If not followed by one of these characters, + // both the backslash and the character are preserved. + // + if(c == '\\' && i < l.Length - 1) + { + switch(c = l[++i]) + { + case '"': + case '\\': + case '\n': + { + arg += c; + break; + } + default: + { + arg += '\\'; + arg += c; + break; + } + } + } + else if(c == '"') // End of double-quote mode. + { + state = State.Normal; + } + else + { + arg += c; // Everything else is taken literally. + } + break; + } + case State.SingleQuote: + { + if(c == '\'') // End of single-quote mode. + { + state = State.Normal; + } + else + { + arg += c; // Everything else is taken literally. + } + break; + } + case State.ANSIQuote: + { + switch(c) + { + case '\\': + { + if(i == l.Length - 1) + { + break; + } + switch(c = l[++i]) + { + // + // Single-letter escape sequences. + // + case 'a': + { + arg += '\a'; + break; + } + case 'b': + { + arg += '\b'; + break; + } + case 'f': + { + arg += '\f'; + break; + } + case 'n': + { + arg += '\n'; + break; + } + case 'r': + { + arg += '\r'; + break; + } + case 't': + { + arg += '\t'; + break; + } + case 'v': + { + arg += '\v'; + break; + } + case '\\': + { + arg += '\\'; + break; + } + case '\'': + { + arg += '\''; + break; + } + case 'e': // Not ANSI-C, but used by bash. + { + arg += '\u001B'; + break; + } - // - // Process up to three octal digits. - // - case '0': - case '1': - case '2': - case '3': - case '4': - case '5': - case '6': - case '7': - { - const string octalDigits = "01234567"; - short s = 0; - int j; - for(j = i; j < i + 3 && j < l.Length && octalDigits.IndexOf(c = l[j]) != -1; ++j) - { - s = (short)(s * 8 + c - '0'); - } - i = j - 1; - arg += (char)s; - break; - } + // + // Process up to three octal digits. + // + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + { + const string octalDigits = "01234567"; + short s = 0; + int j; + for(j = i; j < i + 3 && j < l.Length && octalDigits.IndexOf(c = l[j]) != -1; ++j) + { + s = (short)(s * 8 + c - '0'); + } + i = j - 1; + arg += (char)s; + break; + } - // - // Process up to two hex digits. - // - case 'x': - { - const string hexDigits = "0123456789abcdefABCDEF"; - if(i < l.Length - 1 && hexDigits.IndexOf(l[i + 1]) == -1) - { - arg += '\\'; - arg += 'x'; - break; - } + // + // Process up to two hex digits. + // + case 'x': + { + const string hexDigits = "0123456789abcdefABCDEF"; + if(i < l.Length - 1 && hexDigits.IndexOf(l[i + 1]) == -1) + { + arg += '\\'; + arg += 'x'; + break; + } - short s = 0; - int j; - for(j = i + 1; - j < i + 3 && j < l.Length && hexDigits.IndexOf(c = l[j]) != -1; - ++j) - { - s *= 16; - if(char.IsDigit(c)) - { - s += (short)(c - '0'); - } - else if(char.IsLower(c)) - { - s += (short)(c - 'a' + 10); - } - else - { - s += (short)(c - 'A' + 10); - } - } - i = j - 1; - arg += (char)s; - break; - } + short s = 0; + int j; + for(j = i + 1; + j < i + 3 && j < l.Length && hexDigits.IndexOf(c = l[j]) != -1; + ++j) + { + s *= 16; + if(char.IsDigit(c)) + { + s += (short)(c - '0'); + } + else if(char.IsLower(c)) + { + s += (short)(c - 'a' + 10); + } + else + { + s += (short)(c - 'A' + 10); + } + } + i = j - 1; + arg += (char)s; + break; + } - // - // Process control-chars. - // - case 'c': - { - c = l[++i]; - if((char.ToUpper(c) >= 'A' && char.ToUpper(c) <= 'Z') || - c == '@' || - (c >= '[' && c <= '_')) + // + // Process control-chars. + // + case 'c': + { + c = l[++i]; + if((char.ToUpper(c) >= 'A' && char.ToUpper(c) <= 'Z') || + c == '@' || + (c >= '[' && c <= '_')) + { + arg += (char)(char.ToUpper(c) - '@'); + } + else { - arg += (char)(char.ToUpper(c) - '@'); - } - else - { - // - // Bash does not define what should happen if a \c - // is not followed by a recognized control character. - // We simply treat this case like other unrecognized - // escape sequences, that is, we preserve the escape - // sequence unchanged. - // - arg += '\\'; - arg += 'c'; - arg += c; - } - break; - } + // + // Bash does not define what should happen if a \c + // is not followed by a recognized control character. + // We simply treat this case like other unrecognized + // escape sequences, that is, we preserve the escape + // sequence unchanged. + // + arg += '\\'; + arg += 'c'; + arg += c; + } + break; + } - // - // If inside an ANSI-quoted string, a backslash isn't followed by - // one of the recognized characters, both the backslash and the - // character are preserved. - // - default: - { - arg += '\\'; - arg += c; - break; - } - } - break; - } - case '\'': // End of ANSI-quote mode. - { - state = State.Normal; - break; - } - default: - { - arg += c; // Everything else is taken literally. - break; - } - } - break; - } - default: - { - Debug.Assert(false); - break; - } - } - } - - switch(state) - { - case State.Normal: - { - vec.Add(arg); - break; - } - case State.SingleQuote: - { - throw new BadQuote("missing closing single quote"); - } - case State.DoubleQuote: - { - throw new BadQuote("missing closing double quote"); - } + // + // If inside an ANSI-quoted string, a backslash isn't followed by + // one of the recognized characters, both the backslash and the + // character are preserved. + // + default: + { + arg += '\\'; + arg += c; + break; + } + } + break; + } + case '\'': // End of ANSI-quote mode. + { + state = State.Normal; + break; + } + default: + { + arg += c; // Everything else is taken literally. + break; + } + } + break; + } + default: + { + Debug.Assert(false); + break; + } + } + } + + switch(state) + { + case State.Normal: + { + vec.Add(arg); + break; + } + case State.SingleQuote: + { + throw new BadQuote("missing closing single quote"); + } + case State.DoubleQuote: + { + throw new BadQuote("missing closing double quote"); + } case State.ANSIQuote: { throw new BadQuote("unterminated $' quote"); } - default: - { - Debug.Assert(false); - break; - } - } - - return (string[])vec.ToArray(typeof(string)); - } + default: + { + Debug.Assert(false); + break; + } + } + + return (string[])vec.ToArray(typeof(string)); + } } } |