コード例 #1
0
ファイル: OsbxConvert.cs プロジェクト: vebin/Coosu
        public static async Task <ElementManager> DeserializeObjectAsync(TextReader reader)
        {
            ISubjectParsingHandler lastSubjectHandler = null;
            EventContainer         lastSubject        = null;
            //int lastDeep = 0;
            var line = await reader.ReadLineAsync();

            int l = 0;

            var em = new ElementManager();

            while (line != null)
            {
                if (line.StartsWith("//") || line.StartsWith("[") && line.EndsWith("]"))
                {
                }
                else
                {
                    var split = line.Split(',');
                    var mahou = split[0].TrimStart();
                    var deep  = split[0].Length - mahou.Length;
                    if (deep == 0)
                    {
                        var handler = Register.GetSubjectHandler(mahou);
                        if (handler == null && int.TryParse(mahou, out var flag))
                        {
                            var magicWord = ElementTypeSign.GetString(flag);
                            if (magicWord != null)
                            {
                                handler = Register.GetSubjectHandler(magicWord);
                            }
                        }

                        if (handler != null)
                        {
                            try
                            {
                                var subject = handler.Deserialize(split);
                                var eg      = em.GetOrAddGroup(subject.ZDistance);
                                eg.AddSubject(subject);

                                lastSubject = subject;
                            }
                            catch (Exception ex)
                            {
                                Console.WriteLine($"Error while parsing subject. L {l}: `{line}`\r\n{ex}");
                                lastSubject = null;
                                handler     = null;
                            }
                        }
                        else
                        {
                            Console.WriteLine($"Cannot find subject handler. L {l}: `{line}`");
                        }

                        lastSubjectHandler = handler;
                    }
                    else if (deep == 1)
                    {
                        if (lastSubjectHandler != null)
                        {
                            var actHandler = lastSubjectHandler.GetActionHandler(mahou);
                            if (actHandler != null)
                            {
                                try
                                {
                                    var action = actHandler.Deserialize(split);
                                    lastSubject.ApplyAction(action);
                                }
                                catch (Exception ex)
                                {
                                    Console.WriteLine($"Error while parsing action. L {l}: `{line}`\r\n{ex}");
                                }
                            }
                            else
                            {
                                Console.WriteLine($"Cannot find action handler. L {l}: `{line}`");
                            }
                        }
                        else
                        {
                            Console.WriteLine($"Current subject is null, skipped. L {l}: `{line}`");
                        }
                    }
                    else
                    {
                        Console.WriteLine($"Unknown deep {deep}. L {l}: `{line}`");
                    }
                }

                //var deepMinus = deep - lastDeep;

                //lastDeep = deep;
                //if (deepMinus < 0)
                //{
                //    while (expression)
                //    {
                //        stack.pop;
                //    }
                //}


                line = await reader.ReadLineAsync();

                l++;
            }

            return(em);
            //var count = Environment.ProcessorCount - 1;
            //var locks = new SemaphoreSlim(count, count);
            //var strLock = new object();

            //bool isFinished = false;
            //var str = await reader.ReadLineAsync();
            //if (str != null)
            //{

            //}

            //while (true)
            //{
            //    lock (strLock)
            //    {
            //        if (isFinished) break;
            //    }

            //    var inStr = await reader.ReadLineAsync();

            //    if (inStr == null)
            //    {
            //        lock (strLock)
            //        {
            //            isFinished = true;
            //        }
            //    }
            //    else
            //    {

            //    }
            //}

            //while (locks.CurrentCount != count)
            //{
            //    await Task.Delay(1);
            //}
        }
コード例 #2
0
ファイル: Register.cs プロジェクト: vebin/Coosu
 public static ISubjectParsingHandler RegisterSubject(ISubjectParsingHandler handler)
 {
     SubjectHandlerDic.Add(handler.Flag, handler);
     return(handler);
 }