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);
        }
Пример #2
0
        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);
        }