/// <summary> /// Class constructor /// </summary> public PipDataEntry(PipDataFragmentEscaping escaping, PipDataEntryType entryType, int data) { Contract.Requires(escaping == PipDataFragmentEscaping.Invalid || entryType == PipDataEntryType.NestedDataHeader); EntryType = entryType; m_escaping = escaping; m_data = data; }
/// <summary> /// Returns max possible length of given <paramref name="fragment"/>, when <paramref name="escaping"/> /// is used. Instead of rendering paths and computing actual path lengths, it uses /// <paramref name="maxPathLength"/> as the upper bound for path lengths. /// </summary> public int GetMaxLength(PipFragment fragment, PipDataFragmentEscaping escaping, int maxPathLength) { Contract.Requires(maxPathLength > 0); // StringLiteral if (fragment.FragmentType == PipFragmentType.StringLiteral) { return(GetLength(fragment.GetStringIdValue(), escaping)); } // AbsolutePath if (fragment.FragmentType == PipFragmentType.AbsolutePath) { var numExtraCharactersForEscaping = escaping == PipDataFragmentEscaping.CRuntimeArgumentRules ? 2 : // path gets surrounded by '"' and '"' 0; return(maxPathLength + numExtraCharactersForEscaping); } // VsoHash if (fragment.FragmentType == PipFragmentType.VsoHash) { return(MaxVsoHashStringLength); // vso hash should never need any escaping } if (fragment.FragmentType == PipFragmentType.IpcMoniker) { return(MaxIpcMonikerLength); } Contract.Assert(false, I($"Unhandled fragment ('{fragment.FragmentType}') type and/or fragmentEscaping ('{escaping}')")); return(0); }
/// <summary> /// Creates a copy of the PipData instance with the given separator and escaping /// </summary> public PipData With(StringId fragmentSeparator, PipDataFragmentEscaping fragmentEscaping) { Contract.Requires(fragmentSeparator.IsValid); Contract.Requires(fragmentEscaping != PipDataFragmentEscaping.Invalid); return(CreateInternal( new PipDataEntry(fragmentEscaping, PipDataEntryType.NestedDataHeader, fragmentSeparator.Value), Entries, m_entriesBinarySegmentPointer)); }
/// <summary> /// Returns the length of a StringId when rendered to string using given <paramref name="escaping"/>. /// </summary> public int GetLength(StringId stringId, PipDataFragmentEscaping escaping) { switch (escaping) { case PipDataFragmentEscaping.CRuntimeArgumentRules: // - passing null as StringBuilder to AppendEscapedCommandLineWord is ok // - the return value of AppendEscapedCommandLineWord indicates how many characters would be appended return(CommandLineEscaping.AppendEscapedCommandLineWord(builder: null, word: Render(stringId))); case PipDataFragmentEscaping.NoEscaping: return(StringTable.GetLength(stringId)); // instead of retrieving the whole string, StringTable.GetLength is faster. default: Contract.Assert(false, I($"Unhandled fragmentEscaping: {escaping}")); return(0); } }
/// <summary> /// Creates a nested data header entry /// </summary> internal static PipDataEntry CreateNestedDataHeader(PipDataFragmentEscaping escaping, StringId separator) { return(new PipDataEntry(escaping, PipDataEntryType.NestedDataHeader, separator.Value)); }
/// <nodoc /> public PipDataEntry(PipDataFragmentEscaping escaping, PipDataEntryType entryType, uint data) : this(escaping, entryType, unchecked ((int)data)) { }