private PrimitiveToken ReadPrimitive(BinaryReader reader, AxData data) { PrimitiveToken ret = null; int theTokenOffset = tokenOffset; int type = reader.ReadByte(); int flag = reader.ReadByte(); int value = 0; int extraValue = -1; tokenOffset += 1; if ((flag & 0x80) == 0x80) { value = reader.ReadInt32(); tokenOffset += 2; } else { value = reader.ReadUInt16(); tokenOffset += 1; } HspDictionaryKey key = new HspDictionaryKey(); key.Type = type; key.Value = value; HspDictionaryValue dicValue; if (dictionary.CodeLookUp(key, out dicValue)) { if ((dicValue.Extra & HspCodeExtraFlags.HasExtraInt16) == HspCodeExtraFlags.HasExtraInt16) { //HSP3.0aの仕様では行頭にないif,elseはジャンプ先アドレスを持たない。 if ((flag & 0x20) == 0x20) { extraValue = reader.ReadUInt16(); tokenOffset += 1; ret = createPrimitive(data, dicValue, theTokenOffset, type, flag, value, extraValue); } else { ret = createPrimitive(data, dicValue, theTokenOffset, type, flag, value, -1); } } else { ret = createPrimitive(data, dicValue, theTokenOffset, type, flag, value, -1); } } else { ret = createPrimitive(data, new HspDictionaryValue(), theTokenOffset, type, flag, value, -1); } ret.SetName(); return(ret); }
internal TokenCollection Analyze(AxData data) { if (!data.IsStarted) { throw new InvalidOperationException(); } TokenCollection stream = new TokenCollection(); BinaryReader reader = data.Reader; long sizeOfCode = data.Header.CodeSize; long startOfCode = data.StartOfCode; tokenOffset = 0; reader.BaseStream.Seek(startOfCode, SeekOrigin.Begin); while (tokenOffset < sizeOfCode) { PrimitiveToken code = ReadPrimitive(reader, data); if (code != null) { stream.Add(code); } } #if DEBUG List <int> variablesCount = null; variablesCount = subAnalyzeVariables(stream); for (int i = 0; i < variablesCount.Count; i++) { if (variablesCount[i] == 1) { string errMsg = GlobalVariablePrimitive.ToString(i); errMsg += ":この変数は一度しか使われていません"; global::KttK.HspDecompiler.HspConsole.Warning(errMsg); } if (variablesCount[i] == 0) { string errMsg = GlobalVariablePrimitive.ToString(i); errMsg += ":この変数は使われていません"; global::KttK.HspDecompiler.HspConsole.Warning(errMsg); } } #endif return(stream); }