public static List <GenericToken <T> > GetStream <T>(string tag, string data, GenericTokenDefinition <T>[] defs, DebugDelegate d, Prac.API.Int32Delegate progress) where T : IComparable, IConvertible, IFormattable { List <GenericToken <T> > toks = new List <GenericToken <T> >(); GenericLexer <T> lex = new GenericLexer <T>(tag, data, defs); int size = lex.BytesLeft; int lastprog = 0; while (lex.Next()) { var tok = new GenericToken <T>(lex.Token); tok.id = toks.Count; toks.Add(tok); // compute progress if (progress != null) { var completed = size - lex.BytesLeft; var pct = (double)completed / size; var pctint = (int)(pct * 100); if (pctint > lastprog) { lastprog = pctint; progress(pctint); } } } return(toks); }
public static Prac.API.GenericTracker <RegisterDB> Parse(string data, DebugDelegate d, Prac.API.Int32Delegate progress) { Prac.API.GenericTracker <RegisterDB> db = new Prac.API.GenericTracker <RegisterDB>(); // get token defs var defs = RegisterDB.GetDefs().ToArray(); // get token stream var stream = tokh.GetStream <register_toks>(string.Empty, data, defs, d, progress); // strip out everything we don't care about var final = tokh.Filter_Keep <register_toks>(stream, register_toks.endrecord, register_toks.key_reg_code, register_toks.key_reg_email, register_toks.key_reg_firstname, register_toks.key_reg_lastname, register_toks.key_reg_mid, register_toks.key_registration_program, register_toks.quotedstring); RegisterDB cur = new RegisterDB(); int startrecidx = 0; for (int i = 0; i < final.Count; i++) { var tok = final[i]; var next = i < final.Count - 1 ? final[i + 1] : new GenericToken <register_toks>(register_toks.none); switch (tok.type) { case register_toks.key_reg_code: { if (next.isToken(register_toks.quotedstring)) { cur.Code = next.data.Replace("'", string.Empty); } } break; case register_toks.key_reg_email: { if (next.isToken(register_toks.quotedstring)) { cur.Email = next.data.Replace("'", string.Empty); } } break; case register_toks.key_registration_program: { if (next.isToken(register_toks.quotedstring)) { cur.Program = next.data.Replace("'", string.Empty); } } break; case register_toks.key_reg_mid: { if (next.isToken(register_toks.quotedstring)) { cur.MID = next.data.Replace("'", string.Empty); } } break; case register_toks.key_reg_firstname: { if (next.isToken(register_toks.quotedstring)) { cur.FirstName = next.data.Replace("'", string.Empty); } } break; case register_toks.key_reg_lastname: { if (next.isToken(register_toks.quotedstring)) { cur.LastName = next.data.Replace("'", string.Empty); } } break; case register_toks.endrecord: { cur.ParseDate = DateTime.Now; if (cur.isValid) { db.addindex(cur.Email, cur); cur = new RegisterDB(); } else { if (d != null) { var toks = tokh.ToString <register_toks>(tokh.GetTokensBetween <register_toks>(final, startrecidx, i)); d("error between: " + startrecidx + "-" + i + " data: " + toks); } startrecidx = i + 1; } } break; } } return(db); }