| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987 |
- /*
- * Copyright © 2008 Chris Wilson <chris@chris-wilson.co.uk>
- *
- * This library is free software; you can redistribute it and/or
- * modify it either under the terms of the GNU Lesser General Public
- * License version 2.1 as published by the Free Software Foundation
- * (the "LGPL") or, at your option, under the terms of the Mozilla
- * Public License Version 1.1 (the "MPL"). If you do not alter this
- * notice, a recipient may use your version of this file under either
- * the MPL or the LGPL.
- *
- * You should have received a copy of the LGPL along with this library
- * in the file COPYING-LGPL-2.1; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA
- * You should have received a copy of the MPL along with this library
- * in the file COPYING-MPL-1.1
- *
- * The contents of this file are subject to the Mozilla Public License
- * Version 1.1 (the "License"); you may not use this file except in
- * compliance with the License. You may obtain a copy of the License at
- * http://www.mozilla.org/MPL/
- *
- * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY
- * OF ANY KIND, either express or implied. See the LGPL or the MPL for
- * the specific language governing rights and limitations.
- *
- * The Original Code is the cairo graphics library.
- *
- * The Initial Developer of the Original Code is Chris Wilson.
- *
- * Contributor(s):
- * Chris Wilson <chris@chris-wilson.co.uk>
- */
- #ifndef CAIRO_SCRIPT_PRIVATE_H
- #define CAIRO_SCRIPT_PRIVATE_H
- #ifdef HAVE_CONFIG_H
- #include "config.h"
- #endif
- #include "cairo-script-interpreter.h"
- #include <setjmp.h>
- #ifdef _MSC_VER
- #undef inline
- #define inline __inline
- #endif
- #ifndef FALSE
- #define FALSE 0
- #endif
- #ifndef TRUE
- #define TRUE (!FALSE)
- #endif
- #ifndef NULL
- #define NULL (void *) 0
- #endif
- #if HAVE_STDINT_H
- # include <stdint.h>
- #elif HAVE_INTTYPES_H
- # include <inttypes.h>
- #elif HAVE_SYS_INT_TYPES_H
- # include <sys/int_types.h>
- #elif defined(_MSC_VER)
- typedef __int8 int8_t;
- typedef unsigned __int8 uint8_t;
- typedef __int16 int16_t;
- typedef unsigned __int16 uint16_t;
- typedef __int32 int32_t;
- typedef unsigned __int32 uint32_t;
- typedef __int64 int64_t;
- typedef unsigned __int64 uint64_t;
- # ifndef HAVE_UINT64_T
- # define HAVE_UINT64_T 1
- # endif
- #else
- #error Cannot find definitions for fixed-width integral types (uint8_t, uint32_t, etc.)
- #endif
- #if HAVE_BYTESWAP_H
- # include <byteswap.h>
- #endif
- #ifndef bswap_16
- # define bswap_16(p) \
- (((((uint16_t)(p)) & 0x00ff) << 8) | \
- (((uint16_t)(p)) >> 8))
- #endif
- #ifndef bswap_32
- # define bswap_32(p) \
- (((((uint32_t)(p)) & 0x000000ff) << 24) | \
- ((((uint32_t)(p)) & 0x0000ff00) << 8) | \
- ((((uint32_t)(p)) & 0x00ff0000) >> 8) | \
- ((((uint32_t)(p))) >> 24))
- #endif
- #if __GNUC__ >= 3 && defined(__ELF__) && !defined(__sun)
- # define slim_hidden_proto(name) slim_hidden_proto1(name, slim_hidden_int_name(name)) csi_private
- # define slim_hidden_proto_no_warn(name) slim_hidden_proto1(name, slim_hidden_int_name(name)) csi_private_no_warn
- # define slim_hidden_def(name) slim_hidden_def1(name, slim_hidden_int_name(name))
- # define slim_hidden_int_name(name) INT_##name
- # define slim_hidden_proto1(name, internal) \
- extern __typeof (name) name \
- __asm__ (slim_hidden_asmname (internal))
- # define slim_hidden_def1(name, internal) \
- extern __typeof (name) EXT_##name __asm__(slim_hidden_asmname(name)) \
- __attribute__((__alias__(slim_hidden_asmname(internal))))
- # define slim_hidden_ulp slim_hidden_ulp1(__USER_LABEL_PREFIX__)
- # define slim_hidden_ulp1(x) slim_hidden_ulp2(x)
- # define slim_hidden_ulp2(x) #x
- # define slim_hidden_asmname(name) slim_hidden_asmname1(name)
- # define slim_hidden_asmname1(name) slim_hidden_ulp #name
- #else
- # define slim_hidden_proto(name) int _csi_dummy_prototype(void)
- # define slim_hidden_proto_no_warn(name) int _csi_dummy_prototype(void)
- # define slim_hidden_def(name) int _csi_dummy_prototype(void)
- #endif
- #if __GNUC__ >= 3
- #define csi_pure __attribute__((pure))
- #define csi_const __attribute__((const))
- #else
- #define csi_pure
- #define csi_const
- #endif
- #if defined(__GNUC__) && (__GNUC__ > 2) && defined(__OPTIMIZE__)
- #define _CSI_BOOLEAN_EXPR(expr) \
- __extension__ ({ \
- int _csi_boolean_var_; \
- if (expr) \
- _csi_boolean_var_ = 1; \
- else \
- _csi_boolean_var_ = 0; \
- _csi_boolean_var_; \
- })
- #define _csi_likely(expr) (__builtin_expect (_CSI_BOOLEAN_EXPR(expr), 1))
- #define _csi_unlikely(expr) (__builtin_expect (_CSI_BOOLEAN_EXPR(expr), 0))
- #else
- #define _csi_likely(expr) (expr)
- #define _csi_unlikely(expr) (expr)
- #endif
- #ifdef __GNUC__
- #ifndef offsetof
- #define offsetof(type, member) \
- ((char *) &((type *) 0)->member - (char *) 0)
- #endif
- #define csi_container_of(ptr, type, member) ({ \
- const typeof(((type *) 0)->member) *mptr__ = (ptr); \
- (type *) ((char *) mptr__ - offsetof (type, member)); \
- })
- #else
- #define csi_container_of(ptr, type, member) \
- (type *)((char *) (ptr) - (char *) &((type *)0)->member)
- #endif
- /* slim_internal.h */
- #if (__GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 3)) && defined(__ELF__) && !defined(__sun)
- #define csi_private_no_warn __attribute__((__visibility__("hidden")))
- #elif defined(__SUNPRO_C) && (__SUNPRO_C >= 0x550)
- #define csi_private_no_warn __hidden
- #else /* not gcc >= 3.3 and not Sun Studio >= 8 */
- #define csi_private_no_warn
- #endif
- #undef ARRAY_LENGTH
- #define ARRAY_LENGTH(__array) ((int) (sizeof (__array) / sizeof (__array[0])))
- #ifndef WARN_UNUSED_RESULT
- #define WARN_UNUSED_RESULT
- #endif
- /* Add attribute(warn_unused_result) if supported */
- #define csi_warn WARN_UNUSED_RESULT
- #define csi_private csi_private_no_warn csi_warn
- #define CSI_BITSWAP8(c) ((((c) * 0x0802LU & 0x22110LU) | ((c) * 0x8020LU & 0x88440LU)) * 0x10101LU >> 16)
- #ifdef WORDS_BIGENDIAN
- #define CSI_BITSWAP8_IF_LITTLE_ENDIAN(c) (c)
- #else
- #define CSI_BITSWAP8_IF_LITTLE_ENDIAN(c) CSI_BITSWAP8(c)
- #endif
- typedef enum _csi_status {
- CSI_STATUS_SUCCESS = CAIRO_STATUS_SUCCESS,
- CSI_STATUS_NO_MEMORY = CAIRO_STATUS_NO_MEMORY,
- CSI_STATUS_INVALID_RESTORE = CAIRO_STATUS_INVALID_RESTORE,
- CSI_STATUS_INVALID_POP_GROUP = CAIRO_STATUS_INVALID_POP_GROUP,
- CSI_STATUS_NO_CURRENT_POINT = CAIRO_STATUS_NO_CURRENT_POINT,
- CSI_STATUS_INVALID_MATRIX = CAIRO_STATUS_INVALID_MATRIX,
- CSI_STATUS_INVALID_STATUS = CAIRO_STATUS_INVALID_STATUS,
- CSI_STATUS_NULL_POINTER = CAIRO_STATUS_NULL_POINTER,
- CSI_STATUS_INVALID_STRING = CAIRO_STATUS_INVALID_STRING,
- CSI_STATUS_INVALID_PATH_DATA = CAIRO_STATUS_INVALID_PATH_DATA,
- CSI_STATUS_READ_ERROR = CAIRO_STATUS_READ_ERROR,
- CSI_STATUS_WRITE_ERROR = CAIRO_STATUS_WRITE_ERROR,
- CSI_STATUS_SURFACE_FINISHED = CAIRO_STATUS_SURFACE_FINISHED,
- CSI_STATUS_SURFACE_TYPE_MISMATCH = CAIRO_STATUS_SURFACE_TYPE_MISMATCH,
- CSI_STATUS_PATTERN_TYPE_MISMATCH = CAIRO_STATUS_PATTERN_TYPE_MISMATCH,
- CSI_STATUS_INVALID_CONTENT = CAIRO_STATUS_INVALID_CONTENT,
- CSI_STATUS_INVALID_FORMAT = CAIRO_STATUS_INVALID_FORMAT,
- CSI_STATUS_INVALID_VISUAL = CAIRO_STATUS_INVALID_VISUAL,
- CSI_STATUS_FILE_NOT_FOUND = CAIRO_STATUS_FILE_NOT_FOUND,
- CSI_STATUS_INVALID_DASH = CAIRO_STATUS_INVALID_DASH,
- CSI_STATUS_INVALID_DSC_COMMENT = CAIRO_STATUS_INVALID_DSC_COMMENT,
- CSI_STATUS_INVALID_INDEX = CAIRO_STATUS_INVALID_INDEX,
- CSI_STATUS_CLIP_NOT_REPRESENTABLE = CAIRO_STATUS_CLIP_NOT_REPRESENTABLE,
- CSI_STATUS_TEMP_FILE_ERROR = CAIRO_STATUS_TEMP_FILE_ERROR,
- CSI_STATUS_INVALID_STRIDE = CAIRO_STATUS_INVALID_STRIDE,
- CSI_STATUS_FONT_TYPE_MISMATCH = CAIRO_STATUS_FONT_TYPE_MISMATCH,
- CSI_STATUS_USER_FONT_IMMUTABLE = CAIRO_STATUS_USER_FONT_IMMUTABLE,
- CSI_STATUS_USER_FONT_ERROR = CAIRO_STATUS_USER_FONT_ERROR,
- CSI_STATUS_NEGATIVE_COUNT = CAIRO_STATUS_NEGATIVE_COUNT,
- CSI_STATUS_INVALID_CLUSTERS = CAIRO_STATUS_INVALID_CLUSTERS,
- CSI_STATUS_INVALID_SLANT = CAIRO_STATUS_INVALID_SLANT,
- CSI_STATUS_INVALID_WEIGHT = CAIRO_STATUS_INVALID_WEIGHT,
- /* cairo-script-interpreter specific errors */
- CSI_STATUS_INVALID_SCRIPT,
- CSI_STATUS_SCRIPT_INVALID_TYPE,
- CSI_STATUS_SCRIPT_INVALID_INDEX,
- CSI_STATUS_SCRIPT_UNDEFINED_NAME,
- CSI_STATUS_INTERPRETER_FINISHED,
- _CSI_STATUS_SCRIPT_LAST_ERROR,
- CSI_INT_STATUS_UNSUPPORTED
- } csi_status_t;
- typedef enum {
- CSI_OBJECT_TYPE_NULL = 0,
- /* atomics */
- CSI_OBJECT_TYPE_BOOLEAN,
- CSI_OBJECT_TYPE_INTEGER,
- CSI_OBJECT_TYPE_MARK,
- CSI_OBJECT_TYPE_NAME,
- CSI_OBJECT_TYPE_OPERATOR,
- CSI_OBJECT_TYPE_REAL,
- /* compound */
- CSI_OBJECT_TYPE_ARRAY = 0x8,
- CSI_OBJECT_TYPE_DICTIONARY,
- CSI_OBJECT_TYPE_FILE,
- CSI_OBJECT_TYPE_MATRIX,
- CSI_OBJECT_TYPE_STRING,
- /* cairo */
- CSI_OBJECT_TYPE_CONTEXT = 0x10,
- CSI_OBJECT_TYPE_FONT,
- CSI_OBJECT_TYPE_PATTERN,
- CSI_OBJECT_TYPE_SCALED_FONT,
- CSI_OBJECT_TYPE_SURFACE
- } csi_object_type_t;
- #define CSI_OBJECT_IS_ATOM(OBJ) (((OBJ)->type & CSI_OBJECT_TYPE_MASK) < 0x08)
- #define CSI_OBJECT_IS_COMPOUND(OBJ) ((OBJ)->type & 0x08)
- #define CSI_OBJECT_IS_CAIRO(OBJ) ((OBJ)->type & 0x10)
- enum { /* attributes */
- CSI_OBJECT_ATTR_EXECUTABLE = 1 << 6,
- CSI_OBJECT_ATTR_WRITABLE = 1 << 7
- };
- #define CSI_OBJECT_ATTR_MASK (CSI_OBJECT_ATTR_EXECUTABLE | \
- CSI_OBJECT_ATTR_WRITABLE)
- #define CSI_OBJECT_TYPE_MASK (~CSI_OBJECT_ATTR_MASK)
- typedef struct _cairo_script_interpreter csi_t;
- typedef cairo_bool_t csi_boolean_t;
- typedef csi_status_t (*csi_operator_t) (csi_t *);
- typedef float csi_real_t;
- typedef long csi_integer_t;
- typedef long csi_name_t;
- typedef struct _csi_array csi_array_t;
- typedef struct _csi_buffer csi_buffer_t;
- typedef struct _csi_compound_object csi_compound_object_t;
- typedef struct _csi_dictionary csi_dictionary_t;
- typedef struct _csi_file csi_file_t;
- typedef struct _csi_hash_entry csi_hash_entry_t;
- typedef struct _csi_hash_table csi_hash_table_t;
- typedef struct _csi_hash_table_arrangement csi_hash_table_arrangement_t;
- typedef struct _csi_list csi_list_t;
- typedef struct _csi_matrix csi_matrix_t;
- typedef struct _csi_object csi_object_t;
- typedef struct _csi_scanner csi_scanner_t;
- typedef struct _csi_stack csi_stack_t;
- typedef struct _csi_string csi_string_t;
- typedef cairo_bool_t
- (*csi_hash_predicate_func_t) (void *entry);
- typedef void
- (*csi_hash_callback_func_t) (void *entry,
- void *closure);
- typedef cairo_bool_t
- (*csi_hash_keys_equal_func_t) (const void *key_a, const void *key_b);
- struct _csi_object {
- csi_object_type_t type;
- union {
- cairo_t *cr;
- cairo_font_face_t *font_face;
- cairo_pattern_t *pattern;
- cairo_scaled_font_t *scaled_font;
- cairo_surface_t *surface;
- csi_array_t *array;
- csi_boolean_t boolean;
- csi_compound_object_t *object;
- csi_dictionary_t *dictionary;
- csi_file_t *file;
- csi_integer_t integer;
- csi_matrix_t *matrix;
- csi_operator_t op;
- csi_name_t name;
- csi_real_t real;
- csi_string_t *string;
- void *ptr;
- } datum;
- };
- struct _csi_compound_object {
- csi_object_type_t type;
- unsigned int ref;
- };
- struct _csi_hash_entry {
- unsigned long hash;
- };
- struct _csi_hash_table_arrangement {
- unsigned long high_water_mark;
- unsigned long size;
- unsigned long rehash;
- };
- struct _csi_hash_table {
- csi_hash_keys_equal_func_t keys_equal;
- const csi_hash_table_arrangement_t *arrangement;
- csi_hash_entry_t **entries;
- unsigned long live_entries;
- unsigned long used_entries;
- unsigned long iterating; /* Iterating, no insert, no resize */
- };
- /* simple, embedded doubly-linked links */
- struct _csi_list {
- struct _csi_list *next, *prev;
- };
- struct _csi_buffer {
- char *base, *ptr, *end;
- unsigned int size;
- };
- struct _csi_stack {
- csi_object_t *objects;
- csi_integer_t len;
- csi_integer_t size;
- };
- struct _csi_array {
- csi_compound_object_t base;
- csi_stack_t stack;
- };
- typedef struct _csi_dictionary_entry {
- csi_hash_entry_t hash_entry;
- csi_object_t value;
- } csi_dictionary_entry_t;
- struct _csi_dictionary {
- csi_compound_object_t base;
- csi_hash_table_t hash_table;
- };
- struct _csi_matrix {
- csi_compound_object_t base;
- cairo_matrix_t matrix;
- };
- struct _csi_string {
- csi_compound_object_t base;
- csi_integer_t len;
- csi_integer_t deflate;
- enum {
- NONE,
- ZLIB,
- LZO,
- } method;
- char *string;
- };
- typedef struct _csi_filter_funcs {
- int (*filter_getc) (csi_file_t *);
- void (*filter_putc) (csi_file_t *, int);
- int (*filter_read) (csi_file_t *, uint8_t *, int);
- void (*filter_destroy) (csi_t *, void *);
- } csi_filter_funcs_t;
- struct _csi_file {
- csi_compound_object_t base;
- enum {
- STDIO,
- BYTES,
- PROCEDURE,
- FILTER
- } type;
- unsigned int flags;
- void *src;
- void *data;
- uint8_t *bp;
- int rem;
- const csi_filter_funcs_t *filter;
- };
- union _csi_union_object {
- void *ptr[2];
- csi_stack_t stack;
- csi_array_t arry;
- csi_dictionary_t dictionary;
- csi_matrix_t matrix;
- csi_string_t string;
- csi_file_t file;
- csi_object_t object;
- };
- struct _csi_scanner {
- jmp_buf jump_buffer;
- int depth;
- int bind;
- csi_status_t (*push) (csi_t *ctx, csi_object_t *obj);
- csi_status_t (*execute) (csi_t *ctx, csi_object_t *obj);
- void *closure;
- csi_buffer_t buffer;
- csi_stack_t procedure_stack;
- csi_object_t build_procedure;
- unsigned int accumulator;
- unsigned int accumulator_count;
- unsigned int line_number;
- };
- typedef cairo_script_interpreter_hooks_t csi_hooks_t;
- typedef struct _csi_chunk {
- struct _csi_chunk *next;
- int rem;
- char *ptr;
- } csi_chunk_t;
- struct _cairo_script_interpreter {
- int ref_count;
- csi_status_t status;
- unsigned int finished : 1;
- csi_hooks_t hooks;
- csi_hash_table_t strings;
- csi_stack_t ostack;
- csi_stack_t dstack;
- csi_scanner_t scanner;
- csi_chunk_t *perm_chunk;
- struct {
- csi_chunk_t *chunk;
- void *free_list;
- } slabs[16];
- csi_array_t *free_array;
- csi_dictionary_t *free_dictionary;
- csi_string_t *free_string;
- csi_operator_t opcode[256];
- /* caches of live data */
- csi_list_t *_images;
- csi_list_t *_faces;
- };
- typedef struct _csi_operator_def {
- const char *name;
- csi_operator_t op;
- } csi_operator_def_t;
- typedef struct _csi_integer_constant_def {
- const char *name;
- csi_integer_t value;
- } csi_integer_constant_def_t;
- typedef struct _csi_real_constant_def {
- const char *name;
- csi_real_t value;
- } csi_real_constant_def_t;
- /* cairo-script-file.c */
- csi_private csi_status_t
- csi_file_new (csi_t *ctx,
- csi_object_t *obj,
- const char *path, const char *mode);
- csi_private csi_status_t
- csi_file_new_for_stream (csi_t *ctx,
- csi_object_t *obj,
- FILE *stream);
- csi_private csi_status_t
- csi_file_new_for_bytes (csi_t *ctx,
- csi_object_t *obj,
- const char *bytes,
- unsigned int length);
- csi_private csi_status_t
- csi_file_new_from_string (csi_t *ctx,
- csi_object_t *obj,
- csi_string_t *src);
- csi_private csi_status_t
- csi_file_new_ascii85_decode (csi_t *ctx,
- csi_object_t *obj,
- csi_dictionary_t *dict,
- csi_object_t *src);
- csi_private csi_status_t
- csi_file_new_deflate_decode (csi_t *ctx,
- csi_object_t *obj,
- csi_dictionary_t *dict,
- csi_object_t *src);
- csi_private csi_status_t
- _csi_file_execute (csi_t *ctx, csi_file_t *obj);
- csi_private int
- csi_file_getc (csi_file_t *obj);
- csi_private int
- csi_file_read (csi_file_t *obj, void *buf, int len);
- csi_private void
- csi_file_putc (csi_file_t *obj, int c);
- csi_private void
- csi_file_flush (csi_file_t *obj);
- csi_private void
- csi_file_close (csi_t *ctx, csi_file_t *obj);
- csi_private void
- _csi_file_free (csi_t *ctx, csi_file_t *obj);
- csi_private csi_status_t
- _csi_file_as_string (csi_t *ctx,
- csi_file_t *file,
- csi_object_t *obj);
- /* cairo-script-hash.c */
- csi_private csi_status_t
- _csi_hash_table_init (csi_hash_table_t *hash_table,
- csi_hash_keys_equal_func_t keys_equal);
- csi_private void
- _csi_hash_table_fini (csi_hash_table_t *hash_table);
- csi_private void *
- _csi_hash_table_lookup (csi_hash_table_t *hash_table,
- csi_hash_entry_t *key);
- csi_private csi_status_t
- _csi_hash_table_insert (csi_hash_table_t *hash_table,
- csi_hash_entry_t *entry);
- csi_private void
- _csi_hash_table_remove (csi_hash_table_t *hash_table,
- csi_hash_entry_t *key);
- csi_private void
- _csi_hash_table_foreach (csi_hash_table_t *hash_table,
- csi_hash_callback_func_t hash_callback,
- void *closure);
- /* cairo-script-interpreter.c */
- csi_private void *
- _csi_alloc (csi_t *ctx, int size);
- csi_private void *
- _csi_alloc0 (csi_t *ctx, int size);
- csi_private void *
- _csi_realloc (csi_t *ctx, void *ptr, int size);
- csi_private void
- _csi_free (csi_t *ctx, void *ptr);
- csi_private void *
- _csi_slab_alloc (csi_t *ctx, int size);
- csi_private void *
- _csi_perm_alloc (csi_t *ctx, int size);
- csi_private void
- _csi_slab_free (csi_t *ctx, void *ptr, int size);
- csi_private csi_status_t
- csi_push_ostack (csi_t *ctx, csi_object_t *obj);
- csi_private csi_status_t
- _csi_name_define (csi_t *ctx, csi_name_t name, csi_object_t *obj);
- csi_private csi_status_t
- _csi_name_lookup (csi_t *ctx, csi_name_t name, csi_object_t *obj);
- csi_private csi_status_t
- _csi_name_undefine (csi_t *ctx, csi_name_t name);
- csi_private csi_status_t
- _csi_intern_string (csi_t *ctx, const char **str_inout, int len);
- csi_private csi_status_t
- _csi_error (csi_status_t status);
- /* cairo-script-objects.c */
- csi_private csi_status_t
- csi_array_new (csi_t *ctx,
- csi_integer_t initial_size,
- csi_object_t *obj);
- csi_private csi_status_t
- _csi_array_execute (csi_t *ctx, csi_array_t *array);
- csi_private csi_status_t
- csi_array_get (csi_t *ctx,
- csi_array_t *array,
- long elem,
- csi_object_t *value);
- csi_private csi_status_t
- csi_array_put (csi_t *ctx,
- csi_array_t *array,
- csi_integer_t elem,
- csi_object_t *value);
- csi_private csi_status_t
- csi_array_append (csi_t *ctx,
- csi_array_t *array,
- csi_object_t *obj);
- csi_private void
- csi_array_free (csi_t *ctx, csi_array_t *array);
- static inline void
- csi_boolean_new (csi_object_t *obj,
- csi_boolean_t v)
- {
- obj->type = CSI_OBJECT_TYPE_BOOLEAN;
- obj->datum.boolean = v;
- }
- csi_private csi_status_t
- csi_dictionary_new (csi_t *ctx,
- csi_object_t *obj);
- csi_private csi_status_t
- csi_dictionary_put (csi_t *ctx,
- csi_dictionary_t *dict,
- csi_name_t name,
- csi_object_t *value);
- csi_private csi_status_t
- csi_dictionary_get (csi_t *ctx,
- csi_dictionary_t *dict,
- csi_name_t name,
- csi_object_t *value);
- csi_private csi_boolean_t
- csi_dictionary_has (csi_dictionary_t *dict,
- csi_name_t name);
- csi_private void
- csi_dictionary_remove (csi_t *ctx,
- csi_dictionary_t *dict,
- csi_name_t name);
- csi_private void
- csi_dictionary_free (csi_t *ctx,
- csi_dictionary_t *dict);
- static inline void
- csi_integer_new (csi_object_t *obj,
- csi_integer_t v)
- {
- obj->type = CSI_OBJECT_TYPE_INTEGER;
- obj->datum.integer = v;
- }
- csi_private csi_status_t
- csi_matrix_new (csi_t *ctx,
- csi_object_t *obj);
- csi_private csi_status_t
- csi_matrix_new_from_array (csi_t *ctx,
- csi_object_t *obj,
- csi_array_t *array);
- csi_private csi_status_t
- csi_matrix_new_from_matrix (csi_t *ctx,
- csi_object_t *obj,
- const cairo_matrix_t *m);
- csi_private csi_status_t
- csi_matrix_new_from_values (csi_t *ctx,
- csi_object_t *obj,
- double v[6]);
- csi_private void
- csi_matrix_free (csi_t *ctx,
- csi_matrix_t *obj);
- csi_private csi_status_t
- csi_name_new (csi_t *ctx,
- csi_object_t *obj,
- const char *str,
- int len);
- csi_private csi_status_t
- csi_name_new_static (csi_t *ctx,
- csi_object_t *obj,
- const char *str);
- static inline void
- csi_operator_new (csi_object_t *obj,
- csi_operator_t op)
- {
- obj->type = CSI_OBJECT_TYPE_OPERATOR | CSI_OBJECT_ATTR_EXECUTABLE;
- obj->datum.op = op;
- }
- static inline void
- csi_real_new (csi_object_t *obj,
- csi_real_t v)
- {
- obj->type = CSI_OBJECT_TYPE_REAL;
- obj->datum.real = v;
- }
- csi_private csi_status_t
- csi_string_new (csi_t *ctx,
- csi_object_t *obj,
- const char *str,
- int len);
- csi_private csi_status_t
- csi_string_deflate_new (csi_t *ctx,
- csi_object_t *obj,
- void *bytes,
- int in_len,
- int out_len);
- csi_private csi_status_t
- csi_string_new_from_bytes (csi_t *ctx,
- csi_object_t *obj,
- char *bytes,
- unsigned int len);
- csi_private void
- csi_string_free (csi_t *ctx, csi_string_t *string);
- csi_private csi_status_t
- csi_object_execute (csi_t *ctx, csi_object_t *obj);
- csi_private csi_object_t *
- csi_object_reference (csi_object_t *obj);
- csi_private void
- csi_object_free (csi_t *ctx,
- csi_object_t *obj);
- csi_private csi_status_t
- csi_object_as_file (csi_t *ctx,
- csi_object_t *src,
- csi_object_t *file);
- csi_private csi_boolean_t
- csi_object_eq (csi_object_t *a,
- csi_object_t *b);
- csi_private csi_status_t
- csi_object_compare (csi_object_t *a,
- csi_object_t *b,
- int *out_cmp);
- /* cairo-script-operators.c */
- csi_private const csi_operator_def_t *
- _csi_operators (void);
- csi_private const csi_integer_constant_def_t *
- _csi_integer_constants (void);
- csi_private const csi_real_constant_def_t *
- _csi_real_constants (void);
- /* cairo-script-scanner.c */
- csi_private csi_status_t
- _csi_scanner_init (csi_t *ctx, csi_scanner_t *scanner);
- csi_private csi_status_t
- _csi_scan_file (csi_t *ctx, csi_file_t *src);
- csi_private csi_status_t
- _csi_translate_file (csi_t *ctx,
- csi_file_t *file,
- cairo_write_func_t write_func,
- void *closure);
- csi_private void
- _csi_scanner_fini (csi_t *ctx, csi_scanner_t *scanner);
- csi_private csi_boolean_t
- _csi_parse_number (csi_object_t *obj, const char *s, int len);
- /* cairo-script-stack.c */
- csi_private csi_status_t
- _csi_stack_init (csi_t *ctx, csi_stack_t *stack, csi_integer_t size);
- csi_private void
- _csi_stack_fini (csi_t *ctx, csi_stack_t *stack);
- csi_private csi_status_t
- _csi_stack_roll (csi_t *ctx,
- csi_stack_t *stack,
- csi_integer_t mod,
- csi_integer_t n);
- csi_private csi_status_t
- _csi_stack_grow (csi_t *ctx, csi_stack_t *stack, csi_integer_t cnt);
- csi_private csi_status_t
- _csi_stack_push_internal (csi_t *ctx, csi_stack_t *stack,
- const csi_object_t *obj);
- csi_private csi_object_t *
- _csi_stack_peek (csi_stack_t *stack, csi_integer_t i);
- csi_private void
- _csi_stack_pop (csi_t *ctx, csi_stack_t *stack, csi_integer_t count);
- csi_private csi_status_t
- _csi_stack_exch (csi_stack_t *stack);
- static inline csi_object_type_t
- csi_object_get_type (const csi_object_t *obj)
- {
- return obj->type & CSI_OBJECT_TYPE_MASK;
- }
- static inline csi_boolean_t
- csi_object_is_procedure (const csi_object_t *obj)
- {
- return obj->type == (CSI_OBJECT_TYPE_ARRAY | CSI_OBJECT_ATTR_EXECUTABLE);
- }
- static inline csi_boolean_t
- csi_object_is_number (const csi_object_t *obj)
- {
- int type = csi_object_get_type (obj);
- switch (type) {
- case CSI_OBJECT_TYPE_BOOLEAN:
- case CSI_OBJECT_TYPE_INTEGER:
- case CSI_OBJECT_TYPE_REAL:
- return 1;
- default:
- return 0;
- }
- }
- static inline double
- csi_number_get_value (const csi_object_t *obj)
- {
- int type = csi_object_get_type (obj);
- switch (type) {
- case CSI_OBJECT_TYPE_BOOLEAN: return obj->datum.boolean;
- case CSI_OBJECT_TYPE_INTEGER: return obj->datum.integer;
- case CSI_OBJECT_TYPE_REAL: return obj->datum.real;
- default: return 0.;
- }
- }
- csi_status_t
- _csi_stack_push (csi_t *ctx, csi_stack_t *stack,
- const csi_object_t *obj);
- static inline csi_boolean_t
- _csi_check_ostack (csi_t *ctx, csi_integer_t count)
- {
- return ctx->ostack.len >= count;
- }
- static inline csi_object_t *
- _csi_peek_ostack (csi_t *ctx, csi_integer_t i)
- {
- return &ctx->ostack.objects[ctx->ostack.len - i -1];
- }
- static inline void
- _csi_pop_ostack (csi_t *ctx, csi_integer_t count)
- {
- do
- csi_object_free (ctx, &ctx->ostack.objects[--ctx->ostack.len]);
- while (--count);
- }
- static inline csi_status_t
- _csi_push_ostack_copy (csi_t *ctx, csi_object_t *obj)
- {
- return _csi_stack_push (ctx, &ctx->ostack, csi_object_reference (obj));
- }
- static inline csi_status_t
- _csi_push_ostack (csi_t *ctx, csi_object_t *obj)
- {
- return _csi_stack_push (ctx, &ctx->ostack, obj);
- }
- static inline csi_status_t
- _csi_push_ostack_boolean (csi_t *ctx, csi_boolean_t v)
- {
- csi_object_t obj;
- obj.type = CSI_OBJECT_TYPE_BOOLEAN;
- obj.datum.boolean = v;
- return _csi_stack_push (ctx, &ctx->ostack, &obj);
- }
- static inline csi_status_t
- _csi_push_ostack_integer (csi_t *ctx, csi_integer_t v)
- {
- csi_object_t obj;
- obj.type = CSI_OBJECT_TYPE_INTEGER;
- obj.datum.integer = v;
- return _csi_stack_push (ctx, &ctx->ostack, &obj);
- }
- static inline csi_status_t
- _csi_push_ostack_mark (csi_t *ctx)
- {
- csi_object_t obj;
- obj.type = CSI_OBJECT_TYPE_MARK;
- return _csi_stack_push (ctx, &ctx->ostack, &obj);
- }
- static inline csi_status_t
- _csi_push_ostack_null (csi_t *ctx)
- {
- csi_object_t obj;
- obj.type = CSI_OBJECT_TYPE_NULL;
- return _csi_stack_push (ctx, &ctx->ostack, &obj);
- }
- static inline csi_status_t
- _csi_push_ostack_real (csi_t *ctx, csi_real_t v)
- {
- csi_object_t obj;
- obj.type = CSI_OBJECT_TYPE_REAL;
- obj.datum.real = v;
- return _csi_stack_push (ctx, &ctx->ostack, &obj);
- }
- slim_hidden_proto_no_warn (cairo_script_interpreter_destroy);
- slim_hidden_proto_no_warn (cairo_script_interpreter_reference);
- #endif /* CAIRO_SCRIPT_PRIVATE_H */
|