/// <summary>Parser standard (for all levels) prefix <n>. </summary> /// <param name="ctx">parser context.</param> /// <returns>True if prefix read correctly; otherwise, false.</returns> public static bool ReadSyslogPrefix(this ParserContext ctx) { try { ctx.Position = 0; ctx.ReadSymbol(SyslogChars.LT); var digits = ctx.ReadDigits(3); ctx.ReadSymbol(SyslogChars.GT); ctx.Prefix = ctx.Text.Substring(0, ctx.Position); return(true); } catch (Exception) { ctx.Position = 0; return(false); } }
public static bool TryParseTimestamp(ParserContext ctx) { // sometimes there's starting space if (ctx.Current == SyslogChars.Space) { ctx.SkipSpaces(); } // some messages start with some numeric Id: // <139>36177473: Mar 4 17:21:18 UTC: if (char.IsDigit(ctx.Current)) { // make sure it's not a year and at least 5 chars var fiveDigits = ctx.Text.Substring(ctx.Position, 5).All(ch => char.IsDigit(ch)); if (fiveDigits) { var savePos = ctx.Position; var digits = ctx.ReadDigits(20); if (ctx.Match(": ")) { // we swallowed this numeric prefix and ': ' after that, nothing to do } else { ctx.Position = savePos; // rollback, timestamp evaluation will go from string start } } } try { // quick guess - if it contains current month name if (TryParseIfStartsWithYear(ctx) || TryParseTimestampWithMonthName(ctx) || TryParseIfStartsWithColonThenYear(ctx) || TryParseIfStartsWithSpace(ctx)) { return(true); } } catch (Exception ex) { ctx.ErrorMessages.Add(ex.ToString()); } return(false); }
public static int ReadNumber(this ParserContext ctx, int maxDigits = 10) { var digits = ctx.ReadDigits(maxDigits); return(int.Parse(digits)); }