<html>
  <head>
    <meta content="text/html; charset=ISO-8859-1"
      http-equiv="Content-Type">
  </head>
  <body bgcolor="#FFFFFF" text="#000000">
    <div class="moz-cite-prefix">On 01/13/2014 08:27 PM, Paul Berry
      wrote:<br>
    </div>
    <blockquote
cite="mid:CA+yLL643VMP11DQsDQDPsR3H5DWY6C7wcUg_pEJc6P-VBCLENQ@mail.gmail.com"
      type="cite">
      <meta http-equiv="Content-Type" content="text/html;
        charset=ISO-8859-1">
      <div dir="ltr">On 2 January 2014 03:58, Tapani Pälli <span
          dir="ltr"><<a moz-do-not-send="true"
            href="mailto:tapani.palli@intel.com" target="_blank">tapani.palli@intel.com</a>></span>
        wrote:<br>
        <div class="gmail_extra">
          <div class="gmail_quote">
            <blockquote class="gmail_quote" style="margin:0px 0px 0px
              0.8ex;border-left:1px solid
              rgb(204,204,204);padding-left:1ex">Class will be used by
              the shader binary cache implementation.<br>
              <br>
              Signed-off-by: Tapani Pälli <<a moz-do-not-send="true"
                href="mailto:tapani.palli@intel.com">tapani.palli@intel.com</a>><br>
              ---<br>
               src/glsl/memory_writer.h | 147
              +++++++++++++++++++++++++++++++++++++++++++++++<br>
               1 file changed, 147 insertions(+)<br>
               create mode 100644 src/glsl/memory_writer.h<br>
              <br>
              diff --git a/src/glsl/memory_writer.h
              b/src/glsl/memory_writer.h<br>
              new file mode 100644<br>
              index 0000000..a6c6b55<br>
              --- /dev/null<br>
              +++ b/src/glsl/memory_writer.h<br>
              @@ -0,0 +1,147 @@<br>
              +/* -*- c++ -*- */<br>
              +/*<br>
              + * Copyright © 2013 Intel Corporation<br>
              + *<br>
              + * Permission is hereby granted, free of charge, to any
              person obtaining a<br>
              + * copy of this software and associated documentation
              files (the "Software"),<br>
              + * to deal in the Software without restriction, including
              without limitation<br>
              + * the rights to use, copy, modify, merge, publish,
              distribute, sublicense,<br>
              + * and/or sell copies of the Software, and to permit
              persons to whom the<br>
              + * Software is furnished to do so, subject to the
              following conditions:<br>
              + *<br>
              + * The above copyright notice and this permission notice
              (including the next<br>
              + * paragraph) shall be included in all copies or
              substantial portions of the<br>
              + * Software.<br>
              + *<br>
              + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF
              ANY KIND, EXPRESS OR<br>
              + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
              OF MERCHANTABILITY,<br>
              + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
               IN NO EVENT SHALL<br>
              + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
              CLAIM, DAMAGES OR OTHER<br>
              + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
              OTHERWISE, ARISING<br>
              + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
              USE OR OTHER<br>
              + * DEALINGS IN THE SOFTWARE.<br>
              + */<br>
              +<br>
              +#pragma once<br>
              +#ifndef MEMORY_WRITER_H<br>
              +#define MEMORY_WRITER_H<br>
              +<br>
              +#include <stdlib.h><br>
              +#include <unistd.h><br>
              +#include <string.h><br>
              +<br>
              +#ifdef __cplusplus<br>
              +/**<br>
              + * Helper class for writing data to memory<br>
              + *<br>
              + * This class maintains a dynamically-sized memory buffer
              and allows<br>
              + * for data to be efficiently appended to it with
              automatic resizing.<br>
              + */<br>
              +class memory_writer<br>
              +{<br>
              +public:<br>
              +   memory_writer() :<br>
              +      memory(NULL),<br>
              +      curr_size(0),<br>
              +      pos(0) {}<br>
              +<br>
              +   ~memory_writer()<br>
              +   {<br>
              +      free(memory);<br>
              +   }<br>
              +<br>
              +   /* user wants to claim the memory */<br>
              +   char *release_memory(size_t *size)<br>
              +   {<br>
              +      /* final realloc to free allocated but unused
              memory */<br>
              +      char *result = (char *) realloc(memory, pos);<br>
              +      *size = pos;<br>
              +      memory = NULL;<br>
              +      curr_size = 0;<br>
              +      pos = 0;<br>
              +      return result;<br>
              +   }<br>
              +<br>
              +/**<br>
              + * write functions per type<br>
              + */<br>
              +#define DECL_WRITER(type) int write_ ##type (const type
              data) {\<br>
              +   return write(&data, sizeof(type));\<br>
              +}<br>
              +<br>
              +   DECL_WRITER(int32_t);<br>
              +   DECL_WRITER(int64_t);<br>
              +   DECL_WRITER(uint8_t);<br>
              +   DECL_WRITER(uint32_t);<br>
              +<br>
              +   int write_bool(bool data)<br>
              +   {<br>
              +      uint8_t val = data;<br>
              +      return write_uint8_t(val);<br>
              +   }<br>
              +<br>
              +   /* write function that reallocates more memory if
              required */<br>
              +   int write(const void *data, int32_t size)<br>
              +   {<br>
              +      if (!memory || pos > (int32_t)(curr_size -
              size))<br>
              +         if (grow(size))<br>
              +            return -1;<br>
              +<br>
              +      memcpy(memory + pos, data, size);<br>
              +<br>
              +      pos += size;<br>
              +      return 0;<br>
              +   }<br>
              +<br>
              +   int overwrite(const void *data, int32_t size, int32_t
              offset)<br>
              +   {<br>
              +      if (offset < 0 || offset + size > pos)<br>
              +         return -1;<br>
              +      memcpy(memory + offset, data, size);<br>
              +      return 0;<br>
              +   }<br>
              +<br>
              +   int write_string(const char *str)<br>
              +   {<br>
              +      if (!str)<br>
              +         return -1;<br>
              +      char terminator = '\0';<br>
              +      write(str, strlen(str));<br>
              +      write(&terminator, 1);<br>
            </blockquote>
            <div><br>
            </div>
            <div>C strings include a terminator, so there's no reason to
              write out the string contents and the terminator
              separtely.  You can just do:<br>
              <br>
            </div>
            <div>write(str, strlen(str) + 1);<br>
              <br>
              Also, don't forget to propagate the return code to the
              caller:<br>
              <br>
            </div>
            <div>return write(str, strlen(str) + 1);<br>
            </div>
          </div>
        </div>
      </div>
    </blockquote>
    <br>
    Ah right, will do. It could be that this needs to be modified back
    to how it was though (to write to length of the string too). I think
    it is otherwise impossible for the reader side to know if terminator
    really exists and it might continue to read forever (or call strlen
    for unterminated string).<br>
    <br>
    <blockquote
cite="mid:CA+yLL643VMP11DQsDQDPsR3H5DWY6C7wcUg_pEJc6P-VBCLENQ@mail.gmail.com"
      type="cite">
      <div dir="ltr">
        <div class="gmail_extra">
          <div class="gmail_quote">
            <div> </div>
            <blockquote class="gmail_quote" style="margin:0px 0px 0px
              0.8ex;border-left:1px solid
              rgb(204,204,204);padding-left:1ex">
              +      return 0;<br>
              +   }<br>
              +<br>
              +   inline int32_t position() { return pos; }<br>
              +<br>
              +<br>
              +private:<br>
              +<br>
              +   /* reallocate more memory */<br>
              +   int grow(int32_t size)<br>
              +   {<br>
              +      int32_t new_size = 2 * (curr_size + size);<br>
              +      char *more_mem = (char *) realloc(memory,
              new_size);<br>
              +      if (more_mem == NULL) {<br>
              +         free(memory);<br>
              +         memory = NULL;<br>
              +         return -1;<br>
              +      } else {<br>
              +         memory = more_mem;<br>
              +         curr_size = new_size;<br>
              +         return 0;<br>
              +      }<br>
              +   }<br>
              +<br>
              +   /* allocated memory */<br>
              +   char *memory;<br>
              +<br>
              +   /* current size of the whole allocation */<br>
              +   int32_t curr_size;<br>
              +<br>
              +   /* write position / size of the data written */<br>
              +   int32_t pos;<br>
              +};<br>
              +<br>
              +#endif /* ifdef __cplusplus */<br>
              +<br>
              +#endif /* MEMORY_WRITER_H */<br>
              <span class=""><font color="#888888">--<br>
                  1.8.3.1<br>
                  <br>
                </font></span></blockquote>
          </div>
          <br>
        </div>
      </div>
    </blockquote>
    <br>
  </body>
</html>