public void WriteStrings(StreamFunctionAdd sfa)
 {
     sfa.PositionStream = (long)this.offsetStrings;
     sfa.LengthStream   = (long)this.offsetStrings;
     for (int index = 0; index < this.str.Count; ++index)
     {
         this.str[index].WriteData(sfa);
         if (index > 0)
         {
             uint num1 = this.str[index].offset - this.offsetStrings;
             sfa.PositionStream = (long)(this.str[index].myOffset - 1U);
             if (num1 < 0x10)
             {
                 byte num2 = (byte)(0x10 + num1);
                 sfa.WriteByte(num2);
                 sfa.WriteByte((byte)0);
             }
             else if (num1 < 0x1000)
             {
                 byte num2 = (byte)(0x50 + (num1 >> 8));
                 sfa.WriteByte(num2);
                 byte num3 = (byte)(num1 & (uint)byte.MaxValue);
                 sfa.WriteUInt16((ushort)num3);
             }
             else if (num1 > 0xFFF)
             {
                 sfa.WriteByte(0x90);
                 sfa.WriteUInt16((ushort)num1);
             }
             sfa.PositionStream = sfa.LengthStream;
         }
     }
     sfa.SeekValueWrite(2U);
 }
Example #2
0
        public void WriteStrings(StreamFunctionAdd sfa, bool dedup = false)
        {
            sfa.PositionStream = offsetStrings;
            sfa.LengthStream   = offsetStrings;
            List <int> failedMediumStrings = new List <int>();
            List <int> failedShortStrings  = new List <int>();
            uint       lastShortLength     = 0;
            uint       lastMediumLength    = 0;
            long       realPos             = 0;
            bool       matched             = false;

            for (int index = 0; index < fileStrings.Count; ++index)
            {
                if (dedup)
                {
                    for (int index1 = index - 1; index1 >= 0; --index1)
                    {
                        if (index == 0)
                        {
                            break;
                        }
                        if (fileStrings[index].data.Count == fileStrings[index1].data.Count)
                        {
                            if (System.Linq.Enumerable.SequenceEqual(fileStrings[index].data, fileStrings[index1].data))
                            {
                                realPos = sfa.PositionStream;
                                fileStrings[index].offset = fileStrings[index1].offset;
                                matched = true;
                                break;
                            }
                        }
                    }

                    if (!matched)
                    {
                        fileStrings[index].WriteData(sfa);
                    }
                }
                else
                {
                    fileStrings[index].WriteData(sfa);
                }

                if (index > 0)
                {
                    uint num1 = fileStrings[index].offset - offsetStrings;
                    sfa.PositionStream = fileStrings[index].myOffset - 1U;
                    if (num1 < 0x10 && fileStrings[index].typeOffset == sceStrings.OffsetType.ShortOffset)
                    {
                        byte num2 = (byte)(0x10 + num1);
                        sfa.WriteByte(num2);
                        sfa.WriteByte(0);
                    }
                    else if (num1 < 0x1000 && fileStrings[index].typeOffset == sceStrings.OffsetType.MediumOffset)
                    {
                        byte num2 = (byte)(0x50 + (num1 >> 8));
                        sfa.WriteByte(num2);
                        byte num3 = (byte)(num1 & byte.MaxValue);
                        sfa.WriteUInt16(num3);
                    }
                    else if (num1 < 0x10000 && fileStrings[index].typeOffset == sceStrings.OffsetType.LargeOffset)
                    {
                        sfa.WriteByte(0x90);
                        sfa.WriteUInt16((ushort)num1);
                    }
                    else
                    {
                        Console.OutputEncoding = System.Text.Encoding.UTF8;
                        if (Program.verbose)
                        {
                            MiscUtils.Warn("Can't fit desired pointer in the available space...");
                            MiscUtils.Warn("- Failed at block: " + index + ", around line " + lineNumberList[index]);
                            MiscUtils.Warn("- String: " + plainStringList[index]);
                            //MiscUtils.Warn("- Intended offset: " + num1);
                            MiscUtils.Warn(string.Format("- Position: 0x{0:X6}", fileStrings[index].offset));
                            MiscUtils.Warn("- Pointer type: " + fileStrings[index].typeOffset);
                            MiscUtils.Warn("Continuing insertion, but leaving pointer unchanged, expect text errors!");
                            Console.WriteLine();
                            //Console.ReadKey();
                            //throw new InvalidOperationException();
                        }

                        if (fileStrings[index].typeOffset == sceStrings.OffsetType.MediumOffset)
                        {
                            failedMediumStrings.Add(index);
                            lastMediumLength = num1;
                        }
                        else
                        {
                            failedShortStrings.Add(index);
                            lastShortLength = num1;
                        }
                    }

                    if (matched)
                    {
                        sfa.PositionStream = realPos;
                        matched            = false;
                        continue;
                    }
                    sfa.PositionStream = sfa.LengthStream;
                }
            }

            if (failedShortStrings.Count != 0 || failedMediumStrings.Count != 0)
            {
                MiscUtils.Warn("Couldn't insert all lines due to pointer size issues");
                MiscUtils.Warn("Inserted the other lines, but left the faulty ones untouched, expect text errors!");
                Console.WriteLine();

                if (failedShortStrings.Count != 0)
                {
                    MiscUtils.Info("Found " + failedShortStrings.Count + " strings over the 16 line");
                    MiscUtils.Info("Remove " + (lastShortLength - 16) + " bytes before line "
                                   + lineNumberList[failedShortStrings[0]] + " to get them back to a valid position");
                    MiscUtils.Info("Line " + lineNumberList[failedShortStrings[0]] + " for reference:");
                    MiscUtils.Info("\"" + plainStringList[failedShortStrings[0]] + "\"");
                    Console.WriteLine();
                }

                if (failedMediumStrings.Count != 0)
                {
                    MiscUtils.Info("Found " + failedMediumStrings.Count + " strings over the 4096 line");
                    MiscUtils.Info("Remove " + (lastMediumLength - 4096) + " bytes before line "
                                   + lineNumberList[failedMediumStrings[0]] + " to get them back to a valid position");
                    MiscUtils.Info("Line " + lineNumberList[failedMediumStrings[0]] + " for reference:");
                    MiscUtils.Info("\"" + plainStringList[failedMediumStrings[0]] + "\"");
                    Console.WriteLine();
                }
            }

            sfa.SeekValueWrite(2U);
        }