15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Copyright © 2009 Red Hat, Inc. 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * This is part of HarfBuzz, a text shaping library. 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Permission is hereby granted, without written agreement and without 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * license or royalty fees, to use, copy, modify, and distribute this 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * software and its documentation for any purpose, provided that the 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * above copyright notice and the following two paragraphs appear in 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * all copies of this software. 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * DAMAGE. 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Red Hat Author(s): Behdad Esfahbod 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 27c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)/* http://www.oracle.com/technetwork/articles/servers-storage-dev/standardheaderfiles-453865.html */ 285f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#ifndef _POSIX_C_SOURCE 29c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#define _POSIX_C_SOURCE 199309L 305f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#endif 31c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "hb-private.hh" 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "hb-object-private.hh" 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef HAVE_SYS_MMAN_H 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef HAVE_UNISTD_H 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <unistd.h> 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* HAVE_UNISTD_H */ 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <sys/mman.h> 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* HAVE_SYS_MMAN_H */ 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <stdio.h> 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <errno.h> 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef HB_DEBUG_BLOB 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define HB_DEBUG_BLOB (HB_DEBUG+0) 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct hb_blob_t { 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) hb_object_header_t header; 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_POD (); 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool immutable; 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char *data; 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unsigned int length; 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) hb_memory_mode_t mode; 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void *user_data; 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) hb_destroy_func_t destroy; 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static bool _try_writable (hb_blob_t *blob); 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)_hb_blob_destroy_user_data (hb_blob_t *blob) 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (blob->destroy) { 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) blob->destroy (blob->user_data); 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) blob->user_data = NULL; 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) blob->destroy = NULL; 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 80f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)/** 81f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) * hb_blob_create: (Xconstructor) 82f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) * @data: (array length=length) (closure user_data) (destroy destroy) (scope notified) (transfer none): Pointer to blob data. 83f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) * @length: Length of @data in bytes. 84f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) * @mode: Memory mode for @data. 85f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) * @user_data: Data parameter to pass to @destroy. 86f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) * @destroy: Callback to call when @data is not needed anymore. 87f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) * 88f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) * Creates a new "blob" object wrapping @data. The @mode parameter is used 89f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) * to negotiate ownership and lifecycle of @data. 90f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) * 91f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) * Return value: New blob, or the empty blob if something failed or if @length is 92f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) * zero. Destroy with hb_blob_destroy(). 93f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) * 94f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) * Since: 1.0 95f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) **/ 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)hb_blob_t * 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)hb_blob_create (const char *data, 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unsigned int length, 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) hb_memory_mode_t mode, 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void *user_data, 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) hb_destroy_func_t destroy) 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) hb_blob_t *blob; 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!length || !(blob = hb_object_create<hb_blob_t> ())) { 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (destroy) 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) destroy (user_data); 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return hb_blob_get_empty (); 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) blob->data = data; 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) blob->length = length; 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) blob->mode = mode; 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) blob->user_data = user_data; 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) blob->destroy = destroy; 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (blob->mode == HB_MEMORY_MODE_DUPLICATE) { 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) blob->mode = HB_MEMORY_MODE_READONLY; 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!_try_writable (blob)) { 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) hb_blob_destroy (blob); 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return hb_blob_get_empty (); 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return blob; 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 129f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)/** 130f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) * hb_blob_create_sub_blob: 131f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) * @parent: Parent blob. 132f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) * @offset: Start offset of sub-blob within @parent, in bytes. 133f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) * @length: Length of sub-blob. 134f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) * 135f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) * Returns a blob that represents a range of bytes in @parent. The new 136f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) * blob is always created with %HB_MEMORY_MODE_READONLY, meaning that it 137f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) * will never modify data in the parent blob. The parent data is not 138f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) * expected to be modified, and will result in undefined behavior if it 139f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) * is. 140f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) * 141f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) * Makes @parent immutable. 142f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) * 143f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) * Return value: New blob, or the empty blob if something failed or if 144f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) * @length is zero or @offset is beyond the end of @parent's data. Destroy 145f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) * with hb_blob_destroy(). 146f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) * 147f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) * Since: 1.0 148f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) **/ 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)hb_blob_t * 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)hb_blob_create_sub_blob (hb_blob_t *parent, 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unsigned int offset, 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unsigned int length) 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) hb_blob_t *blob; 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!length || offset >= parent->length) 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return hb_blob_get_empty (); 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) hb_blob_make_immutable (parent); 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) blob = hb_blob_create (parent->data + offset, 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MIN (length, parent->length - offset), 163c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) HB_MEMORY_MODE_READONLY, 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) hb_blob_reference (parent), 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (hb_destroy_func_t) hb_blob_destroy); 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return blob; 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 170f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)/** 171f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) * hb_blob_get_empty: 172f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) * 173f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) * Returns the singleton empty blob. 174f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) * 175f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) * See TODO:link object types for more information. 176f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) * 177f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) * Return value: (transfer full): the empty blob. 178f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) * 179f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) * Since: 1.0 180f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) **/ 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)hb_blob_t * 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)hb_blob_get_empty (void) 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static const hb_blob_t _hb_blob_nil = { 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HB_OBJECT_HEADER_STATIC, 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) true, /* immutable */ 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NULL, /* data */ 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 0, /* length */ 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HB_MEMORY_MODE_READONLY, /* mode */ 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NULL, /* user_data */ 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NULL /* destroy */ 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return const_cast<hb_blob_t *> (&_hb_blob_nil); 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 200f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)/** 201f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) * hb_blob_reference: (skip) 202f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) * @blob: a blob. 203f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) * 204f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) * Increases the reference count on @blob. 205f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) * 206f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) * See TODO:link object types for more information. 207f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) * 208f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) * Return value: @blob. 209f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) * 210f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) * Since: 1.0 211f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) **/ 2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)hb_blob_t * 2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)hb_blob_reference (hb_blob_t *blob) 2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return hb_object_reference (blob); 2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 218f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)/** 219f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) * hb_blob_destroy: (skip) 220f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) * @blob: a blob. 221f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) * 222f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) * Descreases the reference count on @blob, and if it reaches zero, destroys 223f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) * @blob, freeing all memory, possibly calling the destroy-callback the blob 224f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) * was created for if it has not been called already. 225f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) * 226f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) * See TODO:link object types for more information. 227f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) * 228f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) * Since: 1.0 229f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) **/ 2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void 2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)hb_blob_destroy (hb_blob_t *blob) 2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!hb_object_destroy (blob)) return; 2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _hb_blob_destroy_user_data (blob); 2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) free (blob); 2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 240f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)/** 241f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) * hb_blob_set_user_data: (skip) 242f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) * @blob: a blob. 243f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) * @key: key for data to set. 244f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) * @data: data to set. 245f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) * @destroy: callback to call when @data is not needed anymore. 246f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) * @replace: whether to replace an existing data with the same key. 247f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) * 248f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) * Return value: 249f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) * 250f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) * Since: 1.0 251f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) **/ 2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)hb_bool_t 2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)hb_blob_set_user_data (hb_blob_t *blob, 2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) hb_user_data_key_t *key, 2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void * data, 2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) hb_destroy_func_t destroy, 2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) hb_bool_t replace) 2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return hb_object_set_user_data (blob, key, data, destroy, replace); 2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 262f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)/** 263f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) * hb_blob_get_user_data: (skip) 264f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) * @blob: a blob. 265f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) * @key: key for data to get. 266f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) * 267f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) * 268f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) * 269f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) * Return value: (transfer none): 270f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) * 271f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) * Since: 1.0 272f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) **/ 2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void * 2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)hb_blob_get_user_data (hb_blob_t *blob, 2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) hb_user_data_key_t *key) 2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return hb_object_get_user_data (blob, key); 2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 281f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)/** 282f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) * hb_blob_make_immutable: 283f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) * @blob: a blob. 284f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) * 285f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) * 286f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) * 287f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) * Since: 1.0 288f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) **/ 2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void 2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)hb_blob_make_immutable (hb_blob_t *blob) 2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (hb_object_is_inert (blob)) 2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) blob->immutable = true; 2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 298f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)/** 299f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) * hb_blob_is_immutable: 300f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) * @blob: a blob. 301f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) * 302f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) * 303f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) * 304f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) * Return value: TODO 305f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) * 306f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) * Since: 1.0 307f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) **/ 3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)hb_bool_t 3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)hb_blob_is_immutable (hb_blob_t *blob) 3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return blob->immutable; 3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 315f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)/** 316f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) * hb_blob_get_length: 317f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) * @blob: a blob. 318f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) * 319f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) * 320f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) * 321f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) * Return value: the length of blob data in bytes. 322f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) * 323f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) * Since: 1.0 324f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) **/ 3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)unsigned int 3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)hb_blob_get_length (hb_blob_t *blob) 3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return blob->length; 3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 331f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)/** 332f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) * hb_blob_get_data: 333f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) * @blob: a blob. 334f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) * @length: (out): 335f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) * 336f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) * 337f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) * 338f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) * Returns: (transfer none) (array length=length): 339f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) * 340f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) * Since: 1.0 341f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) **/ 3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char * 3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)hb_blob_get_data (hb_blob_t *blob, unsigned int *length) 3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (length) 3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *length = blob->length; 3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return blob->data; 3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 351f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)/** 352f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) * hb_blob_get_data_writable: 353f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) * @blob: a blob. 354f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) * @length: (out): output length of the writable data. 355f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) * 356f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) * Tries to make blob data writable (possibly copying it) and 357f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) * return pointer to data. 358f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) * 359f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) * Fails if blob has been made immutable, or if memory allocation 360f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) * fails. 361f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) * 362f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) * Returns: (transfer none) (array length=length): Writable blob data, 363f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) * or %NULL if failed. 364f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) * 365f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) * Since: 1.0 366f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) **/ 3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)char * 3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)hb_blob_get_data_writable (hb_blob_t *blob, unsigned int *length) 3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!_try_writable (blob)) { 3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (length) 3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *length = 0; 3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return NULL; 3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (length) 3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *length = blob->length; 3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return const_cast<char *> (blob->data); 3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static hb_bool_t 3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)_try_make_writable_inplace_unix (hb_blob_t *blob) 3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(HAVE_SYS_MMAN_H) && defined(HAVE_MPROTECT) 3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uintptr_t pagesize = -1, mask, length; 3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char *addr; 3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(HAVE_SYSCONF) && defined(_SC_PAGE_SIZE) 3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pagesize = (uintptr_t) sysconf (_SC_PAGE_SIZE); 3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#elif defined(HAVE_SYSCONF) && defined(_SC_PAGESIZE) 3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pagesize = (uintptr_t) sysconf (_SC_PAGESIZE); 3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#elif defined(HAVE_GETPAGESIZE) 3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pagesize = (uintptr_t) getpagesize (); 3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((uintptr_t) -1L == pagesize) { 4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DEBUG_MSG_FUNC (BLOB, blob, "failed to get pagesize: %s", strerror (errno)); 4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DEBUG_MSG_FUNC (BLOB, blob, "pagesize is %lu", (unsigned long) pagesize); 4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mask = ~(pagesize-1); 4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) addr = (const char *) (((uintptr_t) blob->data) & mask); 4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) length = (const char *) (((uintptr_t) blob->data + blob->length + pagesize-1) & mask) - addr; 4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DEBUG_MSG_FUNC (BLOB, blob, 4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "calling mprotect on [%p..%p] (%lu bytes)", 4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) addr, addr+length, (unsigned long) length); 4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (-1 == mprotect ((void *) addr, length, PROT_READ | PROT_WRITE)) { 4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DEBUG_MSG_FUNC (BLOB, blob, "mprotect failed: %s", strerror (errno)); 4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) blob->mode = HB_MEMORY_MODE_WRITABLE; 4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DEBUG_MSG_FUNC (BLOB, blob, 4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "successfully made [%p..%p] (%lu bytes) writable\n", 4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) addr, addr+length, (unsigned long) length); 4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else 4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static bool 4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)_try_writable_inplace (hb_blob_t *blob) 4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DEBUG_MSG_FUNC (BLOB, blob, "making writable inplace\n"); 4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (_try_make_writable_inplace_unix (blob)) 4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DEBUG_MSG_FUNC (BLOB, blob, "making writable -> FAILED\n"); 4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* Failed to make writable inplace, mark that */ 4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) blob->mode = HB_MEMORY_MODE_READONLY; 4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static bool 4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)_try_writable (hb_blob_t *blob) 4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (blob->immutable) 4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (blob->mode == HB_MEMORY_MODE_WRITABLE) 4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (blob->mode == HB_MEMORY_MODE_READONLY_MAY_MAKE_WRITABLE && _try_writable_inplace (blob)) 4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (blob->mode == HB_MEMORY_MODE_WRITABLE) 4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DEBUG_MSG_FUNC (BLOB, blob, "current data is -> %p\n", blob->data); 4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) char *new_data; 4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new_data = (char *) malloc (blob->length); 4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (unlikely (!new_data)) 4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DEBUG_MSG_FUNC (BLOB, blob, "dupped successfully -> %p\n", blob->data); 4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) memcpy (new_data, blob->data, blob->length); 4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _hb_blob_destroy_user_data (blob); 4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) blob->mode = HB_MEMORY_MODE_WRITABLE; 4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) blob->data = new_data; 4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) blob->user_data = new_data; 4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) blob->destroy = free; 4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 477