static void _CustomRFC1123_ThunkWriter(ref ThunkWriter writer, DateTime dt) { writer.WriteFormattingConstant(ConstantString_Formatting.Quote); var dayOfWeek = (ConstantString_DaysOfWeek)(((byte)dt.DayOfWeek) * 3); writer.WriteDayOfWeek(dayOfWeek); writer.WriteFormattingConstant(ConstantString_Formatting.CommaSpace); { var day = DigitPairs[dt.Day]; writer.Write(day.First); writer.Write(day.Second); writer.WriteFormattingConstant(ConstantString_Formatting.Space); } // compiles as a switch // not converted to a ConstantString_* enum because you can't pack these such that // they fit in a cache line switch (dt.Month) { case 1: writer.Write("Jan "); break; case 2: writer.Write("Feb "); break; case 3: writer.Write("Mar "); break; case 4: writer.Write("Apr "); break; case 5: writer.Write("May "); break; case 6: writer.Write("Jun "); break; case 7: writer.Write("Jul "); break; case 8: writer.Write("Aug "); break; case 9: writer.Write("Sep "); break; case 10: writer.Write("Oct "); break; case 11: writer.Write("Nov "); break; case 12: writer.Write("Dec "); break; } { var year = dt.Year; var firstHalfYear = DigitPairs[year / 100]; writer.Write(firstHalfYear.First); writer.Write(firstHalfYear.Second); var secondHalfYear = DigitPairs[year % 100]; writer.Write(secondHalfYear.First); writer.Write(secondHalfYear.Second); writer.WriteFormattingConstant(ConstantString_Formatting.Space); } { var hour = DigitPairs[dt.Hour]; writer.Write(hour.First); writer.Write(hour.Second); writer.WriteFormattingConstant(ConstantString_Formatting.Colon); } { var minute = DigitPairs[dt.Minute]; writer.Write(minute.First); writer.Write(minute.Second); writer.WriteFormattingConstant(ConstantString_Formatting.Colon); } { var second = DigitPairs[dt.Second]; writer.Write(second.First); writer.Write(second.Second); } writer.WriteValueConstant(ConstantString_Value.SpaceGMTQuote); }
static unsafe void _WriteEncodedStringWithNullsInlineUnsafe_ThunkWriter(ref ThunkWriter writer, string strRef) { if (strRef == null) { writer.WriteValueConstant(ConstantString_Value.Null); return; } fixed (char* strFixed = strRef) { char* str = strFixed; char c; var len = strRef.Length; while (len > 0) { c = *str; str++; len--; if (c == '\\') { writer.WriteCommonConstant(ConstantString_Common.DoubleBackSlash); continue; } if (c == '"') { writer.WriteFormattingConstant(ConstantString_Formatting.BackSlashQuote); continue; } // This is converted into an IL switch, so don't fret about lookup times switch (c) { case '\u0000': writer.Write000EscapeConstant(ConstantString_000Escape.EscapeSequence_0000); continue; case '\u0001': writer.Write000EscapeConstant(ConstantString_000Escape.EscapeSequence_0001); continue; case '\u0002': writer.Write000EscapeConstant(ConstantString_000Escape.EscapeSequence_0002); continue; case '\u0003': writer.Write000EscapeConstant(ConstantString_000Escape.EscapeSequence_0003); continue; case '\u0004': writer.Write000EscapeConstant(ConstantString_000Escape.EscapeSequence_0004); continue; case '\u0005': writer.Write000EscapeConstant(ConstantString_000Escape.EscapeSequence_0005); continue; case '\u0006': writer.Write000EscapeConstant(ConstantString_000Escape.EscapeSequence_0006); continue; case '\u0007': writer.Write000EscapeConstant(ConstantString_000Escape.EscapeSequence_0007); continue; case '\u0008': writer.WriteCommonConstant(ConstantString_Common.EscapeSequence_b); continue; case '\u0009': writer.WriteCommonConstant(ConstantString_Common.EscapeSequence_t); continue; case '\u000A': writer.WriteCommonConstant(ConstantString_Common.EscapeSequence_n); continue; case '\u000B': writer.Write000EscapeConstant(ConstantString_000Escape.EscapeSequence_000B); continue; case '\u000C': writer.WriteCommonConstant(ConstantString_Common.EscapeSequence_f); continue; case '\u000D': writer.WriteCommonConstant(ConstantString_Common.EscapeSequence_r); continue; case '\u000E': writer.Write000EscapeConstant(ConstantString_000Escape.EscapeSequence_000E); continue; case '\u000F': writer.Write000EscapeConstant(ConstantString_000Escape.EscapeSequence_000F); continue; case '\u0010': writer.Write001EscapeConstant(ConstantString_001Escape.EscapeSequence_0010); continue; case '\u0011': writer.Write001EscapeConstant(ConstantString_001Escape.EscapeSequence_0011); continue; case '\u0012': writer.Write001EscapeConstant(ConstantString_001Escape.EscapeSequence_0012); continue; case '\u0013': writer.Write001EscapeConstant(ConstantString_001Escape.EscapeSequence_0013); continue; case '\u0014': writer.Write001EscapeConstant(ConstantString_001Escape.EscapeSequence_0014); continue; case '\u0015': writer.Write001EscapeConstant(ConstantString_001Escape.EscapeSequence_0015); continue; case '\u0016': writer.Write001EscapeConstant(ConstantString_001Escape.EscapeSequence_0016); continue; case '\u0017': writer.Write001EscapeConstant(ConstantString_001Escape.EscapeSequence_0017); continue; case '\u0018': writer.Write001EscapeConstant(ConstantString_001Escape.EscapeSequence_0018); continue; case '\u0019': writer.Write001EscapeConstant(ConstantString_001Escape.EscapeSequence_0019); continue; case '\u001A': writer.Write001EscapeConstant(ConstantString_001Escape.EscapeSequence_001A); continue; case '\u001B': writer.Write001EscapeConstant(ConstantString_001Escape.EscapeSequence_001B); continue; case '\u001C': writer.Write001EscapeConstant(ConstantString_001Escape.EscapeSequence_001C); continue; case '\u001D': writer.Write001EscapeConstant(ConstantString_001Escape.EscapeSequence_001D); continue; case '\u001E': writer.Write001EscapeConstant(ConstantString_001Escape.EscapeSequence_001E); continue; case '\u001F': writer.Write001EscapeConstant(ConstantString_001Escape.EscapeSequence_001F); continue; default: writer.Write(c); continue; } } } }
static void _WriteTimeSpanMicrosoft_ThunkWriter(ref ThunkWriter writer, TimeSpan ts, char[] buffer) { // can't negate this, have to handle it manually if (ts.Ticks == long.MinValue) { writer.Write("\"-10675199.02:48:05.4775808\""); return; } writer.WriteFormattingConstant(ConstantString_Formatting.Quote); if (ts.Ticks < 0) { writer.Write('-'); ts = ts.Negate(); } var days = ts.Days; var hours = ts.Hours; var minutes = ts.Minutes; var secs = ts.Seconds; int endCount; TwoDigits digits; // days { if (days != 0) { _CustomWriteInt_ThunkWriter(ref writer, days, buffer); writer.Write('.'); } } // hours { digits = DigitPairs[hours]; buffer[0] = digits.First; buffer[1] = digits.Second; } buffer[2] = ':'; // minutes { digits = DigitPairs[minutes]; buffer[3] = digits.First; buffer[4] = digits.Second; } buffer[5] = ':'; // seconds { digits = DigitPairs[secs]; buffer[6] = digits.First; buffer[7] = digits.Second; } endCount = 8; // factional part { int fracEnd; var remainingTicks = (ts - new TimeSpan(ts.Days, ts.Hours, ts.Minutes, ts.Seconds, 0)).Ticks; if (remainingTicks > 0) { buffer[8] = '.'; var fracPart = remainingTicks % 100; remainingTicks /= 100; if (fracPart > 0) { digits = DigitPairs[fracPart]; buffer[15] = digits.Second; buffer[14] = digits.First; fracEnd = 16; } else { fracEnd = 14; } fracPart = remainingTicks % 100; remainingTicks /= 100; if (fracPart > 0) { digits = DigitPairs[fracPart]; buffer[13] = digits.Second; buffer[12] = digits.First; } else { if (fracEnd == 14) { fracEnd = 12; } else { buffer[13] = '0'; buffer[12] = '0'; } } fracPart = remainingTicks % 100; remainingTicks /= 100; if (fracPart > 0) { digits = DigitPairs[fracPart]; buffer[11] = digits.Second; buffer[10] = digits.First; } else { if (fracEnd == 12) { fracEnd = 10; } else { buffer[11] = '0'; buffer[10] = '0'; } } fracPart = remainingTicks; buffer[9] = (char)('0' + fracPart); endCount = fracEnd; } } writer.Write(buffer, 0, endCount); writer.WriteFormattingConstant(ConstantString_Formatting.Quote); }