Rhino.NativeDate.Date_parseString C# (CSharp) Method

Date_parseString() private static method

private static Date_parseString ( string s ) : double
s string
return double
		private static double Date_parseString(string s)
		{
			try
			{
				if (s.Length == 24)
				{
					DateTime d;
					lock (isoFormat)
					{
						d = isoFormat.Parse(s);
					}
					return d.GetTime();
				}
			}
			catch (ParseException)
			{
			}
			int year = -1;
			int mon = -1;
			int mday = -1;
			int hour = -1;
			int min = -1;
			int sec = -1;
			char c = 0;
			char si = 0;
			int i = 0;
			int n = -1;
			double tzoffset = -1;
			char prevc = 0;
			int limit = 0;
			bool seenplusminus = false;
			limit = s.Length;
			while (i < limit)
			{
				c = s[i];
				i++;
				if (c <= ' ' || c == ',' || c == '-')
				{
					if (i < limit)
					{
						si = s[i];
						if (c == '-' && '0' <= si && si <= '9')
						{
							prevc = c;
						}
					}
					continue;
				}
				if (c == '(')
				{
					int depth = 1;
					while (i < limit)
					{
						c = s[i];
						i++;
						if (c == '(')
						{
							depth++;
						}
						else
						{
							if (c == ')')
							{
								if (--depth <= 0)
								{
									break;
								}
							}
						}
					}
					continue;
				}
				if ('0' <= c && c <= '9')
				{
					n = c - '0';
					while (i < limit && '0' <= (c = s[i]) && c <= '9')
					{
						n = n * 10 + c - '0';
						i++;
					}
					if ((prevc == '+' || prevc == '-'))
					{
						seenplusminus = true;
						if (n < 24)
						{
							n = n * 60;
						}
						else
						{
							n = n % 100 + n / 100 * 60;
						}
						if (prevc == '+')
						{
							n = -n;
						}
						if (tzoffset != 0 && tzoffset != -1)
						{
							return ScriptRuntime.NaN;
						}
						tzoffset = n;
					}
					else
					{
						if (n >= 70 || (prevc == '/' && mon >= 0 && mday >= 0 && year < 0))
						{
							if (year >= 0)
							{
								return ScriptRuntime.NaN;
							}
							else
							{
								if (c <= ' ' || c == ',' || c == '/' || i >= limit)
								{
									year = n < 100 ? n + 1900 : n;
								}
								else
								{
									return ScriptRuntime.NaN;
								}
							}
						}
						else
						{
							if (c == ':')
							{
								if (hour < 0)
								{
									hour = n;
								}
								else
								{
									if (min < 0)
									{
										min = n;
									}
									else
									{
										return ScriptRuntime.NaN;
									}
								}
							}
							else
							{
								if (c == '/')
								{
									if (mon < 0)
									{
										mon = n - 1;
									}
									else
									{
										if (mday < 0)
										{
											mday = n;
										}
										else
										{
											return ScriptRuntime.NaN;
										}
									}
								}
								else
								{
									if (i < limit && c != ',' && c > ' ' && c != '-')
									{
										return ScriptRuntime.NaN;
									}
									else
									{
										if (seenplusminus && n < 60)
										{
											if (tzoffset < 0)
											{
												tzoffset -= n;
											}
											else
											{
												tzoffset += n;
											}
										}
										else
										{
											if (hour >= 0 && min < 0)
											{
												min = n;
											}
											else
											{
												if (min >= 0 && sec < 0)
												{
													sec = n;
												}
												else
												{
													if (mday < 0)
													{
														mday = n;
													}
													else
													{
														return ScriptRuntime.NaN;
													}
												}
											}
										}
									}
								}
							}
						}
					}
					prevc = (char)0;
				}
				else
				{
					if (c == '/' || c == ':' || c == '+' || c == '-')
					{
						prevc = c;
					}
					else
					{
						int st = i - 1;
						while (i < limit)
						{
							c = s[i];
							if (!(('A' <= c && c <= 'Z') || ('a' <= c && c <= 'z')))
							{
								break;
							}
							i++;
						}
						int letterCount = i - st;
						if (letterCount < 2)
						{
							return ScriptRuntime.NaN;
						}
						string wtb = "am;pm;" + "monday;tuesday;wednesday;thursday;friday;" + "saturday;sunday;" + "january;february;march;april;may;june;" + "july;august;september;october;november;december;" + "gmt;ut;utc;est;edt;cst;cdt;mst;mdt;pst;pdt;";
						int index = 0;
						for (int wtbOffset = 0; ; )
						{
							int wtbNext = wtb.IndexOf(';', wtbOffset);
							if (wtbNext < 0)
							{
								return ScriptRuntime.NaN;
							}
							if (wtb.RegionMatches(true, wtbOffset, s, st, letterCount))
							{
								break;
							}
							wtbOffset = wtbNext + 1;
							++index;
						}
						if (index < 2)
						{
							if (hour > 12 || hour < 0)
							{
								return ScriptRuntime.NaN;
							}
							else
							{
								if (index == 0)
								{
									// AM
									if (hour == 12)
									{
										hour = 0;
									}
								}
								else
								{
									// PM
									if (hour != 12)
									{
										hour += 12;
									}
								}
							}
						}
						else
						{
							if ((index -= 2) < 7)
							{
							}
							else
							{
								// ignore week days
								if ((index -= 7) < 12)
								{
									// month
									if (mon < 0)
									{
										mon = index;
									}
									else
									{
										return ScriptRuntime.NaN;
									}
								}
								else
								{
									index -= 12;
									switch (index)
									{
										case 0:
										{
											// timezones
											tzoffset = 0;
											break;
										}

										case 1:
										{
											tzoffset = 0;
											break;
										}

										case 2:
										{
											tzoffset = 0;
											break;
										}

										case 3:
										{
											tzoffset = 5 * 60;
											break;
										}

										case 4:
										{
											tzoffset = 4 * 60;
											break;
										}

										case 5:
										{
											tzoffset = 6 * 60;
											break;
										}

										case 6:
										{
											tzoffset = 5 * 60;
											break;
										}

										case 7:
										{
											tzoffset = 7 * 60;
											break;
										}

										case 8:
										{
											tzoffset = 6 * 60;
											break;
										}

										case 9:
										{
											tzoffset = 8 * 60;
											break;
										}

										case 10:
										{
											tzoffset = 7 * 60;
											break;
										}

										default:
										{
											Kit.CodeBug();
											break;
										}
									}
								}
							}
						}
					}
				}
			}
			if (year < 0 || mon < 0 || mday < 0)
			{
				return ScriptRuntime.NaN;
			}
			if (sec < 0)
			{
				sec = 0;
			}
			if (min < 0)
			{
				min = 0;
			}
			if (hour < 0)
			{
				hour = 0;
			}
			double msec = Date_msecFromDate(year, mon, mday, hour, min, sec, 0);
			if (tzoffset == -1)
			{
				return InternalUTC(msec);
			}
			else
			{
				return msec + tzoffset * msPerMinute;
			}
		}