public void GetContentMetadata(Book.Part part, EFlags flags = default) { var filename = part.AaxFileItem.FileName; Log(3, this, () => $"\"{filename.SubstitUser ()}\", flags={flags}"); try { var contentMetadataFile = findContentMetadataFile(filename); if (contentMetadataFile is null || contentMetadataFile.Filename is null) { part.AaxFileItem.ContentMetadataFile = new AsinJsonFile(null, null); return; } part.AaxFileItem.ContentMetadataFile = contentMetadataFile; string metafile = contentMetadataFile.Filename; Log(3, this, () => $"\"{metafile.SubstitUser ()}\""); if (flags.HasFlag(EFlags.fileOnly)) { return; } getContentMetaChapters(part, metafile, flags.HasFlag(EFlags.skuOnly)); } catch (Exception exc) { Log(1, this, () => exc.ToShortString()); } }
/// <summary> /// Consider the next character in the stream 'ch'. /// Returns true if currently within a string/character literal.</summary> public bool WithinLiteral(char ch) { if (m_in_literal_state) { if (m_escape) { // If escaped, then still within the literal m_escape = false; return(m_in_literal = true); } else if (ch == m_quote_character) { m_in_literal_state = false; return(m_in_literal = !m_flags.HasFlag(EFlags.ExcludeQuotes)); // terminating quote can be part of the literal } else if (ch == '\n' && m_flags.HasFlag(EFlags.SingleLineStrings)) { m_in_literal_state = false; return(m_in_literal = false); // terminating '\n' is not part of the literal } else { m_escape = (ch == m_escape_character) && m_flags.HasFlag(EFlags.Escaped); return(m_in_literal = true); } } else if (ch == '\"' || ch == '\'') { m_quote_character = ch; m_in_literal_state = true; m_escape = false; return(m_in_literal = !m_flags.HasFlag(EFlags.ExcludeQuotes)); // first quote can be part of the literal } else { return(m_in_literal = false); } }
public void UpdateFlags(ulong result, uint size, EFlags flags) { if (flags.HasFlag(EFlags.ZeroFlag)) { ToggleFlagIf(EFlags.ZeroFlag, result == 0); } // http://graphics.stanford.edu/~seander/bithacks.html#ParityWith64Bits if (flags.HasFlag(EFlags.ParityFlag)) { ToggleFlagIf(EFlags.ParityFlag, ((((((((ulong)result & 0xFF) * (ulong)0x0101010101010101) & 0x8040201008040201) % 0x1FF) & 1) == 0))); } if (flags.HasFlag(EFlags.SignFlag)) { uint signFlag = (uint)(1 << (int)((size << 3) - 1)); ToggleFlagIf(EFlags.SignFlag, (result & signFlag) == signFlag); } if (flags.HasFlag(EFlags.AdjustFlag)) { ToggleFlagIf(EFlags.AdjustFlag, (result & 8) == 8); } if (flags.HasFlag(EFlags.OverflowFlag)) { long signedResult = (long)result; if (size == 1) { ToggleFlagIf(EFlags.OverflowFlag, signedResult > sbyte.MaxValue || signedResult < sbyte.MinValue); } else if (size == 2) { ToggleFlagIf(EFlags.OverflowFlag, signedResult > short.MaxValue || signedResult < short.MinValue); } else if (size == 4) { ToggleFlagIf(EFlags.OverflowFlag, signedResult > int.MaxValue || signedResult < int.MinValue); } } if (flags.HasFlag(EFlags.CarryFlag)) { ToggleFlagIf(EFlags.CarryFlag, ((result >> ((int)size << 3)) & 1) == 1); } }
public void UpdateFlags(ulong result, uint size, EFlags flags) { if (flags.HasFlag(EFlags.ZeroFlag)) ToggleFlagIf(EFlags.ZeroFlag, result == 0); // http://graphics.stanford.edu/~seander/bithacks.html#ParityWith64Bits if (flags.HasFlag(EFlags.ParityFlag)) ToggleFlagIf(EFlags.ParityFlag, ((((((((ulong)result & 0xFF) * (ulong)0x0101010101010101) & 0x8040201008040201) % 0x1FF) & 1) == 0))); if (flags.HasFlag(EFlags.SignFlag)) { uint signFlag = (uint)(1 << (int)((size << 3) - 1)); ToggleFlagIf(EFlags.SignFlag, (result & signFlag) == signFlag); } if (flags.HasFlag(EFlags.AdjustFlag)) ToggleFlagIf(EFlags.AdjustFlag, (result & 8) == 8); if (flags.HasFlag(EFlags.OverflowFlag)) { long signedResult = (long)result; if (size == 1) ToggleFlagIf(EFlags.OverflowFlag, signedResult > sbyte.MaxValue || signedResult < sbyte.MinValue); else if (size == 2) ToggleFlagIf(EFlags.OverflowFlag, signedResult > short.MaxValue || signedResult < short.MinValue); else if (size == 4) ToggleFlagIf(EFlags.OverflowFlag, signedResult > int.MaxValue || signedResult < int.MinValue); } if (flags.HasFlag(EFlags.CarryFlag)) ToggleFlagIf(EFlags.CarryFlag, ((result >> ((int)size << 3)) & 1) == 1); }
private bool ExecuteJump(string disasmStr, Disasm disasm, string mnemonic) { bool shouldJump = false; if (mnemonic == "jmp") { shouldJump = true; } else if (mnemonic == "je" || mnemonic == "jz") // Jump short if equal (ZF=1). { shouldJump = EFlags.HasFlag(EFlags.ZeroFlag); } else if (mnemonic == "jne" || mnemonic == "jnz") // Jump short if not equal (ZF=0). { shouldJump = !EFlags.HasFlag(EFlags.ZeroFlag); } else if (mnemonic == "ja" || mnemonic == "jnbe") // Jump short if not below or equal (CF=0 and ZF=0). { shouldJump = !EFlags.HasFlag(EFlags.CarryFlag) && !EFlags.HasFlag(EFlags.ZeroFlag); } else if (mnemonic == "jb" || mnemonic == "jc" || mnemonic == "jnae") // Jump short if not above or equal (CF=1). { shouldJump = EFlags.HasFlag(EFlags.CarryFlag); } else if (mnemonic == "jng" || mnemonic == "jle") // Jump short if not greater (ZF=1 or SF != OF). { shouldJump = EFlags.HasFlag(EFlags.ZeroFlag) || (EFlags.HasFlag(EFlags.SignFlag) != EFlags.HasFlag(EFlags.OverflowFlag)); } else if (mnemonic == "jnc" || mnemonic == "jnb" || mnemonic == "jae") // Jump short if not carry (CF=0). { shouldJump = !EFlags.HasFlag(EFlags.CarryFlag); } else if (mnemonic == "jna" || mnemonic == "jbe") // Jump short if not above (CF=1 or ZF=1). { shouldJump = EFlags.HasFlag(EFlags.CarryFlag) || EFlags.HasFlag(EFlags.ZeroFlag); } else if (mnemonic == "jge" || mnemonic == "jnl") // Jump short if greater or equal (SF=OF). { shouldJump = EFlags.HasFlag(EFlags.SignFlag) == EFlags.HasFlag(EFlags.OverflowFlag); } else if (mnemonic == "jg" || mnemonic == "jnle") // Jump short if greater (ZF=0 and SF=OF). { shouldJump = !EFlags.HasFlag(EFlags.ZeroFlag) && (EFlags.HasFlag(EFlags.SignFlag) == EFlags.HasFlag(EFlags.OverflowFlag)); } else if (mnemonic == "jl" || mnemonic == "jnge") // Jump short if less (SF != OF). { shouldJump = EFlags.HasFlag(EFlags.SignFlag) != EFlags.HasFlag(EFlags.OverflowFlag); } else if (mnemonic == "jecxz") // Jump short if ECX register is 0. { shouldJump = Ecx.Value == 0; } else if (mnemonic == "jcxz") // Jump short if CX register is 0. { shouldJump = Ecx.Cx == 0; } else if (mnemonic == "jno") // Jump short if not overflow (OF=0) { shouldJump = !EFlags.HasFlag(EFlags.OverflowFlag); } else if (mnemonic == "jnp" || mnemonic == "jpo") // Jump short if not parity (PF=0) { shouldJump = !EFlags.HasFlag(EFlags.ParityFlag); } else if (mnemonic == "jns") // Jump short if not sign (SF=0) { shouldJump = !EFlags.HasFlag(EFlags.SignFlag); } else if (mnemonic == "jo") // Jump short if overflow (OF=1) { shouldJump = !EFlags.HasFlag(EFlags.OverflowFlag); } else if (mnemonic == "jp" || mnemonic == "jpe") // Jump short if parity (PF=1) { shouldJump = !EFlags.HasFlag(EFlags.ParityFlag); } else if (mnemonic == "js") // Jump short if sign (SF=1) { shouldJump = !EFlags.HasFlag(EFlags.SignFlag); } else { throw new Exception("Invalid jump type detected."); } if (!shouldJump) { return(false); } // We should jump. return(true); }