Exemple #1
0
 /// <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);
        }
Exemple #3
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));
        }
Exemple #4
0
        /// <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);
            }
        }
Exemple #5
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));
 }
Exemple #6
0
 /// <nodoc />
 public PipDataEntry(PipDataFragmentEscaping escaping, PipDataEntryType entryType, uint data)
     : this(escaping, entryType, unchecked ((int)data))
 {
 }