// C99 port from c++ is protected by a GNU Lesser GPLv3 // Copyright © 2013 Sylvain BERTRAND <sylvain.bertrand@gmail.com> // <sylware@legeek.net> #include <stdlib.h> #include <unistd.h> #include <sys/mman.h> #include <string.h> #include "hb.h" #include "hb-private.h" #include "hb-atomic-private.h" #include "hb-open-file-private.h" #include "hb-blob-private.h" struct hb_blob_t { atomic_int32_t ref_cnt; hb_bool_t immutable; const char *data; unsigned length; hb_memory_mode_t mode; void *user_data; hb_destroy_func_t destroy; }; static hb_blob_t hb_blob_nil = { REF_CNT_INVALID_VAL,//ref_cnt TRUE,//immutable NULL,//data 0,//length HB_MEMORY_MODE_READONLY,//mode NULL,//user_data NULL//destroy }; hb_blob_t * hb_blob_get_empty(void) { return &hb_blob_nil; } hb_blob_t * hb_blob_reference(hb_blob_t *blob) { if (hb_atomic_int32_get(&blob->ref_cnt) != REF_CNT_INVALID_VAL) hb_atomic_int32_add(&blob->ref_cnt, 1); return blob; } void hb_blob_make_immutable(hb_blob_t *blob) { if (hb_atomic_int32_get(&blob->ref_cnt) == REF_CNT_INVALID_VAL) return; blob->immutable = TRUE; } unsigned hb_blob_get_length(hb_blob_t *blob) { return blob->length; } const char * hb_blob_get_data(hb_blob_t *blob, unsigned *length) { if (length) *length = blob->length; return blob->data; } static hb_bool_t try_make_writable_inplace_unix(hb_blob_t *blob) { uintptr_t pagesize = -1, mask, length; const char *addr; pagesize = (uintptr_t)sysconf(_SC_PAGESIZE); if ((uintptr_t) -1L == pagesize) return FALSE; mask = ~(pagesize-1); addr = (const char*)(((uintptr_t)blob->data) & mask); length = (const char*)(((uintptr_t)blob->data + blob->length + pagesize-1) & mask) - addr; if (-1 == mprotect((void*)addr, length, PROT_READ | PROT_WRITE)) return FALSE; blob->mode = HB_MEMORY_MODE_WRITABLE; return TRUE; } static hb_bool_t try_writable_inplace(hb_blob_t *blob) { if (try_make_writable_inplace_unix(blob)) return TRUE; //Failed to make writable inplace, mark that blob->mode = HB_MEMORY_MODE_READONLY; return FALSE; } static void hb_blob_destroy_user_data(hb_blob_t *blob) { if (blob->destroy) { blob->destroy(blob->user_data); blob->user_data = NULL; blob->destroy = NULL; } } static hb_bool_t try_writable(hb_blob_t *blob) { if (blob->immutable) return FALSE; if (blob->mode == HB_MEMORY_MODE_WRITABLE) return TRUE; if (blob->mode == HB_MEMORY_MODE_READONLY_MAY_MAKE_WRITABLE && try_writable_inplace(blob)) return TRUE; if (blob->mode == HB_MEMORY_MODE_WRITABLE) return TRUE; char *new_data; new_data = malloc(blob->length); if (!new_data) return FALSE; memcpy(new_data, blob->data, blob->length); hb_blob_destroy_user_data(blob); blob->mode = HB_MEMORY_MODE_WRITABLE; blob->data = new_data; blob->user_data = new_data; blob->destroy = free; return TRUE; } void hb_blob_destroy(hb_blob_t *blob) { if (!blob) return; if (hb_atomic_int32_get(&blob->ref_cnt) == REF_CNT_INVALID_VAL) return; hb_atomic_int32_add(&blob->ref_cnt, -1); if (hb_atomic_int32_get(&blob->ref_cnt) > 0) return; hb_atomic_int32_set(&blob->ref_cnt, REF_CNT_INVALID_VAL); hb_blob_destroy_user_data(blob); free (blob); } hb_blob_t * hb_blob_create_sub_blob(hb_blob_t *parent, unsigned offset, unsigned length) { hb_blob_t *blob; if (!length || offset >= parent->length) return hb_blob_get_empty(); hb_blob_make_immutable(parent); blob = hb_blob_create(parent->data + offset, MIN(length, parent->length - offset), HB_MEMORY_MODE_READONLY, hb_blob_reference(parent), (hb_destroy_func_t)hb_blob_destroy); return blob; } hb_blob_t * hb_blob_create(const char *data, unsigned length, hb_memory_mode_t mode, void *user_data, hb_destroy_func_t destroy) { hb_blob_t *blob = calloc(1, sizeof(*blob)); if (!length || !blob) { if (blob) free(blob); if (destroy) destroy(user_data); return hb_blob_get_empty(); } hb_atomic_int32_set(&blob->ref_cnt, 1); blob->immutable = FALSE; blob->data = data; blob->length = length; blob->mode = mode; blob->user_data = user_data; blob->destroy = destroy; if (blob->mode == HB_MEMORY_MODE_DUPLICATE) { blob->mode = HB_MEMORY_MODE_READONLY; if (!try_writable(blob)) { hb_blob_destroy(blob); return hb_blob_get_empty(); } } return blob; } struct ot_fnt_file * hb_blob_lock_instance(hb_blob_t *blob) { hb_blob_make_immutable (blob); const char *base = hb_blob_get_data(blob, NULL); return (struct ot_fnt_file*)base; }
Mode | Type | Size | Ref | File |
---|---|---|---|---|
100644 | blob | 200 | 1a0b33b52f3f0b8f3567e0fb7b411e88c4b3c2c9 | ABBREVIATIONS |
100644 | blob | 119 | 8bbabe4337eabadd3f5ed07192b85e02d50f5bad | FIXME |
100644 | blob | 100 | 8a85692a2fc36a478ef9662ba2db214375a79254 | README |
100644 | blob | 223 | 7f27bbbdef02188df78858a31e0c38bda3fe4443 | harfbuzz.pc.in |
100644 | blob | 1478 | 2931ccaca651b04a927605232dd3500f7a661dce | hb-atomic-private.h |
100644 | blob | 120 | ee630543fb4ef3e9fa49f7362026407c0fd0a858 | hb-blob-private.h |
100644 | blob | 4983 | 607f12b39c30bbe160c4e3a6781b5a58b64de2fc | hb-blob.c |
100644 | blob | 3467 | d3d0f41b11c3b100cdee91525924c23226acd0cf | hb-blob.h |
100644 | blob | 1299 | 045519300e0994a11484696fa5c533663e4338db | hb-buffer-private.h |
100644 | blob | 11835 | a3b6deceb732205dfeb4b3798227732f4632ed8b | hb-buffer.c |
100644 | blob | 8424 | 87c4ce58e83744e68765567e4107533dae9d5b7f | hb-buffer.h |
100644 | blob | 3363 | f5141f528597232bb1a0214b7f1469cc9af008b8 | hb-common.c |
100644 | blob | 12423 | 40c1887296421c6d63f32e479cd318d4c4d79d19 | hb-common.h |
100644 | blob | 1407 | c4954fa1b2cadb133a419584de60fe16263f148b | hb-coretext.h |
100644 | blob | 1584 | 30ae4b1caf76dd03cc682eda7458728b5380ad6c | hb-deprecated.h |
100644 | blob | 1226 | 3ea9861f08c6fcc0422092c8bb38dd808b5c8757 | hb-face-private.h |
100644 | blob | 5452 | 4489a99ae3f4ebded37dab45f8cde0bf32cc43f1 | hb-face.c |
100644 | blob | 2815 | f682c468de58095fb0a7c4cdd577b34a9cb78077 | hb-face.h |
100644 | blob | 3705 | f027e1e59453b39ecb722e2c7ffd9126b579b1a5 | hb-fallback-shape.c |
100644 | blob | 3222 | 172e69a09927c17f177947f2d5f18318dd3f4545 | hb-font-private.h |
100644 | blob | 30726 | ba271fab87b5d9d6534bf971604b6079eabfc9f5 | hb-font.c |
100644 | blob | 12957 | 7273db43edaf542ef9d6e969fa2d8408e7d5100e | hb-font.h |
100644 | blob | 2570 | bb44c035ff48e7655a397e5b95872d75b92945ad | hb-ft.c |
100644 | blob | 1756 | 696251e143f31987eb599f8cb16db4f12ff8d901 | hb-ft.h |
100644 | blob | 4016 | 91eaa7075c5f9fe797de93912301d2e03d6b7248 | hb-glib.c |
100644 | blob | 1496 | 63a9d3366c58a0110881ad00d971830924b73a2a | hb-glib.h |
100644 | blob | 3185 | 4a88d569e8d3be4daa2eaf39192891426da46514 | hb-gobject-structs.h |
100644 | blob | 1334 | ea1bd25df82d46a222436a1ad078d0fc95d5c303 | hb-gobject.h |
100644 | blob | 1441 | 3eae54acbd81dbf3e534c4ad2e42d57611f7024e | hb-graphite2.h |
100644 | blob | 1495 | f2f35f0f2ce13b6b5c46453128e452ea9380eabf | hb-icu.h |
100644 | blob | 2180 | 7172c280ad7dbb708d6818d386bdbb6e852d80c8 | hb-open-file-private.h |
100644 | blob | 2659 | c4079cec956598ccf9521c874408a618fe7c29dc | hb-open-file.c |
100644 | blob | 65 | 642c3d3d45fdc42619d000cc9f7b3c890bdc0190 | hb-ot-face-private.h |
100644 | blob | 2806 | ecfd5b109b43f549366a61efff16daa92db87349 | hb-ot-layout.c |
100644 | blob | 9212 | d2a314cad6cbf94ba04ff9eaf513a74714eec732 | hb-ot-layout.h |
100644 | blob | 753 | 42faaca3f7ebdafc1232c6810b5ea2124896a95b | hb-ot-tag.c |
100644 | blob | 1688 | 1bf12ab3c09b9aef612515871e587c7c9ca7e62b | hb-ot-tag.h |
100644 | blob | 1526 | 80739063991cf14c4b65cc9247f751226f7f7277 | hb-ot.h |
100644 | blob | 1528 | ae4bc85a37900c9f54cb91986dadc216f620a358 | hb-private.h |
100644 | blob | 3544 | bafdae96333f9c81a4b20a4435e6eadaa31a7d32 | hb-set.h |
100644 | blob | 1647 | 1a90aed635a86f8e1d7002ffa8c7d300a3dd8acf | hb-shape-plan-private.h |
100644 | blob | 15942 | 929804aae7b6e5271cef5e9f1d654dcce7a8ca95 | hb-shape-plan.c |
100644 | blob | 2747 | 8f54552f90ba504f6ba2e9cf01459621fc73f9b2 | hb-shape-plan.h |
100644 | blob | 1370 | 1ff445b5de783fb0aa041f34d75919614b21ad34 | hb-shape.c |
100644 | blob | 2232 | 10a35cb517e14c96670d71bbcff266fce23cad91 | hb-shape.h |
100644 | blob | 1129 | 78e3fe4e3529b39789c0763b7f8e1019b3d5a725 | hb-shaper-private.h |
100644 | blob | 2184 | d1c8f9740fec1b4d19e0967f60391f1c5b17d155 | hb-shaper.c |
100644 | blob | 1261 | 86293900edd4d5fab1013bd0c32eeaad2abef41e | hb-unicode-private.h |
100644 | blob | 8084 | 462ddc1b9bcad35a3d4b3babb64772c93650e75c | hb-unicode.c |
100644 | blob | 14218 | 1c4e097b92d5ba628455fefe25b6f4697cc16f11 | hb-unicode.h |
100644 | blob | 1427 | 51887c8794bce4e37b35c4bb9c675baf55b63052 | hb-uniscribe.h |
100644 | blob | 5070 | 97eb7798f1dc725aad02cc651ffe859044647582 | hb-utf-private.c |
100644 | blob | 1423 | 636ce353798d395c780be99bb68350c3352f40a3 | hb-utf-private.h |
100644 | blob | 1849 | 43634f91ce8a10250c8279b19a1993843feb0f38 | hb-version.h.in |
100644 | blob | 1470 | c5a938a3818c9aca6de00a961c1c8f73bb2c47db | hb.h |
100644 | blob | 7651 | 65c5ca88a67c30becee01c5a8816d964b03862f9 | license.md |
100755 | blob | 5635 | fedeb110245a5460039167ccc6cec1abca82c271 | make |