mscorlib(4.0.0.0) API with additions
DateTimeFormatInfo.cs
1 using System.Collections;
6 using System.Security;
7 using System.Threading;
8 
9 namespace System.Globalization
10 {
12  [Serializable]
13  [ComVisible(true)]
14  [__DynamicallyInvokable]
16  {
17  private static volatile DateTimeFormatInfo invariantInfo;
18 
19  [NonSerialized]
20  private CultureData m_cultureData;
21 
22  [OptionalField(VersionAdded = 2)]
23  internal string m_name;
24 
25  [NonSerialized]
26  private string m_langName;
27 
28  [NonSerialized]
29  private CompareInfo m_compareInfo;
30 
31  [NonSerialized]
32  private CultureInfo m_cultureInfo;
33 
34  internal string amDesignator;
35 
36  internal string pmDesignator;
37 
38  [OptionalField(VersionAdded = 1)]
39  internal string dateSeparator;
40 
41  [OptionalField(VersionAdded = 1)]
42  internal string generalShortTimePattern;
43 
44  [OptionalField(VersionAdded = 1)]
45  internal string generalLongTimePattern;
46 
47  [OptionalField(VersionAdded = 1)]
48  internal string timeSeparator;
49 
50  internal string monthDayPattern;
51 
52  [OptionalField(VersionAdded = 2)]
53  internal string dateTimeOffsetPattern;
54 
55  internal const string rfc1123Pattern = "ddd, dd MMM yyyy HH':'mm':'ss 'GMT'";
56 
57  internal const string sortableDateTimePattern = "yyyy'-'MM'-'dd'T'HH':'mm':'ss";
58 
59  internal const string universalSortableDateTimePattern = "yyyy'-'MM'-'dd HH':'mm':'ss'Z'";
60 
61  internal Calendar calendar;
62 
63  internal int firstDayOfWeek = -1;
64 
65  internal int calendarWeekRule = -1;
66 
67  [OptionalField(VersionAdded = 1)]
68  internal string fullDateTimePattern;
69 
70  internal string[] abbreviatedDayNames;
71 
72  [OptionalField(VersionAdded = 2)]
73  internal string[] m_superShortDayNames;
74 
75  internal string[] dayNames;
76 
77  internal string[] abbreviatedMonthNames;
78 
79  internal string[] monthNames;
80 
81  [OptionalField(VersionAdded = 2)]
82  internal string[] genitiveMonthNames;
83 
84  [OptionalField(VersionAdded = 2)]
85  internal string[] m_genitiveAbbreviatedMonthNames;
86 
87  [OptionalField(VersionAdded = 2)]
88  internal string[] leapYearMonthNames;
89 
90  internal string longDatePattern;
91 
92  internal string shortDatePattern;
93 
94  internal string yearMonthPattern;
95 
96  internal string longTimePattern;
97 
98  internal string shortTimePattern;
99 
100  [OptionalField(VersionAdded = 3)]
101  private string[] allYearMonthPatterns;
102 
103  internal string[] allShortDatePatterns;
104 
105  internal string[] allLongDatePatterns;
106 
107  internal string[] allShortTimePatterns;
108 
109  internal string[] allLongTimePatterns;
110 
111  internal string[] m_eraNames;
112 
113  internal string[] m_abbrevEraNames;
114 
115  internal string[] m_abbrevEnglishEraNames;
116 
117  internal int[] optionalCalendars;
118 
119  private const int DEFAULT_ALL_DATETIMES_SIZE = 132;
120 
121  internal bool m_isReadOnly;
122 
123  [OptionalField(VersionAdded = 2)]
124  internal DateTimeFormatFlags formatFlags = DateTimeFormatFlags.NotInitialized;
125 
126  internal static bool preferExistingTokens = InitPreferExistingTokens();
127 
128  [OptionalField(VersionAdded = 1)]
129  private int CultureID;
130 
131  [OptionalField(VersionAdded = 1)]
132  private bool m_useUserOverride;
133 
134  [OptionalField(VersionAdded = 1)]
135  private bool bUseCalendarInfo;
136 
137  [OptionalField(VersionAdded = 1)]
138  private int nDataItem;
139 
140  [OptionalField(VersionAdded = 2)]
141  internal bool m_isDefaultCalendar;
142 
143  [OptionalField(VersionAdded = 2)]
144  private static volatile Hashtable s_calendarNativeNames;
145 
146  [OptionalField(VersionAdded = 1)]
147  internal string[] m_dateWords;
148 
149  private static char[] MonthSpaces = new char[2]
150  {
151  ' ',
152  '\u00a0'
153  };
154 
155  [NonSerialized]
156  private string m_fullTimeSpanPositivePattern;
157 
158  [NonSerialized]
159  private string m_fullTimeSpanNegativePattern;
160 
161  internal const DateTimeStyles InvalidDateTimeStyles = ~(DateTimeStyles.AllowLeadingWhite | DateTimeStyles.AllowTrailingWhite | DateTimeStyles.AllowInnerWhite | DateTimeStyles.NoCurrentDateDefault | DateTimeStyles.AdjustToUniversal | DateTimeStyles.AssumeLocal | DateTimeStyles.AssumeUniversal | DateTimeStyles.RoundtripKind);
162 
163  [NonSerialized]
164  private TokenHashValue[] m_dtfiTokenHash;
165 
166  private const int TOKEN_HASH_SIZE = 199;
167 
168  private const int SECOND_PRIME = 197;
169 
170  private const string dateSeparatorOrTimeZoneOffset = "-";
171 
172  private const string invariantDateSeparator = "/";
173 
174  private const string invariantTimeSeparator = ":";
175 
176  internal const string IgnorablePeriod = ".";
177 
178  internal const string IgnorableComma = ",";
179 
180  internal const string CJKYearSuff = "年";
181 
182  internal const string CJKMonthSuff = "月";
183 
184  internal const string CJKDaySuff = "日";
185 
186  internal const string KoreanYearSuff = "년";
187 
188  internal const string KoreanMonthSuff = "월";
189 
190  internal const string KoreanDaySuff = "일";
191 
192  internal const string KoreanHourSuff = "시";
193 
194  internal const string KoreanMinuteSuff = "분";
195 
196  internal const string KoreanSecondSuff = "초";
197 
198  internal const string CJKHourSuff = "時";
199 
200  internal const string ChineseHourSuff = "时";
201 
202  internal const string CJKMinuteSuff = "分";
203 
204  internal const string CJKSecondSuff = "秒";
205 
206  internal const string LocalTimeMark = "T";
207 
208  internal const string KoreanLangName = "ko";
209 
210  internal const string JapaneseLangName = "ja";
211 
212  internal const string EnglishLangName = "en";
213 
214  private static volatile DateTimeFormatInfo s_jajpDTFI;
215 
216  private static volatile DateTimeFormatInfo s_zhtwDTFI;
217 
218  private string CultureName
219  {
220  get
221  {
222  if (m_name == null)
223  {
224  m_name = m_cultureData.CultureName;
225  }
226  return m_name;
227  }
228  }
229 
230  private CultureInfo Culture
231  {
232  get
233  {
234  if (m_cultureInfo == null)
235  {
236  m_cultureInfo = CultureInfo.GetCultureInfo(CultureName);
237  }
238  return m_cultureInfo;
239  }
240  }
241 
242  private string LanguageName
243  {
244  [SecurityCritical]
245  get
246  {
247  if (m_langName == null)
248  {
249  m_langName = m_cultureData.SISO639LANGNAME;
250  }
251  return m_langName;
252  }
253  }
254 
257  [__DynamicallyInvokable]
258  public static DateTimeFormatInfo InvariantInfo
259  {
260  [__DynamicallyInvokable]
261  get
262  {
263  if (invariantInfo == null)
264  {
265  DateTimeFormatInfo dateTimeFormatInfo = new DateTimeFormatInfo();
266  dateTimeFormatInfo.Calendar.SetReadOnlyState(readOnly: true);
267  dateTimeFormatInfo.m_isReadOnly = true;
268  invariantInfo = dateTimeFormatInfo;
269  }
270  return invariantInfo;
271  }
272  }
273 
276  [__DynamicallyInvokable]
277  public static DateTimeFormatInfo CurrentInfo
278  {
279  [__DynamicallyInvokable]
280  get
281  {
283  if (!currentCulture.m_isInherited)
284  {
285  DateTimeFormatInfo dateTimeInfo = currentCulture.dateTimeInfo;
286  if (dateTimeInfo != null)
287  {
288  return dateTimeInfo;
289  }
290  }
291  return (DateTimeFormatInfo)currentCulture.GetFormat(typeof(DateTimeFormatInfo));
292  }
293  }
294 
299  [__DynamicallyInvokable]
300  public string AMDesignator
301  {
302  [__DynamicallyInvokable]
303  get
304  {
305  return amDesignator;
306  }
307  [__DynamicallyInvokable]
308  set
309  {
310  if (IsReadOnly)
311  {
312  throw new InvalidOperationException(Environment.GetResourceString("InvalidOperation_ReadOnly"));
313  }
314  if (value == null)
315  {
316  throw new ArgumentNullException("value", Environment.GetResourceString("ArgumentNull_String"));
317  }
318  ClearTokenHashTable();
319  amDesignator = value;
320  }
321  }
322 
328  [__DynamicallyInvokable]
329  public Calendar Calendar
330  {
331  [__DynamicallyInvokable]
332  get
333  {
334  return calendar;
335  }
336  [__DynamicallyInvokable]
337  set
338  {
339  if (IsReadOnly)
340  {
341  throw new InvalidOperationException(Environment.GetResourceString("InvalidOperation_ReadOnly"));
342  }
343  if (value == null)
344  {
345  throw new ArgumentNullException("value", Environment.GetResourceString("ArgumentNull_Obj"));
346  }
347  if (value == calendar)
348  {
349  return;
350  }
351  CultureInfo.CheckDomainSafetyObject(value, this);
352  for (int i = 0; i < OptionalCalendars.Length; i++)
353  {
354  if (OptionalCalendars[i] == value.ID)
355  {
356  if (calendar != null)
357  {
358  m_eraNames = null;
359  m_abbrevEraNames = null;
360  m_abbrevEnglishEraNames = null;
361  monthDayPattern = null;
362  dayNames = null;
363  abbreviatedDayNames = null;
364  m_superShortDayNames = null;
365  monthNames = null;
366  abbreviatedMonthNames = null;
367  genitiveMonthNames = null;
368  m_genitiveAbbreviatedMonthNames = null;
369  leapYearMonthNames = null;
370  formatFlags = DateTimeFormatFlags.NotInitialized;
371  allShortDatePatterns = null;
372  allLongDatePatterns = null;
373  allYearMonthPatterns = null;
374  dateTimeOffsetPattern = null;
375  longDatePattern = null;
376  shortDatePattern = null;
377  yearMonthPattern = null;
378  fullDateTimePattern = null;
379  generalShortTimePattern = null;
380  generalLongTimePattern = null;
381  dateSeparator = null;
382  ClearTokenHashTable();
383  }
384  calendar = value;
385  InitializeOverridableProperties(m_cultureData, calendar.ID);
386  return;
387  }
388  }
389  throw new ArgumentOutOfRangeException("value", Environment.GetResourceString("Argument_InvalidCalendar"));
390  }
391  }
392 
393  private int[] OptionalCalendars
394  {
395  get
396  {
397  if (optionalCalendars == null)
398  {
399  optionalCalendars = m_cultureData.CalendarIds;
400  }
401  return optionalCalendars;
402  }
403  }
404 
405  internal string[] EraNames
406  {
407  get
408  {
409  if (m_eraNames == null)
410  {
411  m_eraNames = m_cultureData.EraNames(Calendar.ID);
412  }
413  return m_eraNames;
414  }
415  }
416 
417  internal string[] AbbreviatedEraNames
418  {
419  get
420  {
421  if (m_abbrevEraNames == null)
422  {
423  m_abbrevEraNames = m_cultureData.AbbrevEraNames(Calendar.ID);
424  }
425  return m_abbrevEraNames;
426  }
427  }
428 
429  internal string[] AbbreviatedEnglishEraNames
430  {
431  get
432  {
433  if (m_abbrevEnglishEraNames == null)
434  {
435  m_abbrevEnglishEraNames = m_cultureData.AbbreviatedEnglishEraNames(Calendar.ID);
436  }
437  return m_abbrevEnglishEraNames;
438  }
439  }
440 
445  public string DateSeparator
446  {
447  get
448  {
449  return dateSeparator;
450  }
451  set
452  {
453  if (IsReadOnly)
454  {
455  throw new InvalidOperationException(Environment.GetResourceString("InvalidOperation_ReadOnly"));
456  }
457  if (value == null)
458  {
459  throw new ArgumentNullException("value", Environment.GetResourceString("ArgumentNull_String"));
460  }
461  ClearTokenHashTable();
462  dateSeparator = value;
463  }
464  }
465 
470  [__DynamicallyInvokable]
472  {
473  [__DynamicallyInvokable]
474  get
475  {
476  return (DayOfWeek)firstDayOfWeek;
477  }
478  [__DynamicallyInvokable]
479  set
480  {
481  if (IsReadOnly)
482  {
483  throw new InvalidOperationException(Environment.GetResourceString("InvalidOperation_ReadOnly"));
484  }
485  if (value >= DayOfWeek.Sunday && value <= DayOfWeek.Saturday)
486  {
487  firstDayOfWeek = (int)value;
488  return;
489  }
490  throw new ArgumentOutOfRangeException("value", Environment.GetResourceString("ArgumentOutOfRange_Range", DayOfWeek.Sunday, DayOfWeek.Saturday));
491  }
492  }
493 
498  [__DynamicallyInvokable]
500  {
501  [__DynamicallyInvokable]
502  get
503  {
504  return (CalendarWeekRule)calendarWeekRule;
505  }
506  [__DynamicallyInvokable]
507  set
508  {
509  if (IsReadOnly)
510  {
511  throw new InvalidOperationException(Environment.GetResourceString("InvalidOperation_ReadOnly"));
512  }
513  if (value >= CalendarWeekRule.FirstDay && value <= CalendarWeekRule.FirstFourDayWeek)
514  {
515  calendarWeekRule = (int)value;
516  return;
517  }
518  throw new ArgumentOutOfRangeException("value", Environment.GetResourceString("ArgumentOutOfRange_Range", CalendarWeekRule.FirstDay, CalendarWeekRule.FirstFourDayWeek));
519  }
520  }
521 
526  [__DynamicallyInvokable]
527  public string FullDateTimePattern
528  {
529  [__DynamicallyInvokable]
530  get
531  {
532  if (fullDateTimePattern == null)
533  {
534  fullDateTimePattern = LongDatePattern + " " + LongTimePattern;
535  }
536  return fullDateTimePattern;
537  }
538  [__DynamicallyInvokable]
539  set
540  {
541  if (IsReadOnly)
542  {
543  throw new InvalidOperationException(Environment.GetResourceString("InvalidOperation_ReadOnly"));
544  }
545  if (value == null)
546  {
547  throw new ArgumentNullException("value", Environment.GetResourceString("ArgumentNull_String"));
548  }
549  fullDateTimePattern = value;
550  }
551  }
552 
557  [__DynamicallyInvokable]
558  public string LongDatePattern
559  {
560  [__DynamicallyInvokable]
561  get
562  {
563  if (longDatePattern == null)
564  {
565  longDatePattern = UnclonedLongDatePatterns[0];
566  }
567  return longDatePattern;
568  }
569  [__DynamicallyInvokable]
570  set
571  {
572  if (IsReadOnly)
573  {
574  throw new InvalidOperationException(Environment.GetResourceString("InvalidOperation_ReadOnly"));
575  }
576  if (value == null)
577  {
578  throw new ArgumentNullException("value", Environment.GetResourceString("ArgumentNull_String"));
579  }
580  longDatePattern = value;
581  ClearTokenHashTable();
582  fullDateTimePattern = null;
583  }
584  }
585 
590  [__DynamicallyInvokable]
591  public string LongTimePattern
592  {
593  [__DynamicallyInvokable]
594  get
595  {
596  if (longTimePattern == null)
597  {
598  longTimePattern = UnclonedLongTimePatterns[0];
599  }
600  return longTimePattern;
601  }
602  [__DynamicallyInvokable]
603  set
604  {
605  if (IsReadOnly)
606  {
607  throw new InvalidOperationException(Environment.GetResourceString("InvalidOperation_ReadOnly"));
608  }
609  if (value == null)
610  {
611  throw new ArgumentNullException("value", Environment.GetResourceString("ArgumentNull_String"));
612  }
613  longTimePattern = value;
614  ClearTokenHashTable();
615  fullDateTimePattern = null;
616  generalLongTimePattern = null;
617  dateTimeOffsetPattern = null;
618  }
619  }
620 
625  [__DynamicallyInvokable]
626  public string MonthDayPattern
627  {
628  [__DynamicallyInvokable]
629  get
630  {
631  if (monthDayPattern == null)
632  {
633  monthDayPattern = m_cultureData.MonthDay(Calendar.ID);
634  }
635  return monthDayPattern;
636  }
637  [__DynamicallyInvokable]
638  set
639  {
640  if (IsReadOnly)
641  {
642  throw new InvalidOperationException(Environment.GetResourceString("InvalidOperation_ReadOnly"));
643  }
644  if (value == null)
645  {
646  throw new ArgumentNullException("value", Environment.GetResourceString("ArgumentNull_String"));
647  }
648  monthDayPattern = value;
649  }
650  }
651 
656  [__DynamicallyInvokable]
657  public string PMDesignator
658  {
659  [__DynamicallyInvokable]
660  get
661  {
662  return pmDesignator;
663  }
664  [__DynamicallyInvokable]
665  set
666  {
667  if (IsReadOnly)
668  {
669  throw new InvalidOperationException(Environment.GetResourceString("InvalidOperation_ReadOnly"));
670  }
671  if (value == null)
672  {
673  throw new ArgumentNullException("value", Environment.GetResourceString("ArgumentNull_String"));
674  }
675  ClearTokenHashTable();
676  pmDesignator = value;
677  }
678  }
679 
682  [__DynamicallyInvokable]
683  public string RFC1123Pattern
684  {
685  [__DynamicallyInvokable]
686  get
687  {
688  return "ddd, dd MMM yyyy HH':'mm':'ss 'GMT'";
689  }
690  }
691 
696  [__DynamicallyInvokable]
697  public string ShortDatePattern
698  {
699  [__DynamicallyInvokable]
700  get
701  {
702  if (shortDatePattern == null)
703  {
704  shortDatePattern = UnclonedShortDatePatterns[0];
705  }
706  return shortDatePattern;
707  }
708  [__DynamicallyInvokable]
709  set
710  {
711  if (IsReadOnly)
712  {
713  throw new InvalidOperationException(Environment.GetResourceString("InvalidOperation_ReadOnly"));
714  }
715  if (value == null)
716  {
717  throw new ArgumentNullException("value", Environment.GetResourceString("ArgumentNull_String"));
718  }
719  shortDatePattern = value;
720  ClearTokenHashTable();
721  generalLongTimePattern = null;
722  generalShortTimePattern = null;
723  dateTimeOffsetPattern = null;
724  }
725  }
726 
731  [__DynamicallyInvokable]
732  public string ShortTimePattern
733  {
734  [__DynamicallyInvokable]
735  get
736  {
737  if (shortTimePattern == null)
738  {
739  shortTimePattern = UnclonedShortTimePatterns[0];
740  }
741  return shortTimePattern;
742  }
743  [__DynamicallyInvokable]
744  set
745  {
746  if (IsReadOnly)
747  {
748  throw new InvalidOperationException(Environment.GetResourceString("InvalidOperation_ReadOnly"));
749  }
750  if (value == null)
751  {
752  throw new ArgumentNullException("value", Environment.GetResourceString("ArgumentNull_String"));
753  }
754  shortTimePattern = value;
755  ClearTokenHashTable();
756  generalShortTimePattern = null;
757  }
758  }
759 
762  [__DynamicallyInvokable]
763  public string SortableDateTimePattern
764  {
765  [__DynamicallyInvokable]
766  get
767  {
768  return "yyyy'-'MM'-'dd'T'HH':'mm':'ss";
769  }
770  }
771 
772  internal string GeneralShortTimePattern
773  {
774  get
775  {
776  if (generalShortTimePattern == null)
777  {
778  generalShortTimePattern = ShortDatePattern + " " + ShortTimePattern;
779  }
780  return generalShortTimePattern;
781  }
782  }
783 
784  internal string GeneralLongTimePattern
785  {
786  get
787  {
788  if (generalLongTimePattern == null)
789  {
790  generalLongTimePattern = ShortDatePattern + " " + LongTimePattern;
791  }
792  return generalLongTimePattern;
793  }
794  }
795 
796  internal string DateTimeOffsetPattern
797  {
798  get
799  {
800  if (dateTimeOffsetPattern == null)
801  {
802  dateTimeOffsetPattern = ShortDatePattern + " " + LongTimePattern;
803  bool flag = false;
804  bool flag2 = false;
805  char c = '\'';
806  int num = 0;
807  while (!flag && num < LongTimePattern.Length)
808  {
809  switch (LongTimePattern[num])
810  {
811  case 'z':
812  flag = !flag2;
813  break;
814  case '"':
815  case '\'':
816  if (flag2 && c == LongTimePattern[num])
817  {
818  flag2 = false;
819  }
820  else if (!flag2)
821  {
822  c = LongTimePattern[num];
823  flag2 = true;
824  }
825  break;
826  case '%':
827  case '\\':
828  num++;
829  break;
830  }
831  num++;
832  }
833  if (!flag)
834  {
835  dateTimeOffsetPattern += " zzz";
836  }
837  }
838  return dateTimeOffsetPattern;
839  }
840  }
841 
846  public string TimeSeparator
847  {
848  get
849  {
850  return timeSeparator;
851  }
852  set
853  {
854  if (IsReadOnly)
855  {
856  throw new InvalidOperationException(Environment.GetResourceString("InvalidOperation_ReadOnly"));
857  }
858  if (value == null)
859  {
860  throw new ArgumentNullException("value", Environment.GetResourceString("ArgumentNull_String"));
861  }
862  ClearTokenHashTable();
863  timeSeparator = value;
864  }
865  }
866 
869  [__DynamicallyInvokable]
870  public string UniversalSortableDateTimePattern
871  {
872  [__DynamicallyInvokable]
873  get
874  {
875  return "yyyy'-'MM'-'dd HH':'mm':'ss'Z'";
876  }
877  }
878 
883  [__DynamicallyInvokable]
884  public string YearMonthPattern
885  {
886  [__DynamicallyInvokable]
887  get
888  {
889  if (yearMonthPattern == null)
890  {
891  yearMonthPattern = UnclonedYearMonthPatterns[0];
892  }
893  return yearMonthPattern;
894  }
895  [__DynamicallyInvokable]
896  set
897  {
898  if (IsReadOnly)
899  {
900  throw new InvalidOperationException(Environment.GetResourceString("InvalidOperation_ReadOnly"));
901  }
902  if (value == null)
903  {
904  throw new ArgumentNullException("value", Environment.GetResourceString("ArgumentNull_String"));
905  }
906  yearMonthPattern = value;
907  ClearTokenHashTable();
908  }
909  }
910 
916  [__DynamicallyInvokable]
917  public string[] AbbreviatedDayNames
918  {
919  [__DynamicallyInvokable]
920  get
921  {
922  return (string[])internalGetAbbreviatedDayOfWeekNames().Clone();
923  }
924  [__DynamicallyInvokable]
925  set
926  {
927  if (IsReadOnly)
928  {
929  throw new InvalidOperationException(Environment.GetResourceString("InvalidOperation_ReadOnly"));
930  }
931  if (value == null)
932  {
933  throw new ArgumentNullException("value", Environment.GetResourceString("ArgumentNull_Array"));
934  }
935  if (value.Length != 7)
936  {
937  throw new ArgumentException(Environment.GetResourceString("Argument_InvalidArrayLength", 7), "value");
938  }
939  CheckNullValue(value, value.Length);
940  ClearTokenHashTable();
941  abbreviatedDayNames = value;
942  }
943  }
944 
950  [ComVisible(false)]
951  [__DynamicallyInvokable]
952  public string[] ShortestDayNames
953  {
954  [__DynamicallyInvokable]
955  get
956  {
957  return (string[])internalGetSuperShortDayNames().Clone();
958  }
959  [__DynamicallyInvokable]
960  set
961  {
962  if (IsReadOnly)
963  {
964  throw new InvalidOperationException(Environment.GetResourceString("InvalidOperation_ReadOnly"));
965  }
966  if (value == null)
967  {
968  throw new ArgumentNullException("value", Environment.GetResourceString("ArgumentNull_Array"));
969  }
970  if (value.Length != 7)
971  {
972  throw new ArgumentException(Environment.GetResourceString("Argument_InvalidArrayLength", 7), "value");
973  }
974  CheckNullValue(value, value.Length);
975  m_superShortDayNames = value;
976  }
977  }
978 
984  [__DynamicallyInvokable]
985  public string[] DayNames
986  {
987  [__DynamicallyInvokable]
988  get
989  {
990  return (string[])internalGetDayOfWeekNames().Clone();
991  }
992  [__DynamicallyInvokable]
993  set
994  {
995  if (IsReadOnly)
996  {
997  throw new InvalidOperationException(Environment.GetResourceString("InvalidOperation_ReadOnly"));
998  }
999  if (value == null)
1000  {
1001  throw new ArgumentNullException("value", Environment.GetResourceString("ArgumentNull_Array"));
1002  }
1003  if (value.Length != 7)
1004  {
1005  throw new ArgumentException(Environment.GetResourceString("Argument_InvalidArrayLength", 7), "value");
1006  }
1007  CheckNullValue(value, value.Length);
1008  ClearTokenHashTable();
1009  dayNames = value;
1010  }
1011  }
1012 
1018  [__DynamicallyInvokable]
1019  public string[] AbbreviatedMonthNames
1020  {
1021  [__DynamicallyInvokable]
1022  get
1023  {
1024  return (string[])internalGetAbbreviatedMonthNames().Clone();
1025  }
1026  [__DynamicallyInvokable]
1027  set
1028  {
1029  if (IsReadOnly)
1030  {
1031  throw new InvalidOperationException(Environment.GetResourceString("InvalidOperation_ReadOnly"));
1032  }
1033  if (value == null)
1034  {
1035  throw new ArgumentNullException("value", Environment.GetResourceString("ArgumentNull_Array"));
1036  }
1037  if (value.Length != 13)
1038  {
1039  throw new ArgumentException(Environment.GetResourceString("Argument_InvalidArrayLength", 13), "value");
1040  }
1041  CheckNullValue(value, value.Length - 1);
1042  ClearTokenHashTable();
1043  abbreviatedMonthNames = value;
1044  }
1045  }
1046 
1052  [__DynamicallyInvokable]
1053  public string[] MonthNames
1054  {
1055  [__DynamicallyInvokable]
1056  get
1057  {
1058  return (string[])internalGetMonthNames().Clone();
1059  }
1060  [__DynamicallyInvokable]
1061  set
1062  {
1063  if (IsReadOnly)
1064  {
1065  throw new InvalidOperationException(Environment.GetResourceString("InvalidOperation_ReadOnly"));
1066  }
1067  if (value == null)
1068  {
1069  throw new ArgumentNullException("value", Environment.GetResourceString("ArgumentNull_Array"));
1070  }
1071  if (value.Length != 13)
1072  {
1073  throw new ArgumentException(Environment.GetResourceString("Argument_InvalidArrayLength", 13), "value");
1074  }
1075  CheckNullValue(value, value.Length - 1);
1076  monthNames = value;
1077  ClearTokenHashTable();
1078  }
1079  }
1080 
1081  internal bool HasSpacesInMonthNames => (FormatFlags & DateTimeFormatFlags.UseSpacesInMonthNames) != DateTimeFormatFlags.None;
1082 
1083  internal bool HasSpacesInDayNames => (FormatFlags & DateTimeFormatFlags.UseSpacesInDayNames) != DateTimeFormatFlags.None;
1084 
1085  private string[] AllYearMonthPatterns => GetMergedPatterns(UnclonedYearMonthPatterns, YearMonthPattern);
1086 
1087  private string[] AllShortDatePatterns => GetMergedPatterns(UnclonedShortDatePatterns, ShortDatePattern);
1088 
1089  private string[] AllShortTimePatterns => GetMergedPatterns(UnclonedShortTimePatterns, ShortTimePattern);
1090 
1091  private string[] AllLongDatePatterns => GetMergedPatterns(UnclonedLongDatePatterns, LongDatePattern);
1092 
1093  private string[] AllLongTimePatterns => GetMergedPatterns(UnclonedLongTimePatterns, LongTimePattern);
1094 
1095  private string[] UnclonedYearMonthPatterns
1096  {
1097  get
1098  {
1099  if (allYearMonthPatterns == null)
1100  {
1101  allYearMonthPatterns = m_cultureData.YearMonths(Calendar.ID);
1102  }
1103  return allYearMonthPatterns;
1104  }
1105  }
1106 
1107  private string[] UnclonedShortDatePatterns
1108  {
1109  get
1110  {
1111  if (allShortDatePatterns == null)
1112  {
1113  allShortDatePatterns = m_cultureData.ShortDates(Calendar.ID);
1114  }
1115  return allShortDatePatterns;
1116  }
1117  }
1118 
1119  private string[] UnclonedLongDatePatterns
1120  {
1121  get
1122  {
1123  if (allLongDatePatterns == null)
1124  {
1125  allLongDatePatterns = m_cultureData.LongDates(Calendar.ID);
1126  }
1127  return allLongDatePatterns;
1128  }
1129  }
1130 
1131  private string[] UnclonedShortTimePatterns
1132  {
1133  get
1134  {
1135  if (allShortTimePatterns == null)
1136  {
1137  allShortTimePatterns = m_cultureData.ShortTimes;
1138  }
1139  return allShortTimePatterns;
1140  }
1141  }
1142 
1143  private string[] UnclonedLongTimePatterns
1144  {
1145  get
1146  {
1147  if (allLongTimePatterns == null)
1148  {
1149  allLongTimePatterns = m_cultureData.LongTimes;
1150  }
1151  return allLongTimePatterns;
1152  }
1153  }
1154 
1158  [__DynamicallyInvokable]
1159  public bool IsReadOnly
1160  {
1161  [__DynamicallyInvokable]
1162  get
1163  {
1164  return m_isReadOnly;
1165  }
1166  }
1167 
1170  [ComVisible(false)]
1171  public string NativeCalendarName
1172  {
1173  get
1174  {
1175  return m_cultureData.CalendarName(Calendar.ID);
1176  }
1177  }
1178 
1184  [ComVisible(false)]
1185  [__DynamicallyInvokable]
1186  public string[] AbbreviatedMonthGenitiveNames
1187  {
1188  [__DynamicallyInvokable]
1189  get
1190  {
1191  return (string[])internalGetGenitiveMonthNames(abbreviated: true).Clone();
1192  }
1193  [__DynamicallyInvokable]
1194  set
1195  {
1196  if (IsReadOnly)
1197  {
1198  throw new InvalidOperationException(Environment.GetResourceString("InvalidOperation_ReadOnly"));
1199  }
1200  if (value == null)
1201  {
1202  throw new ArgumentNullException("value", Environment.GetResourceString("ArgumentNull_Array"));
1203  }
1204  if (value.Length != 13)
1205  {
1206  throw new ArgumentException(Environment.GetResourceString("Argument_InvalidArrayLength", 13), "value");
1207  }
1208  CheckNullValue(value, value.Length - 1);
1209  ClearTokenHashTable();
1210  m_genitiveAbbreviatedMonthNames = value;
1211  }
1212  }
1213 
1219  [ComVisible(false)]
1220  [__DynamicallyInvokable]
1221  public string[] MonthGenitiveNames
1222  {
1223  [__DynamicallyInvokable]
1224  get
1225  {
1226  return (string[])internalGetGenitiveMonthNames(abbreviated: false).Clone();
1227  }
1228  [__DynamicallyInvokable]
1229  set
1230  {
1231  if (IsReadOnly)
1232  {
1233  throw new InvalidOperationException(Environment.GetResourceString("InvalidOperation_ReadOnly"));
1234  }
1235  if (value == null)
1236  {
1237  throw new ArgumentNullException("value", Environment.GetResourceString("ArgumentNull_Array"));
1238  }
1239  if (value.Length != 13)
1240  {
1241  throw new ArgumentException(Environment.GetResourceString("Argument_InvalidArrayLength", 13), "value");
1242  }
1243  CheckNullValue(value, value.Length - 1);
1244  genitiveMonthNames = value;
1245  ClearTokenHashTable();
1246  }
1247  }
1248 
1249  internal string FullTimeSpanPositivePattern
1250  {
1251  get
1252  {
1253  if (m_fullTimeSpanPositivePattern == null)
1254  {
1255  CultureData cultureData = (!m_cultureData.UseUserOverride) ? m_cultureData : CultureData.GetCultureData(m_cultureData.CultureName, useUserOverride: false);
1256  string numberDecimalSeparator = new NumberFormatInfo(cultureData).NumberDecimalSeparator;
1257  m_fullTimeSpanPositivePattern = "d':'h':'mm':'ss'" + numberDecimalSeparator + "'FFFFFFF";
1258  }
1259  return m_fullTimeSpanPositivePattern;
1260  }
1261  }
1262 
1263  internal string FullTimeSpanNegativePattern
1264  {
1265  get
1266  {
1267  if (m_fullTimeSpanNegativePattern == null)
1268  {
1269  m_fullTimeSpanNegativePattern = "'-'" + FullTimeSpanPositivePattern;
1270  }
1271  return m_fullTimeSpanNegativePattern;
1272  }
1273  }
1274 
1275  internal CompareInfo CompareInfo
1276  {
1277  get
1278  {
1279  if (m_compareInfo == null)
1280  {
1281  m_compareInfo = CompareInfo.GetCompareInfo(m_cultureData.SCOMPAREINFO);
1282  }
1283  return m_compareInfo;
1284  }
1285  }
1286 
1287  internal DateTimeFormatFlags FormatFlags
1288  {
1289  get
1290  {
1291  if (formatFlags == DateTimeFormatFlags.NotInitialized)
1292  {
1293  formatFlags = DateTimeFormatFlags.None;
1294  formatFlags |= (DateTimeFormatFlags)DateTimeFormatInfoScanner.GetFormatFlagGenitiveMonth(MonthNames, internalGetGenitiveMonthNames(abbreviated: false), AbbreviatedMonthNames, internalGetGenitiveMonthNames(abbreviated: true));
1295  formatFlags |= (DateTimeFormatFlags)DateTimeFormatInfoScanner.GetFormatFlagUseSpaceInMonthNames(MonthNames, internalGetGenitiveMonthNames(abbreviated: false), AbbreviatedMonthNames, internalGetGenitiveMonthNames(abbreviated: true));
1296  formatFlags |= (DateTimeFormatFlags)DateTimeFormatInfoScanner.GetFormatFlagUseSpaceInDayNames(DayNames, AbbreviatedDayNames);
1297  formatFlags |= (DateTimeFormatFlags)DateTimeFormatInfoScanner.GetFormatFlagUseHebrewCalendar(Calendar.ID);
1298  }
1299  return formatFlags;
1300  }
1301  }
1302 
1303  internal bool HasForceTwoDigitYears
1304  {
1305  get
1306  {
1307  int iD = calendar.ID;
1308  if (iD == 3 || iD == 4)
1309  {
1310  return true;
1311  }
1312  return false;
1313  }
1314  }
1315 
1316  internal bool HasYearMonthAdjustment => (FormatFlags & DateTimeFormatFlags.UseHebrewRule) != DateTimeFormatFlags.None;
1317 
1318  [SecuritySafeCritical]
1319  private static bool InitPreferExistingTokens()
1320  {
1321  bool flag = false;
1322  return DateTime.LegacyParseMode();
1323  }
1324 
1325  private string[] internalGetAbbreviatedDayOfWeekNames()
1326  {
1327  if (abbreviatedDayNames == null)
1328  {
1329  abbreviatedDayNames = m_cultureData.AbbreviatedDayNames(Calendar.ID);
1330  }
1331  return abbreviatedDayNames;
1332  }
1333 
1334  private string[] internalGetSuperShortDayNames()
1335  {
1336  if (m_superShortDayNames == null)
1337  {
1338  m_superShortDayNames = m_cultureData.SuperShortDayNames(Calendar.ID);
1339  }
1340  return m_superShortDayNames;
1341  }
1342 
1343  private string[] internalGetDayOfWeekNames()
1344  {
1345  if (dayNames == null)
1346  {
1347  dayNames = m_cultureData.DayNames(Calendar.ID);
1348  }
1349  return dayNames;
1350  }
1351 
1352  private string[] internalGetAbbreviatedMonthNames()
1353  {
1354  if (abbreviatedMonthNames == null)
1355  {
1356  abbreviatedMonthNames = m_cultureData.AbbreviatedMonthNames(Calendar.ID);
1357  }
1358  return abbreviatedMonthNames;
1359  }
1360 
1361  private string[] internalGetMonthNames()
1362  {
1363  if (monthNames == null)
1364  {
1365  monthNames = m_cultureData.MonthNames(Calendar.ID);
1366  }
1367  return monthNames;
1368  }
1369 
1371  [__DynamicallyInvokable]
1372  public DateTimeFormatInfo()
1373  : this(CultureInfo.InvariantCulture.m_cultureData, GregorianCalendar.GetDefaultInstance())
1374  {
1375  }
1376 
1377  internal DateTimeFormatInfo(CultureData cultureData, Calendar cal)
1378  {
1379  m_cultureData = cultureData;
1380  Calendar = cal;
1381  }
1382 
1383  [SecuritySafeCritical]
1384  private void InitializeOverridableProperties(CultureData cultureData, int calendarID)
1385  {
1386  if (firstDayOfWeek == -1)
1387  {
1388  firstDayOfWeek = cultureData.IFIRSTDAYOFWEEK;
1389  }
1390  if (calendarWeekRule == -1)
1391  {
1392  calendarWeekRule = cultureData.IFIRSTWEEKOFYEAR;
1393  }
1394  if (amDesignator == null)
1395  {
1396  amDesignator = cultureData.SAM1159;
1397  }
1398  if (pmDesignator == null)
1399  {
1400  pmDesignator = cultureData.SPM2359;
1401  }
1402  if (timeSeparator == null)
1403  {
1404  timeSeparator = cultureData.TimeSeparator;
1405  }
1406  if (dateSeparator == null)
1407  {
1408  dateSeparator = cultureData.DateSeparator(calendarID);
1409  }
1410  allLongTimePatterns = m_cultureData.LongTimes;
1411  allShortTimePatterns = m_cultureData.ShortTimes;
1412  allLongDatePatterns = cultureData.LongDates(calendarID);
1413  allShortDatePatterns = cultureData.ShortDates(calendarID);
1414  allYearMonthPatterns = cultureData.YearMonths(calendarID);
1415  }
1416 
1417  [OnDeserialized]
1418  private void OnDeserialized(StreamingContext ctx)
1419  {
1420  if (m_name != null)
1421  {
1422  m_cultureData = CultureData.GetCultureData(m_name, m_useUserOverride);
1423  if (m_cultureData == null)
1424  {
1425  throw new CultureNotFoundException("m_name", m_name, Environment.GetResourceString("Argument_CultureNotSupported"));
1426  }
1427  }
1428  else
1429  {
1430  m_cultureData = CultureData.GetCultureData(CultureID, m_useUserOverride);
1431  }
1432  if (calendar == null)
1433  {
1434  calendar = (Calendar)GregorianCalendar.GetDefaultInstance().Clone();
1435  calendar.SetReadOnlyState(m_isReadOnly);
1436  }
1437  else
1438  {
1439  CultureInfo.CheckDomainSafetyObject(calendar, this);
1440  }
1441  InitializeOverridableProperties(m_cultureData, calendar.ID);
1442  bool isReadOnly = m_isReadOnly;
1443  m_isReadOnly = false;
1444  if (longDatePattern != null)
1445  {
1446  LongDatePattern = longDatePattern;
1447  }
1448  if (shortDatePattern != null)
1449  {
1450  ShortDatePattern = shortDatePattern;
1451  }
1452  if (yearMonthPattern != null)
1453  {
1454  YearMonthPattern = yearMonthPattern;
1455  }
1456  if (longTimePattern != null)
1457  {
1458  LongTimePattern = longTimePattern;
1459  }
1460  if (shortTimePattern != null)
1461  {
1462  ShortTimePattern = shortTimePattern;
1463  }
1464  m_isReadOnly = isReadOnly;
1465  }
1466 
1467  [OnSerializing]
1468  private void OnSerializing(StreamingContext ctx)
1469  {
1470  CultureID = m_cultureData.ILANGUAGE;
1471  m_useUserOverride = m_cultureData.UseUserOverride;
1472  m_name = CultureName;
1473  if (s_calendarNativeNames == null)
1474  {
1475  s_calendarNativeNames = new Hashtable();
1476  }
1477  object obj = LongTimePattern;
1478  obj = LongDatePattern;
1479  obj = ShortTimePattern;
1480  obj = ShortDatePattern;
1481  obj = YearMonthPattern;
1482  obj = AllLongTimePatterns;
1483  obj = AllLongDatePatterns;
1484  obj = AllShortTimePatterns;
1485  obj = AllShortDatePatterns;
1486  obj = AllYearMonthPatterns;
1487  }
1488 
1493  [__DynamicallyInvokable]
1494  public static DateTimeFormatInfo GetInstance(IFormatProvider provider)
1495  {
1496  CultureInfo cultureInfo = provider as CultureInfo;
1497  if (cultureInfo != null && !cultureInfo.m_isInherited)
1498  {
1499  return cultureInfo.DateTimeFormat;
1500  }
1501  DateTimeFormatInfo dateTimeFormatInfo = provider as DateTimeFormatInfo;
1502  if (dateTimeFormatInfo != null)
1503  {
1504  return dateTimeFormatInfo;
1505  }
1506  if (provider != null)
1507  {
1508  dateTimeFormatInfo = (provider.GetFormat(typeof(DateTimeFormatInfo)) as DateTimeFormatInfo);
1509  if (dateTimeFormatInfo != null)
1510  {
1511  return dateTimeFormatInfo;
1512  }
1513  }
1514  return CurrentInfo;
1515  }
1516 
1520  [__DynamicallyInvokable]
1521  public object GetFormat(Type formatType)
1522  {
1523  if (!(formatType == typeof(DateTimeFormatInfo)))
1524  {
1525  return null;
1526  }
1527  return this;
1528  }
1529 
1532  [__DynamicallyInvokable]
1533  public object Clone()
1534  {
1535  DateTimeFormatInfo dateTimeFormatInfo = (DateTimeFormatInfo)MemberwiseClone();
1536  dateTimeFormatInfo.calendar = (Calendar)Calendar.Clone();
1537  dateTimeFormatInfo.m_isReadOnly = false;
1538  return dateTimeFormatInfo;
1539  }
1540 
1546  [__DynamicallyInvokable]
1547  public int GetEra(string eraName)
1548  {
1549  if (eraName == null)
1550  {
1551  throw new ArgumentNullException("eraName", Environment.GetResourceString("ArgumentNull_String"));
1552  }
1553  if (eraName.Length == 0)
1554  {
1555  return -1;
1556  }
1557  for (int i = 0; i < EraNames.Length; i++)
1558  {
1559  if (m_eraNames[i].Length > 0 && string.Compare(eraName, m_eraNames[i], Culture, CompareOptions.IgnoreCase) == 0)
1560  {
1561  return i + 1;
1562  }
1563  }
1564  for (int j = 0; j < AbbreviatedEraNames.Length; j++)
1565  {
1566  if (string.Compare(eraName, m_abbrevEraNames[j], Culture, CompareOptions.IgnoreCase) == 0)
1567  {
1568  return j + 1;
1569  }
1570  }
1571  for (int k = 0; k < AbbreviatedEnglishEraNames.Length; k++)
1572  {
1573  if (string.Compare(eraName, m_abbrevEnglishEraNames[k], StringComparison.InvariantCultureIgnoreCase) == 0)
1574  {
1575  return k + 1;
1576  }
1577  }
1578  return -1;
1579  }
1580 
1586  [__DynamicallyInvokable]
1587  public string GetEraName(int era)
1588  {
1589  if (era == 0)
1590  {
1591  era = Calendar.CurrentEraValue;
1592  }
1593  if (--era < EraNames.Length && era >= 0)
1594  {
1595  return m_eraNames[era];
1596  }
1597  throw new ArgumentOutOfRangeException("era", Environment.GetResourceString("ArgumentOutOfRange_InvalidEraValue"));
1598  }
1599 
1605  [__DynamicallyInvokable]
1606  public string GetAbbreviatedEraName(int era)
1607  {
1608  if (AbbreviatedEraNames.Length == 0)
1609  {
1610  return GetEraName(era);
1611  }
1612  if (era == 0)
1613  {
1614  era = Calendar.CurrentEraValue;
1615  }
1616  if (--era < m_abbrevEraNames.Length && era >= 0)
1617  {
1618  return m_abbrevEraNames[era];
1619  }
1620  throw new ArgumentOutOfRangeException("era", Environment.GetResourceString("ArgumentOutOfRange_InvalidEraValue"));
1621  }
1622 
1623  private static void CheckNullValue(string[] values, int length)
1624  {
1625  int num = 0;
1626  while (true)
1627  {
1628  if (num < length)
1629  {
1630  if (values[num] == null)
1631  {
1632  break;
1633  }
1634  num++;
1635  continue;
1636  }
1637  return;
1638  }
1639  throw new ArgumentNullException("value", Environment.GetResourceString("ArgumentNull_ArrayValue"));
1640  }
1641 
1642  internal string internalGetMonthName(int month, MonthNameStyles style, bool abbreviated)
1643  {
1644  string[] array = null;
1645  switch (style)
1646  {
1647  case MonthNameStyles.Genitive:
1648  array = internalGetGenitiveMonthNames(abbreviated);
1649  break;
1650  case MonthNameStyles.LeapYear:
1651  array = internalGetLeapYearMonthNames();
1652  break;
1653  default:
1654  array = (abbreviated ? internalGetAbbreviatedMonthNames() : internalGetMonthNames());
1655  break;
1656  }
1657  if (month < 1 || month > array.Length)
1658  {
1659  throw new ArgumentOutOfRangeException("month", Environment.GetResourceString("ArgumentOutOfRange_Range", 1, array.Length));
1660  }
1661  return array[month - 1];
1662  }
1663 
1664  private string[] internalGetGenitiveMonthNames(bool abbreviated)
1665  {
1666  if (abbreviated)
1667  {
1668  if (m_genitiveAbbreviatedMonthNames == null)
1669  {
1670  m_genitiveAbbreviatedMonthNames = m_cultureData.AbbreviatedGenitiveMonthNames(Calendar.ID);
1671  }
1672  return m_genitiveAbbreviatedMonthNames;
1673  }
1674  if (genitiveMonthNames == null)
1675  {
1676  genitiveMonthNames = m_cultureData.GenitiveMonthNames(Calendar.ID);
1677  }
1678  return genitiveMonthNames;
1679  }
1680 
1681  internal string[] internalGetLeapYearMonthNames()
1682  {
1683  if (leapYearMonthNames == null)
1684  {
1685  leapYearMonthNames = m_cultureData.LeapYearMonthNames(Calendar.ID);
1686  }
1687  return leapYearMonthNames;
1688  }
1689 
1695  [__DynamicallyInvokable]
1696  public string GetAbbreviatedDayName(DayOfWeek dayofweek)
1697  {
1698  if (dayofweek < DayOfWeek.Sunday || dayofweek > DayOfWeek.Saturday)
1699  {
1700  throw new ArgumentOutOfRangeException("dayofweek", Environment.GetResourceString("ArgumentOutOfRange_Range", DayOfWeek.Sunday, DayOfWeek.Saturday));
1701  }
1702  return internalGetAbbreviatedDayOfWeekNames()[(int)dayofweek];
1703  }
1704 
1710  [ComVisible(false)]
1711  public string GetShortestDayName(DayOfWeek dayOfWeek)
1712  {
1713  if (dayOfWeek < DayOfWeek.Sunday || dayOfWeek > DayOfWeek.Saturday)
1714  {
1715  throw new ArgumentOutOfRangeException("dayOfWeek", Environment.GetResourceString("ArgumentOutOfRange_Range", DayOfWeek.Sunday, DayOfWeek.Saturday));
1716  }
1717  return internalGetSuperShortDayNames()[(int)dayOfWeek];
1718  }
1719 
1720  private static string[] GetCombinedPatterns(string[] patterns1, string[] patterns2, string connectString)
1721  {
1722  string[] array = new string[patterns1.Length * patterns2.Length];
1723  int num = 0;
1724  for (int i = 0; i < patterns1.Length; i++)
1725  {
1726  for (int j = 0; j < patterns2.Length; j++)
1727  {
1728  array[num++] = patterns1[i] + connectString + patterns2[j];
1729  }
1730  }
1731  return array;
1732  }
1733 
1736  public string[] GetAllDateTimePatterns()
1737  {
1738  List<string> list = new List<string>(132);
1739  for (int i = 0; i < DateTimeFormat.allStandardFormats.Length; i++)
1740  {
1741  string[] allDateTimePatterns = GetAllDateTimePatterns(DateTimeFormat.allStandardFormats[i]);
1742  for (int j = 0; j < allDateTimePatterns.Length; j++)
1743  {
1744  list.Add(allDateTimePatterns[j]);
1745  }
1746  }
1747  return list.ToArray();
1748  }
1749 
1755  public string[] GetAllDateTimePatterns(char format)
1756  {
1757  string[] array = null;
1758  switch (format)
1759  {
1760  case 'd':
1761  return AllShortDatePatterns;
1762  case 'D':
1763  return AllLongDatePatterns;
1764  case 'f':
1765  return GetCombinedPatterns(AllLongDatePatterns, AllShortTimePatterns, " ");
1766  case 'F':
1767  case 'U':
1768  return GetCombinedPatterns(AllLongDatePatterns, AllLongTimePatterns, " ");
1769  case 'g':
1770  return GetCombinedPatterns(AllShortDatePatterns, AllShortTimePatterns, " ");
1771  case 'G':
1772  return GetCombinedPatterns(AllShortDatePatterns, AllLongTimePatterns, " ");
1773  case 'M':
1774  case 'm':
1775  return new string[1]
1776  {
1778  };
1779  case 'O':
1780  case 'o':
1781  return new string[1]
1782  {
1783  "yyyy'-'MM'-'dd'T'HH':'mm':'ss.fffffffK"
1784  };
1785  case 'R':
1786  case 'r':
1787  return new string[1]
1788  {
1789  "ddd, dd MMM yyyy HH':'mm':'ss 'GMT'"
1790  };
1791  case 's':
1792  return new string[1]
1793  {
1794  "yyyy'-'MM'-'dd'T'HH':'mm':'ss"
1795  };
1796  case 't':
1797  return AllShortTimePatterns;
1798  case 'T':
1799  return AllLongTimePatterns;
1800  case 'u':
1801  return new string[1]
1802  {
1803  UniversalSortableDateTimePattern
1804  };
1805  case 'Y':
1806  case 'y':
1807  return AllYearMonthPatterns;
1808  default:
1809  throw new ArgumentException(Environment.GetResourceString("Format_BadFormatSpecifier"), "format");
1810  }
1811  }
1812 
1818  [__DynamicallyInvokable]
1819  public string GetDayName(DayOfWeek dayofweek)
1820  {
1821  if (dayofweek < DayOfWeek.Sunday || dayofweek > DayOfWeek.Saturday)
1822  {
1823  throw new ArgumentOutOfRangeException("dayofweek", Environment.GetResourceString("ArgumentOutOfRange_Range", DayOfWeek.Sunday, DayOfWeek.Saturday));
1824  }
1825  return internalGetDayOfWeekNames()[(int)dayofweek];
1826  }
1827 
1833  [__DynamicallyInvokable]
1834  public string GetAbbreviatedMonthName(int month)
1835  {
1836  if (month < 1 || month > 13)
1837  {
1838  throw new ArgumentOutOfRangeException("month", Environment.GetResourceString("ArgumentOutOfRange_Range", 1, 13));
1839  }
1840  return internalGetAbbreviatedMonthNames()[month - 1];
1841  }
1842 
1848  [__DynamicallyInvokable]
1849  public string GetMonthName(int month)
1850  {
1851  if (month < 1 || month > 13)
1852  {
1853  throw new ArgumentOutOfRangeException("month", Environment.GetResourceString("ArgumentOutOfRange_Range", 1, 13));
1854  }
1855  return internalGetMonthNames()[month - 1];
1856  }
1857 
1858  private static string[] GetMergedPatterns(string[] patterns, string defaultPattern)
1859  {
1860  if (defaultPattern == patterns[0])
1861  {
1862  return (string[])patterns.Clone();
1863  }
1864  int i;
1865  for (i = 0; i < patterns.Length && !(defaultPattern == patterns[i]); i++)
1866  {
1867  }
1868  string[] array;
1869  if (i < patterns.Length)
1870  {
1871  array = (string[])patterns.Clone();
1872  array[i] = array[0];
1873  }
1874  else
1875  {
1876  array = new string[patterns.Length + 1];
1877  Array.Copy(patterns, 0, array, 1, patterns.Length);
1878  }
1879  array[0] = defaultPattern;
1880  return array;
1881  }
1882 
1888  [__DynamicallyInvokable]
1889  public static DateTimeFormatInfo ReadOnly(DateTimeFormatInfo dtfi)
1890  {
1891  if (dtfi == null)
1892  {
1893  throw new ArgumentNullException("dtfi", Environment.GetResourceString("ArgumentNull_Obj"));
1894  }
1895  if (dtfi.IsReadOnly)
1896  {
1897  return dtfi;
1898  }
1899  DateTimeFormatInfo dateTimeFormatInfo = (DateTimeFormatInfo)dtfi.MemberwiseClone();
1900  dateTimeFormatInfo.calendar = Calendar.ReadOnly(dtfi.Calendar);
1901  dateTimeFormatInfo.m_isReadOnly = true;
1902  return dateTimeFormatInfo;
1903  }
1904 
1914  [ComVisible(false)]
1915  public void SetAllDateTimePatterns(string[] patterns, char format)
1916  {
1917  if (IsReadOnly)
1918  {
1919  throw new InvalidOperationException(Environment.GetResourceString("InvalidOperation_ReadOnly"));
1920  }
1921  if (patterns == null)
1922  {
1923  throw new ArgumentNullException("patterns", Environment.GetResourceString("ArgumentNull_Array"));
1924  }
1925  if (patterns.Length == 0)
1926  {
1927  throw new ArgumentException(Environment.GetResourceString("Arg_ArrayZeroError"), "patterns");
1928  }
1929  for (int i = 0; i < patterns.Length; i++)
1930  {
1931  if (patterns[i] == null)
1932  {
1933  throw new ArgumentNullException(Environment.GetResourceString("ArgumentNull_ArrayValue"));
1934  }
1935  }
1936  switch (format)
1937  {
1938  case 'd':
1939  allShortDatePatterns = patterns;
1940  shortDatePattern = allShortDatePatterns[0];
1941  break;
1942  case 'D':
1943  allLongDatePatterns = patterns;
1944  longDatePattern = allLongDatePatterns[0];
1945  break;
1946  case 't':
1947  allShortTimePatterns = patterns;
1948  shortTimePattern = allShortTimePatterns[0];
1949  break;
1950  case 'T':
1951  allLongTimePatterns = patterns;
1952  longTimePattern = allLongTimePatterns[0];
1953  break;
1954  case 'Y':
1955  case 'y':
1956  allYearMonthPatterns = patterns;
1957  yearMonthPattern = allYearMonthPatterns[0];
1958  break;
1959  default:
1960  throw new ArgumentException(Environment.GetResourceString("Format_BadFormatSpecifier"), "format");
1961  }
1962  ClearTokenHashTable();
1963  }
1964 
1965  internal static void ValidateStyles(DateTimeStyles style, string parameterName)
1966  {
1967  if ((style & ~(DateTimeStyles.AllowLeadingWhite | DateTimeStyles.AllowTrailingWhite | DateTimeStyles.AllowInnerWhite | DateTimeStyles.NoCurrentDateDefault | DateTimeStyles.AdjustToUniversal | DateTimeStyles.AssumeLocal | DateTimeStyles.AssumeUniversal | DateTimeStyles.RoundtripKind)) != 0)
1968  {
1969  throw new ArgumentException(Environment.GetResourceString("Argument_InvalidDateTimeStyles"), parameterName);
1970  }
1971  if ((style & DateTimeStyles.AssumeLocal) != 0 && (style & DateTimeStyles.AssumeUniversal) != 0)
1972  {
1973  throw new ArgumentException(Environment.GetResourceString("Argument_ConflictingDateTimeStyles"), parameterName);
1974  }
1975  if ((style & DateTimeStyles.RoundtripKind) != 0 && (style & (DateTimeStyles.AdjustToUniversal | DateTimeStyles.AssumeLocal | DateTimeStyles.AssumeUniversal)) != 0)
1976  {
1977  throw new ArgumentException(Environment.GetResourceString("Argument_ConflictingDateTimeRoundtripStyles"), parameterName);
1978  }
1979  }
1980 
1981  internal bool YearMonthAdjustment(ref int year, ref int month, bool parsedMonthName)
1982  {
1983  if ((FormatFlags & DateTimeFormatFlags.UseHebrewRule) != 0)
1984  {
1985  if (year < 1000)
1986  {
1987  year += 5000;
1988  }
1990  {
1991  return false;
1992  }
1993  if (parsedMonthName && !Calendar.IsLeapYear(year))
1994  {
1995  if (month >= 8)
1996  {
1997  month--;
1998  }
1999  else if (month == 7)
2000  {
2001  return false;
2002  }
2003  }
2004  }
2005  return true;
2006  }
2007 
2008  internal static DateTimeFormatInfo GetJapaneseCalendarDTFI()
2009  {
2010  DateTimeFormatInfo dateTimeFormat = s_jajpDTFI;
2011  if (dateTimeFormat == null)
2012  {
2013  dateTimeFormat = new CultureInfo("ja-JP", useUserOverride: false).DateTimeFormat;
2014  dateTimeFormat.Calendar = JapaneseCalendar.GetDefaultInstance();
2015  s_jajpDTFI = dateTimeFormat;
2016  }
2017  return dateTimeFormat;
2018  }
2019 
2020  internal static DateTimeFormatInfo GetTaiwanCalendarDTFI()
2021  {
2022  DateTimeFormatInfo dateTimeFormat = s_zhtwDTFI;
2023  if (dateTimeFormat == null)
2024  {
2025  dateTimeFormat = new CultureInfo("zh-TW", useUserOverride: false).DateTimeFormat;
2026  dateTimeFormat.Calendar = TaiwanCalendar.GetDefaultInstance();
2027  s_zhtwDTFI = dateTimeFormat;
2028  }
2029  return dateTimeFormat;
2030  }
2031 
2032  private void ClearTokenHashTable()
2033  {
2034  m_dtfiTokenHash = null;
2035  formatFlags = DateTimeFormatFlags.NotInitialized;
2036  }
2037 
2038  [SecurityCritical]
2039  internal TokenHashValue[] CreateTokenHashTable()
2040  {
2041  TokenHashValue[] array = m_dtfiTokenHash;
2042  if (array == null)
2043  {
2044  array = new TokenHashValue[199];
2045  bool flag = LanguageName.Equals("ko");
2046  string b = TimeSeparator.Trim();
2047  if ("," != b)
2048  {
2049  InsertHash(array, ",", TokenType.IgnorableSymbol, 0);
2050  }
2051  if ("." != b)
2052  {
2053  InsertHash(array, ".", TokenType.IgnorableSymbol, 0);
2054  }
2055  if ("시" != b && "時" != b && "时" != b)
2056  {
2057  InsertHash(array, TimeSeparator, TokenType.SEP_Time, 0);
2058  }
2059  InsertHash(array, AMDesignator, (TokenType)1027, 0);
2060  InsertHash(array, PMDesignator, (TokenType)1284, 1);
2061  if (LanguageName.Equals("sq"))
2062  {
2063  InsertHash(array, "." + AMDesignator, (TokenType)1027, 0);
2064  InsertHash(array, "." + PMDesignator, (TokenType)1284, 1);
2065  }
2066  InsertHash(array, "年", TokenType.SEP_YearSuff, 0);
2067  InsertHash(array, "년", TokenType.SEP_YearSuff, 0);
2068  InsertHash(array, "月", TokenType.SEP_MonthSuff, 0);
2069  InsertHash(array, "월", TokenType.SEP_MonthSuff, 0);
2070  InsertHash(array, "日", TokenType.SEP_DaySuff, 0);
2071  InsertHash(array, "일", TokenType.SEP_DaySuff, 0);
2072  InsertHash(array, "時", TokenType.SEP_HourSuff, 0);
2073  InsertHash(array, "时", TokenType.SEP_HourSuff, 0);
2074  InsertHash(array, "分", TokenType.SEP_MinuteSuff, 0);
2075  InsertHash(array, "秒", TokenType.SEP_SecondSuff, 0);
2076  if (flag)
2077  {
2078  InsertHash(array, "시", TokenType.SEP_HourSuff, 0);
2079  InsertHash(array, "분", TokenType.SEP_MinuteSuff, 0);
2080  InsertHash(array, "초", TokenType.SEP_SecondSuff, 0);
2081  }
2082  if (LanguageName.Equals("ky"))
2083  {
2084  InsertHash(array, "-", TokenType.IgnorableSymbol, 0);
2085  }
2086  else
2087  {
2088  InsertHash(array, "-", TokenType.SEP_DateOrOffset, 0);
2089  }
2090  string[] array2 = null;
2091  DateTimeFormatInfoScanner dateTimeFormatInfoScanner = null;
2092  dateTimeFormatInfoScanner = new DateTimeFormatInfoScanner();
2093  array2 = (m_dateWords = dateTimeFormatInfoScanner.GetDateWordsOfDTFI(this));
2094  DateTimeFormatFlags dateTimeFormatFlags = FormatFlags;
2095  bool flag2 = false;
2096  string text = null;
2097  if (array2 != null)
2098  {
2099  for (int i = 0; i < array2.Length; i++)
2100  {
2101  switch (array2[i][0])
2102  {
2103  case '\ue000':
2104  text = array2[i].Substring(1);
2105  AddMonthNames(array, text);
2106  break;
2107  case '\ue001':
2108  {
2109  string text2 = array2[i].Substring(1);
2110  InsertHash(array, text2, TokenType.IgnorableSymbol, 0);
2111  if (DateSeparator.Trim(null).Equals(text2))
2112  {
2113  flag2 = true;
2114  }
2115  break;
2116  }
2117  default:
2118  InsertHash(array, array2[i], TokenType.DateWordToken, 0);
2119  if (LanguageName.Equals("eu"))
2120  {
2121  InsertHash(array, "." + array2[i], TokenType.DateWordToken, 0);
2122  }
2123  break;
2124  }
2125  }
2126  }
2127  if (!flag2)
2128  {
2129  InsertHash(array, DateSeparator, TokenType.SEP_Date, 0);
2130  }
2131  AddMonthNames(array, null);
2132  for (int j = 1; j <= 13; j++)
2133  {
2134  InsertHash(array, GetAbbreviatedMonthName(j), TokenType.MonthToken, j);
2135  }
2136  if ((FormatFlags & DateTimeFormatFlags.UseGenitiveMonth) != 0)
2137  {
2138  for (int k = 1; k <= 13; k++)
2139  {
2140  string str = internalGetMonthName(k, MonthNameStyles.Genitive, abbreviated: false);
2141  InsertHash(array, str, TokenType.MonthToken, k);
2142  }
2143  }
2144  if ((FormatFlags & DateTimeFormatFlags.UseLeapYearMonth) != 0)
2145  {
2146  for (int l = 1; l <= 13; l++)
2147  {
2148  string str2 = internalGetMonthName(l, MonthNameStyles.LeapYear, abbreviated: false);
2149  InsertHash(array, str2, TokenType.MonthToken, l);
2150  }
2151  }
2152  for (int m = 0; m < 7; m++)
2153  {
2154  string dayName = GetDayName((DayOfWeek)m);
2155  InsertHash(array, dayName, TokenType.DayOfWeekToken, m);
2156  dayName = GetAbbreviatedDayName((DayOfWeek)m);
2157  InsertHash(array, dayName, TokenType.DayOfWeekToken, m);
2158  }
2159  int[] eras = calendar.Eras;
2160  for (int n = 1; n <= eras.Length; n++)
2161  {
2162  InsertHash(array, GetEraName(n), TokenType.EraToken, n);
2163  InsertHash(array, GetAbbreviatedEraName(n), TokenType.EraToken, n);
2164  }
2165  if (LanguageName.Equals("ja"))
2166  {
2167  for (int num = 0; num < 7; num++)
2168  {
2169  string str3 = "(" + GetAbbreviatedDayName((DayOfWeek)num) + ")";
2170  InsertHash(array, str3, TokenType.DayOfWeekToken, num);
2171  }
2172  if (Calendar.GetType() != typeof(JapaneseCalendar))
2173  {
2174  DateTimeFormatInfo japaneseCalendarDTFI = GetJapaneseCalendarDTFI();
2175  for (int num2 = 1; num2 <= japaneseCalendarDTFI.Calendar.Eras.Length; num2++)
2176  {
2177  InsertHash(array, japaneseCalendarDTFI.GetEraName(num2), TokenType.JapaneseEraToken, num2);
2178  InsertHash(array, japaneseCalendarDTFI.GetAbbreviatedEraName(num2), TokenType.JapaneseEraToken, num2);
2179  InsertHash(array, japaneseCalendarDTFI.AbbreviatedEnglishEraNames[num2 - 1], TokenType.JapaneseEraToken, num2);
2180  }
2181  }
2182  }
2183  else if (CultureName.Equals("zh-TW"))
2184  {
2185  DateTimeFormatInfo taiwanCalendarDTFI = GetTaiwanCalendarDTFI();
2186  for (int num3 = 1; num3 <= taiwanCalendarDTFI.Calendar.Eras.Length; num3++)
2187  {
2188  if (taiwanCalendarDTFI.GetEraName(num3).Length > 0)
2189  {
2190  InsertHash(array, taiwanCalendarDTFI.GetEraName(num3), TokenType.TEraToken, num3);
2191  }
2192  }
2193  }
2194  InsertHash(array, InvariantInfo.AMDesignator, (TokenType)1027, 0);
2195  InsertHash(array, InvariantInfo.PMDesignator, (TokenType)1284, 1);
2196  for (int num4 = 1; num4 <= 12; num4++)
2197  {
2198  string monthName = InvariantInfo.GetMonthName(num4);
2199  InsertHash(array, monthName, TokenType.MonthToken, num4);
2200  monthName = InvariantInfo.GetAbbreviatedMonthName(num4);
2201  InsertHash(array, monthName, TokenType.MonthToken, num4);
2202  }
2203  for (int num5 = 0; num5 < 7; num5++)
2204  {
2205  string dayName2 = InvariantInfo.GetDayName((DayOfWeek)num5);
2206  InsertHash(array, dayName2, TokenType.DayOfWeekToken, num5);
2207  dayName2 = InvariantInfo.GetAbbreviatedDayName((DayOfWeek)num5);
2208  InsertHash(array, dayName2, TokenType.DayOfWeekToken, num5);
2209  }
2210  for (int num6 = 0; num6 < AbbreviatedEnglishEraNames.Length; num6++)
2211  {
2212  InsertHash(array, AbbreviatedEnglishEraNames[num6], TokenType.EraToken, num6 + 1);
2213  }
2214  InsertHash(array, "T", TokenType.SEP_LocalTimeMark, 0);
2215  InsertHash(array, "GMT", TokenType.TimeZoneToken, 0);
2216  InsertHash(array, "Z", TokenType.TimeZoneToken, 0);
2217  InsertHash(array, "/", TokenType.SEP_Date, 0);
2218  InsertHash(array, ":", TokenType.SEP_Time, 0);
2219  m_dtfiTokenHash = array;
2220  }
2221  return array;
2222  }
2223 
2224  private void AddMonthNames(TokenHashValue[] temp, string monthPostfix)
2225  {
2226  for (int i = 1; i <= 13; i++)
2227  {
2228  string monthName = GetMonthName(i);
2229  if (monthName.Length > 0)
2230  {
2231  if (monthPostfix != null)
2232  {
2233  InsertHash(temp, monthName + monthPostfix, TokenType.MonthToken, i);
2234  }
2235  else
2236  {
2237  InsertHash(temp, monthName, TokenType.MonthToken, i);
2238  }
2239  }
2240  monthName = GetAbbreviatedMonthName(i);
2241  InsertHash(temp, monthName, TokenType.MonthToken, i);
2242  }
2243  }
2244 
2245  private static bool TryParseHebrewNumber(ref __DTString str, out bool badFormat, out int number)
2246  {
2247  number = -1;
2248  badFormat = false;
2249  int num = str.Index;
2250  if (!HebrewNumber.IsDigit(str.Value[num]))
2251  {
2252  return false;
2253  }
2254  HebrewNumberParsingContext context = new HebrewNumberParsingContext(0);
2255  HebrewNumberParsingState hebrewNumberParsingState;
2256  do
2257  {
2258  hebrewNumberParsingState = HebrewNumber.ParseByChar(str.Value[num++], ref context);
2259  if (hebrewNumberParsingState == HebrewNumberParsingState.InvalidHebrewNumber || hebrewNumberParsingState == HebrewNumberParsingState.NotHebrewDigit)
2260  {
2261  return false;
2262  }
2263  }
2264  while (num < str.Value.Length && hebrewNumberParsingState != HebrewNumberParsingState.FoundEndOfHebrewNumber);
2265  if (hebrewNumberParsingState != HebrewNumberParsingState.FoundEndOfHebrewNumber)
2266  {
2267  return false;
2268  }
2269  str.Advance(num - str.Index);
2270  number = context.result;
2271  return true;
2272  }
2273 
2274  private static bool IsHebrewChar(char ch)
2275  {
2276  if (ch >= '\u0590')
2277  {
2278  return ch <= '\u05ff';
2279  }
2280  return false;
2281  }
2282 
2283  [SecurityCritical]
2284  internal bool Tokenize(TokenType TokenMask, out TokenType tokenType, out int tokenValue, ref __DTString str)
2285  {
2286  tokenType = TokenType.UnknownToken;
2287  tokenValue = 0;
2288  char c = str.m_current;
2289  bool flag = char.IsLetter(c);
2290  if (flag)
2291  {
2292  c = char.ToLower(c, Culture);
2293  if (IsHebrewChar(c) && TokenMask == TokenType.RegularTokenMask && TryParseHebrewNumber(ref str, out bool badFormat, out tokenValue))
2294  {
2295  if (badFormat)
2296  {
2297  tokenType = TokenType.UnknownToken;
2298  return false;
2299  }
2300  tokenType = TokenType.HebrewNumber;
2301  return true;
2302  }
2303  }
2304  int num = (int)c % 199;
2305  int num2 = 1 + (int)c % 197;
2306  int num3 = str.len - str.Index;
2307  int num4 = 0;
2308  TokenHashValue[] array = m_dtfiTokenHash;
2309  if (array == null)
2310  {
2311  array = CreateTokenHashTable();
2312  }
2313  do
2314  {
2315  TokenHashValue tokenHashValue = array[num];
2316  if (tokenHashValue == null)
2317  {
2318  break;
2319  }
2320  if ((tokenHashValue.tokenType & TokenMask) > (TokenType)0 && tokenHashValue.tokenString.Length <= num3)
2321  {
2322  if (string.Compare(str.Value, str.Index, tokenHashValue.tokenString, 0, tokenHashValue.tokenString.Length, Culture, CompareOptions.IgnoreCase) == 0)
2323  {
2324  int index;
2325  if (flag && (index = str.Index + tokenHashValue.tokenString.Length) < str.len)
2326  {
2327  char c2 = str.Value[index];
2328  if (char.IsLetter(c2))
2329  {
2330  return false;
2331  }
2332  }
2333  tokenType = (tokenHashValue.tokenType & TokenMask);
2334  tokenValue = tokenHashValue.tokenValue;
2335  str.Advance(tokenHashValue.tokenString.Length);
2336  return true;
2337  }
2338  if (tokenHashValue.tokenType == TokenType.MonthToken && HasSpacesInMonthNames)
2339  {
2340  int matchLength = 0;
2341  if (str.MatchSpecifiedWords(tokenHashValue.tokenString, checkWordBoundary: true, ref matchLength))
2342  {
2343  tokenType = (tokenHashValue.tokenType & TokenMask);
2344  tokenValue = tokenHashValue.tokenValue;
2345  str.Advance(matchLength);
2346  return true;
2347  }
2348  }
2349  else if (tokenHashValue.tokenType == TokenType.DayOfWeekToken && HasSpacesInDayNames)
2350  {
2351  int matchLength2 = 0;
2352  if (str.MatchSpecifiedWords(tokenHashValue.tokenString, checkWordBoundary: true, ref matchLength2))
2353  {
2354  tokenType = (tokenHashValue.tokenType & TokenMask);
2355  tokenValue = tokenHashValue.tokenValue;
2356  str.Advance(matchLength2);
2357  return true;
2358  }
2359  }
2360  }
2361  num4++;
2362  num += num2;
2363  if (num >= 199)
2364  {
2365  num -= 199;
2366  }
2367  }
2368  while (num4 < 199);
2369  return false;
2370  }
2371 
2372  private void InsertAtCurrentHashNode(TokenHashValue[] hashTable, string str, char ch, TokenType tokenType, int tokenValue, int pos, int hashcode, int hashProbe)
2373  {
2374  TokenHashValue tokenHashValue = hashTable[hashcode];
2375  hashTable[hashcode] = new TokenHashValue(str, tokenType, tokenValue);
2376  while (++pos < 199)
2377  {
2378  hashcode += hashProbe;
2379  if (hashcode >= 199)
2380  {
2381  hashcode -= 199;
2382  }
2383  TokenHashValue tokenHashValue2 = hashTable[hashcode];
2384  if (tokenHashValue2 == null || char.ToLower(tokenHashValue2.tokenString[0], Culture) == ch)
2385  {
2386  hashTable[hashcode] = tokenHashValue;
2387  if (tokenHashValue2 == null)
2388  {
2389  break;
2390  }
2391  tokenHashValue = tokenHashValue2;
2392  }
2393  }
2394  }
2395 
2396  private void InsertHash(TokenHashValue[] hashTable, string str, TokenType tokenType, int tokenValue)
2397  {
2398  if (str == null || str.Length == 0)
2399  {
2400  return;
2401  }
2402  int num = 0;
2403  if (char.IsWhiteSpace(str[0]) || char.IsWhiteSpace(str[str.Length - 1]))
2404  {
2405  str = str.Trim(null);
2406  if (str.Length == 0)
2407  {
2408  return;
2409  }
2410  }
2411  char c = char.ToLower(str[0], Culture);
2412  int num2 = (int)c % 199;
2413  int num3 = 1 + (int)c % 197;
2414  while (true)
2415  {
2416  TokenHashValue tokenHashValue = hashTable[num2];
2417  if (tokenHashValue == null)
2418  {
2419  hashTable[num2] = new TokenHashValue(str, tokenType, tokenValue);
2420  return;
2421  }
2422  if (str.Length >= tokenHashValue.tokenString.Length && string.Compare(str, 0, tokenHashValue.tokenString, 0, tokenHashValue.tokenString.Length, Culture, CompareOptions.IgnoreCase) == 0)
2423  {
2424  if (str.Length > tokenHashValue.tokenString.Length)
2425  {
2426  break;
2427  }
2428  int tokenType2 = (int)tokenHashValue.tokenType;
2429  if (preferExistingTokens || BinaryCompatibility.TargetsAtLeast_Desktop_V4_5_1)
2430  {
2431  if (((tokenType2 & 0xFF) == 0 && (tokenType & TokenType.RegularTokenMask) != 0) || ((tokenType2 & 0xFF00) == 0 && (tokenType & TokenType.SeparatorTokenMask) != 0))
2432  {
2433  tokenHashValue.tokenType |= tokenType;
2434  if (tokenValue != 0)
2435  {
2436  tokenHashValue.tokenValue = tokenValue;
2437  }
2438  }
2439  }
2440  else if ((((int)tokenType | tokenType2) & 0xFF) == (int)tokenType || (((int)tokenType | tokenType2) & 0xFF00) == (int)tokenType)
2441  {
2442  tokenHashValue.tokenType |= tokenType;
2443  if (tokenValue != 0)
2444  {
2445  tokenHashValue.tokenValue = tokenValue;
2446  }
2447  }
2448  }
2449  num++;
2450  num2 += num3;
2451  if (num2 >= 199)
2452  {
2453  num2 -= 199;
2454  }
2455  if (num >= 199)
2456  {
2457  return;
2458  }
2459  }
2460  InsertAtCurrentHashNode(hashTable, str, c, tokenType, tokenValue, num, num2, num3);
2461  }
2462  }
2463 }
static Thread CurrentThread
Gets the currently running thread.
Definition: Thread.cs:134
string AMDesignator
Gets or sets the string designator for hours that are "ante meridiem" (before noon).
abstract int GetYear(DateTime time)
When overridden in a derived class, returns the year in the specified T:System.DateTime.
object Clone()
Creates a new object that is a copy of the current instance.
The exception that is thrown when a null reference (Nothing in Visual Basic) is passed to a method th...
virtual object GetFormat(Type formatType)
Gets an object that defines how to format the specified type.
Represents time in divisions, such as weeks, months, and years.
Definition: Calendar.cs:11
virtual DateTime MinSupportedDateTime
Gets the earliest date and time supported by this T:System.Globalization.Calendar object.
Definition: Calendar.cs:105
string PMDesignator
Gets or sets the string designator for hours that are "post meridiem" (after noon).
StringComparison
Specifies the culture, case, and sort rules to be used by certain overloads of the M:System....
object GetFormat(Type formatType)
Returns an object that provides formatting services for the specified type.
string FullDateTimePattern
Gets or sets the custom format string for a long date and long time value.
virtual DateTime MaxSupportedDateTime
Gets the latest date and time supported by this T:System.Globalization.Calendar object.
Definition: Calendar.cs:118
The file is read-only.
string SortableDateTimePattern
Gets the custom format string for a sortable date and time value.
Definition: __Canon.cs:3
The exception that is thrown when the value of an argument is outside the allowable range of values a...
string MonthDayPattern
Gets or sets the custom format string for a month and day value.
Compare strings using culture-sensitive sort rules and the invariant culture.
static CompareInfo GetCompareInfo(int culture, Assembly assembly)
Initializes a new T:System.Globalization.CompareInfo object that is associated with the specified cul...
Definition: CompareInfo.cs:133
Provides a mechanism for retrieving an object to control formatting.
Provides culture-specific information about the format of date and time values.
Describes the source and destination of a given serialized stream, and provides an additional caller-...
static CultureInfo GetCultureInfo(int culture)
Retrieves a cached, read-only instance of a culture by using the specified culture identifier.
A type representing a date and time value.
string DateSeparator
Gets or sets the string that separates the components of a date, that is, the year,...
Calendar Calendar
Gets or sets the calendar to use for the current culture.
string ShortTimePattern
Gets or sets the custom format string for a short time value.
CultureInfo?? CurrentCulture
Gets or sets the culture for the current thread.
Definition: Thread.cs:245
Provides information about, and means to manipulate, the current environment and platform....
Definition: Environment.cs:21
static Calendar ReadOnly(Calendar calendar)
Returns a read-only version of the specified T:System.Globalization.Calendar object.
Definition: Calendar.cs:221
Represents a collection of key/value pairs that are organized based on the hash code of the key....
Definition: Hashtable.cs:17
string ShortDatePattern
Gets or sets the custom format string for a short date value.
Implements a set of methods for culture-sensitive string comparisons.
Definition: CompareInfo.cs:13
Supports cloning, which creates a new instance of a class with the same value as an existing instance...
Definition: ICloneable.cs:7
static DateTimeFormatInfo CurrentInfo
Gets a read-only T:System.Globalization.DateTimeFormatInfo object that formats values based on the cu...
string LongDatePattern
Gets or sets the custom format string for a long date value.
CalendarWeekRule
Defines different rules for determining the first week of the year.
abstract int [] Eras
When overridden in a derived class, gets the list of eras in the current calendar.
Definition: Calendar.cs:171
DayOfWeek FirstDayOfWeek
Gets or sets the first day of the week.
Specifies that the class can be serialized.
string RFC1123Pattern
Gets the custom format string for a time value that is based on the Internet Engineering Task Force (...
The exception that is thrown when a method call is invalid for the object's current state.
virtual bool IsLeapYear(int year)
Determines whether the specified year in the current era is a leap year.
Definition: Calendar.cs:682
static DateTimeFormatInfo InvariantInfo
Gets the default read-only T:System.Globalization.DateTimeFormatInfo object that is culture-independe...
Provides information about a specific culture (called a locale for unmanaged code development)....
Definition: CultureInfo.cs:16
CompareOptions
Defines the string comparison options to use with T:System.Globalization.CompareInfo.
DateTimeStyles
Defines the formatting options that customize string parsing for some date and time parsing methods.
DayOfWeek
Specifies the day of the week.
Definition: DayOfWeek.cs:9
string LongTimePattern
Gets or sets the custom format string for a long time value.
virtual object Clone()
Creates a new object that is a copy of the current T:System.Globalization.Calendar object.
Definition: Calendar.cs:208
Creates and controls a thread, sets its priority, and gets its status.
Definition: Thread.cs:18