From d242b0657c8f076ccb7ae8cc6954c0731dbf74fa Mon Sep 17 00:00:00 2001 From: Adrian Cochrane Date: Tue, 2 Apr 2024 16:33:55 +1300 Subject: [PATCH] Continue implementing C-side language bindings. --- cbits/transcode.c | 62 +++++++++++++++++++++++++++++++++++++++++-- fontconfig-pure.cabal | 2 +- 2 files changed, 61 insertions(+), 3 deletions(-) diff --git a/cbits/transcode.c b/cbits/transcode.c index 310f314..1a71cc8 100644 --- a/cbits/transcode.c +++ b/cbits/transcode.c @@ -373,6 +373,27 @@ fail: return NULL; } +FcFontSet **decodeFontSets(cmp_ctx_t *bytes, size_t *nsets) { + if (bytes == NULL) return NULL; + + uint32_t size; + if (!cmp_read_array(bytes, &size)) return NULL; + if (nsets != NULL) nsets = size; + + FcFontSet **ret = calloc(sizeof(FcFontSet *), size); + uint32_t i; + for (i = 0; i < size; i++) { + ret[i] = decodeFontSet(bytes); + if (ret[i] == NULL) goto fail; + i++; + } + return ret; +fail: + for (uint32_t j = 0; j < i; j++) FcFontSetDestroy(ret[j]); + free(ret); + return NULL; +} + bool encodeFontSet(cmp_ctx_t *bytes, FcFontSet *data) { if (bytes == NULL || data == NULL) return NULL; @@ -383,6 +404,23 @@ bool encodeFontSet(cmp_ctx_t *bytes, FcFontSet *data) { return true; } +bool encodeResult(cmp_ctx_t *bytes, FcResult res) { + switch (res) { + case FcResultMatch: // Should be handled by caller! Can't do anything sensible here. + case FcResultNoMatch: // May be handled by caller. + return cmp_write_nil(bytes); + case FcResultTypeMismatch: + return cmp_write_str(bytes, "ErrType", strlen("ErrType")); + case FcResultNoId: + return cmp_write_str(bytes, "ErrNoId", strlen("ErrNoId")); + case FcResultOutOfMemory: + return cmp_write_str(bytes, "ErrOOM", strlen("ErrOOM")); + default: + // Should never happen! + return cmp_write_str(bytes, "ErrOther", strlen("ErrOther")); + } +} + struct bytes { uint8_t *start; size_t offset; @@ -406,18 +444,30 @@ bool bytes_skipper(struct cmp_ctx_s *ctx, size_t count) { size_t bytes_writer(struct cmp_ctx_s *ctx, const void *data, size_t count) { struct bytes *bytes = ctx->buf; - if (bytes->offset + count > bytes->length) return 0; + if (bytes->offset + count > bytes->length) { + bytes->start = realloc(bytes->start, 2*bytes->length); + if (bytes->start == NULL) return 0; + bytes->length = 2*bytes->length; + } memcpy(bytes->start + bytes->offset, data, count); bytes->offset += count; return count; } -void cmp_bytes_init(cmp_ctx_t *ctx, uint8_t *buf, size_t length) { +bool cmp_bytes_init(cmp_ctx_t *ctx, uint8_t *buf, size_t length) { struct bytes *inner = malloc(sizeof(struct bytes)); + if (inner == NULL) return false; inner->start = buf; inner->offset = 0; inner->length = length; cmp_init(ctx, inner, bytes_reader, bytes_skipper, bytes_writer); + return true; +} + +bool cmp_bytes_alloc(cmp_ctx_t *ctx, size_t length) { + struct uint8_t *bytes = malloc(length); + if (bytes == NULL) return false; + return cmp_bytes_init(ctx, bytes, length); } void cmp_bytes_free(cmp_ctx_t *ctx) { @@ -425,3 +475,11 @@ void cmp_bytes_free(cmp_ctx_t *ctx) { free(bytes->start); free(bytes); } + +uint8_t *cmp_bytes_take(cmp_ctx_t *ctx, size_t *length) { + struct bytes *bytes = ctx->buf; + uint8_t *ret = bytes->start; + if (length != NULL) *length = bytes->offset; + free(bytes); + return ret; +} diff --git a/fontconfig-pure.cabal b/fontconfig-pure.cabal index 2b6ec4f..cde47f5 100644 --- a/fontconfig-pure.cabal +++ b/fontconfig-pure.cabal @@ -68,7 +68,7 @@ library Graphics.Text.Font.Choose.StrSet, Graphics.Text.Font.Choose.Value, Graphics.Text.Font.Choose.Pattern, Graphics.Text.Font.Choose.FontSet - c-sources: cbits/cmp.c, cbits/transcode.c + c-sources: cbits/cmp.c, cbits/transcode.c, cbits/freetype-wrap.c -- Modules included in this library but not exported. -- other-modules: -- 2.30.2