Edit

kc3-lang/angle/src/common/angleutils.cpp

Branch :

  • Show log

    Commit

  • Author : Olli Etuaho
    Date : 2017-09-27 11:20:15
    Hash : c853804c
    Message : Add support for arrays of arrays to VariableLocation Array indices are sorted so that the outermost index is in the back. This is because we want to be consistent with future arrays of arrays parsing code. In parsing we'll have a utility function to make a TType object into an array, and there it's most natural to push the new outermost sizes to the back of the vector. Further patches will still be needed to parse arrays of arrays and add support to arrays of arrays into the API. BUG=angleproject:2125 TEST=angle_unittests, angle_end2end_tests Change-Id: I6c88edabf68ae9dbd803ec6d20543016c408b702 Reviewed-on: https://chromium-review.googlesource.com/686414 Reviewed-by: Jamie Madill <jmadill@chromium.org> Reviewed-by: Corentin Wallez <cwallez@chromium.org> Commit-Queue: Olli Etuaho <oetuaho@nvidia.com>

  • src/common/angleutils.cpp
  • //
    // Copyright (c) 2014 The ANGLE Project Authors. All rights reserved.
    // Use of this source code is governed by a BSD-style license that can be
    // found in the LICENSE file.
    //
    
    #include "common/angleutils.h"
    #include "common/debug.h"
    
    #include <stdio.h>
    
    #include <limits>
    #include <vector>
    
    namespace angle
    {
    const uintptr_t DirtyPointer = std::numeric_limits<uintptr_t>::max();
    }
    
    std::string ArrayString(unsigned int i)
    {
        // We assume that UINT_MAX and GL_INVALID_INDEX are equal.
        ASSERT(i != UINT_MAX);
    
        std::stringstream strstr;
        strstr << "[";
        strstr << i;
        strstr << "]";
        return strstr.str();
    }
    
    std::string ArrayIndexString(const std::vector<unsigned int> &indices)
    {
        std::stringstream strstr;
    
        for (auto indicesIt = indices.rbegin(); indicesIt != indices.rend(); ++indicesIt)
        {
            // We assume that UINT_MAX and GL_INVALID_INDEX are equal.
            ASSERT(*indicesIt != UINT_MAX);
            strstr << "[";
            strstr << (*indicesIt);
            strstr << "]";
        }
    
        return strstr.str();
    }
    
    size_t FormatStringIntoVector(const char *fmt, va_list vararg, std::vector<char>& outBuffer)
    {
        // The state of the va_list passed to vsnprintf is undefined after the call, do a copy in case
        // we need to grow the buffer.
        va_list varargCopy;
        va_copy(varargCopy, vararg);
    
        // Attempt to just print to the current buffer
        int len = vsnprintf(&(outBuffer.front()), outBuffer.size(), fmt, varargCopy);
        va_end(varargCopy);
    
        if (len < 0 || static_cast<size_t>(len) >= outBuffer.size())
        {
            // Buffer was not large enough, calculate the required size and resize the buffer
            len = vsnprintf(nullptr, 0, fmt, vararg);
            outBuffer.resize(len + 1);
    
            // Print again
            va_copy(varargCopy, vararg);
            len = vsnprintf(&(outBuffer.front()), outBuffer.size(), fmt, varargCopy);
            va_end(varargCopy);
        }
        ASSERT(len >= 0);
        return static_cast<size_t>(len);
    }