/* ** Function to unget the next character from to input string */ internal static void stringunput(int c) { st.dec(); }
private static CharPtr StrFTimeFmt(CharPtr baseFormat, DateTime t, CharPtr pt, CharPtr ptlim) { CharPtr format = new CharPtr(baseFormat); for (; format[0] != 0; format.inc()) { if (format == '%') { format.inc(); if (format == 'E') { format.inc(); // Alternate Era is ignored } else if (format == 'O') { format.inc(); // Alternate numeric symbols is ignored } switch (format[0]) { case '\0': format.dec(); break; case 'A': // Full day of week //pt = _add((t->tm_wday < 0 || t->tm_wday > 6) ? "?" : _days[t->tm_wday], pt, ptlim); pt = StrFTimeAdd(t.ToString("dddd"), pt, ptlim); continue; case 'a': // Abbreviated day of week //pt = _add((t->tm_wday < 0 || t->tm_wday > 6) ? "?" : _days_abbrev[t->tm_wday], pt, ptlim); pt = StrFTimeAdd(t.ToString("ddd"), pt, ptlim); continue; case 'B': // Full month name //pt = _add((t->tm_mon < 0 || t->tm_mon > 11) ? "?" : _months[t->tm_mon], pt, ptlim); pt = StrFTimeAdd(t.ToString("MMMM"), pt, ptlim); continue; case 'b': // Abbreviated month name case 'h': // Abbreviated month name //pt = _add((t->tm_mon < 0 || t->tm_mon > 11) ? "?" : _months_abbrev[t->tm_mon], pt, ptlim); pt = StrFTimeAdd(t.ToString("MMM"), pt, ptlim); continue; case 'C': // First two digits of year (a.k.a. Year divided by 100 and truncated to integer (00-99)) //pt = _conv((t->tm_year + TM_YEAR_BASE) / 100, "%02d", pt, ptlim); pt = StrFTimeAdd(t.ToString("yyyy").Substring(0, 2), pt, ptlim); continue; case 'c': // Abbreviated date/time representation (e.g. Thu Aug 23 14:55:02 2001) pt = StrFTimeFmt("%a %b %e %H:%M:%S %Y", t, pt, ptlim); continue; case 'D': // Short MM/DD/YY date pt = StrFTimeFmt("%m/%d/%y", t, pt, ptlim); continue; case 'd': // Day of the month, zero-padded (01-31) //pt = _conv(t->tm_mday, "%02d", pt, ptlim); pt = StrFTimeAdd(t.ToString("dd"), pt, ptlim); continue; case 'e': // Day of the month, space-padded ( 1-31) //pt = _conv(t->tm_mday, "%2d", pt, ptlim); pt = StrFTimeAdd(t.Day.ToString().PadLeft(2, ' '), pt, ptlim); continue; case 'F': // Short YYYY-MM-DD date pt = StrFTimeFmt("%Y-%m-%d", t, pt, ptlim); continue; case 'H': // Hour in 24h format (00-23) //pt = _conv(t->tm_hour, "%02d", pt, ptlim); pt = StrFTimeAdd(t.ToString("HH"), pt, ptlim); continue; case 'I': // Hour in 12h format (01-12) //pt = _conv((t->tm_hour % 12) ? (t->tm_hour % 12) : 12, "%02d", pt, ptlim); pt = StrFTimeAdd(t.ToString("hh"), pt, ptlim); continue; case 'j': // Day of the year (001-366) pt = StrFTimeAdd(t.DayOfYear.ToString().PadLeft(3, ' '), pt, ptlim); continue; case 'k': // (Non-standard) // Hours in 24h format, space-padded ( 1-23) //pt = _conv(t->tm_hour, "%2d", pt, ptlim); pt = StrFTimeAdd(t.ToString("%H").PadLeft(2, ' '), pt, ptlim); continue; case 'l': // (Non-standard) // Hours in 12h format, space-padded ( 1-12) //pt = _conv((t->tm_hour % 12) ? (t->tm_hour % 12) : 12, "%2d", pt, ptlim); pt = StrFTimeAdd(t.ToString("%h").PadLeft(2, ' '), pt, ptlim); continue; case 'M': // Minute (00-59) //pt = _conv(t->tm_min, "%02d", pt, ptlim); pt = StrFTimeAdd(t.ToString("mm"), pt, ptlim); continue; case 'm': // Month as a decimal number (01-12) //pt = _conv(t->tm_mon + 1, "%02d", pt, ptlim); pt = StrFTimeAdd(t.ToString("MM"), pt, ptlim); continue; case 'n': // New-line character. pt = StrFTimeAdd(Environment.NewLine, pt, ptlim); continue; case 'p': // AM or PM designation (locale dependent). //pt = _add((t->tm_hour >= 12) ? "pm" : "am", pt, ptlim); pt = StrFTimeAdd(t.ToString("tt"), pt, ptlim); continue; case 'R': // 24-hour HH:MM time, equivalent to %H:%M pt = StrFTimeFmt("%H:%M", t, pt, ptlim); continue; case 'r': // 12-hour clock time (locale dependent). pt = StrFTimeFmt("%I:%M:%S %p", t, pt, ptlim); continue; case 'S': // Second ((00-59) //pt = _conv(t->tm_sec, "%02d", pt, ptlim); pt = StrFTimeAdd(t.ToString("ss"), pt, ptlim); continue; case 'T': // ISO 8601 time format (HH:MM:SS), equivalent to %H:%M:%S pt = StrFTimeFmt("%H:%M:%S", t, pt, ptlim); continue; case 't': // Horizontal-tab character pt = StrFTimeAdd("\t", pt, ptlim); continue; case 'U': // Week number with the first Sunday as the first day of week one (00-53) //pt = _conv((t->tm_yday + 7 - t->tm_wday) / 7, "%02d", pt, ptlim); pt = StrFTimeAdd(System.Globalization.CultureInfo.InvariantCulture.Calendar.GetWeekOfYear(t, System.Globalization.CalendarWeekRule.FirstFullWeek, DayOfWeek.Sunday).ToString(), pt, ptlim); continue; case 'u': // ISO 8601 weekday as number with Monday as 1 (1-7) (locale independant). //pt = _conv((t->tm_wday == 0) ? 7 : t->tm_wday, "%d", pt, ptlim); pt = StrFTimeAdd(t.DayOfWeek == DayOfWeek.Sunday ? "7" : ((int)t.DayOfWeek).ToString(), pt, ptlim); continue; case 'G': // ISO 8601 year (four digits) case 'g': // ISO 8601 year (two digits) case 'V': // ISO 8601 week number // See http://stackoverflow.com/questions/11154673/get-the-correct-week-number-of-a-given-date DateTime isoTime = t; DayOfWeek day = System.Globalization.CultureInfo.InvariantCulture.Calendar.GetDayOfWeek(isoTime); if (day >= DayOfWeek.Monday && day <= DayOfWeek.Wednesday) { isoTime = isoTime.AddDays(3); } if (format[0] == 'V') // ISO 8601 week number { int isoWeek = System.Globalization.CultureInfo.InvariantCulture.Calendar.GetWeekOfYear(isoTime, System.Globalization.CalendarWeekRule.FirstFourDayWeek, DayOfWeek.Monday); pt = StrFTimeAdd(isoWeek.ToString(), pt, ptlim); } else { string isoYear = System.Globalization.CultureInfo.InvariantCulture.Calendar.GetYear(isoTime).ToString(); // ISO 8601 year (four digits) if (format[0] == 'g') // ISO 8601 year (two digits) { isoYear = isoYear.Substring(isoYear.Length - 2, 2); } pt = StrFTimeAdd(isoYear, pt, ptlim); } continue; case 'W': // Week number with the first Monday as the first day of week one (00-53) //pt = _conv((t->tm_yday + 7 - (t->tm_wday ? (t->tm_wday - 1) : 6)) / 7, "%02d", pt, ptlim); pt = StrFTimeAdd(System.Globalization.CultureInfo.InvariantCulture.Calendar.GetWeekOfYear(t, System.Globalization.CalendarWeekRule.FirstFullWeek, DayOfWeek.Monday).ToString(), pt, ptlim); continue; case 'w': // Weekday as a decimal number with Sunday as 0 (0-6) //pt = _conv(t->tm_wday, "%d", pt, ptlim); pt = StrFTimeAdd(((int)t.DayOfWeek).ToString(), pt, ptlim); continue; case 'X': // Long time representation (locale dependent) //pt = _fmt("%H:%M:%S", t, pt, ptlim); // fails to comply with spec! pt = StrFTimeAdd(t.ToString("%T"), pt, ptlim); continue; case 'x': // Short date representation (locale dependent) //pt = _fmt("%m/%d/%y", t, pt, ptlim); // fails to comply with spec! pt = StrFTimeAdd(t.ToString("%d"), pt, ptlim); continue; case 'y': // Last two digits of year (00-99) //pt = _conv((t->tm_year + TM_YEAR_BASE) % 100, "%02d", pt, ptlim); pt = StrFTimeAdd(t.ToString("yy"), pt, ptlim); continue; case 'Y': // Full year (all digits) //pt = _conv(t->tm_year + TM_YEAR_BASE, "%04d", pt, ptlim); pt = StrFTimeAdd(t.Year.ToString(), pt, ptlim); continue; case 'Z': // Timezone name or abbreviation (locale dependent) or nothing if unavailable (e.g. CDT) pt = StrFTimeAdd(TimeZoneInfo.Local.StandardName, pt, ptlim); continue; case 'z': // ISO 8601 offset from UTC in timezone (+/-hhmm), or nothing if unavailable TimeSpan ts = TimeZoneInfo.Local.GetUtcOffset(t); string offset = (ts.Ticks < 0 ? "-" : "+") + ts.TotalHours.ToString("#00") + ts.Minutes.ToString("00"); pt = StrFTimeAdd(offset, pt, ptlim); continue; case '%': // Add '%' pt = StrFTimeAdd("%", pt, ptlim); continue; default: break; } } if (pt == ptlim) break; pt[0] = format[0]; pt.inc(); } return pt; }
private static CharPtr buildformat(CharPtr e, lua_Object o) { CharPtr @string = new CharPtr(buffer, 255); CharPtr fstart = e, fspace, send; char t, j = 'r'; int m = 0, n = -1, l; while (0 != isspace(e[0])) { e.inc(); } fspace = e; t = e[0]; e.inc(); if (e[0] == '<' || e[0] == '|' || e[0] == '>') { j = e[0]; e.inc(); } while (0 != isdigit(e[0])) { m = m * 10 + (e[0] - '0'); e.inc(); } if (e[0] == '.') { e.inc(); /* skip point */ } while (0 != isdigit(e[0])) { if (n < 0) { n = (e[0] - '0'); e.inc(); } else { n = n * 10 + (e[0] - '0'); e.inc(); } } sprintf(f, "%%"); if (j == '<' || j == '|') { sprintf(strchr(f, (char)0), "-"); } if (m > 0) { sprintf(strchr(f, (char)0), "%d", m); } if (n >= 0) { sprintf(strchr(f, (char)0), ".%d", n); } switch (t) { case 'i': case 'I': t = 'd'; sprintf(strchr(f, (char)0), "%c", t); sprintf(@string, f, (long)lua_getnumber(o)); break; case 'f': case 'g': case 'e': case 'G': case 'E': sprintf(strchr(f, (char)0), "%c", t); sprintf(@string, f, (float)lua_getnumber(o)); break; case 'F': t = 'f'; sprintf(strchr(f, (char)0), "%c", t); sprintf(@string, f, (float)lua_getnumber(o)); break; case 's': case 'S': t = 's'; sprintf(strchr(f, (char)0), "%c", t); sprintf(@string, f, lua_getstring(o)); break; default: return(""); } l = (int)strlen(@string); send = @string + l; if (m != 0 && l > m) { int i; for (i = 0; i < m; i++) { @string[i] = '*'; } @string[i] = (char)0; } else if (m != 0 && j == '|') { int k; int i = l - 1; while (0 != isspace(@string[i]) || @string[i] == 0) { i--; } @string -= (m - i) / 2; for (k = 0; k < (m - i) / 2; k++) { @string[k] = ' '; } } /* add space characteres */ while (fspace != fstart) { @string.dec(); fspace.dec(); @string[0] = fspace[0]; } while (0 != isspace(e[0])) { send[0] = e[0]; e.inc(); send.inc(); } send[0] = (char)0; return(@string); }
private static CharPtr StrFTimeFmt(CharPtr baseFormat, DateTime t, CharPtr pt, CharPtr ptlim) { CharPtr format = new CharPtr(baseFormat); for (; format[0] != 0; format.inc()) { if (format == '%') { format.inc(); if (format == 'E') { format.inc(); // Alternate Era is ignored } else if (format == 'O') { format.inc(); // Alternate numeric symbols is ignored } switch (format[0]) { case '\0': format.dec(); break; case 'A': // Full day of week //pt = _add((t->tm_wday < 0 || t->tm_wday > 6) ? "?" : _days[t->tm_wday], pt, ptlim); pt = StrFTimeAdd(t.ToString("dddd"), pt, ptlim); continue; case 'a': // Abbreviated day of week //pt = _add((t->tm_wday < 0 || t->tm_wday > 6) ? "?" : _days_abbrev[t->tm_wday], pt, ptlim); pt = StrFTimeAdd(t.ToString("ddd"), pt, ptlim); continue; case 'B': // Full month name //pt = _add((t->tm_mon < 0 || t->tm_mon > 11) ? "?" : _months[t->tm_mon], pt, ptlim); pt = StrFTimeAdd(t.ToString("MMMM"), pt, ptlim); continue; case 'b': // Abbreviated month name case 'h': // Abbreviated month name //pt = _add((t->tm_mon < 0 || t->tm_mon > 11) ? "?" : _months_abbrev[t->tm_mon], pt, ptlim); pt = StrFTimeAdd(t.ToString("MMM"), pt, ptlim); continue; case 'C': // First two digits of year (a.k.a. Year divided by 100 and truncated to integer (00-99)) //pt = _conv((t->tm_year + TM_YEAR_BASE) / 100, "%02d", pt, ptlim); pt = StrFTimeAdd(t.ToString("yyyy").Substring(0, 2), pt, ptlim); continue; case 'c': // Abbreviated date/time representation (e.g. Thu Aug 23 14:55:02 2001) pt = StrFTimeFmt("%a %b %e %H:%M:%S %Y", t, pt, ptlim); continue; case 'D': // Short MM/DD/YY date pt = StrFTimeFmt("%m/%d/%y", t, pt, ptlim); continue; case 'd': // Day of the month, zero-padded (01-31) //pt = _conv(t->tm_mday, "%02d", pt, ptlim); pt = StrFTimeAdd(t.ToString("dd"), pt, ptlim); continue; case 'e': // Day of the month, space-padded ( 1-31) //pt = _conv(t->tm_mday, "%2d", pt, ptlim); pt = StrFTimeAdd(t.Day.ToString().PadLeft(2, ' '), pt, ptlim); continue; case 'F': // Short YYYY-MM-DD date pt = StrFTimeFmt("%Y-%m-%d", t, pt, ptlim); continue; case 'H': // Hour in 24h format (00-23) //pt = _conv(t->tm_hour, "%02d", pt, ptlim); pt = StrFTimeAdd(t.ToString("HH"), pt, ptlim); continue; case 'I': // Hour in 12h format (01-12) //pt = _conv((t->tm_hour % 12) ? (t->tm_hour % 12) : 12, "%02d", pt, ptlim); pt = StrFTimeAdd(t.ToString("hh"), pt, ptlim); continue; case 'j': // Day of the year (001-366) pt = StrFTimeAdd(t.DayOfYear.ToString().PadLeft(3, ' '), pt, ptlim); continue; case 'k': // (Non-standard) // Hours in 24h format, space-padded ( 1-23) //pt = _conv(t->tm_hour, "%2d", pt, ptlim); pt = StrFTimeAdd(t.ToString("%H").PadLeft(2, ' '), pt, ptlim); continue; case 'l': // (Non-standard) // Hours in 12h format, space-padded ( 1-12) //pt = _conv((t->tm_hour % 12) ? (t->tm_hour % 12) : 12, "%2d", pt, ptlim); pt = StrFTimeAdd(t.ToString("%h").PadLeft(2, ' '), pt, ptlim); continue; case 'M': // Minute (00-59) //pt = _conv(t->tm_min, "%02d", pt, ptlim); pt = StrFTimeAdd(t.ToString("mm"), pt, ptlim); continue; case 'm': // Month as a decimal number (01-12) //pt = _conv(t->tm_mon + 1, "%02d", pt, ptlim); pt = StrFTimeAdd(t.ToString("MM"), pt, ptlim); continue; case 'n': // New-line character. pt = StrFTimeAdd(Environment.NewLine, pt, ptlim); continue; case 'p': // AM or PM designation (locale dependent). //pt = _add((t->tm_hour >= 12) ? "pm" : "am", pt, ptlim); pt = StrFTimeAdd(t.ToString("tt"), pt, ptlim); continue; case 'R': // 24-hour HH:MM time, equivalent to %H:%M pt = StrFTimeFmt("%H:%M", t, pt, ptlim); continue; case 'r': // 12-hour clock time (locale dependent). pt = StrFTimeFmt("%I:%M:%S %p", t, pt, ptlim); continue; case 'S': // Second ((00-59) //pt = _conv(t->tm_sec, "%02d", pt, ptlim); pt = StrFTimeAdd(t.ToString("ss"), pt, ptlim); continue; case 'T': // ISO 8601 time format (HH:MM:SS), equivalent to %H:%M:%S pt = StrFTimeFmt("%H:%M:%S", t, pt, ptlim); continue; case 't': // Horizontal-tab character pt = StrFTimeAdd("\t", pt, ptlim); continue; case 'U': // Week number with the first Sunday as the first day of week one (00-53) //pt = _conv((t->tm_yday + 7 - t->tm_wday) / 7, "%02d", pt, ptlim); pt = StrFTimeAdd(System.Globalization.CultureInfo.InvariantCulture.Calendar.GetWeekOfYear(t, System.Globalization.CalendarWeekRule.FirstFullWeek, DayOfWeek.Sunday).ToString(), pt, ptlim); continue; case 'u': // ISO 8601 weekday as number with Monday as 1 (1-7) (locale independant). //pt = _conv((t->tm_wday == 0) ? 7 : t->tm_wday, "%d", pt, ptlim); pt = StrFTimeAdd(t.DayOfWeek == DayOfWeek.Sunday ? "7" : ((int)t.DayOfWeek).ToString(), pt, ptlim); continue; case 'G': // ISO 8601 year (four digits) case 'g': // ISO 8601 year (two digits) case 'V': // ISO 8601 week number // See http://stackoverflow.com/questions/11154673/get-the-correct-week-number-of-a-given-date DateTime isoTime = t; DayOfWeek day = System.Globalization.CultureInfo.InvariantCulture.Calendar.GetDayOfWeek(isoTime); if (day >= DayOfWeek.Monday && day <= DayOfWeek.Wednesday) { isoTime = isoTime.AddDays(3); } if (format[0] == 'V') // ISO 8601 week number { int isoWeek = System.Globalization.CultureInfo.InvariantCulture.Calendar.GetWeekOfYear(isoTime, System.Globalization.CalendarWeekRule.FirstFourDayWeek, DayOfWeek.Monday); pt = StrFTimeAdd(isoWeek.ToString(), pt, ptlim); } else { string isoYear = System.Globalization.CultureInfo.InvariantCulture.Calendar.GetYear(isoTime).ToString(); // ISO 8601 year (four digits) if (format[0] == 'g') // ISO 8601 year (two digits) { isoYear = isoYear.Substring(isoYear.Length - 2, 2); } pt = StrFTimeAdd(isoYear, pt, ptlim); } continue; case 'W': // Week number with the first Monday as the first day of week one (00-53) //pt = _conv((t->tm_yday + 7 - (t->tm_wday ? (t->tm_wday - 1) : 6)) / 7, "%02d", pt, ptlim); pt = StrFTimeAdd(System.Globalization.CultureInfo.InvariantCulture.Calendar.GetWeekOfYear(t, System.Globalization.CalendarWeekRule.FirstFullWeek, DayOfWeek.Monday).ToString(), pt, ptlim); continue; case 'w': // Weekday as a decimal number with Sunday as 0 (0-6) //pt = _conv(t->tm_wday, "%d", pt, ptlim); pt = StrFTimeAdd(((int)t.DayOfWeek).ToString(), pt, ptlim); continue; case 'X': // Long time representation (locale dependent) //pt = _fmt("%H:%M:%S", t, pt, ptlim); // fails to comply with spec! pt = StrFTimeAdd(t.ToString("%T"), pt, ptlim); continue; case 'x': // Short date representation (locale dependent) //pt = _fmt("%m/%d/%y", t, pt, ptlim); // fails to comply with spec! pt = StrFTimeAdd(t.ToString("%d"), pt, ptlim); continue; case 'y': // Last two digits of year (00-99) //pt = _conv((t->tm_year + TM_YEAR_BASE) % 100, "%02d", pt, ptlim); pt = StrFTimeAdd(t.ToString("yy"), pt, ptlim); continue; case 'Y': // Full year (all digits) //pt = _conv(t->tm_year + TM_YEAR_BASE, "%04d", pt, ptlim); pt = StrFTimeAdd(t.Year.ToString(), pt, ptlim); continue; case 'Z': // Timezone name or abbreviation (locale dependent) or nothing if unavailable (e.g. CDT) pt = StrFTimeAdd(TimeZoneInfo.Local.StandardName, pt, ptlim); continue; case 'z': // ISO 8601 offset from UTC in timezone (+/-hhmm), or nothing if unavailable TimeSpan ts = TimeZoneInfo.Local.GetUtcOffset(t); string offset = (ts.Ticks < 0 ? "-" : "+") + ts.TotalHours.ToString("#00") + ts.Minutes.ToString("00"); pt = StrFTimeAdd(offset, pt, ptlim); continue; case '%': // Add '%' pt = StrFTimeAdd("%", pt, ptlim); continue; default: break; } } if (pt == ptlim) { break; } pt[0] = format[0]; pt.inc(); } return(pt); }