Beispiel #1
0
        static string DumpHeaders(HGame game, bool isDumpingOutgoing)
        {
            IReadOnlyDictionary <ushort, ASClass> messageClasses =
                (isDumpingOutgoing ? game.OutgoingMessages : game.IncomingMessages);

            IOrderedEnumerable <KeyValuePair <string, List <ushort> > > organizedHeaders =
                GetOrganizedHeadersByHashCount(game, messageClasses);

            string headersDump       = string.Empty;
            string unusedHeadersDump = string.Empty;
            string messageType       = (isDumpingOutgoing ? "Outgoing" : "Incoming");
            var    unusedHeaders     = new List <KeyValuePair <string, List <ushort> > >();

            foreach (KeyValuePair <string, List <ushort> > organizedHeader in organizedHeaders)
            {
                if (organizedHeader.Value.Count == 1)
                {
                    if (isDumpingOutgoing)
                    {
                        UniqueOutMessageHashCount++;
                    }
                    else
                    {
                        UniqueInMessageHashCount++;
                    }
                }
                string messageHash = organizedHeader.Key;
                foreach (ushort header in organizedHeader.Value)
                {
                    ASClass  messageClass = messageClasses[header];
                    string   messageName  = messageClass.Instance.QualifiedName.Name;
                    ASMethod messageCtor  = messageClass.Instance.Constructor;

                    string dump = $"{messageType}[{header}, {messageHash}] = {messageName}{messageCtor}";
                    if (!isDumpingOutgoing)
                    {
                        ASClass inMsgParser = game.GetIncomingMessageParser(messageClass);
                        dump += ($", Parser: {inMsgParser.Instance.QualifiedName.Name}");
                    }
                    dump += "\r\n";
                    if (!game.IsMessageReferenced(messageClass))
                    {
                        unusedHeadersDump += ("[Dead]" + dump);
                    }
                    else
                    {
                        headersDump += dump;
                    }
                }
            }

            if (!string.IsNullOrWhiteSpace(unusedHeadersDump))
            {
                headersDump += unusedHeadersDump;
            }

            return(headersDump.Trim());
        }
Beispiel #2
0
        static string UpdateHeaders(string headersPath, HGame current, HGame previous, bool isUpdatingOutgoing)
        {
            IReadOnlyDictionary <ushort, ASClass> curMsgClasses =
                (isUpdatingOutgoing ? current.OutgoingMessages : current.IncomingMessages);

            IReadOnlyDictionary <ushort, ASClass> preMsgClasses =
                (isUpdatingOutgoing ? previous.OutgoingMessages : previous.IncomingMessages);

            string         value    = File.ReadAllText(headersPath);
            MatchEvaluator replacer =
                delegate(Match match)
            {
                bool   isOut       = isUpdatingOutgoing;
                string endValue    = match.Groups["end"].Value;
                string headerValue = match.Groups["header"].Value;

                ushort preHeader = 0;
                if (!ushort.TryParse(headerValue, out preHeader) ||
                    !preMsgClasses.ContainsKey(preHeader))
                {
                    if (headerValue != "0000")
                    {
                        return($"-1{endValue} //Invalid Header '{headerValue}'");
                    }
                    else
                    {
                        return("-1" + endValue);
                    }
                }

                ASClass msgClass = preMsgClasses[preHeader];
                string  hash     = previous.GetMessageHash(msgClass);

                bool   isDead = false;
                string result = string.Empty;
                IReadOnlyList <ASClass> curSimilars = current.GetMessages(hash);
                if (curSimilars == null)
                {
                    return($"-1{endValue} //No Matches {msgClass.Instance.QualifiedName.Name}[{headerValue}]");
                }
                else
                {
                    ASClass curMsgClass = curSimilars[0];
                    isDead = !current.IsMessageReferenced(curMsgClass);

                    if (curSimilars.Count == 1)
                    {
                        ushort curHeader = current.GetMessageHeader(curMsgClass);
                        result = $"{curHeader}{endValue} //{headerValue}";
                    }
                    else
                    {
                        result = $"-1{endValue} //Duplicate Matches {msgClass.Instance.QualifiedName.Name}[{headerValue}] | {hash}";
                    }
                }
                if (isDead)
                {
                    result +=
                        " | Dead Message(0 References)";
                }
                return(result);
            };

            value = Regex.Replace(value,
                                  "( |)//(.*?)\r\n", "\r\n", RegexOptions.Singleline).Trim();

            if (value.Contains("-1"))
            {
                value = Regex.Replace(value,
                                      @"-\b1\b", "0000", RegexOptions.Multiline);
            }

            value = Regex.Replace(value,
                                  @"(\b(?<header>\d{1,4})\b)(?<end>[^\r|$]*)", replacer, RegexOptions.Multiline);

            return(value);
        }