public virtual int Compare (string string1, int offset1,
string string2, int offset2,
CompareOptions options)
{
if ((options & ValidCompareOptions) != options)
throw new ArgumentException ("options");
if (string1 == null) {
if (string2 == null)
return 0;
return -1;
}
if (string2 == null)
return 1;
/* Not in the spec, but ms does these short
* cuts before checking the offsets (breaking
* the offset >= string length specified check
* in the process...)
*/
if((string1.Length == 0 || offset1 == string1.Length) &&
(string2.Length == 0 || offset2 == string2.Length))
return(0);
if(offset1 < 0 || offset2 < 0) {
throw new ArgumentOutOfRangeException ("Offsets must not be less than zero");
}
if(offset1 > string1.Length) {
throw new ArgumentOutOfRangeException ("Offset1 is greater than or equal to the length of string1");
}
if(offset2 > string2.Length) {
throw new ArgumentOutOfRangeException ("Offset2 is greater than or equal to the length of string2");
}
return(internal_compare_switch (string1, offset1,
string1.Length-offset1,
string2, offset2,
string2.Length-offset2,
options));
}