diff options
author | Akira TAGOH <akira@tagoh.org> | 2007-09-18 06:38:07 +0000 |
---|---|---|
committer | Akira TAGOH <akira@tagoh.org> | 2007-09-18 06:38:07 +0000 |
commit | 58c9ccfa8b22735eeed3a73c10b1ea8876adde06 (patch) | |
tree | 952bdce66e2df5330691ec7f51a950b220214cc7 | |
parent | c71fc5a0b08a8a779b3b7725847788ac8e448ca7 (diff) |
* rewrite some code
92 files changed, 11798 insertions, 29347 deletions
diff --git a/Makefile.am b/Makefile.am index b569a6b..72137ca 100644 --- a/Makefile.am +++ b/Makefile.am @@ -1,5 +1,5 @@ NULL = -SUBDIRS = hieroglyph src devices plugins lib tests examples po +SUBDIRS = hieroglyph tests #src devices plugins lib tests examples po pkgconfigdir = $(libdir)/pkgconfig pkgconfig_DATA = hieroglyph.pc diff --git a/configure.ac b/configure.ac index 0e829ed..3062541 100644 --- a/configure.ac +++ b/configure.ac @@ -1,5 +1,5 @@ dnl Process this file with autoconf to produce a configure script. -AC_INIT([hieroglyph], 0.0.1, [at@gclab.org]) +AC_INIT([hieroglyph], 0.0.1, [akira@tagoh.org]) . ./requires @@ -52,6 +52,17 @@ fi changequote([,])dnl dnl ====================================================================== +dnl testing functionalities +dnl ====================================================================== +dnl alignment +AC_CHECK_ALIGNOF(char) +AC_CHECK_ALIGNOF(short) +AC_CHECK_ALIGNOF(int) +AC_CHECK_ALIGNOF(long) +AC_CHECK_ALIGNOF(void *) +AC_CHECK_ALIGNOF(long long) + +dnl ====================================================================== dnl functions testing dnl ====================================================================== AC_CHECK_FUNC(exp10,,[ @@ -86,6 +97,7 @@ PKG_CHECK_MODULES(HG, glib-2.0) PKG_CHECK_MODULES(HG_MODULE, gmodule-2.0) PKG_CHECK_MODULES(GTK2, gtk+-2.0) PKG_CHECK_MODULES(GTHREAD, gthread-2.0) +PKG_CHECK_MODULES(CHECK, check >= 0.9.4) AC_SUBST(HG_CFLAGS) AC_SUBST(HG_LIBS) AC_SUBST(HG_MODULE_CFLAGS) @@ -94,6 +106,8 @@ AC_SUBST(GTK2_CFLAGS) AC_SUBST(GTK2_LIBS) AC_SUBST(GTHREAD_CFLAGS) AC_SUBST(GTHREAD_LIBS) +AC_SUBST(CHECK_CFLAGS) +AC_SUBST(CHECK_LIBS) dnl ====================================================================== dnl check glib-2.0 stuff diff --git a/hieroglyph/Makefile.am b/hieroglyph/Makefile.am index c46e49a..2f3852d 100644 --- a/hieroglyph/Makefile.am +++ b/hieroglyph/Makefile.am @@ -1,19 +1,12 @@ NULL = INCLUDES = \ - -DHG_LOG_DOMAIN="\"Hieroglyph\"" \ - -DHIEROGLYPH_DEVICEDIR="\"$(HIEROGLYPH_DEVICEDIR)\"" \ - -DHIEROGLYPH_PLUGINDIR="\"$(HIEROGLYPH_PLUGINDIR)\"" \ - -DHIEROGLYPH_CMAPDIR="\"$(HIEROGLYPH_CMAPDIR)\"" \ - -DHIEROGLYPH_LIBDIR="\"$(HIEROGLYPH_LIBDIR)\"" \ + -DG_LOG_DOMAIN="\"Hieroglyph\"" \ $(HG_CFLAGS) \ - $(HG_MODULE_CFLAGS) \ $(NULL) LIBS = \ @LDFLAGS@ \ - -export-dynamic \ $(HG_LIBS) \ - $(HG_MODULE_LIBS) \ $(NULL) function_prefix = hieroglyph @@ -36,35 +29,22 @@ built_headers = \ hgincludedir = $(includedir)/hieroglyph hginclude_HEADERS = \ $(built_headers) \ - hgallocator-bfit.h \ hgarray.h \ - hgbtree.h \ - hgdebug.h \ - hgdevice.h \ hgdict.h \ hgfile.h \ - hggraphics.h \ - hglineedit.h \ - hglist.h \ - hglog.h \ hgmacros.h \ - hgmatrix.h \ - hgmem.h \ - hgpage.h \ - hgpath.h \ - hgplugins.h \ - hgrender.h \ + hgobject.h \ + hgoperator.h \ hgstack.h \ hgstring.h \ hgtypes.h \ - hgvaluenode.h \ - operator.h \ - scanner.h \ + utils.h \ vm.h \ $(NULL) noinst_HEADERS = \ - hgallocator-private.h \ + hgdictprime.h \ + hgoperator-private.h \ $(NULL) # @@ -74,46 +54,20 @@ lib_LTLIBRARIES = \ libhieroglyph.la \ $(NULL) -libhieroglyph_private_SOURCES = \ - iarray.c \ - iarray.h \ - ibtree.c \ - ibtree.h \ - ilist.c \ - ilist.h \ - operator-private.h \ - $(NULL) - libhieroglyph_la_SOURCES = \ - $(libhieroglyph_private_SOURCES) \ - hgallocator-bfit.c \ hgarray.c \ - hgbtree.c \ - hgdebug.c \ - hgdevice.c \ hgdict.c \ hgfile.c \ - hggraphics.c \ - hglineedit.c \ - hglist.c \ - hglog.c \ - hgmatrix.c \ - hgmem.c \ - hgpage.c \ - hgpath.c \ - hgplugins.c \ - hgrender.c \ + hgobject.c \ + hgoperator.c \ hgstack.c \ hgstring.c \ - hgvaluenode.c \ - operator.c \ - scanner.c \ + utils.c \ vm.c \ $(NULL) libhieroglyph_la_LDFLAGS = \ $(LDFLAGS) \ - -lm \ $(NULL) libhieroglyph_la_LIBADD = \ diff --git a/hieroglyph/hgallocator-bfit.c b/hieroglyph/hgallocator-bfit.c deleted file mode 100644 index 13204bd..0000000 --- a/hieroglyph/hgallocator-bfit.c +++ /dev/null @@ -1,1113 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* - * hgallocator-bfit.c - * Copyright (C) 2006 Akira TAGOH - * - * Authors: - * Akira TAGOH <at@gclab.org> - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - */ -#ifdef HAVE_CONFIG_H -#include <config.h> -#endif - -#include <string.h> -#include <setjmp.h> -#include "hgallocator-bfit.h" -#include "hgallocator-private.h" -#include "hglog.h" -#include "hgmem.h" -#include "ibtree.h" -#include "ilist.h" -#include "hgstring.h" - - -#define BTREE_N_NODE 6 - - -typedef struct _HieroGlyphAllocatorBFitPrivate HgAllocatorBFitPrivate; -typedef struct _HieroGlyphMemBFitBlock HgMemBFitBlock; -typedef struct _HieroGlyphSnapshotChunk HgSnapshotChunk; - - -struct _HieroGlyphAllocatorBFitPrivate { - HgBTree *free_block_tree; - GPtrArray *heap2block_array; - HgBTree *obj2block_tree; - guint n_complex_objects; -}; - -struct _HieroGlyphMemBFitBlock { - gpointer heap_fragment; - gint heap_id; - HgMemBFitBlock *prev; - HgMemBFitBlock *next; - gsize length; - gint in_use; -}; - -struct _HieroGlyphSnapshotChunk { - gint heap_id; - gsize offset; - gsize length; - gpointer heap_chunks; - HgSnapshotChunk *next; -}; - - -static gboolean _hg_allocator_bfit_real_initialize (HgMemPool *pool, - gsize prealloc); -static gboolean _hg_allocator_bfit_real_destroy (HgMemPool *pool); -static gboolean _hg_allocator_bfit_real_resize_pool (HgMemPool *pool, - gsize size); -static gpointer _hg_allocator_bfit_real_alloc (HgMemPool *pool, - gsize size, - guint flags); -static void _hg_allocator_bfit_real_free (HgMemPool *pool, - gpointer data); -static gpointer _hg_allocator_bfit_real_resize (HgMemObject *object, - gsize size); -static gsize _hg_allocator_bfit_real_get_size (HgMemObject *object); -static void _hg_allocator_bfit_real_set_flags (HgMemObject *object, - guint flags); -static gboolean _hg_allocator_bfit_real_garbage_collection(HgMemPool *pool); -static void _hg_allocator_bfit_real_gc_mark (HgMemPool *pool); -static gboolean _hg_allocator_bfit_real_is_safe_object (HgMemPool *pool, - HgMemObject *object); -static HgMemSnapshot *_hg_allocator_bfit_real_save_snapshot (HgMemPool *pool); -static gboolean _hg_allocator_bfit_real_restore_snapshot (HgMemPool *pool, - HgMemSnapshot *snapshot, - guint adjuster); -static void _hg_allocator_bfit_snapshot_real_free (gpointer data); -static void _hg_allocator_bfit_snapshot_real_set_flags(gpointer data, - guint flags); -static void _hg_allocator_bfit_snapshot_real_relocate (gpointer data, - HgMemRelocateInfo *info); -static gpointer _hg_allocator_bfit_snapshot_real_to_string(gpointer data); - - -static HgAllocatorVTable __hg_allocator_bfit_vtable = { - .initialize = _hg_allocator_bfit_real_initialize, - .destroy = _hg_allocator_bfit_real_destroy, - .resize_pool = _hg_allocator_bfit_real_resize_pool, - .alloc = _hg_allocator_bfit_real_alloc, - .free = _hg_allocator_bfit_real_free, - .resize = _hg_allocator_bfit_real_resize, - .get_size = _hg_allocator_bfit_real_get_size, - .set_flags = _hg_allocator_bfit_real_set_flags, - .garbage_collection = _hg_allocator_bfit_real_garbage_collection, - .gc_mark = _hg_allocator_bfit_real_gc_mark, - .is_safe_object = _hg_allocator_bfit_real_is_safe_object, - .save_snapshot = _hg_allocator_bfit_real_save_snapshot, - .restore_snapshot = _hg_allocator_bfit_real_restore_snapshot, -}; - -static HgObjectVTable __hg_snapshot_vtable = { - .free = _hg_allocator_bfit_snapshot_real_free, - .set_flags = _hg_allocator_bfit_snapshot_real_set_flags, - .relocate = _hg_allocator_bfit_snapshot_real_relocate, - .dup = NULL, - .copy = NULL, - .to_string = _hg_allocator_bfit_snapshot_real_to_string, -}; - -/* - * Private Functions - */ -#define _hg_allocator_get_minimum_aligned_size__inline(__hg_aga_size, __hg_alignment_size, __hg_aligned_ret) \ - G_STMT_START { \ - (__hg_aligned_ret) = (__hg_aga_size) / (__hg_alignment_size) * (__hg_alignment_size); \ - } G_STMT_END -#define _hg_allocator_get_aligned_size__inline(__hg_aga_size, __hg_alignment_size, __hg_aligned_ret) \ - G_STMT_START { \ - (__hg_aligned_ret) = ((__hg_aga_size) + (__hg_alignment_size)) / (__hg_alignment_size) * (__hg_alignment_size); \ - } G_STMT_END -#define _hg_allocator_get_object_size__inline(__hg_ago_object) \ - ((HgMemBFitBlock *)(__hg_ago_object)->subid)->length - -/* utility functions */ -static HgMemBFitBlock * -_hg_bfit_block_new(gpointer heap, - gsize length, - gint heap_id) -{ - HgMemBFitBlock *retval = g_new(HgMemBFitBlock, 1); - - if (retval != NULL) { - retval->heap_fragment = heap; - retval->heap_id = heap_id; - retval->length = length; - retval->in_use = 0; - retval->next = NULL; - retval->prev = NULL; - } - - return retval; -} - -#define _hg_bfit_block_free g_free - -static HgSnapshotChunk * -_hg_bfit_snapshot_chunk_new(gint heap_id, - gsize offset, - gsize length, - gpointer heap_chunks) -{ - HgSnapshotChunk *retval = g_new(HgSnapshotChunk, 1); - - retval->heap_id = heap_id; - retval->offset = offset; - retval->length = length; - retval->heap_chunks = g_new(gchar, length + 1); - retval->next = NULL; - - memcpy(retval->heap_chunks, heap_chunks, length); - - return retval; -} - -static void -_hg_bfit_snapshot_chunk_free(HgSnapshotChunk *chunk) -{ - if (chunk->heap_chunks) - g_free(chunk->heap_chunks); - g_free(chunk); -} - -static void -_hg_allocator_bfit_remove_block(HgAllocatorBFitPrivate *priv, - HgMemBFitBlock *block) -{ - gsize aligned; - HgList *l; - - _hg_allocator_get_minimum_aligned_size__inline(block->length, - HG_MEM_ALIGNMENT, - aligned); - if ((l = hg_btree_find(priv->free_block_tree, GSIZE_TO_POINTER (aligned))) == NULL) { - hg_log_warning("[BUG] there are no memory chunks sized %" G_GSIZE_FORMAT " (aligned size: %" G_GSIZE_FORMAT ".", - block->length, aligned); - } else { - HgListIter iter = hg_list_find_iter(l, block); - - if (iter == NULL) { - hg_log_warning("[BUG] can't find a memory block %p (size: %" G_GSIZE_FORMAT ", aligned size: %" G_GSIZE_FORMAT ".", - block, block->length, aligned); - } else { - l = hg_list_iter_delete_link(iter); - if (l == NULL) { - /* remove node from tree */ - hg_btree_remove(priv->free_block_tree, - GSIZE_TO_POINTER (aligned)); - } else { - hg_btree_replace(priv->free_block_tree, - GSIZE_TO_POINTER (aligned), l); - } - hg_list_iter_free(iter); - } - } -} - -static void -_hg_allocator_bfit_add_free_block(HgAllocatorBFitPrivate *priv, - HgMemBFitBlock *block) -{ - gsize aligned; - HgList *l; - - block->in_use = 0; - /* clear data to avoid incomplete header detection */ - if (block->length >= (sizeof (HgMemObject) + sizeof (HgObject))) { - memset(block->heap_fragment, 0, sizeof (HgMemObject) + sizeof (HgObject)); - } else { - memset(block->heap_fragment, 0, block->length); - } - /* trying to resolve the fragmentation */ - while (block->prev != NULL && block->prev->in_use == 0) { - HgMemBFitBlock *b = block->prev; - - if (((gsize)b->heap_fragment + b->length) != (gsize)block->heap_fragment) { - hg_log_warning("[BUG] wrong block chain detected. (block: %p heap: %p length: %" G_GSIZE_FORMAT ") is chained from (block: %p heap: %p length: %" G_GSIZE_FORMAT ")", block, block->heap_fragment, block->length, b, b->heap_fragment, b->length); - break; - } - /* block must be removed from array because available size is increased. */ - _hg_allocator_bfit_remove_block(priv, b); - /* it could be merged now */ - b->length += block->length; - b->next = block->next; - if (block->next) - block->next->prev = b; - _hg_bfit_block_free(block); - block = b; - } - while (block->next != NULL && block->next->in_use == 0) { - HgMemBFitBlock *b = block->next; - - if (((gsize)block->heap_fragment + block->length) != (gsize)b->heap_fragment) { - hg_log_warning("[BUG] wrong block chain detected. (block: %p heap: %p length: %" G_GSIZE_FORMAT ") is chained to (block: %p heap: %p length: %" G_GSIZE_FORMAT ")", block, block->heap_fragment, block->length, b, b->heap_fragment, b->length); - break; - } - /* it could be merged now */ - block->length += b->length; - block->next = b->next; - if (b->next) - b->next->prev = block; - /* block must be removed because it's no longer available */ - _hg_allocator_bfit_remove_block(priv, b); - _hg_bfit_block_free(b); - } - _hg_allocator_get_minimum_aligned_size__inline(block->length, - HG_MEM_ALIGNMENT, - aligned); - if ((l = hg_btree_find(priv->free_block_tree, GSIZE_TO_POINTER (aligned))) == NULL) { - l = _hg_list_new(); - l = hg_list_append(l, block); - hg_btree_add(priv->free_block_tree, GSIZE_TO_POINTER (aligned), l); - } else { - l = hg_list_prepend(l, block); - hg_btree_replace(priv->free_block_tree, GSIZE_TO_POINTER (aligned), l); - } -} - -static HgMemBFitBlock * -_hg_allocator_bfit_get_free_block(HgMemPool *pool, - HgAllocatorBFitPrivate *priv, - gsize size) -{ - gsize aligned, real_aligned; - HgList *l; - HgListIter iter; - HgMemBFitBlock *retval = NULL; - - g_return_val_if_fail (size % HG_MEM_ALIGNMENT == 0, NULL); - - _hg_allocator_get_minimum_aligned_size__inline(size, HG_MEM_ALIGNMENT, aligned); - if ((l = hg_btree_find_near(priv->free_block_tree, GSIZE_TO_POINTER (aligned))) == NULL) - return NULL; - iter = hg_list_iter_new(l); - if (iter == NULL) - return NULL; - retval = hg_list_iter_get_data(iter); - _hg_allocator_get_minimum_aligned_size__inline(retval->length, - HG_MEM_ALIGNMENT, - real_aligned); - l = hg_list_iter_delete_link(iter); - hg_list_iter_free(iter); - if (l == NULL) { - hg_btree_remove(priv->free_block_tree, - GSIZE_TO_POINTER (real_aligned)); - } else { - hg_btree_replace(priv->free_block_tree, - GSIZE_TO_POINTER (real_aligned), l); - } - if (retval != NULL) { - gsize unused = retval->length - size, min_size; - HgMemBFitBlock *block; - - _hg_allocator_get_aligned_size__inline(sizeof (HgMemObject), HG_MEM_ALIGNMENT, min_size); - if (unused > 0 && unused >= min_size) { - block = _hg_bfit_block_new((gpointer)((gsize)retval->heap_fragment + size), - unused, - retval->heap_id); - if (block != NULL) { - block->prev = retval; - block->next = retval->next; - if (retval->next) - retval->next->prev = block; - retval->length = size; - retval->next = block; - /* in_use flag must be set to true here. - * otherwise warning will appears in _hg_allocator_bfit_add_free_block. - */ - retval->in_use = 1; - _hg_allocator_bfit_add_free_block(priv, block); - } - } - pool->used_heap_size += retval->length; - retval->in_use = 1; - } - - return retval; -} - -static void -_hg_allocator_bfit_relocate(HgMemPool *pool, - HgMemRelocateInfo *info) -{ - HgAllocatorBFitPrivate *priv = pool->allocator->private; - gsize header_size = sizeof (HgMemObject); - HgMemObject *obj, *new_obj; - HgObject *hobj; - gpointer p, data; - HgListIter iter; - - if (pool->is_processing) - return; - pool->is_processing = TRUE; - - /* relocate the addresses in the root node */ - if (pool->root_node) { - iter = hg_list_iter_new(pool->root_node); - do { - data = hg_list_iter_get_data(iter); - if ((gsize)data >= info->start && - (gsize)data <= info->end) { - hg_list_iter_set_data(iter, (gpointer)((gsize)data + info->diff)); - } else { - const HgObjectVTable const *vtable; - HgMemObject *obj; - - /* object that is targetted for relocation will relocates - * their member variables later. so we need to ensure - * the relocation for others. - */ - hobj = (HgObject *)data; - hg_mem_get_object__inline(hobj, obj); - if (obj != NULL && HG_MEMOBJ_IS_HGOBJECT (obj) && - (vtable = hg_object_get_vtable(hobj)) != NULL && - vtable->relocate) { - vtable->relocate(hobj, info); - } - } - } while (hg_list_get_iter_next(pool->root_node, iter)); - hg_list_iter_free(iter); - } - /* relocate the addresses in another pool */ - if (pool->other_pool_ref_list) { - iter = hg_list_iter_new(pool->other_pool_ref_list); - do { - /* recursively invoke relocate in another pool. */ - _hg_allocator_bfit_relocate(hg_list_iter_get_data(iter), info); - } while (hg_list_get_iter_next(pool->other_pool_ref_list, iter)); - hg_list_iter_free(iter); - } - /* relocate the addresses in the stack */ - for (p = _hg_stack_start; p > _hg_stack_end; p--) { - obj = (HgMemObject *)(*(gsize *)p - header_size); - if ((gsize)obj >= info->start && - (gsize)obj <= info->end) { - if (hg_btree_find(priv->obj2block_tree, obj) != NULL) { - new_obj = (HgMemObject *)((gsize)obj + info->diff); - *(gsize *)p = (gsize)new_obj->data; - } - } - obj = (HgMemObject *)(*(gsize *)p); - if ((gsize)obj >= info->start && - (gsize)obj <= info->end) { - if (hg_btree_find(priv->obj2block_tree, obj) != NULL) { - new_obj = (HgMemObject *)((gsize)obj + info->diff); - *(gsize *)p = (gsize)new_obj; - } - } - } - - pool->is_processing = FALSE; -} - -/* best fit memory allocator */ -static gboolean -_hg_allocator_bfit_real_initialize(HgMemPool *pool, - gsize prealloc) -{ - HgAllocatorBFitPrivate *priv; - HgHeap *heap; - gsize total_heap_size; - HgMemBFitBlock *block; - - _hg_allocator_get_aligned_size__inline(prealloc, - HG_MEM_ALIGNMENT, - total_heap_size); - priv = g_new0(HgAllocatorBFitPrivate, 1); - if (priv == NULL) - return FALSE; - - heap = hg_heap_new(pool, total_heap_size); - if (heap == NULL) { - g_free(priv); - - return FALSE; - } - pool->total_heap_size = pool->initial_heap_size = total_heap_size; - pool->used_heap_size = 0; - - block = _hg_bfit_block_new(heap->heaps, total_heap_size, heap->serial); - if (block == NULL) { - hg_heap_free(heap); - g_free(priv); - - return FALSE; - } - - priv->free_block_tree = hg_btree_new(BTREE_N_NODE); - priv->heap2block_array = g_ptr_array_new(); - priv->obj2block_tree = hg_btree_new(BTREE_N_NODE); - priv->n_complex_objects = 0; - - g_ptr_array_add(priv->heap2block_array, block); - _hg_allocator_bfit_add_free_block(priv, block); - hg_mem_pool_add_heap(pool, heap); - - pool->allocator->private = priv; - - return TRUE; -} - -static gboolean -_hg_allocator_bfit_real_free_block_traverse(gpointer key, - gpointer val, - gpointer data) -{ - hg_list_free(val); - - return TRUE; -} - -static gboolean -_hg_allocator_bfit_real_destroy(HgMemPool *pool) -{ - HgAllocatorBFitPrivate *priv = pool->allocator->private; - guint i; - - hg_mem_garbage_collection(pool); - if (priv->heap2block_array) { - for (i = 0; i < priv->heap2block_array->len; i++) { - HgMemBFitBlock *block = g_ptr_array_index(priv->heap2block_array, i); - HgMemBFitBlock *tmp; - HgMemObject *obj; - - while (block != NULL) { - tmp = block->next; - /* split off the link to avoid freeing of block in hg_mem_free */ - block->next = NULL; - block->prev = NULL; - if (block->in_use > 0) { - obj = block->heap_fragment; - hg_mem_free(obj->data); - } - _hg_bfit_block_free(block); - block = tmp; - } - } - g_ptr_array_free(priv->heap2block_array, TRUE); - } - hg_btree_foreach(priv->free_block_tree, - _hg_allocator_bfit_real_free_block_traverse, - NULL); - hg_btree_destroy(priv->free_block_tree); - hg_btree_destroy(priv->obj2block_tree); - g_free(priv); - - return TRUE; -} - -static gboolean -_hg_allocator_bfit_real_resize_pool(HgMemPool *pool, - gsize size) -{ - HgAllocatorBFitPrivate *priv = pool->allocator->private; - HgHeap *heap; - gsize block_size; - HgMemBFitBlock *block; - - _hg_allocator_get_aligned_size__inline(sizeof (HgMemObject) + size, - HG_MEM_ALIGNMENT, - block_size); - if (pool->initial_heap_size > block_size) { - block_size = pool->initial_heap_size; - } else { - /* it may be a good idea to allocate much more memory - * because block_size will be used soon. - * then need to be resized again. - */ - block_size *= 2; - } - heap = hg_heap_new(pool, block_size); - if (heap == NULL) - return FALSE; - block = _hg_bfit_block_new(heap->heaps, block_size, heap->serial); - if (block == NULL) { - hg_heap_free(heap); - - return FALSE; - } - pool->total_heap_size += block_size; - g_ptr_array_add(priv->heap2block_array, block); - _hg_allocator_bfit_add_free_block(priv, block); - hg_mem_pool_add_heap(pool, heap); - - return TRUE; -} - -static gpointer -_hg_allocator_bfit_real_alloc(HgMemPool *pool, - gsize size, - guint flags) -{ - HgAllocatorBFitPrivate *priv = pool->allocator->private; - gsize min_size, block_size; - HgMemBFitBlock *block; - HgMemObject *obj = NULL; - - _hg_allocator_get_aligned_size__inline(sizeof (HgMemObject), - HG_MEM_ALIGNMENT, - min_size); - _hg_allocator_get_aligned_size__inline(sizeof (HgMemObject) + size, - HG_MEM_ALIGNMENT, - block_size); - block = _hg_allocator_bfit_get_free_block(pool, priv, block_size); - if (block != NULL) { - /* clear data to avoid incomplete header detection */ - if (block_size >= (sizeof (HgMemObject) + sizeof (HgObject))) { - memset(block->heap_fragment, 0, sizeof (HgMemObject) + sizeof (HgObject)); - } else { - memset(block->heap_fragment, 0, block_size); - } - obj = block->heap_fragment; - HG_SET_MAGIC_CODE (obj, HG_MEM_HEADER); - obj->subid = block; - obj->pool = pool; - HG_MEMOBJ_INIT_FLAGS (obj); - HG_MEMOBJ_SET_HEAP_ID (obj, block->heap_id); - if ((flags & HG_FL_HGOBJECT) != 0) - HG_MEMOBJ_SET_HGOBJECT_ID (obj); - if ((flags & HG_FL_COMPLEX) != 0) - priv->n_complex_objects++; - HG_MEMOBJ_SET_SNAPSHOT_AGE (obj, hg_mem_pool_get_age_of_snapshot(pool)); - HG_MEMOBJ_SET_FLAGS (obj, flags); - hg_btree_add(priv->obj2block_tree, block->heap_fragment, block); - - return obj->data; - } - - return NULL; -} - -static void -_hg_allocator_bfit_real_free(HgMemPool *pool, - gpointer data) -{ - HgAllocatorBFitPrivate *priv = pool->allocator->private; - HgMemBFitBlock *block; - HgMemObject *obj; - - hg_mem_get_object__inline(data, obj); - if (obj == NULL) { - hg_log_warning("[BUG] Unknown object %p is going to be destroyed.", data); - return; - } - block = obj->subid; - if (block == NULL) { - hg_log_warning("[BUG] Broken object %p is going to be destroyed.", data); - return; - } - if (hg_btree_find(priv->obj2block_tree, block->heap_fragment) == NULL) { - hg_log_warning("[BUG] Failed to remove an object %p (block: %p) from list.", - data, block); - return; - } - if ((HG_MEMOBJ_GET_FLAGS (obj) & HG_FL_COMPLEX) == HG_FL_COMPLEX) { - guint8 age = HG_MEMOBJ_GET_SNAPSHOT_AGE (obj); - HgListIter iter; - - priv->n_complex_objects--; - if (pool->snapshot_list) { - iter = hg_list_iter_new(pool->snapshot_list); - do { - HgMemSnapshot *snap = hg_list_iter_get_data(iter); - - if (snap->age > age) - snap->private = GUINT_TO_POINTER (GPOINTER_TO_UINT (snap->private) - 1); - } while (hg_list_get_iter_next(pool->snapshot_list, iter)); - hg_list_iter_free(iter); - } - } - hg_btree_remove(priv->obj2block_tree, block->heap_fragment); - pool->used_heap_size -= block->length; - _hg_allocator_bfit_add_free_block(priv, block); -} - -static gpointer -_hg_allocator_bfit_real_resize(HgMemObject *object, - gsize size) -{ - gsize block_size, min_block_size; - HgMemPool *pool = object->pool; - - HG_SET_STACK_END; - - _hg_allocator_get_aligned_size__inline(sizeof (HgMemObject), - HG_MEM_ALIGNMENT, - min_block_size); - _hg_allocator_get_aligned_size__inline(sizeof (HgMemObject) + size, - HG_MEM_ALIGNMENT, - block_size); - if (block_size > _hg_allocator_get_object_size__inline(object)) { - gpointer p; - HgMemRelocateInfo info; - HgObject *hobj; - HgMemObject *obj; - const HgObjectVTable const *vtable; - - p = hg_mem_alloc_with_flags(pool, block_size, HG_MEMOBJ_GET_FLAGS (object)); - /* reset the stack bottom here again. it may be broken during allocation - * if GC was running. - */ - HG_SET_STACK_END_AGAIN; - if (p == NULL) - return NULL; - info.start = (gsize)object; - info.end = (gsize)object; - info.diff = (gsize)p - (gsize)object->data; - memcpy(p, object->data, - _hg_allocator_get_object_size__inline(object) - sizeof (HgMemObject)); - /* avoid to call HgObject's free function so that - * it will be invoked from copied object. - */ - if (HG_MEMOBJ_IS_HGOBJECT (object)) { - hobj = (HgObject *)object->data; - HG_OBJECT_SET_VTABLE_ID (hobj, 0); - } - /* set HG_FL_DEAD flag instead of freeing a object. - * the object may be still used where is in snapshot. - */ - /* XXX: in PostScript spec, it may be unlikely to happen, - * so that this process is really machine-dependant code. - * and PostScript itself doesn't support to extend - * the object size. - */ - hg_mem_set_dead(object); - - _hg_allocator_bfit_relocate(pool, &info); - hobj = (HgObject *)p; - hg_mem_get_object__inline(hobj, obj); - if (obj != NULL && HG_MEMOBJ_IS_HGOBJECT (obj) && - (vtable = hg_object_get_vtable(hobj)) != NULL && - vtable->relocate) { - vtable->relocate(hobj, &info); - } - - return p; - } else if (block_size < _hg_allocator_get_object_size__inline(object) && - (_hg_allocator_get_object_size__inline(object) - block_size) > min_block_size) { - HgHeap *heap = g_ptr_array_index(pool->heap_list, HG_MEMOBJ_GET_HEAP_ID (object)); - gsize fixed_size = _hg_allocator_get_object_size__inline(object) - block_size; - HgMemBFitBlock *block = _hg_bfit_block_new((gpointer)((gsize)object + block_size), - fixed_size, - heap->serial); - HgMemBFitBlock *blk = object->subid; - HgAllocatorBFitPrivate *priv = pool->allocator->private; - - if (block == NULL) { - hg_log_warning("Failed to allocate a block for resizing."); - return NULL; - } - block->prev = blk; - block->next = blk->next; - if (blk->next) - blk->next->prev = block; - blk->length = block_size; - blk->next = block; - pool->used_heap_size -= block->length; - _hg_allocator_bfit_add_free_block(priv, block); - } - - return object->data; -} - -static gsize -_hg_allocator_bfit_real_get_size(HgMemObject *object) -{ - HgMemBFitBlock *block = object->subid; - - return block->length; -} - -static void -_hg_allocator_bfit_real_set_flags(HgMemObject *object, - guint flags) -{ - HgAllocatorBFitPrivate *priv = object->pool->allocator->private; - - if ((flags & HG_FL_COMPLEX) == HG_FL_COMPLEX) { - if ((HG_MEMOBJ_GET_FLAGS (object) & HG_FL_COMPLEX) == 0) - priv->n_complex_objects++; - } else if ((HG_MEMOBJ_GET_FLAGS (object) & HG_FL_COMPLEX) == HG_FL_COMPLEX) { - priv->n_complex_objects--; - } -} - -static gboolean -_hg_allocator_bfit_real_garbage_collection(HgMemPool *pool) -{ - HgAllocatorBFitPrivate *priv = pool->allocator->private; - guint i; - gboolean retval = FALSE; - HgListIter iter; -#ifdef DEBUG - guint total = 0, swept = 0; -#endif /* DEBUG */ - - if (pool->is_collecting) { - /* just return without doing anything */ - return FALSE; - } - pool->is_collecting = TRUE; - pool->age_of_gc_mark++; - if (pool->age_of_gc_mark == 0) - pool->age_of_gc_mark++; - if (!pool->destroyed) { - /* increase an age of mark in another pool too */ - if (pool->other_pool_ref_list) { - iter = hg_list_iter_new(pool->other_pool_ref_list); - do { - HgMemPool *p = hg_list_iter_get_data(iter); - - p->age_of_gc_mark++; - if (p->age_of_gc_mark == 0) - p->age_of_gc_mark++; - } while (hg_list_get_iter_next(pool->other_pool_ref_list, iter)); - hg_list_iter_free(iter); - } - } - hg_log_debug(DEBUG_GC, "starting GC for %s", pool->name); - if (!pool->destroyed) { - if (!pool->use_gc) { - pool->is_collecting = FALSE; - - return FALSE; - } - hg_log_debug(DEBUG_GC, "marking start."); - /* mark phase */ - pool->allocator->vtable->gc_mark(pool); - } - hg_log_debug(DEBUG_GC, "sweeping start."); - /* sweep phase */ - for (i = 0; i < priv->heap2block_array->len; i++) { - HgMemBFitBlock *block = g_ptr_array_index(priv->heap2block_array, i), *tmp; - HgMemObject *obj; - - while (block != NULL) { - obj = block->heap_fragment; - tmp = block->next; - /* if block isn't in use, it will be destroyed during hg_mem_free. - * tmp must points out used block. - */ - while (tmp != NULL && tmp->in_use == 0) - tmp = tmp->next; - - if (block->in_use > 0) { - if (!hg_mem_is_gc_mark__inline(obj) && - (pool->destroyed || !hg_mem_is_locked(obj))) { -#ifdef DEBUG - swept++; - hg_log_debug(DEBUG_GC, "sweeping %p (block: %p memobj: %p size: %" G_GSIZE_FORMAT " age: %d[current %d])", obj->data, obj->subid, obj, ((HgMemBFitBlock *)obj->subid)->length, HG_MEMOBJ_GET_MARK_AGE (obj), obj->pool->age_of_gc_mark); -#endif /* DEBUG */ - hg_mem_free(obj->data); - retval = TRUE; - } - } -#ifdef DEBUG - total++; -#endif /* DEBUG */ - block = tmp; - } - } - hg_log_debug(DEBUG_GC, "GC finished (total: %d blocks swept: %d blocks)", - total, swept); - pool->is_collecting = FALSE; - - return retval; -} - -static void -_hg_allocator_bfit_real_gc_mark(HgMemPool *pool) -{ - HG_SET_STACK_END; - - if (pool->is_processing) - return; - pool->is_processing = TRUE; - - hg_log_debug(DEBUG_GC, "MARK AGE: %d (%s)", pool->age_of_gc_mark, pool->name); - G_STMT_START { - HgListIter iter; - HgMemObject *obj; - jmp_buf env; - - /* trace the root node */ - if (pool->root_node) { - iter = hg_list_iter_new(pool->root_node); - do { - gpointer p = hg_list_iter_get_data(iter); - - hg_mem_get_object__inline(p, obj); - if (obj == NULL) { - hg_log_warning("[BUG] Invalid object %p is in the root node.", - p); - } else { - if (!hg_mem_is_gc_mark__inline(obj)) { - hg_mem_gc_mark__inline(obj); - hg_log_debug(DEBUG_GC, "MARK: %p (mem: %p age: %d) from root node.", obj->data, obj, HG_MEMOBJ_GET_MARK_AGE (obj)); - } else { - hg_log_debug(DEBUG_GC, "MARK[already]: %p (mem: %p age: %d) from root node.", obj->data, obj, HG_MEMOBJ_GET_MARK_AGE (obj)); - } - } - } while (hg_list_get_iter_next(pool->root_node, iter)); - hg_list_iter_free(iter); - } - /* trace another pool */ - if (pool->other_pool_ref_list) { - iter = hg_list_iter_new(pool->other_pool_ref_list); - do { - gpointer p = hg_list_iter_get_data(iter); - - hg_log_debug(DEBUG_GC, "entering %s", ((HgMemPool *)p)->name); - ((HgMemPool *)p)->allocator->vtable->gc_mark(p); - hg_log_debug(DEBUG_GC, "leaving %s", ((HgMemPool *)p)->name); - } while (hg_list_get_iter_next(pool->other_pool_ref_list, iter)); - hg_list_iter_free(iter); - } - /* trace in the registers */ - setjmp(env); - hg_log_debug(DEBUG_GC, "marking from registers."); - hg_mem_gc_mark_array_region(pool, (gpointer)env, (gpointer)env + sizeof (env)); - /* trace the stack */ - hg_log_debug(DEBUG_GC, "marking from stacks."); - hg_mem_gc_mark_array_region(pool, _hg_stack_start, _hg_stack_end); - } G_STMT_END; - - pool->is_processing = FALSE; -} - -static gboolean -_hg_allocator_bfit_real_is_safe_object(HgMemPool *pool, - HgMemObject *object) -{ - HgAllocatorBFitPrivate *priv = pool->allocator->private; - - return hg_btree_find(priv->obj2block_tree, object) != NULL; -} - -static HgMemSnapshot * -_hg_allocator_bfit_real_save_snapshot(HgMemPool *pool) -{ - HgAllocatorBFitPrivate *priv = pool->allocator->private; - HgMemSnapshot *retval; - GPtrArray *heaps_list = g_ptr_array_new(); - guint i; - - hg_mem_garbage_collection(pool); - /* XXX: maybe need to improve this detection. - * right now the snapshot age depends on the order of releasing - * a snapshot image. need better to manage the age of snapshot. - */ - if (hg_mem_pool_get_n_snapshots(pool) >= 255) { - hg_log_warning("Too many snapshot are creating."); - return NULL; - } - for (i = 0; i < pool->n_heaps; i++) { - gpointer start, end, top; - HgMemBFitBlock *block, *prev; - HgSnapshotChunk *chunk, *beginning_of_chunk = NULL, *prev_chunk = NULL; - -#define _is_targeted_block(_heap) \ - ((HG_MEMOBJ_GET_FLAGS ((HgMemObject *)_heap) & \ - HG_FL_RESTORABLE) == HG_FL_RESTORABLE) -#define _skip_non_restorable_block(_block) \ - while ((_block) != NULL && \ - ((_block)->in_use == 0 || \ - !_is_targeted_block ((_block)->heap_fragment))) \ - (_block) = (_block)->next; - - block = g_ptr_array_index(priv->heap2block_array, i); - _skip_non_restorable_block(block); - if (block != NULL) - top = block->heap_fragment; - - while (block != NULL) { - start = block->heap_fragment; - while (block != NULL && - block->in_use == 1 && - _is_targeted_block (block->heap_fragment)) { - prev = block; - block = block->next; - } - end = prev->heap_fragment + prev->length; - - chunk = _hg_bfit_snapshot_chunk_new(i, start - top, end - start, start); - if (beginning_of_chunk == NULL) - beginning_of_chunk = chunk; - if (prev_chunk) { - prev_chunk->next = chunk; - } - prev_chunk = chunk; - - _skip_non_restorable_block(block); - } - g_ptr_array_add(heaps_list, beginning_of_chunk); - } - - retval = hg_mem_alloc_with_flags(pool, sizeof (HgMemSnapshot), - HG_FL_HGOBJECT | HG_FL_COMPLEX); - if (retval == NULL) { - hg_log_warning("Failed to allocate a memory for snapshot."); - return NULL; - } - HG_OBJECT_INIT_STATE (&retval->object); - HG_OBJECT_SET_STATE (&retval->object, hg_mem_pool_get_default_access_mode(pool)); - hg_object_set_vtable(&retval->object, &__hg_snapshot_vtable); - retval->id = (gsize)pool; - retval->heap_list = heaps_list; - retval->n_heaps = pool->n_heaps; - retval->age = ++pool->age_of_snapshot; - retval->private = GUINT_TO_POINTER (priv->n_complex_objects); - -#undef _skip_non_restorable_block -#undef _is_targeted_block - - return retval; -} - -static gboolean -_hg_allocator_bfit_real_restore_snapshot(HgMemPool *pool, - HgMemSnapshot *snapshot, - guint adjuster) -{ - HgAllocatorBFitPrivate *priv = pool->allocator->private; - gboolean retval = TRUE; - gint i; - - hg_mem_garbage_collection(pool); - /* just ignore the older children snapshots */ - if (snapshot->age <= hg_mem_pool_get_age_of_snapshot(pool)) { - if ((GPOINTER_TO_UINT (snapshot->private) + adjuster) != priv->n_complex_objects) { - hg_log_debug(DEBUG_SNAPSHOT, "there are complex objects being alive. [%u %u]", GPOINTER_TO_UINT (snapshot->private) + adjuster, priv->n_complex_objects); - return FALSE; - } - for (i = 0; i < snapshot->n_heaps; i++) { - HgSnapshotChunk *chunk = g_ptr_array_index(snapshot->heap_list, i), *tmp; - HgMemBFitBlock *block = g_ptr_array_index(priv->heap2block_array, i); - - while (chunk != NULL) { - memcpy(block->heap_fragment + chunk->offset, - chunk->heap_chunks, - chunk->length); - tmp = chunk; - chunk = chunk->next; - _hg_bfit_snapshot_chunk_free(tmp); - } - } - pool->age_of_snapshot = snapshot->age; - - snapshot->n_heaps = 0; - g_ptr_array_free(snapshot->heap_list, TRUE); - snapshot->heap_list = NULL; - snapshot->age = 0; - retval = TRUE; - } - - return retval; -} - -/* snapshot */ -static void -_hg_allocator_bfit_snapshot_real_free(gpointer data) -{ - HgMemSnapshot *snapshot = data; - HgSnapshotChunk *chunk, *tmp; - gint i; - HgMemObject *obj; - - hg_mem_get_object__inline(data, obj); - if (obj->pool->snapshot_list) - obj->pool->snapshot_list = hg_list_remove(obj->pool->snapshot_list, snapshot); - - if (snapshot->heap_list) { - for (i = 0; i < snapshot->n_heaps; i++) { - chunk = g_ptr_array_index(snapshot->heap_list, i); - while (chunk) { - tmp = chunk; - chunk = chunk->next; - _hg_bfit_snapshot_chunk_free(tmp); - } - } - g_ptr_array_free(snapshot->heap_list, TRUE); - } -} - -static void -_hg_allocator_bfit_snapshot_real_set_flags(gpointer data, - guint flags) -{ - HgMemSnapshot *snapshot = data; - HgSnapshotChunk *chunk; - gint i; - HgMemObject *obj; - - for (i = 0; i < snapshot->n_heaps; i++) { - chunk = g_ptr_array_index(snapshot->heap_list, i); - - while (chunk) { - obj = chunk->heap_chunks; - - if (!HG_CHECK_MAGIC_CODE (obj, HG_MEM_HEADER)) { - hg_log_warning("[BUG] Invalid object %p to be marked in snapshot.", obj); - } else { - if (!hg_mem_is_flags__inline(obj, flags)) - hg_mem_add_flags__inline(obj, flags, TRUE); - } - - chunk = chunk->next; - } - } -} - -static void -_hg_allocator_bfit_snapshot_real_relocate(gpointer data, - HgMemRelocateInfo *info) -{ - /* XXX: is this really necessary? - * the snapshot objects and the chunks in it will be just - * discarded when any complex objects that was created after made - * this snapshot is there. and the relocation won't happens for - * the simple objects. - */ -} - -static gpointer -_hg_allocator_bfit_snapshot_real_to_string(gpointer data) -{ - HgMemObject *obj; - HgString *retval; - - hg_mem_get_object__inline(data, obj); - if (obj == NULL) - return NULL; - retval = hg_string_new(obj->pool, 7); - hg_string_append(retval, "-save-", -1); - - return retval; -} - -/* - * Public Functions - */ -HgAllocatorVTable * -hg_allocator_bfit_get_vtable(void) -{ - return &__hg_allocator_bfit_vtable; -} diff --git a/hieroglyph/hgallocator-ffit.c b/hieroglyph/hgallocator-ffit.c deleted file mode 100644 index 75281f8..0000000 --- a/hieroglyph/hgallocator-ffit.c +++ /dev/null @@ -1,937 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* - * hgallocator-ffit.c - * Copyright (C) 2006 Akira TAGOH - * - * Authors: - * Akira TAGOH <at@gclab.org> - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - */ -#ifdef HAVE_CONFIG_H -#include <config.h> -#endif - -#include <string.h> -#include "hgallocator-ffit.h" -#include "hgallocator-private.h" -#include "hgmem.h" -#include "hgbtree.h" -#include "hgstring.h" - - -#define BTREE_N_NODE 6 - - -typedef struct _HieroGlyphAllocatorRelocateInfo HgAllocatorRelocateInfo; -typedef struct _HieroGlyphAllocatorFFitPrivate HgAllocatorFFitPrivate; -typedef struct _HieroGlyphAllocatorFFitSnapshotPrivate HgAllocatorFFitSnapshotPrivate; -typedef struct _HieroGlyphMemFFitBlock HgMemFFitBlock; - - -struct _HieroGlyphAllocatorRelocateInfo { - HgBTree *tree; - HgMemRelocateInfo *info; -}; - -struct _HieroGlyphAllocatorFFitPrivate { - GList *free_block_list; - GList *last_free_block; - HgBTree *used_block_list; -}; - -struct _HieroGlyphAllocatorFFitSnapshotPrivate { - GList *restorable_block_list; - GList *unrestorable_block_list; -}; - -struct _HieroGlyphMemFFitBlock { - gint heap_id; - gsize block_size; - gsize offset; -}; - - -static gboolean _hg_allocator_ffit_real_initialize (HgMemPool *pool, - gsize prealloc); -static gboolean _hg_allocator_ffit_real_destroy (HgMemPool *pool); -static gboolean _hg_allocator_ffit_real_resize_pool (HgMemPool *pool, - gsize size); -static gpointer _hg_allocator_ffit_real_alloc (HgMemPool *pool, - gsize size, - guint flags); -static void _hg_allocator_ffit_real_free (HgMemPool *pool, - gpointer data); -static gpointer _hg_allocator_ffit_real_resize (HgMemObject *object, - gsize size); -static gboolean _hg_allocator_ffit_real_garbage_collection(HgMemPool *pool); -static void _hg_allocator_ffit_real_gc_mark (HgMemPool *pool); -static HgMemSnapshot *_hg_allocator_ffit_real_save_snapshot (HgMemPool *pool); -static gboolean _hg_allocator_ffit_real_restore_snapshot (HgMemPool *pool, - HgMemSnapshot *snapshot); -static void _hg_allocator_ffit_snapshot_real_free (gpointer data); -static void _hg_allocator_ffit_snapshot_real_set_flags(gpointer data, - guint flags); -static void _hg_allocator_ffit_snapshot_real_relocate (gpointer data, - HgMemRelocateInfo *info); -static gpointer _hg_allocator_ffit_snapshot_real_to_string(gpointer data); - - -static HgAllocatorVTable __hg_allocator_ffit_vtable = { - .initialize = _hg_allocator_ffit_real_initialize, - .destroy = _hg_allocator_ffit_real_destroy, - .resize_pool = _hg_allocator_ffit_real_resize_pool, - .alloc = _hg_allocator_ffit_real_alloc, - .free = _hg_allocator_ffit_real_free, - .resize = _hg_allocator_ffit_real_resize, - .garbage_collection = _hg_allocator_ffit_real_garbage_collection, - .gc_mark = _hg_allocator_ffit_real_gc_mark, - .save_snapshot = _hg_allocator_ffit_real_save_snapshot, - .restore_snapshot = _hg_allocator_ffit_real_restore_snapshot, -}; - -static HgObjectVTable __hg_snapshot_vtable = { - .free = _hg_allocator_ffit_snapshot_real_free, - .set_flags = _hg_allocator_ffit_snapshot_real_set_flags, - .relocate = _hg_allocator_ffit_snapshot_real_relocate, - .dup = NULL, - .copy = NULL, - .to_string = _hg_allocator_ffit_snapshot_real_to_string, -}; - - -/* - * Private Functions - */ -/* - * allocator - */ -#define _hg_allocator_compute_block_size__inline(__hg_acb_size, __hg_acb_ret) \ - G_STMT_START { \ - gsize __hg_acbt = (__hg_acb_size); \ - (__hg_acb_ret) = 0; \ - while (__hg_acbt >= 2) { \ - __hg_acbt /= 2; \ - (__hg_acb_ret)++; \ - } \ - if ((1 << (__hg_acb_ret)) < (__hg_acb_size)) \ - (__hg_acb_ret)++; \ - (__hg_acb_ret) = 1 << (__hg_acb_ret); \ - } G_STMT_END - -/* first fit memory allocator */ -static gboolean -_hg_allocator_ffit_real_initialize(HgMemPool *pool, - gsize prealloc) -{ - HgAllocatorFFitPrivate *priv; - HgHeap *heap; - HgMemFFitBlock *block; - gsize total_heap_size; - - _hg_allocator_compute_block_size__inline(prealloc, total_heap_size); - priv = g_new0(HgAllocatorFFitPrivate, 1); - if (priv == NULL) - return FALSE; - - heap = hg_heap_new(pool, total_heap_size); - if (heap == NULL) - return FALSE; - - pool->total_heap_size = pool->initial_heap_size = total_heap_size; - pool->used_heap_size = 0; - g_ptr_array_add(pool->heap_list, heap); - - pool->allocator->private = priv; - - block = g_new(HgMemFFitBlock, 1); - block->heap_id = heap->serial; - block->block_size = total_heap_size; - block->offset = 0; - priv->free_block_list = g_list_append(NULL, block); - priv->last_free_block = priv->free_block_list; - priv->used_block_list = hg_btree_new(BTREE_N_NODE); - - return TRUE; -} - -static void -_hg_allocator_ffit_traverse_for_destroy(gpointer key, - gpointer val, - gpointer data) -{ - GList *l = data; - HgMemObject *obj = val; - HgObject *hobj = (HgObject *)obj->data; - - if (hobj->id == HG_OBJECT_ID && hobj->vtable && hobj->vtable->free) - l = g_list_append(l, obj->data); -} - -static gboolean -_hg_allocator_ffit_real_destroy(HgMemPool *pool) -{ - HgAllocatorFFitPrivate *priv = pool->allocator->private; - GList *l, *free_list; - - free_list = g_list_alloc(); /* dummy */ - hg_btree_foreach(priv->used_block_list, _hg_allocator_ffit_traverse_for_destroy, free_list); - for (l = g_list_next(free_list); l != NULL; l = g_list_next(l)) { - hg_mem_free(l->data); - } - g_list_free(free_list); - hg_btree_destroy(priv->used_block_list); - for (l = priv->free_block_list; l != NULL; l = g_list_next(l)) { - g_free(l->data); - } - g_list_free(priv->free_block_list); - g_free(priv); - - return TRUE; -} - -static gpointer -_hg_allocator_ffit_real_alloc(HgMemPool *pool, - gsize size, - guint flags) -{ - HgAllocatorFFitPrivate *priv = pool->allocator->private; - HgMemFFitBlock *block; - GList *l; - gsize min_size; - gsize block_size; - HgMemObject *obj = NULL; - HgHeap *heap; - - _hg_allocator_compute_block_size__inline(sizeof (HgMemObject), min_size); - _hg_allocator_compute_block_size__inline(sizeof (HgMemObject) + size, block_size); - /* try to find a object from free block list */ - for (l = priv->free_block_list; l != NULL; l = g_list_next(l)) { - block = l->data; - - if (block->block_size >= block_size) { - if (block->block_size - block_size <= min_size) - block_size = block->block_size; - heap = g_ptr_array_index(pool->heap_list, block->heap_id); - obj = (gpointer)(gsize)heap->heaps + block->offset; - obj->id = HG_MEM_HEADER; - obj->subid = priv->used_block_list; - obj->heap_id = block->heap_id; - obj->pool = pool; - obj->block_size = block_size; - obj->flags = flags; - hg_btree_add(priv->used_block_list, obj, obj); - - block->offset += block_size; - block->block_size -= block_size; - pool->used_heap_size += block_size; - heap->used_heap_size += block_size; - if (block->block_size == 0) { - g_free(block); - if (l == priv->last_free_block) - priv->last_free_block = g_list_previous(priv->last_free_block); - priv->free_block_list = g_list_delete_link(priv->free_block_list, l); - } - - return obj->data; - } - } - - return NULL; -} - -static void -_hg_allocator_ffit_real_free(HgMemPool *pool, - gpointer data) -{ - HgAllocatorFFitPrivate *priv = pool->allocator->private; - HgMemFFitBlock *block; - HgMemObject *obj; - HgHeap *heap; - - hg_mem_get_object__inline(data, obj); - if (obj == NULL || - (obj->subid != priv->used_block_list && - hg_btree_find(priv->used_block_list, obj) == NULL)) { - g_warning("[BUG] Unknown object %p is given for destroying.", data); - return; - } else { - heap = g_ptr_array_index(pool->heap_list, obj->heap_id); - hg_btree_remove(priv->used_block_list, obj); - block = g_new(HgMemFFitBlock, 1); - block->heap_id = obj->heap_id; - block->block_size = obj->block_size; - block->offset = (gsize)obj - (gsize)heap->heaps; - pool->used_heap_size -= obj->block_size; - heap->used_heap_size -= obj->block_size; - if (priv->last_free_block) { - GList *tmp = g_list_alloc(); - - priv->last_free_block->next = tmp; - tmp->prev = priv->last_free_block; - tmp->data = block; - priv->last_free_block = tmp; - } else { - priv->last_free_block = priv->free_block_list = g_list_append(priv->free_block_list, block); - } - } -} - -static void -_hg_allocator_ffit_traverse_for_relocation(gpointer key, - gpointer val, - gpointer data) -{ - HgMemObject *obj = val, *new_obj; - HgObject *hobj; - HgAllocatorRelocateInfo *info = data; - - if ((gsize)obj >= info->info->start && - (gsize)obj <= info->info->end) { - new_obj = (HgMemObject *)((gsize)obj + info->info->diff); - hg_btree_add(info->tree, new_obj, new_obj); - hobj = (HgObject *)new_obj->data; -#ifdef DEBUG_GC - g_print("DEBUG: Relocating %p -> %p\n", obj, new_obj); -#endif /* DEBUG_GC */ - if (hobj->id == HG_OBJECT_ID && hobj->vtable && hobj->vtable->relocate) { - hobj->vtable->relocate(hobj, info->info); - } - } else { - hg_btree_add(info->tree, obj, obj); - } -} - -static void -_hg_allocator_ffit_relocate(HgMemPool *pool, - HgMemRelocateInfo *info) -{ - HgAllocatorFFitPrivate *priv = pool->allocator->private; - HgAllocatorRelocateInfo ainfo; - gsize header_size = sizeof (HgMemObject); - HgBTree *new_tree = hg_btree_new(BTREE_N_NODE); - GList *list; - HgMemObject *obj, *new_obj; - HgObject *hobj; - gpointer p; - - /* relocate the addresses in the root node */ - for (list = pool->root_node; list != NULL; list = g_list_next(list)) { - if ((gsize)list->data >= info->start && - (gsize)list->data <= info->end) { - list->data = (gpointer)((gsize)list->data + info->diff); - } else { - /* object that is targetted for relocation will relocates - * their member variables later. so we need to ensure - * the relocation for others. - */ - hobj = (HgObject *)list->data; - if (hobj->id == HG_OBJECT_ID && hobj->vtable && hobj->vtable->relocate) { - hobj->vtable->relocate(hobj, info); - } - } - } - /* relocate the addresses in the stack */ - for (p = _hg_stack_start; p > _hg_stack_end; p--) { - if ((*(gsize *)p - header_size) >= info->start && - (*(gsize *)p - header_size) <= info->end) { - if ((obj = hg_btree_find(priv->used_block_list, (gpointer)(*(gsize *)p - header_size))) != NULL) { - new_obj = (HgMemObject *)((gsize)obj + info->diff); - *(gsize *)p = (gsize)new_obj->data; - } - } - if (*(gsize *)p >= info->start && - *(gsize *)p <= info->end) { - if ((obj = hg_btree_find(priv->used_block_list, (gpointer)*(gsize *)p)) != NULL) { - new_obj = (HgMemObject *)((gsize)obj + info->diff); - *(gsize *)p = (gsize)new_obj; - } - } - } - /* tell the object to update the allocated address */ - ainfo.tree = new_tree; - ainfo.info = info; - hg_btree_foreach(priv->used_block_list, _hg_allocator_ffit_traverse_for_relocation, &ainfo); - hg_btree_destroy(priv->used_block_list); - priv->used_block_list = new_tree; -} - -static gpointer -_hg_allocator_ffit_real_resize(HgMemObject *object, - gsize size) -{ - gsize block_size, min_block_size; - HgMemFFitBlock *block; - HgMemPool *pool = object->pool; - HgAllocatorFFitPrivate *priv = pool->allocator->private; - - HG_SET_STACK_END; - - _hg_allocator_compute_block_size__inline(sizeof (HgMemObject) + size, block_size); - _hg_allocator_compute_block_size__inline(sizeof (HgMemObject), min_block_size); - if (block_size > object->block_size) { - gpointer p; - - p = hg_mem_alloc_with_flags(pool, block_size, object->flags); - HG_SET_STACK_END_AGAIN; - if (p == NULL) { - return NULL; - } else { - HgMemRelocateInfo info; - - info.start = (gsize)object; - info.end = (gsize)object; - info.diff = (gsize)p - (gsize)object->data; - memcpy(p, object->data, object->block_size - sizeof (HgMemObject)); - _hg_allocator_ffit_relocate(pool, &info); - - return p; - } - } else if (block_size < object->block_size && - (object->block_size - block_size) > min_block_size) { - HgHeap *heap = g_ptr_array_index(pool->heap_list, object->heap_id); - - block = g_new(HgMemFFitBlock, 1); - block->heap_id = object->heap_id; - block->block_size = object->block_size - block_size; - block->offset = (gsize)object - (gsize)heap->heaps + block_size; - object->block_size = block_size; - pool->used_heap_size -= block->block_size; - heap->used_heap_size -= block->block_size; - if (priv->last_free_block) { - GList *tmp = g_list_alloc(); - - priv->last_free_block->next = tmp; - tmp->prev = priv->last_free_block; - tmp->data = block; - priv->last_free_block = tmp; - } else { - priv->last_free_block = priv->free_block_list = g_list_append(priv->free_block_list, block); - } - } - - return object->data; -} - -static gboolean -_hg_allocator_ffit_real_resize_pool(HgMemPool *pool, - gsize size) -{ - HgAllocatorFFitPrivate *priv = pool->allocator->private; - HgHeap *heap; - gsize block_size; - HgMemFFitBlock *block; - - _hg_allocator_compute_block_size__inline(sizeof (HgMemObject) + size, block_size); -#ifdef DEBUG_GC - g_print("DEBUG: %s going to be growed up.\n", pool->name); -#endif /* DEBUG_GC */ - if (pool->initial_heap_size > block_size) { - block_size = pool->initial_heap_size; - } else { - /* it may be a good idea to allocate much more memory - * because block_size will be used soon. - * then need to be resized again. - */ - block_size *= 2; - } - heap = hg_heap_new(pool, block_size); - if (heap == NULL) - return FALSE; - pool->total_heap_size += block_size; - - block = g_new(HgMemFFitBlock, 1); - block->heap_id = heap->serial; - block->block_size = block_size; - block->offset = 0; - g_ptr_array_add(pool->heap_list, heap); - /* it would be a good idea to prepend the block into the free block list - * so that there are no free blocks anymore. - */ - priv->free_block_list = g_list_prepend(priv->free_block_list, block); - if (priv->last_free_block == NULL) - priv->last_free_block = priv->free_block_list; - - return TRUE; -} - -static gint -_hg_allocator_ffit_compare(gconstpointer a, - gconstpointer b) -{ - const HgMemFFitBlock *aa = a, *bb = b; - - if (aa->heap_id == bb->heap_id) - return aa->offset - bb->offset; - - return aa->heap_id - bb->heap_id; -} - -static void -_hg_allocator_ffit_traverse_for_gc(gpointer key, - gpointer val, - gpointer data) -{ - GList *l = data; - HgMemObject *obj = val; - - if (!hg_mem_is_gc_mark(obj) && !hg_mem_is_locked(obj)) { -#ifdef DEBUG_GC - G_STMT_START { - HgObject *hobj = (HgObject *)obj->data; - g_print("DEBUG: being freed: %p\n", obj); - g_print("DEBUG: Details:\n"); - if (hobj->id == HG_OBJECT_ID) { - g_print("DEBUG: vtable: %p\n", hobj->vtable); - } - } G_STMT_END; -#endif /* DEBUG_GC */ - l = g_list_append(l, obj->data); - } else { -#ifdef DEBUG_GC - g_print("DEBUG: unmarking %p\n", val); -#endif /* DEBUG_GC */ - hg_mem_gc_unmark(obj); - } -} - -static void -_hg_allocator_ffit_traverse_for_gc_destroyed(gpointer key, - gpointer val, - gpointer data) -{ - GList *l = data; - HgMemObject *obj = val; - HgObject *hobj = (HgObject *)obj->data; - - if (!hg_mem_is_gc_mark(obj)) { -#ifdef DEBUG_GC - G_STMT_START { - g_print("DEBUG: being freed: %p\n", obj); - g_print("DEBUG: Details:\n"); - if (hobj->id == HG_OBJECT_ID) { - g_print("DEBUG: vtable: %p\n", hobj->vtable); - } - } G_STMT_END; -#endif /* DEBUG_GC */ - if (hobj->id == HG_OBJECT_ID && hobj->vtable && hobj->vtable->free) - l = g_list_append(l, obj->data); - } else { -#ifdef DEBUG_GC - g_print("DEBUG: unmarking %p\n", val); -#endif /* DEBUG_GC */ - hg_mem_gc_unmark(obj); - } -} - -static gboolean -_hg_allocator_ffit_real_garbage_collection(HgMemPool *pool) -{ - HgAllocatorFFitPrivate *priv = pool->allocator->private; - GList *l, *ll, *free_list; - HgMemFFitBlock *block1, *block2; - gboolean retval = FALSE; - - if (!pool->destroyed) { - if (!pool->use_gc) - return FALSE; - /* keep a mark to avoid collecting garbages */ - pool->allocator->vtable->gc_mark(pool); - } - /* do the garbage collection */ - free_list = g_list_alloc(); /* dummy */ - if (!pool->destroyed) { - hg_btree_foreach(priv->used_block_list, _hg_allocator_ffit_traverse_for_gc, free_list); - } else { - hg_btree_foreach(priv->used_block_list, _hg_allocator_ffit_traverse_for_gc_destroyed, free_list); - } - for (l = g_list_next(free_list); l != NULL; l = g_list_next(l)) { - hg_mem_free(l->data); - } - g_list_free(free_list); - if (!pool->destroyed) { - /* this is actually not a GC. just merge the free spaces to one or more */ - priv->free_block_list = g_list_sort(priv->free_block_list, _hg_allocator_ffit_compare); - for (l = priv->free_block_list; l != NULL; l = g_list_next(l)) { - loop_top: - ll = g_list_next(l); - if (ll == NULL) - break; - block1 = l->data; - block2 = ll->data; - if (block1->heap_id == block2->heap_id && - (block1->offset + block1->block_size) == block2->offset) { - block1->block_size += block2->block_size; - g_free(block2); - priv->free_block_list = g_list_delete_link(priv->free_block_list, ll); - l = g_list_previous(l); - - retval = TRUE; - if (l == NULL) { - l = priv->free_block_list; - goto loop_top; - } - } - } - priv->last_free_block = g_list_last(priv->free_block_list); - } - - return retval; -} - -static void -_hg_allocator_ffit_real_gc_mark(HgMemPool *pool) -{ - HgAllocatorFFitPrivate *priv = pool->allocator->private; - - HG_SET_STACK_END; - - G_STMT_START { - gpointer p; - HgMemObject *obj; - gsize header_size = sizeof (HgMemObject); - GList *list; - - /* trace the root node */ - for (list = pool->root_node; list != NULL; list = g_list_next(list)) { - hg_mem_get_object__inline(list->data, obj); - if (obj == NULL) { - g_warning("Invalid object %p in the root node.", list->data); - } else { -#ifdef DEBUG_GC - g_print("DEBUG: marking %p from root node\n", obj); -#endif /* DEBUG_GC */ - if (!hg_mem_is_gc_mark(obj)) - hg_mem_gc_mark(obj); -#ifdef DEBUG_GC - else { - g_print("DEBUG: already marked %p\n", obj); - } -#endif /* DEBUG_GC */ - } - } - /* trace the stack */ - for (p = _hg_stack_start; p > _hg_stack_end; p--) { - if ((obj = hg_btree_find(priv->used_block_list, (gpointer)(*(gsize *)p - header_size))) != NULL) { -#ifdef DEBUG_GC - g_print("DEBUG: marking %p from stack\n", obj); -#endif /* DEBUG_GC */ - if (!hg_mem_is_gc_mark(obj)) - hg_mem_gc_mark(obj); -#ifdef DEBUG_GC - else { - g_print("DEBUG: already marked %p\n", obj); - } -#endif /* DEBUG_GC */ - } - } - } G_STMT_END; -} - - -/* - * snapshot - */ -static void -_hg_allocator_ffit_snapshot_real_free(gpointer data) -{ - HgMemSnapshot *snapshot = data; - HgAllocatorFFitSnapshotPrivate *priv = snapshot->private; - gint i; - HgHeap *heap; - - if (priv->restorable_block_list) - g_list_free(priv->restorable_block_list); - if (priv->unrestorable_block_list) - g_list_free(priv->unrestorable_block_list); - if (snapshot->heap_list) { - for (i = 0; i < snapshot->n_heaps; i++) { - heap = g_ptr_array_index(snapshot->heap_list, i); - hg_heap_free(heap); - } - g_ptr_array_free(snapshot->heap_list, TRUE); - } -} - -static void -_hg_allocator_ffit_snapshot_real_set_flags(gpointer data, - guint flags) -{ - HgMemSnapshot *snapshot = data; - HgAllocatorFFitSnapshotPrivate *priv = snapshot->private; - GList *list; - HgMemObject *obj; - - hg_mem_get_object__inline(snapshot->private, obj); - if (!hg_mem_is_flags__inline(obj, flags)) - hg_mem_add_flags__inline(obj, flags, TRUE); - - for (list = priv->restorable_block_list; list != NULL; list = g_list_next(list)) { - obj = list->data; - - if (obj->id != HG_MEM_HEADER) { - g_warning("[BUG] Invalid object %p was given to set a flags in snapshot (restorable).", list->data); - } else { -#ifdef DEBUG_GC - G_STMT_START { - if ((flags & HG_FL_MARK) != 0) { - g_print("DEBUG: %s: marking snapshot %p from restorable blocks\n", __FUNCTION__, obj); - } - } G_STMT_END; -#endif /* DEBUG_GC */ - if (!hg_mem_is_flags__inline(obj, flags)) - hg_mem_add_flags__inline(obj, flags, TRUE); - } - } - for (list = priv->unrestorable_block_list; list != NULL; list = g_list_next(list)) { - obj = list->data; - - if (obj->id != HG_MEM_HEADER) { - g_warning("[BUG] Invalid object %p was given to set a flags in snapshot (unrestorable).", list->data); - } else { -#ifdef DEBUG_GC - G_STMT_START { - if ((flags & HG_FL_MARK) != 0) { - g_print("DEBUG: %s: marking snapshot %p from unrestorable blocks\n", __FUNCTION__, obj); - } - } G_STMT_END; -#endif /* DEBUG_GC */ - if (!hg_mem_is_flags__inline(obj, flags)) - hg_mem_add_flags__inline(obj, flags, TRUE); - } - } -} - -static void -_hg_allocator_ffit_snapshot_real_relocate(gpointer data, - HgMemRelocateInfo *info) -{ - HgMemSnapshot *snapshot = data; - HgAllocatorFFitSnapshotPrivate *priv; - GList *list; - HgMemObject *obj; - HgObject *hobj; - HgHeap *heap, *snapheap; - - if ((gsize)snapshot->private >= info->start && - (gsize)snapshot->private <= info->end) { - snapshot->private = (gpointer)((gsize)snapshot->private + info->diff); - } - priv = snapshot->private; - - for (list = priv->restorable_block_list; list != NULL; list = g_list_next(list)) { - if ((gsize)list->data >= info->start && - (gsize)list->data <= info->end) { - list->data = (gpointer)((gsize)list->data + info->diff); - obj = list->data; - heap = g_ptr_array_index(obj->pool->heap_list, obj->heap_id); - snapheap = g_ptr_array_index(snapshot->heap_list, obj->heap_id); - hobj = (HgObject *)((gsize)snapheap->heaps + (gsize)obj - (gsize)heap->heaps); - if (hobj->id == HG_OBJECT_ID && hobj->vtable && hobj->vtable->relocate) { - hobj->vtable->relocate(hobj, info); - } - } - } - for (list = priv->unrestorable_block_list; list != NULL; list = g_list_next(list)) { - if ((gsize)list->data >= info->start && - (gsize)list->data <= info->end) { - list->data = (gpointer)((gsize)list->data + info->diff); - } - } -} - -static void -_hg_allocator_ffit_snapshot_traverse_save(gpointer key, - gpointer val, - gpointer data) -{ - HgMemSnapshot *snapshot = data; - HgAllocatorFFitSnapshotPrivate *priv = snapshot->private; - HgMemObject *obj = val; - - if (obj->id != HG_MEM_HEADER) { - g_warning("[BUG] Invalid object %p was given to make a snapshot.", val); - } else { - if (hg_mem_is_restorable(obj)) { - HgHeap *origheap = g_ptr_array_index(obj->pool->heap_list, obj->heap_id); - HgHeap *heap = g_ptr_array_index(snapshot->heap_list, obj->heap_id); - - priv->restorable_block_list = g_list_append(priv->restorable_block_list, - val); - memcpy(heap->heaps + ((gsize)obj - (gsize)origheap->heaps), - obj, - obj->block_size); - } else { - priv->unrestorable_block_list = g_list_append(priv->unrestorable_block_list, - val); - } - } -} - -static gpointer -_hg_allocator_ffit_snapshot_real_to_string(gpointer data) -{ - HgMemObject *obj; - HgString *retval; - - hg_mem_get_object__inline(data, obj); - if (obj == NULL) - return NULL; - retval = hg_string_new(obj->pool, 7); - hg_string_append(retval, "-save-", -1); - - return retval; -} - -static HgMemSnapshot * -_hg_allocator_ffit_real_save_snapshot(HgMemPool *pool) -{ - HgMemSnapshot *retval; - HgAllocatorFFitPrivate *priv = pool->allocator->private; - HgAllocatorFFitSnapshotPrivate *new_priv; - gint i; - - retval = hg_mem_alloc(pool, sizeof (HgMemSnapshot)); - if (retval == NULL) { - g_warning("Failed to create a snapshot."); - return NULL; - } - retval->object.id = HG_OBJECT_ID; - retval->object.state = hg_mem_pool_get_default_access_mode(pool); - /* set NULL to avoid the call before finishing an initialization. */ - retval->object.vtable = NULL; - - retval->id = (gsize)pool; - retval->heap_list = g_ptr_array_new(); - if (retval->heap_list == NULL) { - g_warning("Failed to create a snapshot."); - return NULL; - } - retval->n_heaps = 0; - for (i = 0; i < pool->n_heaps; i++) { - HgHeap *heap; - HgHeap *origheap = g_ptr_array_index(pool->heap_list, i); - - heap = hg_heap_new(pool, origheap->total_heap_size); - if (heap == NULL) { - g_warning("Failed to create a snapshot."); - return NULL; - } - heap->serial = origheap->serial; - /* need to decrease the number of heap in pool */ - pool->n_heaps--; - retval->n_heaps++; - g_ptr_array_add(retval->heap_list, heap); - } - retval->private = new_priv = hg_mem_alloc(pool, sizeof (HgAllocatorFFitSnapshotPrivate)); - if (retval->private == NULL) { - g_warning("Failed to create a snapshot."); - return NULL; - } - new_priv->restorable_block_list = NULL; - new_priv->unrestorable_block_list = NULL; - - retval->object.vtable = &__hg_snapshot_vtable; - - hg_btree_foreach(priv->used_block_list, - _hg_allocator_ffit_snapshot_traverse_save, - retval); - - return retval; -} - -static void -_hg_allocator_ffit_snapshot_traverse_complex_object(gpointer key, - gpointer val, - gpointer data) -{ - gboolean *has_complex = data; - HgMemObject *obj = val; - - if (obj->id != HG_MEM_HEADER) { - g_warning("[BUG] Invalid object %p was given to be figured the complex object out.", val); - } else { - if (!hg_mem_is_gc_mark(obj) && - hg_mem_is_complex_mark(obj)) - *has_complex = TRUE; - } -} - -static gboolean -_hg_allocator_ffit_real_restore_snapshot(HgMemPool *pool, - HgMemSnapshot *snapshot) -{ - GList *list; - gboolean has_complex = FALSE; - HgAllocatorFFitSnapshotPrivate *snappriv = snapshot->private; - HgAllocatorFFitPrivate *priv = pool->allocator->private; - - g_return_val_if_fail (snapshot->id == (gsize)pool, FALSE); - - /* collect the unnecessary objects first */ - hg_mem_garbage_collection(pool); - - /* mark to check if there are another complex object allocated. */ - for (list = snappriv->restorable_block_list; list != NULL; list = g_list_next(list)) { - HgMemObject *obj = list->data; - HgHeap *heap = g_ptr_array_index(pool->heap_list, obj->heap_id); - HgHeap *snapheap = g_ptr_array_index(snapshot->heap_list, obj->heap_id); - gsize offset = (gsize)obj - (gsize)heap->heaps; - - if (obj->id != HG_MEM_HEADER) { - g_warning("Invalid object %p was given to set a flags in snapshot.", list->data); - } else { - memcpy((gpointer)((gsize)heap->heaps + offset), - (gpointer)((gsize)snapheap->heaps + offset), - obj->block_size); -#ifdef DEBUG_GC - g_print("DEBUG: marking %p from snapshot (restorable).\n", obj); -#endif /* DEBUG_GC */ - if (!hg_mem_is_gc_mark(obj)) - hg_mem_gc_mark(obj); - } - } - for (list = snappriv->unrestorable_block_list; list != NULL; list = g_list_next(list)) { - HgMemObject *obj = list->data; - - if (obj->id != HG_MEM_HEADER) { - g_warning("Invalid object %p was given to set a flags in snapshot.", list->data); - } else { -#ifdef DEBUG_GC - g_print("DEBUG: marking %p from snapshot (unrestorable).\n", obj); -#endif /* DEBUG_GC */ - if (!hg_mem_is_gc_mark(obj)) - hg_mem_gc_mark(obj); - } - } - hg_btree_foreach(priv->used_block_list, - _hg_allocator_ffit_snapshot_traverse_complex_object, - &has_complex); - if (!has_complex) { - hg_mem_garbage_collection(pool); - } - - return has_complex == FALSE; -} - -/* - * Public Functions - */ -HgAllocatorVTable * -hg_allocator_ffit_get_vtable(void) -{ - return &__hg_allocator_ffit_vtable; -} diff --git a/hieroglyph/hgallocator-ffit.h b/hieroglyph/hgallocator-ffit.h deleted file mode 100644 index c31e412..0000000 --- a/hieroglyph/hgallocator-ffit.h +++ /dev/null @@ -1,35 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* - * hgallocator-ffit.h - * Copyright (C) 2006 Akira TAGOH - * - * Authors: - * Akira TAGOH <at@gclab.org> - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - */ -#ifndef __HG_ALLOCATOR_FFIT_H__ -#define __HG_ALLOCATOR_FFIT_H__ - -#include <hieroglyph/hgtypes.h> - -G_BEGIN_DECLS - -HgAllocatorVTable *hg_allocator_ffit_get_vtable(void) G_GNUC_CONST; - -G_END_DECLS - -#endif /* __HG_ALLOCATOR_FFIT_H__ */ diff --git a/hieroglyph/hgallocator-private.h b/hieroglyph/hgallocator-private.h deleted file mode 100644 index d7f0ca2..0000000 --- a/hieroglyph/hgallocator-private.h +++ /dev/null @@ -1,93 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* - * hgallocator-private.h - * Copyright (C) 2006 Akira TAGOH - * - * Authors: - * Akira TAGOH <at@gclab.org> - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - */ -#ifndef __HG_ALLOCATOR_PRIVATE_H__ -#define __HG_ALLOCATOR_PRIVATE_H__ - -#include <hieroglyph/hgtypes.h> - - -G_BEGIN_DECLS - - -#define HG_MEM_POOL_FLAGS_GET_FLAGS(__value__, __mask__) \ - ((__value__) & (__mask__)) -#define HG_MEM_POOL_GET_FLAGS(__pool__, __mask__) \ - HG_MEM_POOL_FLAGS_GET_FLAGS ((__pool__)->flags, __mask__) -#define HG_MEM_POOL_SET_FLAGS(__pool__, __mask__, __flags__) \ - (__pool__)->flags = (((__pool__)->flags & ~(__mask__)) | ((__flags__) ? (__mask__) : 0)) -#define HG_MEM_POOL_FLAGS_HAS_FLAGS(__value__, __mask__) \ - (HG_MEM_POOL_FLAGS_GET_FLAGS (__value__, __mask__) ? TRUE : FALSE) -#define HG_MEM_POOL_HAS_FLAGS(__pool__, __mask__) \ - (HG_MEM_POOL_FLAGS_HAS_FLAGS ((__pool__)->flags, __mask__)) - - -struct _HieroGlyphHeap { - gpointer heaps; - gint serial; - gsize total_heap_size; - gsize used_heap_size; -}; - -struct _HieroGlyphMemPool { - gchar *name; - GPtrArray *heap_list; - gint n_heaps; - gsize initial_heap_size; - gsize total_heap_size; - gsize used_heap_size; - HgAllocator *allocator; - HgList *root_node; - HgList *other_pool_ref_list; - HgList *snapshot_list; - guint access_mode; - guint flags; - gshort gc_threshold; - guint8 age_of_gc_mark; - guint8 age_of_snapshot; - gboolean destroyed : 1; - gboolean periodical_gc : 1; - gboolean gc_checked : 1; - gboolean use_gc : 1; - gboolean is_processing : 1; - gboolean is_collecting : 1; -}; - -struct _HieroGlyphMemSnapshot { - HgObject object; - gsize id; - GPtrArray *heap_list; - gint n_heaps; - gint age; - gpointer private; -}; - - -extern gpointer _hg_stack_start; -extern gpointer _hg_stack_end; - - -G_END_DECLS - - -#endif /* __HG_ALLOCATOR_PRIVATE_H__ */ diff --git a/hieroglyph/hgarray.c b/hieroglyph/hgarray.c index 5656c82..6dfb589 100644 --- a/hieroglyph/hgarray.c +++ b/hieroglyph/hgarray.c @@ -1,10 +1,10 @@ /* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ /* * hgarray.c - * Copyright (C) 2005-2006 Akira TAGOH + * Copyright (C) 2005-2007 Akira TAGOH * * Authors: - * Akira TAGOH <at@gclab.org> + * Akira TAGOH <akira@tagoh.org> * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -22,604 +22,187 @@ * Boston, MA 02111-1307, USA. */ #ifdef HAVE_CONFIG_H -#include <config.h> +#include "config.h" #endif -#include <string.h> +#include <glib/gstrfuncs.h> +#include <glib/gthread.h> +#include <hieroglyph/hgobject.h> +#include <hieroglyph/vm.h> #include "hgarray.h" -#include "hgstring.h" -#include "hgbtree.h" -#include "hglog.h" -#include "hgmem.h" -#include "hgvaluenode.h" -#include "hgfile.h" - -#define HG_ARRAY_ALLOC_SIZE 65535 -#define HG_ARRAY_MAX_SIZE 65535 - - -struct _HieroGlyphArray { - HgObject object; - HgValueNode **current; - HgValueNode **arrays; - gchar *name; - guint16 n_arrays; - guint16 allocated_arrays; - guint16 removed_arrays; - guint16 subarray_offset; - gboolean is_subarray : 1; - gboolean is_fixed_size : 1; -}; - - -static void _hg_array_real_set_flags(gpointer data, - guint flags); -static void _hg_array_real_relocate (gpointer data, - HgMemRelocateInfo *info); -static gpointer _hg_array_real_dup (gpointer data); -static gpointer _hg_array_real_copy (gpointer data); -static gpointer _hg_array_real_to_string(gpointer data); - - -static HgObjectVTable __hg_array_vtable = { - .free = NULL, - .set_flags = _hg_array_real_set_flags, - .relocate = _hg_array_real_relocate, - .dup = _hg_array_real_dup, - .copy = _hg_array_real_copy, - .to_string = _hg_array_real_to_string, -}; -/* - * Private Functions - */ -static void -_hg_array_real_set_flags(gpointer data, - guint flags) -{ - HgArray *array = data; - HgMemObject *obj; - guint i; - - if (array->name) { - hg_mem_get_object__inline(array->name, obj); - if (obj == NULL) { - hg_log_warning("[BUG] Invalid object %p to be marked: Array name", array->name); - } else { - if (!hg_mem_is_flags__inline(obj, flags)) - hg_mem_add_flags__inline(obj, flags, TRUE); - } - } - for (i = 0; i < array->n_arrays; i++) { - hg_mem_get_object__inline(array->current[i], obj); - if (obj == NULL) { - hg_log_warning("[BUG] Invalid object %p to be marked: Array %d", array->current[i], i); - } else { -#ifdef DEBUG_GC - G_STMT_START { - if ((flags & HG_MEMOBJ_MARK_AGE_MASK) != 0) { - if (!hg_mem_is_flags__inline(obj, flags)) { - hg_value_node_debug_print(__hg_file_stderr, HG_DEBUG_GC_MARK, HG_TYPE_VALUE_ARRAY, array, array->current[i], GUINT_TO_POINTER (i)); - } else { - hg_value_node_debug_print(__hg_file_stderr, HG_DEBUG_GC_ALREADYMARK, HG_TYPE_VALUE_ARRAY, array, array->current[i], GUINT_TO_POINTER (i)); - } - } - } G_STMT_END; -#endif /* DEBUG_GC */ - if (!hg_mem_is_flags__inline(obj, flags)) - hg_mem_add_flags__inline(obj, flags, TRUE); - } - } - if (array->arrays) { - hg_mem_get_object__inline(array->arrays, obj); - if (obj == NULL) { - hg_log_warning("[BUG] Invalid object %p to be marked: Array", array->arrays); - } else { -#ifdef DEBUG_GC - G_STMT_START { - if ((flags & HG_MEMOBJ_MARK_AGE_MASK) != 0) { - hg_value_node_debug_print(__hg_file_stderr, HG_DEBUG_GC_MARK, HG_TYPE_VALUE_ARRAY, array, array->arrays, GUINT_TO_POINTER (-1)); - } - } G_STMT_END; -#endif /* DEBUG_GC */ - hg_mem_add_flags__inline(obj, flags, TRUE); - } - } -} -static void -_hg_array_real_relocate(gpointer data, - HgMemRelocateInfo *info) -{ - HgArray *array = data; - guint i; +G_LOCK_DEFINE_STATIC (hgarray); - if (array->name) { - if ((gsize)array->name >= info->start && - (gsize)array->name <= info->end) { - array->name = (gchar *)((gsize)array->name + info->diff); - } - } - if ((gsize)array->arrays >= info->start && - (gsize)array->arrays <= info->end) { - array->arrays = (HgValueNode **)((gsize)array->arrays + info->diff); - array->current = (gpointer)((gsize)array->arrays + sizeof (gpointer) * array->removed_arrays + sizeof (gpointer) * array->subarray_offset); - } - for (i = 0; i < array->n_arrays; i++) { - if ((gsize)array->current[i] >= info->start && - (gsize)array->current[i] <= info->end) { - array->current[i] = (HgValueNode *)((gsize)array->current[i] + info->diff); - } - } -} +/* + * private functions + */ -static gpointer -_hg_array_real_dup(gpointer data) +/* + * public functions + */ +hg_object_t * +hg_object_array_new(hg_vm_t *vm, + guint16 length) { - HgArray *array = data, *retval; - HgMemObject *obj; + hg_object_t *retval; + hg_arraydata_t *data; - hg_mem_get_object__inline(data, obj); - if (obj == NULL) - return NULL; + hg_return_val_if_fail (vm != NULL, NULL); - retval = hg_array_new(obj->pool, array->n_arrays); - if (retval == NULL) { - hg_log_warning("Failed to duplicate an array."); - return NULL; + retval = hg_object_sized_new(vm, hg_n_alignof (sizeof (hg_arraydata_t) + sizeof (hg_object_t) * length)); + if (retval != NULL) { + HG_OBJECT_GET_TYPE (retval) = HG_OBJECT_TYPE_ARRAY; + HG_OBJECT_ARRAY (retval)->length = length; + HG_OBJECT_ARRAY (retval)->real_length = length; + data = HG_OBJECT_ARRAY_DATA (retval); + data->name[0] = 0; + if (length > 0) + data->array = (hg_object_t *)data->data; + else + data->array = NULL; } - memcpy(retval->arrays, array->current, sizeof (HgValueNode *) * array->n_arrays); - retval->name = array->name; - retval->n_arrays = array->n_arrays; return retval; } -static gpointer -_hg_array_real_copy(gpointer data) +hg_object_t * +hg_object_array_subarray_new(hg_vm_t *vm, + hg_object_t *object, + guint16 start_index, + guint16 length) { - HgArray *array = data, *retval; - HgMemObject *obj; - guint i; - gpointer p; - - hg_mem_get_object__inline(data, obj); - if (obj == NULL) - return NULL; - - if (hg_mem_is_copying(obj)) { - /* circular reference happened. */ - hg_log_warning("Circular reference happened in %p (mem: %p). copying entire object is impossible.", data, obj); - return array; - } - hg_mem_set_copying(obj); - retval = hg_array_new(obj->pool, array->n_arrays); - if (retval == NULL) { - hg_log_warning("Failed to copy an array."); - hg_mem_unset_copying(obj); - return NULL; - } - retval->name = array->name; - for (i = 0; i < array->n_arrays; i++) { - p = hg_object_copy((HgObject *)array->current[i]); - if (p == NULL) { - hg_mem_unset_copying(obj); - return NULL; - } - retval->arrays[retval->n_arrays++] = p; - } - hg_mem_unset_copying(obj); + hg_object_t *retval, **p; - return retval; -} + hg_return_val_if_fail (vm != NULL, NULL); + hg_return_val_if_fail (object != NULL, NULL); + hg_return_val_if_fail (HG_OBJECT_IS_ARRAY (object), NULL); + hg_return_val_if_fail (HG_OBJECT_ARRAY (object)->real_length > start_index, NULL); + hg_return_val_if_fail (HG_OBJECT_ARRAY (object)->real_length >= (start_index + length), NULL); -static gpointer -_hg_array_real_to_string(gpointer data) -{ - HgArray *array = data; - HgMemObject *obj; - HgString *retval, *str; - guint i; - - hg_mem_get_object__inline(data, obj); - if (obj == NULL) - return NULL; - retval = hg_string_new(obj->pool, -1); - if (retval == NULL) - return NULL; - if (array->name && array->name[0] != 0) { - hg_string_append(retval, "--", 2); - hg_string_append(retval, array->name, -1); - hg_string_append(retval, "--", 2); - hg_string_fix_string_size(retval); - - return retval; + retval = hg_object_array_new(vm, 0); + if (retval != NULL) { + p = HG_OBJECT_ARRAY_DATA (object)->array; + HG_OBJECT_ARRAY_DATA (retval)->array = &p[start_index]; + HG_OBJECT_ARRAY (retval)->real_length = length; } - if (!hg_object_is_readable(data)) { - hg_string_append(retval, "-array-", 7); - hg_string_fix_string_size(retval); - - return retval; - } - if (hg_mem_is_copying(obj)) { - /* circular reference happened. */ - gchar *name = g_strdup_printf("--circle-%p--", array); - - hg_string_append(retval, name, -1); - hg_string_fix_string_size(retval); - g_free(name); - - return retval; - } - hg_mem_set_copying(obj); - for (i = 0; i < array->n_arrays; i++) { - if (hg_string_length(retval) > 0) - hg_string_append_c(retval, ' '); - str = hg_object_to_string((HgObject *)array->current[i]); - if (str == NULL) { - hg_mem_free(retval); - hg_mem_unset_copying(obj); - return NULL; - } - if (!hg_string_concat(retval, str)) { - hg_mem_free(retval); - hg_mem_unset_copying(obj); - return NULL; - } - } - hg_string_fix_string_size(retval); - hg_mem_unset_copying(obj); return retval; } -/* - * Public Functions - */ -HgArray * -hg_array_new(HgMemPool *pool, - gint32 num) -{ - HgArray *retval; - - g_return_val_if_fail (pool != NULL, NULL); - g_return_val_if_fail (num < HG_ARRAY_MAX_SIZE + 1, NULL); - - retval = hg_mem_alloc_with_flags(pool, - sizeof (HgArray), - HG_FL_HGOBJECT | HG_FL_RESTORABLE | HG_FL_COMPLEX); - if (retval == NULL) - return NULL; - HG_OBJECT_INIT_STATE (&retval->object); - HG_OBJECT_SET_STATE (&retval->object, hg_mem_pool_get_default_access_mode(pool)); - hg_object_set_vtable(&retval->object, &__hg_array_vtable); - - retval->name = NULL; - retval->n_arrays = 0; - retval->removed_arrays = 0; - retval->subarray_offset = 0; - retval->is_subarray = FALSE; - if (num < 0) { - retval->allocated_arrays = HG_ARRAY_ALLOC_SIZE; - retval->is_fixed_size = FALSE; - } else { - retval->allocated_arrays = num; - retval->is_fixed_size = TRUE; - } - /* initialize arrays with NULL first to avoid a crash. - * when the alloc size is too big and GC is necessary to be ran. - */ - retval->arrays = NULL; - retval->arrays = hg_mem_alloc_with_flags(pool, - sizeof (HgValueNode *) * retval->allocated_arrays, - HG_FL_RESTORABLE); - retval->current = retval->arrays; - if (retval->arrays == NULL) - return NULL; - - return retval; -} - -gboolean -hg_array_append(HgArray *array, - HgValueNode *node) -{ - return hg_array_append_forcibly(array, node, FALSE); -} - gboolean -hg_array_append_forcibly(HgArray *array, - HgValueNode *node, - gboolean force) +hg_object_array_put(hg_vm_t *vm, + hg_object_t *object, + hg_object_t *data, + guint16 index) { - HgMemObject *obj, *nobj; - - g_return_val_if_fail (array != NULL, FALSE); - g_return_val_if_fail (node != NULL, FALSE); - g_return_val_if_fail (hg_object_is_readable((HgObject *)array), FALSE); - g_return_val_if_fail (hg_object_is_writable((HgObject *)array), FALSE); + hg_object_t **array; - hg_mem_get_object__inline(array, obj); - g_return_val_if_fail (obj != NULL, FALSE); - hg_mem_get_object__inline(node, nobj); - g_return_val_if_fail (nobj != NULL, FALSE); + hg_return_val_if_fail (vm != NULL, FALSE); + hg_return_val_if_fail (object != NULL, FALSE); + hg_return_val_if_fail (data != NULL, FALSE); + hg_return_val_if_fail (HG_OBJECT_IS_ARRAY (object), FALSE); + hg_return_val_if_fail (HG_OBJECT_ARRAY (object)->real_length > index, FALSE); + /* XXX: need to check the memory spool type */ - if (!force) { - if (!hg_mem_pool_is_own_object(obj->pool, node)) { - hg_log_warning("node %p isn't allocated from a pool %s\n", node, hg_mem_pool_get_name(obj->pool)); - - return FALSE; - } - } - if (obj->pool != nobj->pool) - hg_mem_pool_add_pool_reference(nobj->pool, obj->pool); - if (array->removed_arrays > 0) { - /* remove the nodes forever */ - memmove(array->arrays, array->current, sizeof (gpointer) * array->n_arrays); - array->removed_arrays = 0; - array->current = array->arrays; - } - if (!array->is_fixed_size && - array->n_arrays >= array->allocated_arrays) { - /* max array size is 65535 */ - g_return_val_if_fail (array->n_arrays < HG_ARRAY_MAX_SIZE, FALSE); - /* resize */ - gpointer p = hg_mem_resize(array->arrays, - sizeof (HgValueNode *) * (array->allocated_arrays + HG_ARRAY_ALLOC_SIZE)); - - if (p == NULL) { - hg_log_warning("Failed to resize an array."); - return FALSE; - } else { - array->current = array->arrays = p; - array->allocated_arrays += HG_ARRAY_ALLOC_SIZE; - } - } - if (array->n_arrays < array->allocated_arrays) { - array->arrays[array->n_arrays++] = node; - } else { - return FALSE; - } - - return TRUE; -} - -gboolean -hg_array_replace(HgArray *array, - HgValueNode *node, - guint index) -{ - return hg_array_replace_forcibly(array, node, index, FALSE); -} - -gboolean -hg_array_replace_forcibly(HgArray *array, - HgValueNode *node, - guint index, - gboolean force) -{ - HgMemObject *obj, *nobj; - - g_return_val_if_fail (array != NULL, FALSE); - g_return_val_if_fail (node != NULL, FALSE); - g_return_val_if_fail (index < array->n_arrays, FALSE); - g_return_val_if_fail (hg_object_is_readable((HgObject *)array), FALSE); - g_return_val_if_fail (hg_object_is_writable((HgObject *)array), FALSE); - - hg_mem_get_object__inline(array, obj); - g_return_val_if_fail (obj != NULL, FALSE); - hg_mem_get_object__inline(node, nobj); - g_return_val_if_fail (nobj != NULL, FALSE); - - if (!force) { - if (!hg_mem_pool_is_own_object(obj->pool, node)) { - hg_log_warning("node %p isn't allocated from a pool %s\n", node, hg_mem_pool_get_name(obj->pool)); - - return FALSE; - } - } - if (obj->pool != nobj->pool) - hg_mem_pool_add_pool_reference(nobj->pool, obj->pool); - array->current[index] = node; - - return TRUE; -} - -gboolean -hg_array_remove(HgArray *array, - guint index) -{ - guint i; - - g_return_val_if_fail (array != NULL, FALSE); - g_return_val_if_fail (index < array->n_arrays, FALSE); - g_return_val_if_fail (array->is_subarray == FALSE, FALSE); - g_return_val_if_fail (hg_object_is_readable((HgObject *)array), FALSE); - g_return_val_if_fail (hg_object_is_writable((HgObject *)array), FALSE); - - if (index == 0) { - /* This looks ugly hack but need to spend less time - * to remove an array node. - */ - array->removed_arrays++; - array->current = (gpointer)((gsize)array->arrays + sizeof (gpointer) * array->removed_arrays); - } else { - for (i = index; i <= array->n_arrays - 1; i++) { - array->current[i] = array->current[i + 1]; - } - } - array->n_arrays--; + array = HG_OBJECT_ARRAY_DATA (object)->array; + array[index] = data; return TRUE; } -HgValueNode * -hg_array_index(const HgArray *array, - guint index) +hg_object_t * +hg_object_array_get(hg_vm_t *vm, + const hg_object_t *object, + guint16 index) { - g_return_val_if_fail (array != NULL, NULL); - g_return_val_if_fail (index < array->n_arrays, NULL); - g_return_val_if_fail (hg_object_is_readable((HgObject *)array), NULL); + hg_object_t **array, *retval, *p; - return array->current[index]; -} - -guint -hg_array_length(HgArray *array) -{ - g_return_val_if_fail (array != NULL, 0); - g_return_val_if_fail (hg_object_is_readable((HgObject *)array), 0); - - return array->n_arrays; -} - -gboolean -hg_array_fix_array_size(HgArray *array) -{ - g_return_val_if_fail (array != NULL, FALSE); - g_return_val_if_fail (hg_object_is_readable((HgObject *)array), FALSE); - g_return_val_if_fail (hg_object_is_writable((HgObject *)array), FALSE); + hg_return_val_if_fail (vm != NULL, NULL); + hg_return_val_if_fail (object != NULL, NULL); + hg_return_val_if_fail (HG_OBJECT_IS_ARRAY (object), NULL); + hg_return_val_if_fail (HG_OBJECT_ARRAY (object)->real_length > index, NULL); - if (!array->is_fixed_size) { - gpointer p; - - if (array->removed_arrays > 0) { - /* array needs to be correct first */ - memmove(array->arrays, array->current, sizeof (gpointer) * array->n_arrays); - array->removed_arrays = 0; - } - p = hg_mem_resize(array->arrays, sizeof (gpointer) * array->n_arrays); - if (p == NULL) { - hg_log_warning("Failed to resize an array."); - return FALSE; - } - array->current = array->arrays = p; - array->allocated_arrays = array->n_arrays; - array->is_fixed_size = TRUE; - } - - return TRUE; -} + array = HG_OBJECT_ARRAY_DATA (object)->array; + p = array[index]; -HgArray * -hg_array_make_subarray(HgMemPool *pool, - HgArray *array, - guint start_index, - guint end_index) -{ - HgArray *retval; - - g_return_val_if_fail (pool != NULL, NULL); - - retval = hg_array_new(pool, 0); - if (end_index > HG_ARRAY_MAX_SIZE) { - /* makes an empty array */ + if (!HG_OBJECT_IS_COMPLEX (p)) { + /* create a copy to prevent destructive modifications */ + retval = hg_object_copy(vm, p); } else { - if (!hg_array_copy_as_subarray(array, retval, start_index, end_index)) - return NULL; + /* complex objects are allowed to be modified */ + retval = p; } return retval; } -gboolean -hg_array_copy_as_subarray(HgArray *src, - HgArray *dest, - guint start_index, - guint end_index) +hg_object_t * +hg_object_array_get_const(const hg_object_t *object, + guint16 index) { - g_return_val_if_fail (src != NULL, FALSE); - g_return_val_if_fail (dest != NULL, FALSE); - g_return_val_if_fail (start_index < src->n_arrays, FALSE); - g_return_val_if_fail (end_index < src->n_arrays, FALSE); - g_return_val_if_fail (start_index <= end_index, FALSE); - - /* validate an array */ - if (src->removed_arrays > 0) { - /* remove the nodes forever */ - memmove(src->arrays, src->current, sizeof (gpointer) * src->n_arrays); - src->removed_arrays = 0; - src->current = src->arrays; - } - /* destroy the unnecessary destination arrays */ - hg_mem_free(dest->arrays); - /* make a sub-array */ - dest->arrays = src->arrays; - dest->current = (gpointer)((gsize)dest->arrays + sizeof (gpointer) * (src->subarray_offset + start_index)); - dest->allocated_arrays = dest->n_arrays = end_index - start_index + 1; - dest->removed_arrays = 0; - dest->subarray_offset = start_index; - dest->is_subarray = TRUE; - dest->is_fixed_size = TRUE; + hg_object_t **array; - return TRUE; + hg_return_val_if_fail (object != NULL, NULL); + hg_return_val_if_fail (HG_OBJECT_IS_ARRAY (object), NULL); + hg_return_val_if_fail (HG_OBJECT_ARRAY (object)->real_length > index, NULL); + + array = HG_OBJECT_ARRAY_DATA (object)->array; + return array[index]; } gboolean -hg_array_compare(const HgArray *a, - const HgArray *b, - guint attributes_mask) +hg_object_array_compare(hg_object_t *object1, + hg_object_t *object2) { - guint i; + guint16 i; + hg_object_t *a, *b; gboolean retval = TRUE; - HgMemObject *obj; - g_return_val_if_fail (a != NULL, FALSE); - g_return_val_if_fail (b != NULL, FALSE); + hg_return_val_if_fail (object1 != NULL, FALSE); + hg_return_val_if_fail (object2 != NULL, FALSE); + hg_return_val_if_fail (HG_OBJECT_IS_ARRAY (object1), FALSE); + hg_return_val_if_fail (HG_OBJECT_IS_ARRAY (object2), FALSE); - if (a->n_arrays != b->n_arrays) + if (HG_OBJECT_ARRAY (object1)->real_length != HG_OBJECT_ARRAY (object2)->real_length) return FALSE; - hg_mem_get_object__inline(a, obj); - if (obj == NULL) - return FALSE; + G_LOCK (hgarray); + if (HG_OBJECT_OBJECT (object1)->attr.bit.is_checked) { + retval = (HG_OBJECT_OBJECT (object1)->attr.bit.is_checked == HG_OBJECT_OBJECT (object2)->attr.bit.is_checked); + G_UNLOCK (hgarray); - if (hg_mem_is_copying(obj)) { - /* postpone the decision. leave it to later comparing so far */ - return TRUE; + return retval; } - hg_mem_set_copying(obj); + /* for checking the circular reference */ + HG_OBJECT_OBJECT (object1)->attr.bit.is_checked = TRUE; + HG_OBJECT_OBJECT (object2)->attr.bit.is_checked = TRUE; + G_UNLOCK (hgarray); - for (i = 0; i < a->n_arrays; i++) { - HgValueNode *na, *nb; - - na = hg_array_index(a, i); - nb = hg_array_index(b, i); - if ((retval = hg_value_node_compare_content(na, nb, attributes_mask)) == FALSE) + for (i = 0; i < HG_OBJECT_ARRAY (object1)->real_length; i++) { + a = hg_object_array_get_const(object1, i); + b = hg_object_array_get_const(object2, i); + if (!hg_object_compare(a, b)) { + retval = FALSE; break; + } } - hg_mem_unset_copying(obj); + /* cleaning up */ + G_LOCK (hgarray); + HG_OBJECT_OBJECT (object1)->attr.bit.is_checked = FALSE; + HG_OBJECT_OBJECT (object2)->attr.bit.is_checked = FALSE; + G_UNLOCK (hgarray); return retval; } -void -hg_array_set_name(HgArray *array, - const gchar *name) -{ - HgMemObject *obj; - size_t len; - - g_return_if_fail (array != NULL); - g_return_if_fail (name != NULL && name[0] != 0); - - len = strlen(name); - hg_mem_get_object__inline(array, obj); - /* don't free 'name' here. - * it could be in the snapshot. - */ - array->name = hg_mem_alloc_with_flags(obj->pool, - sizeof (gchar) * (len + 1), - HG_FL_RESTORABLE); - memcpy(array->name, name, len); - array->name[len] = 0; -} - -const gchar * -hg_array_get_name(const HgArray *array) +gchar * +hg_object_array_dump(hg_object_t *object, + gboolean verbose) { - g_return_val_if_fail (array != NULL, NULL); + hg_return_val_if_fail (object != NULL, NULL); + hg_return_val_if_fail (HG_OBJECT_IS_ARRAY (object), NULL); - return array->name; + return g_strdup("--array--"); } diff --git a/hieroglyph/hgarray.h b/hieroglyph/hgarray.h index a9b0287..63f0092 100644 --- a/hieroglyph/hgarray.h +++ b/hieroglyph/hgarray.h @@ -1,10 +1,10 @@ /* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ /* * hgarray.h - * Copyright (C) 2005-2006 Akira TAGOH + * Copyright (C) 2005-2007 Akira TAGOH * * Authors: - * Akira TAGOH <at@gclab.org> + * Akira TAGOH <akira@tagoh.org> * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -21,51 +21,36 @@ * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ -#ifndef __HG_ARRAY_H__ -#define __HG_ARRAY_H__ +#ifndef __HIEROGLYPH_HGARRAY_H__ +#define __HIEROGLYPH_HGARRAY_H__ #include <hieroglyph/hgtypes.h> + G_BEGIN_DECLS -#define hg_array_free(obj) hg_mem_free(obj) -HgArray *hg_array_new (HgMemPool *pool, - gint32 num); -gboolean hg_array_append (HgArray *array, - HgValueNode *node); -gboolean hg_array_append_forcibly (HgArray *array, - HgValueNode *node, - gboolean force); -gboolean hg_array_replace (HgArray *array, - HgValueNode *node, - guint index); -gboolean hg_array_replace_forcibly(HgArray *array, - HgValueNode *node, - guint index, - gboolean force); -gboolean hg_array_remove (HgArray *array, - guint index); -HgValueNode *hg_array_index (const HgArray *array, - guint index); -guint hg_array_length (HgArray *array); -gboolean hg_array_fix_array_size (HgArray *array); -HgArray *hg_array_make_subarray (HgMemPool *pool, - HgArray *array, - guint start_index, - guint end_index); -gboolean hg_array_copy_as_subarray(HgArray *src, - HgArray *dest, - guint start_index, - guint end_index); -gboolean hg_array_compare (const HgArray *a, - const HgArray *b, - guint attributes_mask); -void hg_array_set_name (HgArray *array, - const gchar *name); -const gchar *hg_array_get_name (const HgArray *array); +hg_object_t *hg_object_array_new (hg_vm_t *vm, + guint16 length) G_GNUC_WARN_UNUSED_RESULT; +hg_object_t *hg_object_array_subarray_new(hg_vm_t *vm, + hg_object_t *object, + guint16 start_index, + guint16 length) G_GNUC_WARN_UNUSED_RESULT; +gboolean hg_object_array_put (hg_vm_t *vm, + hg_object_t *object, + hg_object_t *item, + guint16 index); +hg_object_t *hg_object_array_get (hg_vm_t *vm, + const hg_object_t *object, + guint16 index); +hg_object_t *hg_object_array_get_const (const hg_object_t *object, + guint16 index); +gboolean hg_object_array_compare (hg_object_t *object1, + hg_object_t *object2); +gchar *hg_object_array_dump (hg_object_t *object, + gboolean verbose) G_GNUC_MALLOC; G_END_DECLS -#endif /* __HG_ARRAY_H__ */ +#endif /* __HIEROGLYPH_HGARRAY_H__ */ diff --git a/hieroglyph/hgbtree.c b/hieroglyph/hgbtree.c deleted file mode 100644 index 3e07ed1..0000000 --- a/hieroglyph/hgbtree.c +++ /dev/null @@ -1,947 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* - * hgbtree.c - * Copyright (C) 2006 Akira TAGOH - * - * Authors: - * Akira TAGOH <at@gclab.org> - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - */ -#ifdef HAVE_CONFIG_H -#include <config.h> -#endif - -#include "hgbtree.h" -#include "hglog.h" -#include "hgmem.h" - - -static void _hg_btree_page_real_free (gpointer data); -static void _hg_btree_page_real_set_flags (gpointer data, - guint flags); -static void _hg_btree_page_real_relocate (gpointer data, - HgMemRelocateInfo *info); -static void _hg_btree_page_destroy (HgBTreePage *page); -static void _hg_btree_real_free (gpointer data); -static void _hg_btree_real_set_flags (gpointer data, - guint flags); -static void _hg_btree_real_relocate (gpointer data, - HgMemRelocateInfo *info); -static HgBTreePage *hg_btree_page_new (HgBTree *tree); -static gboolean hg_btree_page_insert (HgBTreePage *page, - gpointer *key, - gpointer *val, - gboolean replace, - HgBTreePage **newpage); -static void hg_btree_page_insert_data (HgBTreePage *page, - gpointer *key, - gpointer *val, - guint16 pos, - HgBTreePage **newpage); -static void hg_btree_page_blance (HgBTreePage *page, - gpointer *key, - gpointer *val, - guint16 pos, - HgBTreePage **newpage); -static gboolean hg_btree_page_remove (HgBTreePage *page, - gpointer *key, - gpointer *val, - gboolean *need_restore); -static gboolean hg_btree_page_remove_data (HgBTreePage *page, - guint16 pos); -static gboolean hg_btree_page_restore (HgBTreePage *page, - guint16 pos); -static void hg_btree_page_restore_right_blance(HgBTreePage *page, - guint16 pos); -static void hg_btree_page_restore_left_blance (HgBTreePage *page, - guint16 pos); -static gboolean hg_btree_page_combine (HgBTreePage *page, - guint16 pos); - - -static HgObjectVTable __hg_btree_page_vtable = { - .free = _hg_btree_page_real_free, - .set_flags = _hg_btree_page_real_set_flags, - .relocate = _hg_btree_page_real_relocate, - .dup = NULL, - .copy = NULL, - .to_string = NULL, -}; -static HgObjectVTable __hg_btree_vtable = { - .free = _hg_btree_real_free, - .set_flags = _hg_btree_real_set_flags, - .relocate = _hg_btree_real_relocate, - .dup = NULL, - .copy = NULL, - .to_string = NULL, -}; - - -/* - * Private Functions - */ -static void -_hg_btree_page_real_free(gpointer data) -{ - HgBTreePage *page = data; - guint16 i; - - for (i = 0; i < page->n_data; i++) { - /* no need to destroy page->page[i] here. it will be destroyed - * by GC sweeper. - */ - if (page->parent->key_destroy_func) - page->parent->key_destroy_func(page->key[i]); - if (page->parent->val_destroy_func) - page->parent->val_destroy_func(page->val[i]); - } - /* no need to destroy page->page[page->n_data] here. it will be - * destroyed by GC sweeper. - */ - hg_mem_free(page->key); - hg_mem_free(page->val); - hg_mem_free(page->page); - page->n_data = 0; - page->key = NULL; - page->val = NULL; - page->page = NULL; -} - -static void -_hg_btree_page_real_set_flags(gpointer data, - guint flags) -{ - HgBTreePage *page = data; - guint16 i; - HgMemObject *obj; - - if (page->key) { - hg_mem_get_object__inline(page->key, obj); - if (obj == NULL) { - hg_log_warning("[BUG] Invalid object %p to be marked: HgBTreePage key", - page->key); - } else { - hg_mem_add_flags__inline(obj, flags, TRUE); - } - } - if (page->val) { - hg_mem_get_object__inline(page->val, obj); - if (obj == NULL) { - hg_log_warning("[BUG] Invalid object %p to be marked: HgBTreePage val", - page->val); - } else { - hg_mem_add_flags__inline(obj, flags, TRUE); - } - } - if (page->page == NULL && page->n_data > 0) { - hg_log_warning("[BUG] HgBTree structure corruption. no real data, but it says there are %d item(s).", - page->n_data); - } - if (page->page) { - hg_mem_get_object__inline(page->page, obj); - if (obj == NULL) { - hg_log_warning("[BUG] Invalid object %p to be marked: HgBTreePage page", - page->page); - } else { - hg_mem_add_flags__inline(obj, flags, TRUE); - } - } else { - return; - } - - if (!page->parent->disable_marking) { - for (i = 0; i < page->n_data; i++) { - if (page->page[i]) { - hg_mem_get_object__inline(page->page[i], obj); - if (obj == NULL) { - hg_log_warning("[BUG] Invalid object %p to be marked: HgBTreePage page[%d]", - page->page[i], i); - } else { - hg_mem_add_flags__inline(obj, flags, TRUE); - } - } - hg_mem_get_object__inline(page->val[i], obj); - if (obj == NULL) { - hg_log_warning("[BUG] Invalid object %p to be marked: HgBTreePage val[%d]", - page->val[i], i); - } else { - hg_mem_add_flags__inline(obj, flags, TRUE); - } - } - if (page->page[page->n_data]) { - hg_mem_get_object__inline(page->page[page->n_data], obj); - if (obj == NULL) { - hg_log_warning("[BUG] Invalid object %p to be marked: HgBTreePage page[%d]", - page->page[page->n_data], page->n_data); - } else { - hg_mem_add_flags__inline(obj, flags, TRUE); - } - } - } -} - -static void -_hg_btree_page_real_relocate(gpointer data, - HgMemRelocateInfo *info) -{ - HgBTreePage *page = data; - guint16 i; - - if ((gsize)page->page >= info->start && - (gsize)page->page <= info->end) { - page->page = (gpointer)((gsize)page->page + info->diff); - } - if ((gsize)page->key >= info->start && - (gsize)page->key <= info->end) { - page->key = (gpointer)((gsize)page->key + info->diff); - } - if ((gsize)page->val >= info->start && - (gsize)page->val <= info->end) { - page->val = (gpointer)((gsize)page->val + info->diff); - } - if (!page->parent->disable_marking) { - for (i = 0; i < page->n_data; i++) { - if (page->page[i]) { - if ((gsize)page->page[i] >= info->start && - (gsize)page->page[i] <= info->end) { - page->page[i] = (gpointer)((gsize)page->page[i] + info->diff); - } - } - if ((gsize)page->val[i] >= info->start && - (gsize)page->val[i] <= info->end) { - page->val[i] = (gpointer)((gsize)page->val[i] + info->diff); - } - } - if (page->page[page->n_data]) { - if ((gsize)page->page[page->n_data] >= info->start && - (gsize)page->page[page->n_data] <= info->end) { - page->page[page->n_data] = (gpointer)((gsize)page->page[page->n_data] + info->diff); - } - } - } -} - -static void -_hg_btree_page_destroy(HgBTreePage *page) -{ - if (page != NULL) { - guint16 i; - - if (page->n_data == 0 && - page->key == NULL && - page->val == NULL && - page->page == NULL) { - /* this may be already freed */ - } else { - for (i = 0; i < page->n_data; i++) { - _hg_btree_page_destroy(page->page[i]); - } - _hg_btree_page_destroy(page->page[page->n_data]); - hg_mem_free(page); - } - } -} - -static void -_hg_btree_real_free(gpointer data) -{ - HgBTree *tree = data; - - _hg_btree_page_destroy(tree->root); -} - -static void -_hg_btree_real_set_flags(gpointer data, - guint flags) -{ - HgBTree *tree = data; - HgMemObject *obj; - - if (tree->root) { - hg_mem_get_object__inline(tree->root, obj); - if (obj == NULL) { - hg_log_warning("[BUG] Invalid object %p to be marked: HgBTree", tree->root); - } else { - if (!hg_mem_is_flags__inline(obj, flags)) - hg_mem_add_flags__inline(obj, flags, TRUE); - } - } -} - -static void -_hg_btree_real_relocate(gpointer data, - HgMemRelocateInfo *info) -{ - HgBTree *tree = data; - - if ((gsize)tree->root >= info->start && - (gsize)tree->root <= info->end) { - tree->root = (gpointer)((gsize)tree->root + info->diff); - } -} - -static HgBTreePage * -hg_btree_page_new(HgBTree *tree) -{ - HgBTreePage *retval; - HgMemObject *obj; - - hg_mem_get_object__inline(tree, obj); - /* HgBTree's free method will takes care of this object age. - * HG_FL_LOCK is necessary to avoid destroying object at GC - */ - retval = hg_mem_alloc_with_flags(obj->pool, sizeof (HgBTreePage), - HG_FL_RESTORABLE | HG_FL_COMPLEX | HG_FL_LOCK | HG_FL_HGOBJECT); - if (retval == NULL) - return NULL; - HG_OBJECT_INIT_STATE (&retval->object); - HG_OBJECT_SET_STATE (&retval->object, hg_mem_pool_get_default_access_mode(obj->pool)); - hg_object_set_vtable(&retval->object, &__hg_btree_page_vtable); - - retval->parent = tree; - /* it may be entered into GC during allocating memory. - * need to initialize with NULL to avoid corruption. - */ - retval->key = NULL; - retval->val = NULL; - retval->page = NULL; - retval->key = hg_mem_alloc_with_flags(obj->pool, - sizeof (gpointer) * tree->page_size * 2, - HG_FL_RESTORABLE | HG_FL_COMPLEX | HG_FL_LOCK); - retval->val = hg_mem_alloc_with_flags(obj->pool, - sizeof (gpointer) * tree->page_size * 2, - HG_FL_RESTORABLE | HG_FL_COMPLEX | HG_FL_LOCK); - retval->page = hg_mem_alloc_with_flags(obj->pool, - sizeof (gpointer) * (tree->page_size * 2 + 1), - HG_FL_RESTORABLE | HG_FL_COMPLEX | HG_FL_LOCK); - if (retval->key == NULL || - retval->val == NULL || - retval->page == NULL) { - return NULL; - } - - return retval; -} - -static gboolean -hg_btree_page_insert(HgBTreePage *page, - gpointer *key, - gpointer *val, - gboolean replace, - HgBTreePage **newpage) -{ - guint16 i; - gboolean retval; - - if (page == NULL) { - *newpage = NULL; - return FALSE; - } - if (page->key[page->n_data - 1] >= *key) { - for (i = 0; i < page->n_data && page->key[i] < *key; i++); - if (i < page->n_data && page->key[i] == *key) { - if (replace) { - if (page->parent->val_destroy_func) - page->parent->val_destroy_func(page->val[i]); - page->key[i] = *key; - page->val[i] = *val; - } - return TRUE; - } - } else { - i = page->n_data; - } - retval = hg_btree_page_insert(page->page[i], key, val, replace, newpage); - if (!retval) { - if (page->n_data < (page->parent->page_size * 2)) { - hg_btree_page_insert_data(page, key, val, i, newpage); - retval = TRUE; - } else { - hg_btree_page_blance(page, key, val, i, newpage); - retval = FALSE; - } - } - return retval; -} - -static void -hg_btree_page_insert_data(HgBTreePage *page, - gpointer *key, - gpointer *val, - guint16 pos, - HgBTreePage **newpage) -{ - guint16 i; - - for (i = page->n_data; i > pos; i--) { - page->key[i] = page->key[i - 1]; - page->val[i] = page->val[i - 1]; - page->page[i + 1] = page->page[i]; - } - page->key[pos] = *key; - page->val[pos] = *val; - page->page[pos + 1] = *newpage; - page->n_data++; -} - -static void -hg_btree_page_blance(HgBTreePage *page, - gpointer *key, - gpointer *val, - guint16 pos, - HgBTreePage **newpage) -{ - guint16 i, size, page_size = page->parent->page_size; - HgBTreePage *new; - - if (pos <= page_size) - size = page_size; - else - size = page_size + 1; - new = hg_btree_page_new(page->parent); - if (new == NULL) { - hg_log_warning("Failed to allocate a memory."); - return; - } - for (i = size + 1; i <= page_size * 2; i++) { - new->key[i - size - 1] = page->key[i - 1]; - new->val[i - size - 1] = page->val[i - 1]; - new->page[i - size] = page->page[i]; - } - new->n_data = page_size * 2 - size; - page->n_data = size; - if (pos <= page_size) - hg_btree_page_insert_data(page, key, val, pos, newpage); - else - hg_btree_page_insert_data(new, key, val, pos - size, newpage); - *key = page->key[page->n_data - 1]; - *val = page->val[page->n_data - 1]; - new->page[0] = page->page[page->n_data]; - page->n_data--; - *newpage = new; -} - -static gboolean -hg_btree_page_remove(HgBTreePage *page, - gpointer *key, - gpointer *val, - gboolean *need_restore) -{ - HgBTreePage *p; - guint16 i; - gboolean removed = FALSE; - - if (page == NULL) - return FALSE; - if (page->key[page->n_data - 1] >= *key) - for (i = 0; i < page->n_data && page->key[i] < *key; i++); - else - i = page->n_data; - if (i < page->n_data && page->key[i] == *key) { - removed = TRUE; - if (page->parent->key_destroy_func) - page->parent->key_destroy_func(page->key[i]); - if (page->parent->val_destroy_func) - page->parent->val_destroy_func(page->val[i]); - if ((p = page->page[i + 1]) != NULL) { - while (p->page[0] != NULL) - p = p->page[0]; - page->key[i] = *key = p->key[0]; - page->val[i] = *val = p->val[0]; - removed = hg_btree_page_remove(page->page[i + 1], key, val, need_restore); - if (*need_restore) - *need_restore = hg_btree_page_restore(page, i + 1); - } else { - *need_restore = hg_btree_page_remove_data(page, i); - } - } else { - removed = hg_btree_page_remove(page->page[i], key, val, need_restore); - if (*need_restore) - *need_restore = hg_btree_page_restore(page, i); - } - - return removed; -} - -static gboolean -hg_btree_page_remove_data(HgBTreePage *page, - guint16 pos) -{ - while (++pos < page->n_data) { - page->key[pos - 1] = page->key[pos]; - page->val[pos - 1] = page->val[pos]; - page->page[pos] = page->page[pos + 1]; - } - - return --(page->n_data) < page->parent->page_size; -} - -static gboolean -hg_btree_page_restore(HgBTreePage *page, - guint16 pos) -{ - guint16 page_size = page->parent->page_size; - - if (pos > 0) { - if (page->page[pos - 1]->n_data > page_size) - hg_btree_page_restore_right_blance(page, pos); - else - return hg_btree_page_combine(page, pos); - } else { - if (page->page[1]->n_data > page_size) - hg_btree_page_restore_left_blance(page, 1); - else - return hg_btree_page_combine(page, 1); - } - - return FALSE; -} - -static void -hg_btree_page_restore_right_blance(HgBTreePage *page, - guint16 pos) -{ - guint16 i; - HgBTreePage *left, *right; - - left = page->page[pos - 1]; - right = page->page[pos]; - - for (i = right->n_data; i > 0; i--) { - right->key[i] = right->key[i - 1]; - right->val[i] = right->val[i - 1]; - right->page[i + 1] = right->page[i]; - } - right->page[1] = right->page[0]; - right->n_data++; - right->key[0] = page->key[pos - 1]; - right->val[0] = page->val[pos - 1]; - page->key[pos - 1] = left->key[left->n_data - 1]; - page->val[pos - 1] = left->val[left->n_data - 1]; - right->page[0] = left->page[left->n_data]; - left->n_data--; -} - -static void -hg_btree_page_restore_left_blance(HgBTreePage *page, - guint16 pos) -{ - guint16 i; - HgBTreePage *left, *right; - - left = page->page[pos - 1]; - right = page->page[pos]; - left->n_data++; - left->key[left->n_data - 1] = page->key[pos - 1]; - left->val[left->n_data - 1] = page->val[pos - 1]; - left->page[left->n_data] = right->page[0]; - page->key[pos - 1] = right->key[0]; - page->val[pos - 1] = right->val[0]; - right->page[0] = right->page[1]; - right->n_data--; - for (i = 1; i <= right->n_data; i++) { - right->key[i - 1] = right->key[i]; - right->val[i - 1] = right->val[i]; - right->page[i] = right->page[i + 1]; - } -} - -static gboolean -hg_btree_page_combine(HgBTreePage *page, - guint16 pos) -{ - guint16 i; - HgBTreePage *left, *right; - gboolean need_restore; - - left = page->page[pos - 1]; - right = page->page[pos]; - left->n_data++; - left->key[left->n_data - 1] = page->key[pos - 1]; - left->val[left->n_data - 1] = page->val[pos - 1]; - left->page[left->n_data] = right->page[0]; - for (i = 1; i <= right->n_data; i++) { - left->n_data++; - left->key[left->n_data - 1] = right->key[i - 1]; - left->val[left->n_data - 1] = right->val[i - 1]; - left->page[left->n_data] = right->page[i]; - } - need_restore = hg_btree_page_remove_data(page, pos - 1); - /* 'right' page could be freed here though, it might be referred from - * somewhere. so the actual destroying the page relies on GC. - */ - - return need_restore; -} - -static void -hg_btree_page_foreach(HgBTreePage *page, - HgTraverseFunc func, - gpointer data) -{ - if (page != NULL) { - guint16 i; - - for (i = 0; i < page->n_data; i++) { - hg_btree_page_foreach(page->page[i], func, data); - if (!func(page->key[i], page->val[i], data)) - return; - } - hg_btree_page_foreach(page->page[page->n_data], func, data); - } -} - -static gboolean -hg_btree_page_get_iter(HgBTreePage *page, - guint *sequence, - HgBTreeIter iter, - gboolean valid_stamp) -{ - gboolean retval = FALSE; - - if (page != NULL) { - guint16 i; - - for (i = 0; i < page->n_data; i++) { - retval = hg_btree_page_get_iter(page->page[i], sequence, iter, valid_stamp); - if (retval) { - return retval; - } else { - if (valid_stamp) { - if (*sequence == iter->seq) { - iter->key = page->key[i]; - iter->val = page->val[i]; - iter->seq++; - - return TRUE; - } - } else { - if (iter->key == page->key[i]) { - iter->seq = *sequence; - - return TRUE; - } else if (page->key[i] > iter->key) { - iter->seq = *sequence - 1; - - return TRUE; - } - } - (*sequence)++; - } - } - retval = hg_btree_page_get_iter(page->page[page->n_data], sequence, iter, valid_stamp); - } - - return retval; -} - -static gboolean -_hg_btree_count_traverse(gpointer key, - gpointer val, - gpointer data) -{ - guint *len = data; - - (*len)++; - - return TRUE; -} - -/* - * Public Functions - */ -HgBTree * -hg_btree_new(HgMemPool *pool, - guint16 page_size) -{ - return hg_btree_new_full(pool, page_size, NULL, NULL); -} - -HgBTree * -hg_btree_new_full(HgMemPool *pool, - guint16 page_size, - GDestroyNotify key_destroy_func, - GDestroyNotify val_destroy_func) -{ - HgBTree *retval; - - g_return_val_if_fail (pool != NULL, NULL); - g_return_val_if_fail (page_size <= G_MAXINT16, NULL); - - retval = hg_mem_alloc_with_flags(pool, sizeof (HgBTree), - HG_FL_RESTORABLE | HG_FL_COMPLEX | HG_FL_HGOBJECT); - if (retval == NULL) - return NULL; - HG_OBJECT_INIT_STATE (&retval->object); - HG_OBJECT_SET_STATE (&retval->object, hg_mem_pool_get_default_access_mode(pool)); - hg_object_set_vtable(&retval->object, &__hg_btree_vtable); - - retval->page_size = page_size; - retval->root = NULL; - retval->key_destroy_func = key_destroy_func; - retval->val_destroy_func = val_destroy_func; - retval->disable_marking = FALSE; - - return retval; -} - -void -hg_btree_add(HgBTree *tree, - gpointer key, - gpointer val) -{ - gboolean inserted; - HgBTreePage *page, *newpage = NULL; - gpointer pkey, pval; - - g_return_if_fail (tree != NULL); - - pkey = key; - pval = val; - inserted = hg_btree_page_insert(tree->root, &pkey, &pval, FALSE, &newpage); - if (!inserted) { - page = hg_btree_page_new(tree); - if (page == NULL) { - hg_log_warning("Failed to allocate a tree page."); - return; - } - page->n_data = 1; - page->key[0] = pkey; - page->val[0] = pval; - page->page[0] = tree->root; - page->page[1] = newpage; - tree->root = page; - } -} - -void -hg_btree_replace(HgBTree *tree, - gpointer key, - gpointer val) -{ - gboolean inserted; - HgBTreePage *page, *newpage = NULL; - gpointer pkey, pval; - - g_return_if_fail (tree != NULL); - - pkey = key; - pval = val; - inserted = hg_btree_page_insert(tree->root, &pkey, &pval, TRUE, &newpage); - if (!inserted) { - page = hg_btree_page_new(tree); - page->n_data = 1; - page->key[0] = pkey; - page->val[0] = pval; - page->page[0] = tree->root; - page->page[1] = newpage; - tree->root = page; - } -} - -void -hg_btree_remove(HgBTree *tree, - gpointer key) -{ - HgBTreePage *page; - gboolean removed, need_restore = FALSE; - gpointer pkey, pval = NULL; - - g_return_if_fail (tree != NULL); - - pkey = key; - removed = hg_btree_page_remove(tree->root, &pkey, &pval, &need_restore); - if (removed) { - if (tree->root->n_data == 0) { - page = tree->root; - tree->root = tree->root->page[0]; - /* 'page' page could be freed here though, it might be - * referred from somewhere. so the actual destroying - * the page relies on GC. - */ - } - } -} - -gpointer -hg_btree_find(HgBTree *tree, - gpointer key) -{ - HgBTreePage *page; - - g_return_val_if_fail (tree != NULL, NULL); - - page = tree->root; - while (page != NULL) { - guint16 i; - - if (page->key[page->n_data - 1] >= key) { - for (i = 0; i < page->n_data && page->key[i] < key; i++); - if (i < page->n_data && page->key[i] == key) - return page->val[i]; - } else { - i = page->n_data; - } - page = page->page[i]; - } - - return NULL; -} - -gpointer -hg_btree_find_near(HgBTree *tree, - gpointer key) -{ - HgBTreePage *page, *prev = NULL; - guint16 i = 0, prev_pos = 0; - - g_return_val_if_fail (tree != NULL, NULL); - - page = tree->root; - while (page != NULL) { - if (page->key[page->n_data - 1] >= key) { - for (i = 0; i < page->n_data && page->key[i] < key; i++); - if (i < page->n_data && page->key[i] == key) - return page->val[i]; - prev = page; - prev_pos = i; - } else { - i = page->n_data; - } - page = page->page[i]; - } - if (prev) { - if (prev_pos < prev->n_data) { - /* prev->val[i - 1] should be less than key */ - return prev->val[prev_pos]; - } - /* no items is bigger than key found. */ - } - - return NULL; -} - -void -hg_btree_foreach(HgBTree *tree, - HgTraverseFunc func, - gpointer data) -{ - g_return_if_fail (tree != NULL); - g_return_if_fail (func != NULL); - - hg_btree_page_foreach(tree->root, func, data); -} - -HgBTreeIter -hg_btree_iter_new(void) -{ - HgBTreeIter iter = g_new(struct _HieroGlyphBTreeIter, 1); - - iter->id = NULL; - iter->stamp = NULL; - iter->seq = 0; - iter->key = NULL; - iter->val = NULL; - - return iter; -} - -void -hg_btree_iter_free(HgBTreeIter iter) -{ - g_free(iter); -} - -gboolean -hg_btree_get_iter_first(HgBTree *tree, - HgBTreeIter iter) -{ - guint sequence = 0; - - g_return_val_if_fail (tree != NULL, FALSE); - g_return_val_if_fail (iter != NULL, FALSE); - - iter->id = tree; - iter->stamp = tree->root; - iter->seq = 0; - - return hg_btree_page_get_iter(tree->root, &sequence, iter, TRUE); -} - -gboolean -hg_btree_get_iter_next(HgBTree *tree, - HgBTreeIter iter) -{ - guint sequence = 0; - - g_return_val_if_fail (tree != NULL, FALSE); - g_return_val_if_fail (iter != NULL, FALSE); - g_return_val_if_fail (iter->id == tree, FALSE); - g_return_val_if_fail (iter->stamp == tree->root, FALSE); - - return hg_btree_page_get_iter(tree->root, &sequence, iter, TRUE); -} - -gboolean -hg_btree_is_iter_valid(HgBTree *tree, - HgBTreeIter iter) -{ - g_return_val_if_fail (tree != NULL, FALSE); - g_return_val_if_fail (iter != NULL, FALSE); - g_return_val_if_fail (iter->id == tree, FALSE); - - return iter->stamp == tree->root; -} - -gboolean -hg_btree_update_iter(HgBTree *tree, - HgBTreeIter iter) -{ - gboolean retval; - guint sequence = 0; - - g_return_val_if_fail (tree != NULL, FALSE); - g_return_val_if_fail (iter != NULL, FALSE); - g_return_val_if_fail (iter->id == tree, FALSE); - - retval = hg_btree_page_get_iter(tree->root, &sequence, iter, FALSE); - if (retval) { - iter->seq++; - iter->stamp = tree->root; - } - - return retval; -} - -guint -hg_btree_length(HgBTree *tree) -{ - guint retval = 0; - - hg_btree_foreach(tree, _hg_btree_count_traverse, &retval); - - return retval; -} - -void -hg_btree_allow_marking(HgBTree *tree, - gboolean flag) -{ - g_return_if_fail (tree != NULL); - - tree->disable_marking = (flag ? FALSE : TRUE); -} diff --git a/hieroglyph/hgbtree.h b/hieroglyph/hgbtree.h deleted file mode 100644 index 5bedaac..0000000 --- a/hieroglyph/hgbtree.h +++ /dev/null @@ -1,100 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* - * hgbtree.h - * Copyright (C) 2006 Akira TAGOH - * - * Authors: - * Akira TAGOH <at@gclab.org> - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - */ -#ifndef __HG_BTREE_H__ -#define __HG_BTREE_H__ - -#include <hieroglyph/hgtypes.h> - -G_BEGIN_DECLS - -typedef struct _HieroGlyphBTreePage HgBTreePage; -typedef struct _HieroGlyphBTree HgBTree; -typedef struct _HieroGlyphBTreeIter *HgBTreeIter; - -struct _HieroGlyphBTreePage { - HgObject object; - HgBTree *parent; - gpointer *key; - gpointer *val; - HgBTreePage **page; - guint16 n_data; -}; - -struct _HieroGlyphBTree { - HgObject object; - HgBTreePage *root; - GDestroyNotify key_destroy_func; - GDestroyNotify val_destroy_func; - guint16 page_size; - gboolean disable_marking : 1; -}; - -struct _HieroGlyphBTreeIter { - gpointer id; - gpointer stamp; - guint seq; - gpointer key; - gpointer val; -}; - - -HgBTree *hg_btree_new (HgMemPool *pool, - guint16 page_size); -HgBTree *hg_btree_new_full (HgMemPool *pool, - guint16 page_size, - GDestroyNotify key_destroy_func, - GDestroyNotify val_destroy_func); -void hg_btree_add (HgBTree *tree, - gpointer key, - gpointer val); -void hg_btree_replace (HgBTree *tree, - gpointer key, - gpointer val); -void hg_btree_remove (HgBTree *tree, - gpointer key); -gpointer hg_btree_find (HgBTree *tree, - gpointer key); -gpointer hg_btree_find_near(HgBTree *tree, - gpointer key); -void hg_btree_foreach (HgBTree *tree, - HgTraverseFunc func, - gpointer data); -guint hg_btree_length (HgBTree *tree); -/* iterator */ -HgBTreeIter hg_btree_iter_new (void); -void hg_btree_iter_free (HgBTreeIter iter); -gboolean hg_btree_get_iter_first(HgBTree *tree, - HgBTreeIter iter); -gboolean hg_btree_get_iter_next (HgBTree *tree, - HgBTreeIter iter); -gboolean hg_btree_is_iter_valid (HgBTree *tree, - HgBTreeIter iter); -gboolean hg_btree_update_iter (HgBTree *tree, - HgBTreeIter iter); -void hg_btree_allow_marking (HgBTree *tree, - gboolean flag); - -G_END_DECLS - -#endif /* __HG_BTREE_H__ */ diff --git a/hieroglyph/hgdevice.c b/hieroglyph/hgdevice.c deleted file mode 100644 index 2d5f233..0000000 --- a/hieroglyph/hgdevice.c +++ /dev/null @@ -1,181 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* - * hgdevice.c - * Copyright (C) 2005-2006 Akira TAGOH - * - * Authors: - * Akira TAGOH <at@gclab.org> - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - */ -#ifdef HAVE_CONFIG_H -#include <config.h> -#endif - -#include <string.h> -#include <gmodule.h> -#include "hgdevice.h" -#include "hglog.h" - -/* - * Private Functions - */ -static HgDevice * -_hg_device_open(const gchar *filename) -{ - GModule *module; - HgDevice *retval = NULL; - gpointer open_symbol = NULL, close_symbol = NULL; - - if ((module = g_module_open(filename, G_MODULE_BIND_LAZY | G_MODULE_BIND_LOCAL)) != NULL) { - g_module_symbol(module, "device_open", &open_symbol); - g_module_symbol(module, "device_close", &close_symbol); - if (open_symbol && close_symbol) { - retval = ((HgDeviceOpenFunc)open_symbol) (); - } else { - hg_log_warning(g_module_error()); - g_module_close(module); - - return NULL; - } -#ifdef DEBUG_MODULES - } else { - hg_log_warning(g_module_error()); -#endif /* DEBUG_MODULES */ - } - - return retval; -} - -/* - * Public Functions - */ -HgDevice * -hg_device_new(const gchar *name) -{ - HgDevice *retval = NULL; - gchar *realname, *modulename, *fullmodname; - const gchar *modpath; - - g_return_val_if_fail (name != NULL, NULL); - - realname = g_path_get_basename(name); - modulename = g_strdup_printf("lib%s-device.so", realname); - if ((modpath = g_getenv("HIEROGLYPH_DEVICE_PATH")) != NULL) { - gchar **path_list = g_strsplit(modpath, G_SEARCHPATH_SEPARATOR_S, -1); - gchar *p, *path; - gint i = 0; - size_t len; - - while (path_list[i]) { - p = path_list[i]; - - while (*p && g_ascii_isspace(*p)) - p++; - len = strlen(p); - while (len > 0 && g_ascii_isspace(p[len - 1])) - len--; - path = g_strndup(p, len); - if (path[0] != 0) { - fullmodname = g_build_filename(path, modulename, NULL); - retval = _hg_device_open(fullmodname); - g_free(fullmodname); - } - g_free(path); - if (retval != NULL) { - break; - } - i++; - } - g_strfreev(path_list); - } - if (retval == NULL) { - fullmodname = g_build_filename(HIEROGLYPH_DEVICEDIR, modulename, NULL); - retval = _hg_device_open(fullmodname); - g_free(fullmodname); - } - if (retval == NULL) - hg_log_warning("No `%s' device module found.", realname); - - g_free(realname); - g_free(modulename); - - return retval; -} - -void -hg_device_destroy(HgDevice *device) -{ - g_return_if_fail (device != NULL); -} - -gboolean -hg_device_draw(HgDevice *device, - HgPage *page) -{ - GList *l; - HgRender *render; - gboolean retval = TRUE; - - g_return_val_if_fail (device != NULL, FALSE); - g_return_val_if_fail (page != NULL, FALSE); - g_return_val_if_fail (device->vtable != NULL, FALSE); - - if (device->vtable->initialize) { - if (!device->vtable->initialize(device, page)) - return FALSE; - } else { - /* page initialization function is a must */ - return FALSE; - } - for (l = page->node; l != NULL; l = g_list_next(l)) { - render = l->data; - - switch (render->u.type) { - case HG_RENDER_EOFILL: - if (device->vtable->eofill) - if (!device->vtable->eofill(device, &render->u.fill)) - retval = FALSE; - break; - case HG_RENDER_FILL: - if (device->vtable->fill) - if (!device->vtable->fill(device, &render->u.fill)) - retval = FALSE; - break; - case HG_RENDER_STROKE: - if (device->vtable->stroke) - if (!device->vtable->stroke(device, &render->u.stroke)) - retval = FALSE; - break; - case HG_RENDER_DEBUG: - if (render->u.debug.func) - render->u.debug.func(render->u.debug.data); - break; - default: - hg_log_warning("Unknown rendering code %d\n", render->u.type); - break; - } - } - if (device->vtable->finalize) { - if (!device->vtable->finalize(device)) - return FALSE; - } else { - /* page finalization function is a must */ - return FALSE; - } - - return retval; -} diff --git a/hieroglyph/hgdevice.h b/hieroglyph/hgdevice.h deleted file mode 100644 index ec6c957..0000000 --- a/hieroglyph/hgdevice.h +++ /dev/null @@ -1,64 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* - * hgdevice.h - * Copyright (C) 2006 Akira TAGOH - * - * Authors: - * Akira TAGOH <at@gclab.org> - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - */ -#ifndef __HG_DEVICE_H__ -#define __HG_DEVICE_H__ - -#include <gmodule.h> -#include <hieroglyph/hgtypes.h> - -G_BEGIN_DECLS - - -typedef HgDevice * (*HgDeviceOpenFunc) (void); -typedef void (*HgDeviceCloseFunc) (HgDevice *device); - -struct _HieroGlyphDeviceVTable { - gboolean (* initialize) (HgDevice *device, - HgPage *page); - gboolean (* finalize) (HgDevice *device); - gboolean (* eofill) (HgDevice *device, - HgRenderFill *data); - gboolean (* fill) (HgDevice *device, - HgRenderFill *data); - gboolean (* stroke) (HgDevice *device, - HgRenderStroke *data); -}; - -struct _HieroGlyphDevice { - HgDeviceVTable *vtable; - gdouble width; - gdouble height; -}; - - -HgDevice *hg_device_new(const gchar *name); - -/* device control functions */ -void hg_device_destroy(HgDevice *device); -gboolean hg_device_draw (HgDevice *device, - HgPage *page); - -G_END_DECLS - -#endif /* __HG_DEVICE_H__ */ diff --git a/hieroglyph/hgdict.c b/hieroglyph/hgdict.c index f140d1d..cd45e5b 100644 --- a/hieroglyph/hgdict.c +++ b/hieroglyph/hgdict.c @@ -1,10 +1,10 @@ /* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ /* * hgdict.c - * Copyright (C) 2005-2006 Akira TAGOH + * Copyright (C) 2005-2007 Akira TAGOH * * Authors: - * Akira TAGOH <at@gclab.org> + * Akira TAGOH <akira@tagoh.org> * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -22,1492 +22,251 @@ * Boston, MA 02111-1307, USA. */ #ifdef HAVE_CONFIG_H -#include <config.h> +#include "config.h" #endif +#include <glib/gstrfuncs.h> +#include <hieroglyph/hgobject.h> #include "hgdict.h" -#include "hgbtree.h" -#include "hglog.h" -#include "hgmem.h" -#include "hglist.h" -#include "hgstring.h" -#include "hgvaluenode.h" -#include "hgfile.h" +#include "hgdictprime.h" -#define BTREE_N_NODE 5 -#define HG_DICT_HASH(dict, obj) ((hg_value_node_get_hash(obj) << 8) % (dict)->prime) +#define _get_hash(_hg_d_,_hg_o_) ((hg_object_get_hash(_hg_o_) << 8) % __hg_dict_primes[HG_OBJECT_DICT (_hg_d_)->length]) -typedef struct _HieroGlyphDictNode HgDictNode; -typedef struct _HieroGlyphDictTraverseInfo HgDictTraverseInfo; -typedef struct _HieroGlyphDictCompareData HgDictCompareData; - -struct _HieroGlyphDictTraverseInfo { - HgTraverseFunc func; - gpointer data; -}; -struct _HieroGlyphDictCompareData { - const HgDict *opposite_dict; - guint attributes_mask; - gboolean result; -}; -struct _HieroGlyphDictNode { - HgObject object; - HgValueNode *key; - HgValueNode *val; -}; -struct _HieroGlyphDict { - HgObject object; - HgBTree *dict; - guint32 prime; - guint16 n_prealloc; - guint16 n_keys; -}; - - -static void _hg_dict_real_set_flags (gpointer data, - guint flags); -static void _hg_dict_real_relocate (gpointer data, - HgMemRelocateInfo *info); -static gpointer _hg_dict_real_dup (gpointer data); -static gpointer _hg_dict_real_to_string (gpointer data); -static void _hg_dict_node_real_set_flags(gpointer data, - guint flags); -static void _hg_dict_node_real_relocate (gpointer data, - HgMemRelocateInfo *info); - - -static guint hg_dict_primes[] = { - 2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, - 59, 61, 67, 71, 73, 79, 83, 89, 97, 101, 103, 107, 109, - 113, 127, 131, 137, 139, 149, 151, 157, 163, 167, 173, 179, - 181, 191, 193, 197, 199, 211, 223, 227, 229, 233, 239, 241, - 251, 257, 263, 269, 271, 277, 281, 283, 293, 307, 311, 313, - 317, 331, 337, 347, 349, 353, 359, 367, 373, 379, 383, 389, - 397, 401, 409, 419, 421, 431, 433, 439, 443, 449, 457, 461, - 463, 467, 479, 487, 491, 499, 503, 509, 521, 523, 541, 547, - 557, 563, 569, 571, 577, 587, 593, 599, 601, 607, 613, 617, - 619, 631, 641, 643, 647, 653, 659, 661, 673, 677, 683, 691, - 701, 709, 719, 727, 733, 739, 743, 751, 757, 761, 769, 773, - 787, 797, 809, 811, 821, 823, 827, 829, 839, 853, 857, 859, - 863, 877, 881, 883, 887, 907, 911, 919, 929, 937, 941, 947, - 953, 967, 971, 977, 983, 991, 997, 1009, 1013, 1019, 1021, - 1031, 1033, 1039, 1049, 1051, 1061, 1063, 1069, 1087, 1091, - 1093, 1097, 1103, 1109, 1117, 1123, 1129, 1151, 1153, 1163, - 1171, 1181, 1187, 1193, 1201, 1213, 1217, 1223, 1229, 1231, - 1237, 1249, 1259, 1277, 1279, 1283, 1289, 1291, 1297, 1301, - 1303, 1307, 1319, 1321, 1327, 1361, 1367, 1373, 1381, 1399, - 1409, 1423, 1427, 1429, 1433, 1439, 1447, 1451, 1453, 1459, - 1471, 1481, 1483, 1487, 1489, 1493, 1499, 1511, 1523, 1531, - 1543, 1549, 1553, 1559, 1567, 1571, 1579, 1583, 1597, 1601, - 1607, 1609, 1613, 1619, 1621, 1627, 1637, 1657, 1663, 1667, - 1669, 1693, 1697, 1699, 1709, 1721, 1723, 1733, 1741, 1747, - 1753, 1759, 1777, 1783, 1787, 1789, 1801, 1811, 1823, 1831, - 1847, 1861, 1867, 1871, 1873, 1877, 1879, 1889, 1901, 1907, - 1913, 1931, 1933, 1949, 1951, 1973, 1979, 1987, 1993, 1997, - 1999, 2003, 2011, 2017, 2027, 2029, 2039, 2053, 2063, 2069, - 2081, 2083, 2087, 2089, 2099, 2111, 2113, 2129, 2131, 2137, - 2141, 2143, 2153, 2161, 2179, 2203, 2207, 2213, 2221, 2237, - 2239, 2243, 2251, 2267, 2269, 2273, 2281, 2287, 2293, 2297, - 2309, 2311, 2333, 2339, 2341, 2347, 2351, 2357, 2371, 2377, - 2381, 2383, 2389, 2393, 2399, 2411, 2417, 2423, 2437, 2441, - 2447, 2459, 2467, 2473, 2477, 2503, 2521, 2531, 2539, 2543, - 2549, 2551, 2557, 2579, 2591, 2593, 2609, 2617, 2621, 2633, - 2647, 2657, 2659, 2663, 2671, 2677, 2683, 2687, 2689, 2693, - 2699, 2707, 2711, 2713, 2719, 2729, 2731, 2741, 2749, 2753, - 2767, 2777, 2789, 2791, 2797, 2801, 2803, 2819, 2833, 2837, - 2843, 2851, 2857, 2861, 2879, 2887, 2897, 2903, 2909, 2917, - 2927, 2939, 2953, 2957, 2963, 2969, 2971, 2999, 3001, 3011, - 3019, 3023, 3037, 3041, 3049, 3061, 3067, 3079, 3083, 3089, - 3109, 3119, 3121, 3137, 3163, 3167, 3169, 3181, 3187, 3191, - 3203, 3209, 3217, 3221, 3229, 3251, 3253, 3257, 3259, 3271, - 3299, 3301, 3307, 3313, 3319, 3323, 3329, 3331, 3343, 3347, - 3359, 3361, 3371, 3373, 3389, 3391, 3407, 3413, 3433, 3449, - 3457, 3461, 3463, 3467, 3469, 3491, 3499, 3511, 3517, 3527, - 3529, 3533, 3539, 3541, 3547, 3557, 3559, 3571, 3581, 3583, - 3593, 3607, 3613, 3617, 3623, 3631, 3637, 3643, 3659, 3671, - 3673, 3677, 3691, 3697, 3701, 3709, 3719, 3727, 3733, 3739, - 3761, 3767, 3769, 3779, 3793, 3797, 3803, 3821, 3823, 3833, - 3847, 3851, 3853, 3863, 3877, 3881, 3889, 3907, 3911, 3917, - 3919, 3923, 3929, 3931, 3943, 3947, 3967, 3989, 4001, 4003, - 4007, 4013, 4019, 4021, 4027, 4049, 4051, 4057, 4073, 4079, - 4091, 4093, 4099, 4111, 4127, 4129, 4133, 4139, 4153, 4157, - 4159, 4177, 4201, 4211, 4217, 4219, 4229, 4231, 4241, 4243, - 4253, 4259, 4261, 4271, 4273, 4283, 4289, 4297, 4327, 4337, - 4339, 4349, 4357, 4363, 4373, 4391, 4397, 4409, 4421, 4423, - 4441, 4447, 4451, 4457, 4463, 4481, 4483, 4493, 4507, 4513, - 4517, 4519, 4523, 4547, 4549, 4561, 4567, 4583, 4591, 4597, - 4603, 4621, 4637, 4639, 4643, 4649, 4651, 4657, 4663, 4673, - 4679, 4691, 4703, 4721, 4723, 4729, 4733, 4751, 4759, 4783, - 4787, 4789, 4793, 4799, 4801, 4813, 4817, 4831, 4861, 4871, - 4877, 4889, 4903, 4909, 4919, 4931, 4933, 4937, 4943, 4951, - 4957, 4967, 4969, 4973, 4987, 4993, 4999, 5003, 5009, 5011, - 5021, 5023, 5039, 5051, 5059, 5077, 5081, 5087, 5099, 5101, - 5107, 5113, 5119, 5147, 5153, 5167, 5171, 5179, 5189, 5197, - 5209, 5227, 5231, 5233, 5237, 5261, 5273, 5279, 5281, 5297, - 5303, 5309, 5323, 5333, 5347, 5351, 5381, 5387, 5393, 5399, - 5407, 5413, 5417, 5419, 5431, 5437, 5441, 5443, 5449, 5471, - 5477, 5479, 5483, 5501, 5503, 5507, 5519, 5521, 5527, 5531, - 5557, 5563, 5569, 5573, 5581, 5591, 5623, 5639, 5641, 5647, - 5651, 5653, 5657, 5659, 5669, 5683, 5689, 5693, 5701, 5711, - 5717, 5737, 5741, 5743, 5749, 5779, 5783, 5791, 5801, 5807, - 5813, 5821, 5827, 5839, 5843, 5849, 5851, 5857, 5861, 5867, - 5869, 5879, 5881, 5897, 5903, 5923, 5927, 5939, 5953, 5981, - 5987, 6007, 6011, 6029, 6037, 6043, 6047, 6053, 6067, 6073, - 6079, 6089, 6091, 6101, 6113, 6121, 6131, 6133, 6143, 6151, - 6163, 6173, 6197, 6199, 6203, 6211, 6217, 6221, 6229, 6247, - 6257, 6263, 6269, 6271, 6277, 6287, 6299, 6301, 6311, 6317, - 6323, 6329, 6337, 6343, 6353, 6359, 6361, 6367, 6373, 6379, - 6389, 6397, 6421, 6427, 6449, 6451, 6469, 6473, 6481, 6491, - 6521, 6529, 6547, 6551, 6553, 6563, 6569, 6571, 6577, 6581, - 6599, 6607, 6619, 6637, 6653, 6659, 6661, 6673, 6679, 6689, - 6691, 6701, 6703, 6709, 6719, 6733, 6737, 6761, 6763, 6779, - 6781, 6791, 6793, 6803, 6823, 6827, 6829, 6833, 6841, 6857, - 6863, 6869, 6871, 6883, 6899, 6907, 6911, 6917, 6947, 6949, - 6959, 6961, 6967, 6971, 6977, 6983, 6991, 6997, 7001, 7013, - 7019, 7027, 7039, 7043, 7057, 7069, 7079, 7103, 7109, 7121, - 7127, 7129, 7151, 7159, 7177, 7187, 7193, 7207, 7211, 7213, - 7219, 7229, 7237, 7243, 7247, 7253, 7283, 7297, 7307, 7309, - 7321, 7331, 7333, 7349, 7351, 7369, 7393, 7411, 7417, 7433, - 7451, 7457, 7459, 7477, 7481, 7487, 7489, 7499, 7507, 7517, - 7523, 7529, 7537, 7541, 7547, 7549, 7559, 7561, 7573, 7577, - 7583, 7589, 7591, 7603, 7607, 7621, 7639, 7643, 7649, 7669, - 7673, 7681, 7687, 7691, 7699, 7703, 7717, 7723, 7727, 7741, - 7753, 7757, 7759, 7789, 7793, 7817, 7823, 7829, 7841, 7853, - 7867, 7873, 7877, 7879, 7883, 7901, 7907, 7919, 7927, 7933, - 7937, 7949, 7951, 7963, 7993, 8009, 8011, 8017, 8039, 8053, - 8059, 8069, 8081, 8087, 8089, 8093, 8101, 8111, 8117, 8123, - 8147, 8161, 8167, 8171, 8179, 8191, 8209, 8219, 8221, 8231, - 8233, 8237, 8243, 8263, 8269, 8273, 8287, 8291, 8293, 8297, - 8311, 8317, 8329, 8353, 8363, 8369, 8377, 8387, 8389, 8419, - 8423, 8429, 8431, 8443, 8447, 8461, 8467, 8501, 8513, 8521, - 8527, 8537, 8539, 8543, 8563, 8573, 8581, 8597, 8599, 8609, - 8623, 8627, 8629, 8641, 8647, 8663, 8669, 8677, 8681, 8689, - 8693, 8699, 8707, 8713, 8719, 8731, 8737, 8741, 8747, 8753, - 8761, 8779, 8783, 8803, 8807, 8819, 8821, 8831, 8837, 8839, - 8849, 8861, 8863, 8867, 8887, 8893, 8923, 8929, 8933, 8941, - 8951, 8963, 8969, 8971, 8999, 9001, 9007, 9011, 9013, 9029, - 9041, 9043, 9049, 9059, 9067, 9091, 9103, 9109, 9127, 9133, - 9137, 9151, 9157, 9161, 9173, 9181, 9187, 9199, 9203, 9209, - 9221, 9227, 9239, 9241, 9257, 9277, 9281, 9283, 9293, 9311, - 9319, 9323, 9337, 9341, 9343, 9349, 9371, 9377, 9391, 9397, - 9403, 9413, 9419, 9421, 9431, 9433, 9437, 9439, 9461, 9463, - 9467, 9473, 9479, 9491, 9497, 9511, 9521, 9533, 9539, 9547, - 9551, 9587, 9601, 9613, 9619, 9623, 9629, 9631, 9643, 9649, - 9661, 9677, 9679, 9689, 9697, 9719, 9721, 9733, 9739, 9743, - 9749, 9767, 9769, 9781, 9787, 9791, 9803, 9811, 9817, 9829, - 9833, 9839, 9851, 9857, 9859, 9871, 9883, 9887, 9901, 9907, - 9923, 9929, 9931, 9941, 9949, 9967, 9973, 10007, 10009, - 10037, 10039, 10061, 10067, 10069, 10079, 10091, 10093, - 10099, 10103, 10111, 10133, 10139, 10141, 10151, 10159, - 10163, 10169, 10177, 10181, 10193, 10211, 10223, 10243, - 10247, 10253, 10259, 10267, 10271, 10273, 10289, 10301, - 10303, 10313, 10321, 10331, 10333, 10337, 10343, 10357, - 10369, 10391, 10399, 10427, 10429, 10433, 10453, 10457, - 10459, 10463, 10477, 10487, 10499, 10501, 10513, 10529, - 10531, 10559, 10567, 10589, 10597, 10601, 10607, 10613, - 10627, 10631, 10639, 10651, 10657, 10663, 10667, 10687, - 10691, 10709, 10711, 10723, 10729, 10733, 10739, 10753, - 10771, 10781, 10789, 10799, 10831, 10837, 10847, 10853, - 10859, 10861, 10867, 10883, 10889, 10891, 10903, 10909, - 10937, 10939, 10949, 10957, 10973, 10979, 10987, 10993, - 11003, 11027, 11047, 11057, 11059, 11069, 11071, 11083, - 11087, 11093, 11113, 11117, 11119, 11131, 11149, 11159, - 11161, 11171, 11173, 11177, 11197, 11213, 11239, 11243, - 11251, 11257, 11261, 11273, 11279, 11287, 11299, 11311, - 11317, 11321, 11329, 11351, 11353, 11369, 11383, 11393, - 11399, 11411, 11423, 11437, 11443, 11447, 11467, 11471, - 11483, 11489, 11491, 11497, 11503, 11519, 11527, 11549, - 11551, 11579, 11587, 11593, 11597, 11617, 11621, 11633, - 11657, 11677, 11681, 11689, 11699, 11701, 11717, 11719, - 11731, 11743, 11777, 11779, 11783, 11789, 11801, 11807, - 11813, 11821, 11827, 11831, 11833, 11839, 11863, 11867, - 11887, 11897, 11903, 11909, 11923, 11927, 11933, 11939, - 11941, 11953, 11959, 11969, 11971, 11981, 11987, 12007, - 12011, 12037, 12041, 12043, 12049, 12071, 12073, 12097, - 12101, 12107, 12109, 12113, 12119, 12143, 12149, 12157, - 12161, 12163, 12197, 12203, 12211, 12227, 12239, 12241, - 12251, 12253, 12263, 12269, 12277, 12281, 12289, 12301, - 12323, 12329, 12343, 12347, 12373, 12377, 12379, 12391, - 12401, 12409, 12413, 12421, 12433, 12437, 12451, 12457, - 12473, 12479, 12487, 12491, 12497, 12503, 12511, 12517, - 12527, 12539, 12541, 12547, 12553, 12569, 12577, 12583, - 12589, 12601, 12611, 12613, 12619, 12637, 12641, 12647, - 12653, 12659, 12671, 12689, 12697, 12703, 12713, 12721, - 12739, 12743, 12757, 12763, 12781, 12791, 12799, 12809, - 12821, 12823, 12829, 12841, 12853, 12889, 12893, 12899, - 12907, 12911, 12917, 12919, 12923, 12941, 12953, 12959, - 12967, 12973, 12979, 12983, 13001, 13003, 13007, 13009, - 13033, 13037, 13043, 13049, 13063, 13093, 13099, 13103, - 13109, 13121, 13127, 13147, 13151, 13159, 13163, 13171, - 13177, 13183, 13187, 13217, 13219, 13229, 13241, 13249, - 13259, 13267, 13291, 13297, 13309, 13313, 13327, 13331, - 13337, 13339, 13367, 13381, 13397, 13399, 13411, 13417, - 13421, 13441, 13451, 13457, 13463, 13469, 13477, 13487, - 13499, 13513, 13523, 13537, 13553, 13567, 13577, 13591, - 13597, 13613, 13619, 13627, 13633, 13649, 13669, 13679, - 13681, 13687, 13691, 13693, 13697, 13709, 13711, 13721, - 13723, 13729, 13751, 13757, 13759, 13763, 13781, 13789, - 13799, 13807, 13829, 13831, 13841, 13859, 13873, 13877, - 13879, 13883, 13901, 13903, 13907, 13913, 13921, 13931, - 13933, 13963, 13967, 13997, 13999, 14009, 14011, 14029, - 14033, 14051, 14057, 14071, 14081, 14083, 14087, 14107, - 14143, 14149, 14153, 14159, 14173, 14177, 14197, 14207, - 14221, 14243, 14249, 14251, 14281, 14293, 14303, 14321, - 14323, 14327, 14341, 14347, 14369, 14387, 14389, 14401, - 14407, 14411, 14419, 14423, 14431, 14437, 14447, 14449, - 14461, 14479, 14489, 14503, 14519, 14533, 14537, 14543, - 14549, 14551, 14557, 14561, 14563, 14591, 14593, 14621, - 14627, 14629, 14633, 14639, 14653, 14657, 14669, 14683, - 14699, 14713, 14717, 14723, 14731, 14737, 14741, 14747, - 14753, 14759, 14767, 14771, 14779, 14783, 14797, 14813, - 14821, 14827, 14831, 14843, 14851, 14867, 14869, 14879, - 14887, 14891, 14897, 14923, 14929, 14939, 14947, 14951, - 14957, 14969, 14983, 15013, 15017, 15031, 15053, 15061, - 15073, 15077, 15083, 15091, 15101, 15107, 15121, 15131, - 15137, 15139, 15149, 15161, 15173, 15187, 15193, 15199, - 15217, 15227, 15233, 15241, 15259, 15263, 15269, 15271, - 15277, 15287, 15289, 15299, 15307, 15313, 15319, 15329, - 15331, 15349, 15359, 15361, 15373, 15377, 15383, 15391, - 15401, 15413, 15427, 15439, 15443, 15451, 15461, 15467, - 15473, 15493, 15497, 15511, 15527, 15541, 15551, 15559, - 15569, 15581, 15583, 15601, 15607, 15619, 15629, 15641, - 15643, 15647, 15649, 15661, 15667, 15671, 15679, 15683, - 15727, 15731, 15733, 15737, 15739, 15749, 15761, 15767, - 15773, 15787, 15791, 15797, 15803, 15809, 15817, 15823, - 15859, 15877, 15881, 15887, 15889, 15901, 15907, 15913, - 15919, 15923, 15937, 15959, 15971, 15973, 15991, 16001, - 16007, 16033, 16057, 16061, 16063, 16067, 16069, 16073, - 16087, 16091, 16097, 16103, 16111, 16127, 16139, 16141, - 16183, 16187, 16189, 16193, 16217, 16223, 16229, 16231, - 16249, 16253, 16267, 16273, 16301, 16319, 16333, 16339, - 16349, 16361, 16363, 16369, 16381, 16411, 16417, 16421, - 16427, 16433, 16447, 16451, 16453, 16477, 16481, 16487, - 16493, 16519, 16529, 16547, 16553, 16561, 16567, 16573, - 16603, 16607, 16619, 16631, 16633, 16649, 16651, 16657, - 16661, 16673, 16691, 16693, 16699, 16703, 16729, 16741, - 16747, 16759, 16763, 16787, 16811, 16823, 16829, 16831, - 16843, 16871, 16879, 16883, 16889, 16901, 16903, 16921, - 16927, 16931, 16937, 16943, 16963, 16979, 16981, 16987, - 16993, 17011, 17021, 17027, 17029, 17033, 17041, 17047, - 17053, 17077, 17093, 17099, 17107, 17117, 17123, 17137, - 17159, 17167, 17183, 17189, 17191, 17203, 17207, 17209, - 17231, 17239, 17257, 17291, 17293, 17299, 17317, 17321, - 17327, 17333, 17341, 17351, 17359, 17377, 17383, 17387, - 17389, 17393, 17401, 17417, 17419, 17431, 17443, 17449, - 17467, 17471, 17477, 17483, 17489, 17491, 17497, 17509, - 17519, 17539, 17551, 17569, 17573, 17579, 17581, 17597, - 17599, 17609, 17623, 17627, 17657, 17659, 17669, 17681, - 17683, 17707, 17713, 17729, 17737, 17747, 17749, 17761, - 17783, 17789, 17791, 17807, 17827, 17837, 17839, 17851, - 17863, 17881, 17891, 17903, 17909, 17911, 17921, 17923, - 17929, 17939, 17957, 17959, 17971, 17977, 17981, 17987, - 17989, 18013, 18041, 18043, 18047, 18049, 18059, 18061, - 18077, 18089, 18097, 18119, 18121, 18127, 18131, 18133, - 18143, 18149, 18169, 18181, 18191, 18199, 18211, 18217, - 18223, 18229, 18233, 18251, 18253, 18257, 18269, 18287, - 18289, 18301, 18307, 18311, 18313, 18329, 18341, 18353, - 18367, 18371, 18379, 18397, 18401, 18413, 18427, 18433, - 18439, 18443, 18451, 18457, 18461, 18481, 18493, 18503, - 18517, 18521, 18523, 18539, 18541, 18553, 18583, 18587, - 18593, 18617, 18637, 18661, 18671, 18679, 18691, 18701, - 18713, 18719, 18731, 18743, 18749, 18757, 18773, 18787, - 18793, 18797, 18803, 18839, 18859, 18869, 18899, 18911, - 18913, 18917, 18919, 18947, 18959, 18973, 18979, 19001, - 19009, 19013, 19031, 19037, 19051, 19069, 19073, 19079, - 19081, 19087, 19121, 19139, 19141, 19157, 19163, 19181, - 19183, 19207, 19211, 19213, 19219, 19231, 19237, 19249, - 19259, 19267, 19273, 19289, 19301, 19309, 19319, 19333, - 19373, 19379, 19381, 19387, 19391, 19403, 19417, 19421, - 19423, 19427, 19429, 19433, 19441, 19447, 19457, 19463, - 19469, 19471, 19477, 19483, 19489, 19501, 19507, 19531, - 19541, 19543, 19553, 19559, 19571, 19577, 19583, 19597, - 19603, 19609, 19661, 19681, 19687, 19697, 19699, 19709, - 19717, 19727, 19739, 19751, 19753, 19759, 19763, 19777, - 19793, 19801, 19813, 19819, 19841, 19843, 19853, 19861, - 19867, 19889, 19891, 19913, 19919, 19927, 19937, 19949, - 19961, 19963, 19973, 19979, 19991, 19993, 19997, 20011, - 20021, 20023, 20029, 20047, 20051, 20063, 20071, 20089, - 20101, 20107, 20113, 20117, 20123, 20129, 20143, 20147, - 20149, 20161, 20173, 20177, 20183, 20201, 20219, 20231, - 20233, 20249, 20261, 20269, 20287, 20297, 20323, 20327, - 20333, 20341, 20347, 20353, 20357, 20359, 20369, 20389, - 20393, 20399, 20407, 20411, 20431, 20441, 20443, 20477, - 20479, 20483, 20507, 20509, 20521, 20533, 20543, 20549, - 20551, 20563, 20593, 20599, 20611, 20627, 20639, 20641, - 20663, 20681, 20693, 20707, 20717, 20719, 20731, 20743, - 20747, 20749, 20753, 20759, 20771, 20773, 20789, 20807, - 20809, 20849, 20857, 20873, 20879, 20887, 20897, 20899, - 20903, 20921, 20929, 20939, 20947, 20959, 20963, 20981, - 20983, 21001, 21011, 21013, 21017, 21019, 21023, 21031, - 21059, 21061, 21067, 21089, 21101, 21107, 21121, 21139, - 21143, 21149, 21157, 21163, 21169, 21179, 21187, 21191, - 21193, 21211, 21221, 21227, 21247, 21269, 21277, 21283, - 21313, 21317, 21319, 21323, 21341, 21347, 21377, 21379, - 21383, 21391, 21397, 21401, 21407, 21419, 21433, 21467, - 21481, 21487, 21491, 21493, 21499, 21503, 21517, 21521, - 21523, 21529, 21557, 21559, 21563, 21569, 21577, 21587, - 21589, 21599, 21601, 21611, 21613, 21617, 21647, 21649, - 21661, 21673, 21683, 21701, 21713, 21727, 21737, 21739, - 21751, 21757, 21767, 21773, 21787, 21799, 21803, 21817, - 21821, 21839, 21841, 21851, 21859, 21863, 21871, 21881, - 21893, 21911, 21929, 21937, 21943, 21961, 21977, 21991, - 21997, 22003, 22013, 22027, 22031, 22037, 22039, 22051, - 22063, 22067, 22073, 22079, 22091, 22093, 22109, 22111, - 22123, 22129, 22133, 22147, 22153, 22157, 22159, 22171, - 22189, 22193, 22229, 22247, 22259, 22271, 22273, 22277, - 22279, 22283, 22291, 22303, 22307, 22343, 22349, 22367, - 22369, 22381, 22391, 22397, 22409, 22433, 22441, 22447, - 22453, 22469, 22481, 22483, 22501, 22511, 22531, 22541, - 22543, 22549, 22567, 22571, 22573, 22613, 22619, 22621, - 22637, 22639, 22643, 22651, 22669, 22679, 22691, 22697, - 22699, 22709, 22717, 22721, 22727, 22739, 22741, 22751, - 22769, 22777, 22783, 22787, 22807, 22811, 22817, 22853, - 22859, 22861, 22871, 22877, 22901, 22907, 22921, 22937, - 22943, 22961, 22963, 22973, 22993, 23003, 23011, 23017, - 23021, 23027, 23029, 23039, 23041, 23053, 23057, 23059, - 23063, 23071, 23081, 23087, 23099, 23117, 23131, 23143, - 23159, 23167, 23173, 23189, 23197, 23201, 23203, 23209, - 23227, 23251, 23269, 23279, 23291, 23293, 23297, 23311, - 23321, 23327, 23333, 23339, 23357, 23369, 23371, 23399, - 23417, 23431, 23447, 23459, 23473, 23497, 23509, 23531, - 23537, 23539, 23549, 23557, 23561, 23563, 23567, 23581, - 23593, 23599, 23603, 23609, 23623, 23627, 23629, 23633, - 23663, 23669, 23671, 23677, 23687, 23689, 23719, 23741, - 23743, 23747, 23753, 23761, 23767, 23773, 23789, 23801, - 23813, 23819, 23827, 23831, 23833, 23857, 23869, 23873, - 23879, 23887, 23893, 23899, 23909, 23911, 23917, 23929, - 23957, 23971, 23977, 23981, 23993, 24001, 24007, 24019, - 24023, 24029, 24043, 24049, 24061, 24071, 24077, 24083, - 24091, 24097, 24103, 24107, 24109, 24113, 24121, 24133, - 24137, 24151, 24169, 24179, 24181, 24197, 24203, 24223, - 24229, 24239, 24247, 24251, 24281, 24317, 24329, 24337, - 24359, 24371, 24373, 24379, 24391, 24407, 24413, 24419, - 24421, 24439, 24443, 24469, 24473, 24481, 24499, 24509, - 24517, 24527, 24533, 24547, 24551, 24571, 24593, 24611, - 24623, 24631, 24659, 24671, 24677, 24683, 24691, 24697, - 24709, 24733, 24749, 24763, 24767, 24781, 24793, 24799, - 24809, 24821, 24841, 24847, 24851, 24859, 24877, 24889, - 24907, 24917, 24919, 24923, 24943, 24953, 24967, 24971, - 24977, 24979, 24989, 25013, 25031, 25033, 25037, 25057, - 25073, 25087, 25097, 25111, 25117, 25121, 25127, 25147, - 25153, 25163, 25169, 25171, 25183, 25189, 25219, 25229, - 25237, 25243, 25247, 25253, 25261, 25301, 25303, 25307, - 25309, 25321, 25339, 25343, 25349, 25357, 25367, 25373, - 25391, 25409, 25411, 25423, 25439, 25447, 25453, 25457, - 25463, 25469, 25471, 25523, 25537, 25541, 25561, 25577, - 25579, 25583, 25589, 25601, 25603, 25609, 25621, 25633, - 25639, 25643, 25657, 25667, 25673, 25679, 25693, 25703, - 25717, 25733, 25741, 25747, 25759, 25763, 25771, 25793, - 25799, 25801, 25819, 25841, 25847, 25849, 25867, 25873, - 25889, 25903, 25913, 25919, 25931, 25933, 25939, 25943, - 25951, 25969, 25981, 25997, 25999, 26003, 26017, 26021, - 26029, 26041, 26053, 26083, 26099, 26107, 26111, 26113, - 26119, 26141, 26153, 26161, 26171, 26177, 26183, 26189, - 26203, 26209, 26227, 26237, 26249, 26251, 26261, 26263, - 26267, 26293, 26297, 26309, 26317, 26321, 26339, 26347, - 26357, 26371, 26387, 26393, 26399, 26407, 26417, 26423, - 26431, 26437, 26449, 26459, 26479, 26489, 26497, 26501, - 26513, 26539, 26557, 26561, 26573, 26591, 26597, 26627, - 26633, 26641, 26647, 26669, 26681, 26683, 26687, 26693, - 26699, 26701, 26711, 26713, 26717, 26723, 26729, 26731, - 26737, 26759, 26777, 26783, 26801, 26813, 26821, 26833, - 26839, 26849, 26861, 26863, 26879, 26881, 26891, 26893, - 26903, 26921, 26927, 26947, 26951, 26953, 26959, 26981, - 26987, 26993, 27011, 27017, 27031, 27043, 27059, 27061, - 27067, 27073, 27077, 27091, 27103, 27107, 27109, 27127, - 27143, 27179, 27191, 27197, 27211, 27239, 27241, 27253, - 27259, 27271, 27277, 27281, 27283, 27299, 27329, 27337, - 27361, 27367, 27397, 27407, 27409, 27427, 27431, 27437, - 27449, 27457, 27479, 27481, 27487, 27509, 27527, 27529, - 27539, 27541, 27551, 27581, 27583, 27611, 27617, 27631, - 27647, 27653, 27673, 27689, 27691, 27697, 27701, 27733, - 27737, 27739, 27743, 27749, 27751, 27763, 27767, 27773, - 27779, 27791, 27793, 27799, 27803, 27809, 27817, 27823, - 27827, 27847, 27851, 27883, 27893, 27901, 27917, 27919, - 27941, 27943, 27947, 27953, 27961, 27967, 27983, 27997, - 28001, 28019, 28027, 28031, 28051, 28057, 28069, 28081, - 28087, 28097, 28099, 28109, 28111, 28123, 28151, 28163, - 28181, 28183, 28201, 28211, 28219, 28229, 28277, 28279, - 28283, 28289, 28297, 28307, 28309, 28319, 28349, 28351, - 28387, 28393, 28403, 28409, 28411, 28429, 28433, 28439, - 28447, 28463, 28477, 28493, 28499, 28513, 28517, 28537, - 28541, 28547, 28549, 28559, 28571, 28573, 28579, 28591, - 28597, 28603, 28607, 28619, 28621, 28627, 28631, 28643, - 28649, 28657, 28661, 28663, 28669, 28687, 28697, 28703, - 28711, 28723, 28729, 28751, 28753, 28759, 28771, 28789, - 28793, 28807, 28813, 28817, 28837, 28843, 28859, 28867, - 28871, 28879, 28901, 28909, 28921, 28927, 28933, 28949, - 28961, 28979, 29009, 29017, 29021, 29023, 29027, 29033, - 29059, 29063, 29077, 29101, 29123, 29129, 29131, 29137, - 29147, 29153, 29167, 29173, 29179, 29191, 29201, 29207, - 29209, 29221, 29231, 29243, 29251, 29269, 29287, 29297, - 29303, 29311, 29327, 29333, 29339, 29347, 29363, 29383, - 29387, 29389, 29399, 29401, 29411, 29423, 29429, 29437, - 29443, 29453, 29473, 29483, 29501, 29527, 29531, 29537, - 29567, 29569, 29573, 29581, 29587, 29599, 29611, 29629, - 29633, 29641, 29663, 29669, 29671, 29683, 29717, 29723, - 29741, 29753, 29759, 29761, 29789, 29803, 29819, 29833, - 29837, 29851, 29863, 29867, 29873, 29879, 29881, 29917, - 29921, 29927, 29947, 29959, 29983, 29989, 30011, 30013, - 30029, 30047, 30059, 30071, 30089, 30091, 30097, 30103, - 30109, 30113, 30119, 30133, 30137, 30139, 30161, 30169, - 30181, 30187, 30197, 30203, 30211, 30223, 30241, 30253, - 30259, 30269, 30271, 30293, 30307, 30313, 30319, 30323, - 30341, 30347, 30367, 30389, 30391, 30403, 30427, 30431, - 30449, 30467, 30469, 30491, 30493, 30497, 30509, 30517, - 30529, 30539, 30553, 30557, 30559, 30577, 30593, 30631, - 30637, 30643, 30649, 30661, 30671, 30677, 30689, 30697, - 30703, 30707, 30713, 30727, 30757, 30763, 30773, 30781, - 30803, 30809, 30817, 30829, 30839, 30841, 30851, 30853, - 30859, 30869, 30871, 30881, 30893, 30911, 30931, 30937, - 30941, 30949, 30971, 30977, 30983, 31013, 31019, 31033, - 31039, 31051, 31063, 31069, 31079, 31081, 31091, 31121, - 31123, 31139, 31147, 31151, 31153, 31159, 31177, 31181, - 31183, 31189, 31193, 31219, 31223, 31231, 31237, 31247, - 31249, 31253, 31259, 31267, 31271, 31277, 31307, 31319, - 31321, 31327, 31333, 31337, 31357, 31379, 31387, 31391, - 31393, 31397, 31469, 31477, 31481, 31489, 31511, 31513, - 31517, 31531, 31541, 31543, 31547, 31567, 31573, 31583, - 31601, 31607, 31627, 31643, 31649, 31657, 31663, 31667, - 31687, 31699, 31721, 31723, 31727, 31729, 31741, 31751, - 31769, 31771, 31793, 31799, 31817, 31847, 31849, 31859, - 31873, 31883, 31891, 31907, 31957, 31963, 31973, 31981, - 31991, 32003, 32009, 32027, 32029, 32051, 32057, 32059, - 32063, 32069, 32077, 32083, 32089, 32099, 32117, 32119, - 32141, 32143, 32159, 32173, 32183, 32189, 32191, 32203, - 32213, 32233, 32237, 32251, 32257, 32261, 32297, 32299, - 32303, 32309, 32321, 32323, 32327, 32341, 32353, 32359, - 32363, 32369, 32371, 32377, 32381, 32401, 32411, 32413, - 32423, 32429, 32441, 32443, 32467, 32479, 32491, 32497, - 32503, 32507, 32531, 32533, 32537, 32561, 32563, 32569, - 32573, 32579, 32587, 32603, 32609, 32611, 32621, 32633, - 32647, 32653, 32687, 32693, 32707, 32713, 32717, 32719, - 32749, 32771, 32779, 32783, 32789, 32797, 32801, 32803, - 32831, 32833, 32839, 32843, 32869, 32887, 32909, 32911, - 32917, 32933, 32939, 32941, 32957, 32969, 32971, 32983, - 32987, 32993, 32999, 33013, 33023, 33029, 33037, 33049, - 33053, 33071, 33073, 33083, 33091, 33107, 33113, 33119, - 33149, 33151, 33161, 33179, 33181, 33191, 33199, 33203, - 33211, 33223, 33247, 33287, 33289, 33301, 33311, 33317, - 33329, 33331, 33343, 33347, 33349, 33353, 33359, 33377, - 33391, 33403, 33409, 33413, 33427, 33457, 33461, 33469, - 33479, 33487, 33493, 33503, 33521, 33529, 33533, 33547, - 33563, 33569, 33577, 33581, 33587, 33589, 33599, 33601, - 33613, 33617, 33619, 33623, 33629, 33637, 33641, 33647, - 33679, 33703, 33713, 33721, 33739, 33749, 33751, 33757, - 33767, 33769, 33773, 33791, 33797, 33809, 33811, 33827, - 33829, 33851, 33857, 33863, 33871, 33889, 33893, 33911, - 33923, 33931, 33937, 33941, 33961, 33967, 33997, 34019, - 34031, 34033, 34039, 34057, 34061, 34123, 34127, 34129, - 34141, 34147, 34157, 34159, 34171, 34183, 34211, 34213, - 34217, 34231, 34253, 34259, 34261, 34267, 34273, 34283, - 34297, 34301, 34303, 34313, 34319, 34327, 34337, 34351, - 34361, 34367, 34369, 34381, 34403, 34421, 34429, 34439, - 34457, 34469, 34471, 34483, 34487, 34499, 34501, 34511, - 34513, 34519, 34537, 34543, 34549, 34583, 34589, 34591, - 34603, 34607, 34613, 34631, 34649, 34651, 34667, 34673, - 34679, 34687, 34693, 34703, 34721, 34729, 34739, 34747, - 34757, 34759, 34763, 34781, 34807, 34819, 34841, 34843, - 34847, 34849, 34871, 34877, 34883, 34897, 34913, 34919, - 34939, 34949, 34961, 34963, 34981, 35023, 35027, 35051, - 35053, 35059, 35069, 35081, 35083, 35089, 35099, 35107, - 35111, 35117, 35129, 35141, 35149, 35153, 35159, 35171, - 35201, 35221, 35227, 35251, 35257, 35267, 35279, 35281, - 35291, 35311, 35317, 35323, 35327, 35339, 35353, 35363, - 35381, 35393, 35401, 35407, 35419, 35423, 35437, 35447, - 35449, 35461, 35491, 35507, 35509, 35521, 35527, 35531, - 35533, 35537, 35543, 35569, 35573, 35591, 35593, 35597, - 35603, 35617, 35671, 35677, 35729, 35731, 35747, 35753, - 35759, 35771, 35797, 35801, 35803, 35809, 35831, 35837, - 35839, 35851, 35863, 35869, 35879, 35897, 35899, 35911, - 35923, 35933, 35951, 35963, 35969, 35977, 35983, 35993, - 35999, 36007, 36011, 36013, 36017, 36037, 36061, 36067, - 36073, 36083, 36097, 36107, 36109, 36131, 36137, 36151, - 36161, 36187, 36191, 36209, 36217, 36229, 36241, 36251, - 36263, 36269, 36277, 36293, 36299, 36307, 36313, 36319, - 36341, 36343, 36353, 36373, 36383, 36389, 36433, 36451, - 36457, 36467, 36469, 36473, 36479, 36493, 36497, 36523, - 36527, 36529, 36541, 36551, 36559, 36563, 36571, 36583, - 36587, 36599, 36607, 36629, 36637, 36643, 36653, 36671, - 36677, 36683, 36691, 36697, 36709, 36713, 36721, 36739, - 36749, 36761, 36767, 36779, 36781, 36787, 36791, 36793, - 36809, 36821, 36833, 36847, 36857, 36871, 36877, 36887, - 36899, 36901, 36913, 36919, 36923, 36929, 36931, 36943, - 36947, 36973, 36979, 36997, 37003, 37013, 37019, 37021, - 37039, 37049, 37057, 37061, 37087, 37097, 37117, 37123, - 37139, 37159, 37171, 37181, 37189, 37199, 37201, 37217, - 37223, 37243, 37253, 37273, 37277, 37307, 37309, 37313, - 37321, 37337, 37339, 37357, 37361, 37363, 37369, 37379, - 37397, 37409, 37423, 37441, 37447, 37463, 37483, 37489, - 37493, 37501, 37507, 37511, 37517, 37529, 37537, 37547, - 37549, 37561, 37567, 37571, 37573, 37579, 37589, 37591, - 37607, 37619, 37633, 37643, 37649, 37657, 37663, 37691, - 37693, 37699, 37717, 37747, 37781, 37783, 37799, 37811, - 37813, 37831, 37847, 37853, 37861, 37871, 37879, 37889, - 37897, 37907, 37951, 37957, 37963, 37967, 37987, 37991, - 37993, 37997, 38011, 38039, 38047, 38053, 38069, 38083, - 38113, 38119, 38149, 38153, 38167, 38177, 38183, 38189, - 38197, 38201, 38219, 38231, 38237, 38239, 38261, 38273, - 38281, 38287, 38299, 38303, 38317, 38321, 38327, 38329, - 38333, 38351, 38371, 38377, 38393, 38431, 38447, 38449, - 38453, 38459, 38461, 38501, 38543, 38557, 38561, 38567, - 38569, 38593, 38603, 38609, 38611, 38629, 38639, 38651, - 38653, 38669, 38671, 38677, 38693, 38699, 38707, 38711, - 38713, 38723, 38729, 38737, 38747, 38749, 38767, 38783, - 38791, 38803, 38821, 38833, 38839, 38851, 38861, 38867, - 38873, 38891, 38903, 38917, 38921, 38923, 38933, 38953, - 38959, 38971, 38977, 38993, 39019, 39023, 39041, 39043, - 39047, 39079, 39089, 39097, 39103, 39107, 39113, 39119, - 39133, 39139, 39157, 39161, 39163, 39181, 39191, 39199, - 39209, 39217, 39227, 39229, 39233, 39239, 39241, 39251, - 39293, 39301, 39313, 39317, 39323, 39341, 39343, 39359, - 39367, 39371, 39373, 39383, 39397, 39409, 39419, 39439, - 39443, 39451, 39461, 39499, 39503, 39509, 39511, 39521, - 39541, 39551, 39563, 39569, 39581, 39607, 39619, 39623, - 39631, 39659, 39667, 39671, 39679, 39703, 39709, 39719, - 39727, 39733, 39749, 39761, 39769, 39779, 39791, 39799, - 39821, 39827, 39829, 39839, 39841, 39847, 39857, 39863, - 39869, 39877, 39883, 39887, 39901, 39929, 39937, 39953, - 39971, 39979, 39983, 39989, 40009, 40013, 40031, 40037, - 40039, 40063, 40087, 40093, 40099, 40111, 40123, 40127, - 40129, 40151, 40153, 40163, 40169, 40177, 40189, 40193, - 40213, 40231, 40237, 40241, 40253, 40277, 40283, 40289, - 40343, 40351, 40357, 40361, 40387, 40423, 40427, 40429, - 40433, 40459, 40471, 40483, 40487, 40493, 40499, 40507, - 40519, 40529, 40531, 40543, 40559, 40577, 40583, 40591, - 40597, 40609, 40627, 40637, 40639, 40693, 40697, 40699, - 40709, 40739, 40751, 40759, 40763, 40771, 40787, 40801, - 40813, 40819, 40823, 40829, 40841, 40847, 40849, 40853, - 40867, 40879, 40883, 40897, 40903, 40927, 40933, 40939, - 40949, 40961, 40973, 40993, 41011, 41017, 41023, 41039, - 41047, 41051, 41057, 41077, 41081, 41113, 41117, 41131, - 41141, 41143, 41149, 41161, 41177, 41179, 41183, 41189, - 41201, 41203, 41213, 41221, 41227, 41231, 41233, 41243, - 41257, 41263, 41269, 41281, 41299, 41333, 41341, 41351, - 41357, 41381, 41387, 41389, 41399, 41411, 41413, 41443, - 41453, 41467, 41479, 41491, 41507, 41513, 41519, 41521, - 41539, 41543, 41549, 41579, 41593, 41597, 41603, 41609, - 41611, 41617, 41621, 41627, 41641, 41647, 41651, 41659, - 41669, 41681, 41687, 41719, 41729, 41737, 41759, 41761, - 41771, 41777, 41801, 41809, 41813, 41843, 41849, 41851, - 41863, 41879, 41887, 41893, 41897, 41903, 41911, 41927, - 41941, 41947, 41953, 41957, 41959, 41969, 41981, 41983, - 41999, 42013, 42017, 42019, 42023, 42043, 42061, 42071, - 42073, 42083, 42089, 42101, 42131, 42139, 42157, 42169, - 42179, 42181, 42187, 42193, 42197, 42209, 42221, 42223, - 42227, 42239, 42257, 42281, 42283, 42293, 42299, 42307, - 42323, 42331, 42337, 42349, 42359, 42373, 42379, 42391, - 42397, 42403, 42407, 42409, 42433, 42437, 42443, 42451, - 42457, 42461, 42463, 42467, 42473, 42487, 42491, 42499, - 42509, 42533, 42557, 42569, 42571, 42577, 42589, 42611, - 42641, 42643, 42649, 42667, 42677, 42683, 42689, 42697, - 42701, 42703, 42709, 42719, 42727, 42737, 42743, 42751, - 42767, 42773, 42787, 42793, 42797, 42821, 42829, 42839, - 42841, 42853, 42859, 42863, 42899, 42901, 42923, 42929, - 42937, 42943, 42953, 42961, 42967, 42979, 42989, 43003, - 43013, 43019, 43037, 43049, 43051, 43063, 43067, 43093, - 43103, 43117, 43133, 43151, 43159, 43177, 43189, 43201, - 43207, 43223, 43237, 43261, 43271, 43283, 43291, 43313, - 43319, 43321, 43331, 43391, 43397, 43399, 43403, 43411, - 43427, 43441, 43451, 43457, 43481, 43487, 43499, 43517, - 43541, 43543, 43573, 43577, 43579, 43591, 43597, 43607, - 43609, 43613, 43627, 43633, 43649, 43651, 43661, 43669, - 43691, 43711, 43717, 43721, 43753, 43759, 43777, 43781, - 43783, 43787, 43789, 43793, 43801, 43853, 43867, 43889, - 43891, 43913, 43933, 43943, 43951, 43961, 43963, 43969, - 43973, 43987, 43991, 43997, 44017, 44021, 44027, 44029, - 44041, 44053, 44059, 44071, 44087, 44089, 44101, 44111, - 44119, 44123, 44129, 44131, 44159, 44171, 44179, 44189, - 44201, 44203, 44207, 44221, 44249, 44257, 44263, 44267, - 44269, 44273, 44279, 44281, 44293, 44351, 44357, 44371, - 44381, 44383, 44389, 44417, 44449, 44453, 44483, 44491, - 44497, 44501, 44507, 44519, 44531, 44533, 44537, 44543, - 44549, 44563, 44579, 44587, 44617, 44621, 44623, 44633, - 44641, 44647, 44651, 44657, 44683, 44687, 44699, 44701, - 44711, 44729, 44741, 44753, 44771, 44773, 44777, 44789, - 44797, 44809, 44819, 44839, 44843, 44851, 44867, 44879, - 44887, 44893, 44909, 44917, 44927, 44939, 44953, 44959, - 44963, 44971, 44983, 44987, 45007, 45013, 45053, 45061, - 45077, 45083, 45119, 45121, 45127, 45131, 45137, 45139, - 45161, 45179, 45181, 45191, 45197, 45233, 45247, 45259, - 45263, 45281, 45289, 45293, 45307, 45317, 45319, 45329, - 45337, 45341, 45343, 45361, 45377, 45389, 45403, 45413, - 45427, 45433, 45439, 45481, 45491, 45497, 45503, 45523, - 45533, 45541, 45553, 45557, 45569, 45587, 45589, 45599, - 45613, 45631, 45641, 45659, 45667, 45673, 45677, 45691, - 45697, 45707, 45737, 45751, 45757, 45763, 45767, 45779, - 45817, 45821, 45823, 45827, 45833, 45841, 45853, 45863, - 45869, 45887, 45893, 45943, 45949, 45953, 45959, 45971, - 45979, 45989, 46021, 46027, 46049, 46051, 46061, 46073, - 46091, 46093, 46099, 46103, 46133, 46141, 46147, 46153, - 46171, 46181, 46183, 46187, 46199, 46219, 46229, 46237, - 46261, 46271, 46273, 46279, 46301, 46307, 46309, 46327, - 46337, 46349, 46351, 46381, 46399, 46411, 46439, 46441, - 46447, 46451, 46457, 46471, 46477, 46489, 46499, 46507, - 46511, 46523, 46549, 46559, 46567, 46573, 46589, 46591, - 46601, 46619, 46633, 46639, 46643, 46649, 46663, 46679, - 46681, 46687, 46691, 46703, 46723, 46727, 46747, 46751, - 46757, 46769, 46771, 46807, 46811, 46817, 46819, 46829, - 46831, 46853, 46861, 46867, 46877, 46889, 46901, 46919, - 46933, 46957, 46993, 46997, 47017, 47041, 47051, 47057, - 47059, 47087, 47093, 47111, 47119, 47123, 47129, 47137, - 47143, 47147, 47149, 47161, 47189, 47207, 47221, 47237, - 47251, 47269, 47279, 47287, 47293, 47297, 47303, 47309, - 47317, 47339, 47351, 47353, 47363, 47381, 47387, 47389, - 47407, 47417, 47419, 47431, 47441, 47459, 47491, 47497, - 47501, 47507, 47513, 47521, 47527, 47533, 47543, 47563, - 47569, 47581, 47591, 47599, 47609, 47623, 47629, 47639, - 47653, 47657, 47659, 47681, 47699, 47701, 47711, 47713, - 47717, 47737, 47741, 47743, 47777, 47779, 47791, 47797, - 47807, 47809, 47819, 47837, 47843, 47857, 47869, 47881, - 47903, 47911, 47917, 47933, 47939, 47947, 47951, 47963, - 47969, 47977, 47981, 48017, 48023, 48029, 48049, 48073, - 48079, 48091, 48109, 48119, 48121, 48131, 48157, 48163, - 48179, 48187, 48193, 48197, 48221, 48239, 48247, 48259, - 48271, 48281, 48299, 48311, 48313, 48337, 48341, 48353, - 48371, 48383, 48397, 48407, 48409, 48413, 48437, 48449, - 48463, 48473, 48479, 48481, 48487, 48491, 48497, 48523, - 48527, 48533, 48539, 48541, 48563, 48571, 48589, 48593, - 48611, 48619, 48623, 48647, 48649, 48661, 48673, 48677, - 48679, 48731, 48733, 48751, 48757, 48761, 48767, 48779, - 48781, 48787, 48799, 48809, 48817, 48821, 48823, 48847, - 48857, 48859, 48869, 48871, 48883, 48889, 48907, 48947, - 48953, 48973, 48989, 48991, 49003, 49009, 49019, 49031, - 49033, 49037, 49043, 49057, 49069, 49081, 49103, 49109, - 49117, 49121, 49123, 49139, 49157, 49169, 49171, 49177, - 49193, 49199, 49201, 49207, 49211, 49223, 49253, 49261, - 49277, 49279, 49297, 49307, 49331, 49333, 49339, 49363, - 49367, 49369, 49391, 49393, 49409, 49411, 49417, 49429, - 49433, 49451, 49459, 49463, 49477, 49481, 49499, 49523, - 49529, 49531, 49537, 49547, 49549, 49559, 49597, 49603, - 49613, 49627, 49633, 49639, 49663, 49667, 49669, 49681, - 49697, 49711, 49727, 49739, 49741, 49747, 49757, 49783, - 49787, 49789, 49801, 49807, 49811, 49823, 49831, 49843, - 49853, 49871, 49877, 49891, 49919, 49921, 49927, 49937, - 49939, 49943, 49957, 49991, 49993, 49999, 50021, 50023, - 50033, 50047, 50051, 50053, 50069, 50077, 50087, 50093, - 50101, 50111, 50119, 50123, 50129, 50131, 50147, 50153, - 50159, 50177, 50207, 50221, 50227, 50231, 50261, 50263, - 50273, 50287, 50291, 50311, 50321, 50329, 50333, 50341, - 50359, 50363, 50377, 50383, 50387, 50411, 50417, 50423, - 50441, 50459, 50461, 50497, 50503, 50513, 50527, 50539, - 50543, 50549, 50551, 50581, 50587, 50591, 50593, 50599, - 50627, 50647, 50651, 50671, 50683, 50707, 50723, 50741, - 50753, 50767, 50773, 50777, 50789, 50821, 50833, 50839, - 50849, 50857, 50867, 50873, 50891, 50893, 50909, 50923, - 50929, 50951, 50957, 50969, 50971, 50989, 50993, 51001, - 51031, 51043, 51047, 51059, 51061, 51071, 51109, 51131, - 51133, 51137, 51151, 51157, 51169, 51193, 51197, 51199, - 51203, 51217, 51229, 51239, 51241, 51257, 51263, 51283, - 51287, 51307, 51329, 51341, 51343, 51347, 51349, 51361, - 51383, 51407, 51413, 51419, 51421, 51427, 51431, 51437, - 51439, 51449, 51461, 51473, 51479, 51481, 51487, 51503, - 51511, 51517, 51521, 51539, 51551, 51563, 51577, 51581, - 51593, 51599, 51607, 51613, 51631, 51637, 51647, 51659, - 51673, 51679, 51683, 51691, 51713, 51719, 51721, 51749, - 51767, 51769, 51787, 51797, 51803, 51817, 51827, 51829, - 51839, 51853, 51859, 51869, 51871, 51893, 51899, 51907, - 51913, 51929, 51941, 51949, 51971, 51973, 51977, 51991, - 52009, 52021, 52027, 52051, 52057, 52067, 52069, 52081, - 52103, 52121, 52127, 52147, 52153, 52163, 52177, 52181, - 52183, 52189, 52201, 52223, 52237, 52249, 52253, 52259, - 52267, 52289, 52291, 52301, 52313, 52321, 52361, 52363, - 52369, 52379, 52387, 52391, 52433, 52453, 52457, 52489, - 52501, 52511, 52517, 52529, 52541, 52543, 52553, 52561, - 52567, 52571, 52579, 52583, 52609, 52627, 52631, 52639, - 52667, 52673, 52691, 52697, 52709, 52711, 52721, 52727, - 52733, 52747, 52757, 52769, 52783, 52807, 52813, 52817, - 52837, 52859, 52861, 52879, 52883, 52889, 52901, 52903, - 52919, 52937, 52951, 52957, 52963, 52967, 52973, 52981, - 52999, 53003, 53017, 53047, 53051, 53069, 53077, 53087, - 53089, 53093, 53101, 53113, 53117, 53129, 53147, 53149, - 53161, 53171, 53173, 53189, 53197, 53201, 53231, 53233, - 53239, 53267, 53269, 53279, 53281, 53299, 53309, 53323, - 53327, 53353, 53359, 53377, 53381, 53401, 53407, 53411, - 53419, 53437, 53441, 53453, 53479, 53503, 53507, 53527, - 53549, 53551, 53569, 53591, 53593, 53597, 53609, 53611, - 53617, 53623, 53629, 53633, 53639, 53653, 53657, 53681, - 53693, 53699, 53717, 53719, 53731, 53759, 53773, 53777, - 53783, 53791, 53813, 53819, 53831, 53849, 53857, 53861, - 53881, 53887, 53891, 53897, 53899, 53917, 53923, 53927, - 53939, 53951, 53959, 53987, 53993, 54001, 54011, 54013, - 54037, 54049, 54059, 54083, 54091, 54101, 54121, 54133, - 54139, 54151, 54163, 54167, 54181, 54193, 54217, 54251, - 54269, 54277, 54287, 54293, 54311, 54319, 54323, 54331, - 54347, 54361, 54367, 54371, 54377, 54401, 54403, 54409, - 54413, 54419, 54421, 54437, 54443, 54449, 54469, 54493, - 54497, 54499, 54503, 54517, 54521, 54539, 54541, 54547, - 54559, 54563, 54577, 54581, 54583, 54601, 54617, 54623, - 54629, 54631, 54647, 54667, 54673, 54679, 54709, 54713, - 54721, 54727, 54751, 54767, 54773, 54779, 54787, 54799, - 54829, 54833, 54851, 54869, 54877, 54881, 54907, 54917, - 54919, 54941, 54949, 54959, 54973, 54979, 54983, 55001, - 55009, 55021, 55049, 55051, 55057, 55061, 55073, 55079, - 55103, 55109, 55117, 55127, 55147, 55163, 55171, 55201, - 55207, 55213, 55217, 55219, 55229, 55243, 55249, 55259, - 55291, 55313, 55331, 55333, 55337, 55339, 55343, 55351, - 55373, 55381, 55399, 55411, 55439, 55441, 55457, 55469, - 55487, 55501, 55511, 55529, 55541, 55547, 55579, 55589, - 55603, 55609, 55619, 55621, 55631, 55633, 55639, 55661, - 55663, 55667, 55673, 55681, 55691, 55697, 55711, 55717, - 55721, 55733, 55763, 55787, 55793, 55799, 55807, 55813, - 55817, 55819, 55823, 55829, 55837, 55843, 55849, 55871, - 55889, 55897, 55901, 55903, 55921, 55927, 55931, 55933, - 55949, 55967, 55987, 55997, 56003, 56009, 56039, 56041, - 56053, 56081, 56087, 56093, 56099, 56101, 56113, 56123, - 56131, 56149, 56167, 56171, 56179, 56197, 56207, 56209, - 56237, 56239, 56249, 56263, 56267, 56269, 56299, 56311, - 56333, 56359, 56369, 56377, 56383, 56393, 56401, 56417, - 56431, 56437, 56443, 56453, 56467, 56473, 56477, 56479, - 56489, 56501, 56503, 56509, 56519, 56527, 56531, 56533, - 56543, 56569, 56591, 56597, 56599, 56611, 56629, 56633, - 56659, 56663, 56671, 56681, 56687, 56701, 56711, 56713, - 56731, 56737, 56747, 56767, 56773, 56779, 56783, 56807, - 56809, 56813, 56821, 56827, 56843, 56857, 56873, 56891, - 56893, 56897, 56909, 56911, 56921, 56923, 56929, 56941, - 56951, 56957, 56963, 56983, 56989, 56993, 56999, 57037, - 57041, 57047, 57059, 57073, 57077, 57089, 57097, 57107, - 57119, 57131, 57139, 57143, 57149, 57163, 57173, 57179, - 57191, 57193, 57203, 57221, 57223, 57241, 57251, 57259, - 57269, 57271, 57283, 57287, 57301, 57329, 57331, 57347, - 57349, 57367, 57373, 57383, 57389, 57397, 57413, 57427, - 57457, 57467, 57487, 57493, 57503, 57527, 57529, 57557, - 57559, 57571, 57587, 57593, 57601, 57637, 57641, 57649, - 57653, 57667, 57679, 57689, 57697, 57709, 57713, 57719, - 57727, 57731, 57737, 57751, 57773, 57781, 57787, 57791, - 57793, 57803, 57809, 57829, 57839, 57847, 57853, 57859, - 57881, 57899, 57901, 57917, 57923, 57943, 57947, 57973, - 57977, 57991, 58013, 58027, 58031, 58043, 58049, 58057, - 58061, 58067, 58073, 58099, 58109, 58111, 58129, 58147, - 58151, 58153, 58169, 58171, 58189, 58193, 58199, 58207, - 58211, 58217, 58229, 58231, 58237, 58243, 58271, 58309, - 58313, 58321, 58337, 58363, 58367, 58369, 58379, 58391, - 58393, 58403, 58411, 58417, 58427, 58439, 58441, 58451, - 58453, 58477, 58481, 58511, 58537, 58543, 58549, 58567, - 58573, 58579, 58601, 58603, 58613, 58631, 58657, 58661, - 58679, 58687, 58693, 58699, 58711, 58727, 58733, 58741, - 58757, 58763, 58771, 58787, 58789, 58831, 58889, 58897, - 58901, 58907, 58909, 58913, 58921, 58937, 58943, 58963, - 58967, 58979, 58991, 58997, 59009, 59011, 59021, 59023, - 59029, 59051, 59053, 59063, 59069, 59077, 59083, 59093, - 59107, 59113, 59119, 59123, 59141, 59149, 59159, 59167, - 59183, 59197, 59207, 59209, 59219, 59221, 59233, 59239, - 59243, 59263, 59273, 59281, 59333, 59341, 59351, 59357, - 59359, 59369, 59377, 59387, 59393, 59399, 59407, 59417, - 59419, 59441, 59443, 59447, 59453, 59467, 59471, 59473, - 59497, 59509, 59513, 59539, 59557, 59561, 59567, 59581, - 59611, 59617, 59621, 59627, 59629, 59651, 59659, 59663, - 59669, 59671, 59693, 59699, 59707, 59723, 59729, 59743, - 59747, 59753, 59771, 59779, 59791, 59797, 59809, 59833, - 59863, 59879, 59887, 59921, 59929, 59951, 59957, 59971, - 59981, 59999, 60013, 60017, 60029, 60037, 60041, 60077, - 60083, 60089, 60091, 60101, 60103, 60107, 60127, 60133, - 60139, 60149, 60161, 60167, 60169, 60209, 60217, 60223, - 60251, 60257, 60259, 60271, 60289, 60293, 60317, 60331, - 60337, 60343, 60353, 60373, 60383, 60397, 60413, 60427, - 60443, 60449, 60457, 60493, 60497, 60509, 60521, 60527, - 60539, 60589, 60601, 60607, 60611, 60617, 60623, 60631, - 60637, 60647, 60649, 60659, 60661, 60679, 60689, 60703, - 60719, 60727, 60733, 60737, 60757, 60761, 60763, 60773, - 60779, 60793, 60811, 60821, 60859, 60869, 60887, 60889, - 60899, 60901, 60913, 60917, 60919, 60923, 60937, 60943, - 60953, 60961, 61001, 61007, 61027, 61031, 61043, 61051, - 61057, 61091, 61099, 61121, 61129, 61141, 61151, 61153, - 61169, 61211, 61223, 61231, 61253, 61261, 61283, 61291, - 61297, 61331, 61333, 61339, 61343, 61357, 61363, 61379, - 61381, 61403, 61409, 61417, 61441, 61463, 61469, 61471, - 61483, 61487, 61493, 61507, 61511, 61519, 61543, 61547, - 61553, 61559, 61561, 61583, 61603, 61609, 61613, 61627, - 61631, 61637, 61643, 61651, 61657, 61667, 61673, 61681, - 61687, 61703, 61717, 61723, 61729, 61751, 61757, 61781, - 61813, 61819, 61837, 61843, 61861, 61871, 61879, 61909, - 61927, 61933, 61949, 61961, 61967, 61979, 61981, 61987, - 61991, 62003, 62011, 62017, 62039, 62047, 62053, 62057, - 62071, 62081, 62099, 62119, 62129, 62131, 62137, 62141, - 62143, 62171, 62189, 62191, 62201, 62207, 62213, 62219, - 62233, 62273, 62297, 62299, 62303, 62311, 62323, 62327, - 62347, 62351, 62383, 62401, 62417, 62423, 62459, 62467, - 62473, 62477, 62483, 62497, 62501, 62507, 62533, 62539, - 62549, 62563, 62581, 62591, 62597, 62603, 62617, 62627, - 62633, 62639, 62653, 62659, 62683, 62687, 62701, 62723, - 62731, 62743, 62753, 62761, 62773, 62791, 62801, 62819, - 62827, 62851, 62861, 62869, 62873, 62897, 62903, 62921, - 62927, 62929, 62939, 62969, 62971, 62981, 62983, 62987, - 62989, 63029, 63031, 63059, 63067, 63073, 63079, 63097, - 63103, 63113, 63127, 63131, 63149, 63179, 63197, 63199, - 63211, 63241, 63247, 63277, 63281, 63299, 63311, 63313, - 63317, 63331, 63337, 63347, 63353, 63361, 63367, 63377, - 63389, 63391, 63397, 63409, 63419, 63421, 63439, 63443, - 63463, 63467, 63473, 63487, 63493, 63499, 63521, 63527, - 63533, 63541, 63559, 63577, 63587, 63589, 63599, 63601, - 63607, 63611, 63617, 63629, 63647, 63649, 63659, 63667, - 63671, 63689, 63691, 63697, 63703, 63709, 63719, 63727, - 63737, 63743, 63761, 63773, 63781, 63793, 63799, 63803, - 63809, 63823, 63839, 63841, 63853, 63857, 63863, 63901, - 63907, 63913, 63929, 63949, 63977, 63997, 64007, 64013, - 64019, 64033, 64037, 64063, 64067, 64081, 64091, 64109, - 64123, 64151, 64153, 64157, 64171, 64187, 64189, 64217, - 64223, 64231, 64237, 64271, 64279, 64283, 64301, 64303, - 64319, 64327, 64333, 64373, 64381, 64399, 64403, 64433, - 64439, 64451, 64453, 64483, 64489, 64499, 64513, 64553, - 64567, 64577, 64579, 64591, 64601, 64609, 64613, 64621, - 64627, 64633, 64661, 64663, 64667, 64679, 64693, 64709, - 64717, 64747, 64763, 64781, 64783, 64793, 64811, 64817, - 64849, 64853, 64871, 64877, 64879, 64891, 64901, 64919, - 64921, 64927, 64937, 64951, 64969, 64997, 65003, 65011, - 65027, 65029, 65033, 65053, 65063, 65071, 65089, 65099, - 65101, 65111, 65119, 65123, 65129, 65141, 65147, 65167, - 65171, 65173, 65179, 65183, 65203, 65213, 65239, 65257, - 65267, 65269, 65287, 65293, 65309, 65323, 65327, 65353, - 65357, 65371, 65381, 65393, 65407, 65413, 65419, 65423, - 65437, 65447, 65449, 65479, 65497, 65519, 65521, 65537, - 0 -}; - -static HgObjectVTable __hg_dict_vtable = { - .free = NULL, - .set_flags = _hg_dict_real_set_flags, - .relocate = _hg_dict_real_relocate, - .dup = _hg_dict_real_dup, - .copy = NULL, - .to_string = _hg_dict_real_to_string, -}; -static HgObjectVTable __hg_dict_node_vtable = { - .free = NULL, - .set_flags = _hg_dict_node_real_set_flags, - .relocate = _hg_dict_node_real_relocate, - .dup = NULL, - .copy = NULL, - .to_string = NULL, -}; - /* - * Private Functions + * private functions */ -static guint -_hg_dict_get_prime(guint n) -{ - gint i; - - for (i = 0; hg_dict_primes[i] != 0; i++) { - if (hg_dict_primes[i] >= n) - break; - } - if (hg_dict_primes[i] == 0) - i--; - - return hg_dict_primes[i]; -} - static gboolean -_hg_dict_traverse_set_flags(gpointer key, - gpointer val, - gpointer data) +_hg_object_dict_lookup(hg_object_t *dict, + hg_object_t *key, + guint16 *retval) { - HgMemObject *obj; - guint flags = GPOINTER_TO_UINT (data); - HgList *list = val; - HgListIter iter = hg_list_iter_new(list); + guint16 h, hash; + hg_dictdata_t *data = HG_OBJECT_DICT_DATA (dict); - if (iter == NULL) { - hg_log_warning("Failed to create an iter to set flags from Dict."); - return FALSE; - } - /* no need to mark a key because it's hash value here */ + hg_return_val_if_fail (retval != NULL, FALSE); - /* mark each nodes */ + h = hash = _get_hash(dict, key); while (1) { - HgDictNode *node = hg_list_iter_get_data(iter); + if (data[hash].key != NULL && data[hash].value != NULL) { + if (hg_object_compare(key, data[hash].key)) { + *retval = hash; - hg_mem_get_object__inline(node, obj); - if (obj == NULL) { - hg_log_warning("[BUG] Invalid object %p to be marked: DictNode [list %p]", node, list); + return TRUE; + } } else { -#ifdef DEBUG_GC - G_STMT_START { - if ((flags & HG_MEMOBJ_MARK_AGE_MASK) != 0) { - if (!hg_mem_is_flags__inline(obj, flags)) { - hg_value_node_debug_print(__hg_file_stderr, HG_DEBUG_GC_MARK, HG_TYPE_VALUE_DICT, NULL, node, GINT_TO_POINTER (0)); - } else { - hg_value_node_debug_print(__hg_file_stderr, HG_DEBUG_GC_ALREADYMARK, HG_TYPE_VALUE_DICT, NULL, node, GINT_TO_POINTER (0)); - } - } - } G_STMT_END; -#endif /* DEBUG_GC */ - if (!hg_mem_is_flags__inline(obj, flags)) - hg_mem_add_flags__inline(obj, flags, TRUE); + /* probably no such keys are registered into dict */ + break; } - if (!hg_list_get_iter_next(list, iter)) + /* try to find out next slot */ + if ((hash + 1) == h) { + /* probably no such keys are registered int odict */ break; + } + hash++; + if (hash > __hg_dict_primes[HG_OBJECT_DICT (dict)->length]) { + /* looking at the first slot */ + hash = 0; + } } - hg_list_iter_free(iter); - - return TRUE; -} - -static void -_hg_dict_real_set_flags(gpointer data, - guint flags) -{ - HgDict *dict = data; - HgMemObject *obj; - - hg_mem_get_object__inline(dict->dict, obj); - if (obj == NULL) { - hg_log_warning("[BUG] Invalid object %p to be marked: Dict tree", dict->dict); - } else { - if (!hg_mem_is_flags__inline(obj, flags)) - hg_mem_add_flags__inline(obj, flags, TRUE); - hg_btree_foreach(dict->dict, - _hg_dict_traverse_set_flags, - GUINT_TO_POINTER (flags)); - } -} + *retval = 0; -static void -_hg_dict_real_relocate(gpointer data, - HgMemRelocateInfo *info) -{ - HgDict *dict = data; - - if ((gsize)dict->dict >= info->start && - (gsize)dict->dict <= info->end) { - dict->dict = (gpointer)((gsize)dict->dict + info->diff); - } + return FALSE; } static gboolean -_hg_dict_traverse_dup(gpointer key, - gpointer val, - gpointer data) +_hg_object_dict_insert(hg_object_t *dict, + hg_object_t *key, + hg_object_t *value, + gboolean with_replace) { - HgValueNode *nkey = key, *nval = val, *nnkey, *nnval; - HgDict *dict = data; - HgMemObject *obj; - - hg_mem_get_object__inline(key, obj); - nnkey = hg_object_dup((HgObject *)nkey); - if (nnkey == NULL) { - hg_log_warning("[BUG] Failed to duplicate a key during traversing dict."); - nnkey = nkey; - } - nnval = hg_object_dup((HgObject *)nval); - if (nnval == NULL) { - hg_log_warning("[BUG] Failed to duplicate a val during traversing dict."); - nnval = nval; - } - hg_dict_insert(obj->pool, dict, nnkey, nnval); - - return TRUE; -} - -static gpointer -_hg_dict_real_dup(gpointer data) -{ - HgDict *dict = data, *retval; - HgMemObject *obj; - - hg_mem_get_object__inline(data, obj); - if (obj == NULL) - return NULL; - - retval = hg_dict_new(obj->pool, dict->n_prealloc); - if (retval == NULL) { - hg_log_warning("Failed to duplicate a dict."); - return NULL; - } - hg_dict_traverse(dict, _hg_dict_traverse_dup, retval); - - return retval; -} - -static gpointer -_hg_dict_real_to_string(gpointer data) -{ - HgMemObject *obj; - HgString *retval; - - hg_mem_get_object__inline(data, obj); - if (obj == NULL) - return NULL; - - retval = hg_string_new(obj->pool, 7); - hg_string_append(retval, "-dict-", -1); - - return retval; -} + gboolean retval = FALSE; + guint16 h, hash; + hg_dictdata_t *data = HG_OBJECT_DICT_DATA (dict); -static void -_hg_dict_node_real_set_flags(gpointer data, - guint flags) -{ - HgDictNode *node = data; - HgMemObject *obj; + hg_return_val_if_fail (HG_OBJECT_DICT (dict)->used < HG_OBJECT_DICT (dict)->length, FALSE); - hg_mem_get_object__inline(node->key, obj); - if (obj == NULL) { - hg_log_warning("[BUG] Invalid object %p to be marked: Dict key", node->key); - } else { -#ifdef DEBUG_GC - G_STMT_START { - if ((flags & HG_MEMOBJ_MARK_AGE_MASK) != 0) { - if (!hg_mem_is_flags__inline(obj, flags)) { - hg_value_node_debug_print(__hg_file_stderr, HG_DEBUG_GC_MARK, HG_TYPE_VALUE_DICT, node, node->key, GINT_TO_POINTER (1)); - } else { - hg_value_node_debug_print(__hg_file_stderr, HG_DEBUG_GC_ALREADYMARK, HG_TYPE_VALUE_DICT, node, node->key, GINT_TO_POINTER (1)); - } + h = hash = _get_hash(dict, key); + while (1) { + if (data[hash].key == NULL && data[hash].value == NULL) { + data[hash].key = key; + data[hash].value = value; + HG_OBJECT_DICT (dict)->used++; + retval = TRUE; + break; + } else if (hg_object_compare(key, data[hash].key)) { + if (with_replace) { + data[hash].key = key; + data[hash].value = value; + retval = TRUE; } - } G_STMT_END; -#endif /* DEBUG_GC */ - if (!hg_mem_is_flags__inline(obj, flags)) - hg_mem_add_flags__inline(obj, flags, TRUE); - } - hg_mem_get_object__inline(node->val, obj); - if (obj == NULL) { - hg_log_warning("[BUG] Invalid object %p to be marked: Dict val", node->val); - } else { -#ifdef DEBUG_GC - G_STMT_START { - if ((flags & HG_MEMOBJ_MARK_AGE_MASK) != 0) { - if (!hg_mem_is_flags__inline(obj, flags)) { - hg_value_node_debug_print(__hg_file_stderr, HG_DEBUG_GC_MARK, HG_TYPE_VALUE_DICT, node, node->val, GINT_TO_POINTER (2)); - } else { - hg_value_node_debug_print(__hg_file_stderr, HG_DEBUG_GC_ALREADYMARK, HG_TYPE_VALUE_DICT, node, node->val, GINT_TO_POINTER (2)); - } + break; + } else { + /* try to find out an empty slot */ + if ((hash + 1) == h) { + /* probably no empty slots. + * but guess this won't happen because of checking + */ + g_warning("[BUG] no empty slots in the dict."); + + return FALSE; } - } G_STMT_END; -#endif /* DEBUG_GC */ - if (!hg_mem_is_flags__inline(obj, flags)) - hg_mem_add_flags__inline(obj, flags, TRUE); - } -} - -static void -_hg_dict_node_real_relocate(gpointer data, - HgMemRelocateInfo *info) -{ - HgDictNode *node = data; - - if ((gsize)node->key >= info->start && - (gsize)node->key <= info->end) - node->key = (HgValueNode *)((gsize)node->key + info->diff); - if ((gsize)node->val >= info->start && - (gsize)node->val <= info->end) - node->val = (HgValueNode *)((gsize)node->val + info->diff); -} - -static HgDictNode * -hg_dict_node_new(HgMemPool *pool) -{ - HgDictNode *retval; - - retval = hg_mem_alloc_with_flags(pool, - sizeof (HgDictNode), - HG_FL_HGOBJECT | HG_FL_RESTORABLE); - if (retval == NULL) { - hg_log_warning("Failed to create a dict node."); - return NULL; - } - HG_OBJECT_INIT_STATE (&retval->object); - HG_OBJECT_SET_STATE (&retval->object, hg_mem_pool_get_default_access_mode(pool)); - hg_object_set_vtable(&retval->object, &__hg_dict_node_vtable); - retval->key = NULL; - retval->val = NULL; - - return retval; -} - -static gboolean -_hg_dict_node_compare(gconstpointer a, - gconstpointer b) -{ - const HgDictNode *node = a; - const HgValueNode *key = b; - - return hg_value_node_compare(node->key, key); -} - -static gboolean -_hg_dict_node_compare_with_string(gconstpointer a, - gconstpointer b) -{ - const HgDictNode *node = a; - const gchar *key = b; - - if (HG_IS_VALUE_NAME (node->key)) { - return strcmp(HG_VALUE_GET_NAME (node->key), key) == 0; - } else if (HG_IS_VALUE_STRING (node->key)) { - return hg_string_compare_with_raw(HG_VALUE_GET_STRING (node->key), key, -1); + hash++; + if (hash > __hg_dict_primes[HG_OBJECT_DICT (dict)->length]) { + /* try to find out from first */ + hash = 0; + } + } } return FALSE; } -static gboolean -_hg_dict_traverse_real_traverse(gpointer key, - gpointer val, - gpointer data) -{ - HgList *l = val; - HgListIter iter = hg_list_iter_new(l); - HgDictTraverseInfo *info = data; - - while (1) { - HgDictNode *node = hg_list_iter_get_data(iter); - - if (!info->func(node->key, node->val, info->data)) - return FALSE; - if (!hg_list_get_iter_next(l, iter)) - break; - } - hg_list_iter_free(iter); - - return TRUE; -} - -static gboolean -_hg_dict_compare_on_traverse(gpointer key, - gpointer val, - gpointer data) -{ - HgValueNode *nkey = key; - HgValueNode *nval = val; - HgValueNode *n; - HgDictCompareData *info = data; - - if ((n = hg_dict_lookup(info->opposite_dict, nkey)) == NULL) { - info->result = FALSE; - - return FALSE; - } - if (!hg_value_node_compare_content(nval, n, info->attributes_mask)) { - info->result = FALSE; - - return FALSE; - } - - return TRUE; -} - /* - * Public Functions + * public functions */ -HgDict * -hg_dict_new(HgMemPool *pool, - guint n_prealloc) +hg_object_t * +hg_object_dict_new(hg_vm_t *vm, + guint16 n_nodes) { - HgDict *retval; + hg_object_t *retval; - g_return_val_if_fail (pool != NULL, NULL); - g_return_val_if_fail (n_prealloc >= 0 && n_prealloc <= 65535, NULL); - - retval = hg_mem_alloc_with_flags(pool, - sizeof (HgDict), - HG_FL_HGOBJECT | HG_FL_RESTORABLE | HG_FL_COMPLEX); - if (retval == NULL) { - hg_log_warning("Failed to create a dict."); - return NULL; - } - HG_OBJECT_INIT_STATE (&retval->object); - HG_OBJECT_SET_STATE (&retval->object, hg_mem_pool_get_default_access_mode(pool)); - hg_object_set_vtable(&retval->object, &__hg_dict_vtable); + hg_return_val_if_fail (vm != NULL, NULL); - retval->dict = hg_btree_new(pool, BTREE_N_NODE); - if (retval->dict == NULL) { - hg_mem_free(retval); - return NULL; + retval = hg_object_sized_new(vm, hg_n_alignof (sizeof (hg_dictdata_t) * __hg_dict_primes[n_nodes])); + if (retval != NULL) { + HG_OBJECT_GET_TYPE (retval) = HG_OBJECT_TYPE_DICT; + HG_OBJECT_DICT (retval)->length = n_nodes; + HG_OBJECT_DICT (retval)->used = 0; } - retval->prime = _hg_dict_get_prime(n_prealloc); - retval->n_prealloc = n_prealloc; - retval->n_keys = 0; return retval; } gboolean -hg_dict_insert(HgMemPool *pool, - HgDict *dict, - HgValueNode *key, - HgValueNode *val) +hg_object_dict_compare(hg_object_t *object1, + hg_object_t *object2) { - return hg_dict_insert_forcibly(pool, dict, key, val, FALSE); + hg_return_val_if_fail (object1 != NULL, FALSE); + hg_return_val_if_fail (object2 != NULL, FALSE); + hg_return_val_if_fail (HG_OBJECT_IS_DICT (object1), FALSE); + hg_return_val_if_fail (HG_OBJECT_IS_DICT (object2), FALSE); + + /* XXX: no copy and dup functionalities are available so far. + * so just comparing a pointer should works enough. + */ + return object1 == object2; } -gboolean -hg_dict_insert_forcibly(HgMemPool *pool, - HgDict *dict, - HgValueNode *key, - HgValueNode *val, - gboolean force) +gchar * +hg_object_dict_dump(hg_object_t *object, + gboolean verbose) { - gsize hash; - HgList *l; - HgDictNode *node = NULL; - HgMemObject *obj, *kobj, *vobj; - - g_return_val_if_fail (dict != NULL, FALSE); - g_return_val_if_fail (key != NULL, FALSE); - g_return_val_if_fail (val != NULL, FALSE); - g_return_val_if_fail (hg_object_is_readable((HgObject *)dict), FALSE); - g_return_val_if_fail (hg_object_is_writable((HgObject *)dict), FALSE); - g_return_val_if_fail (dict->n_keys < 65535, FALSE); - - hg_mem_get_object__inline(dict, obj); - g_return_val_if_fail (obj != NULL, FALSE); - hg_mem_get_object__inline(key, kobj); - g_return_val_if_fail (kobj != NULL, FALSE); - hg_mem_get_object__inline(val, vobj); - g_return_val_if_fail (vobj != NULL, FALSE); - - if (!force) { - if (!hg_mem_pool_is_own_object(obj->pool, key)) { - hg_log_warning("key %p isn't allocated from a pool %s\n", key, hg_mem_pool_get_name(obj->pool)); - - return FALSE; - } - if (!hg_mem_pool_is_own_object(obj->pool, val)) { - hg_log_warning("value %p isn't allocated from a pool %s\n", val, hg_mem_pool_get_name(obj->pool)); - - return FALSE; - } - } - - hash = HG_DICT_HASH (dict, key); - if (obj->pool != kobj->pool) - hg_mem_pool_add_pool_reference(kobj->pool, obj->pool); - if (obj->pool != vobj->pool) - hg_mem_pool_add_pool_reference(vobj->pool, obj->pool); - - if ((l = hg_btree_find(dict->dict, GSIZE_TO_POINTER (hash))) != NULL) { - HgListIter iter; + hg_return_val_if_fail (object != NULL, NULL); + hg_return_val_if_fail (HG_OBJECT_IS_DICT (object), NULL); - iter = hg_list_find_iter_custom(l, key, _hg_dict_node_compare); - if (iter) { - node = hg_list_iter_get_data(iter); - node->val = val; - hg_list_iter_free(iter); - } else { - node = hg_dict_node_new(pool); - node->key = key; - node->val = val; - l = hg_list_append_object(l, (HgObject *)node); - dict->n_keys++; - } - } else { - node = hg_dict_node_new(pool); - node->key = key; - node->val = val; - l = hg_list_new(pool); - l = hg_list_append_object(l, (HgObject *)node); - hg_btree_add(dict->dict, GSIZE_TO_POINTER (hash), l); - dict->n_keys++; - } - if (dict->n_keys > dict->n_prealloc) { - hg_log_warning("FIXME: need to recalculate the prime."); - } - - return TRUE; + return g_strdup("--dict--"); } gboolean -hg_dict_remove(HgDict *dict, - HgValueNode *key) +hg_object_dict_insert(hg_object_t *dict, + hg_object_t *key, + hg_object_t *value) { - gsize hash; - HgList *l; - gboolean retval = FALSE; - - g_return_val_if_fail (dict != NULL, FALSE); - g_return_val_if_fail (key != NULL, FALSE); - g_return_val_if_fail (hg_object_is_readable((HgObject *)dict), FALSE); - g_return_val_if_fail (hg_object_is_writable((HgObject *)dict), FALSE); - - hash = HG_DICT_HASH (dict, key); - if ((l = hg_btree_find(dict->dict, GSIZE_TO_POINTER (hash))) != NULL) { - HgListIter iter; + hg_return_val_if_fail (dict != NULL, FALSE); + hg_return_val_if_fail (key != NULL, FALSE); + hg_return_val_if_fail (value != NULL, FALSE); + hg_return_val_if_fail (HG_OBJECT_IS_DICT (dict), FALSE); - iter = hg_list_find_iter_custom(l, key, _hg_dict_node_compare); - if (iter) { - l = hg_list_iter_delete_link(iter); - if (l == NULL) - hg_btree_remove(dict->dict, GSIZE_TO_POINTER (hash)); - else - hg_btree_replace(dict->dict, GSIZE_TO_POINTER (hash), l); - dict->n_keys--; - retval = TRUE; - hg_list_iter_free(iter); - } + if (HG_OBJECT_ATTR_IS_GLOBAL (dict) && + !HG_OBJECT_ATTR_IS_GLOBAL (value)) { + return FALSE; } - return retval; + return _hg_object_dict_insert(dict, key, value, FALSE); } -HgValueNode * -hg_dict_lookup(const HgDict *dict, - HgValueNode *key) +gboolean +hg_object_dict_insert_without_consistency(hg_object_t *dict, + hg_object_t *key, + hg_object_t *value) { - gsize hash; - HgList *l; - HgDictNode *node; - HgValueNode *retval = NULL; + hg_return_val_if_fail (dict != NULL, FALSE); + hg_return_val_if_fail (key != NULL, FALSE); + hg_return_val_if_fail (value != NULL, FALSE); + hg_return_val_if_fail (HG_OBJECT_IS_DICT (dict), FALSE); - g_return_val_if_fail (dict != NULL, NULL); - g_return_val_if_fail (key != NULL, NULL); - g_return_val_if_fail (hg_object_is_readable((HgObject *)dict), NULL); - - hash = HG_DICT_HASH (dict, key); - if ((l = hg_btree_find(dict->dict, GSIZE_TO_POINTER (hash))) != NULL) { - HgListIter iter; - - iter = hg_list_find_iter_custom(l, key, _hg_dict_node_compare); - if (iter) { - node = hg_list_iter_get_data(iter); - retval = hg_object_dup((HgObject *)node->val); - hg_list_iter_free(iter); - } - } - - return retval; + return _hg_object_dict_insert(dict, key, value, FALSE); } -HgValueNode * -hg_dict_lookup_with_string(HgDict *dict, - const gchar *key) +gboolean +hg_object_dict_replace(hg_object_t *dict, + hg_object_t *key, + hg_object_t *value) { - gsize hash = 0; - HgList *l; - HgDictNode *node; - const gchar *p; - HgValueNode *retval = NULL; - - g_return_val_if_fail (dict != NULL, NULL); - g_return_val_if_fail (key != NULL, NULL); - g_return_val_if_fail (hg_object_is_readable((HgObject *)dict), NULL); + hg_return_val_if_fail (dict != NULL, FALSE); + hg_return_val_if_fail (key != NULL, FALSE); + hg_return_val_if_fail (value != NULL, FALSE); + hg_return_val_if_fail (HG_OBJECT_IS_DICT (dict), FALSE); - for (p = key; *p != 0; p++) { - hash = (hash << 5) - hash + *p; - } - hash = (hash << 8) % dict->prime; - if ((l = hg_btree_find(dict->dict, GSIZE_TO_POINTER (hash))) != NULL) { - HgListIter iter; - - iter = hg_list_find_iter_custom(l, key, _hg_dict_node_compare_with_string); - if (iter) { - node = hg_list_iter_get_data(iter); - retval = hg_object_dup((HgObject *)node->val); - hg_list_iter_free(iter); - } + if (HG_OBJECT_ATTR_IS_GLOBAL (dict) && + !HG_OBJECT_ATTR_IS_GLOBAL (value)) { + return FALSE; } - return retval; -} - -guint -hg_dict_length(const HgDict *dict) -{ - g_return_val_if_fail (dict != NULL, 0); - g_return_val_if_fail (hg_object_is_readable((HgObject *)dict), 0); - - return dict->n_keys; + return _hg_object_dict_insert(dict, key, value, TRUE); } -guint -hg_dict_maxlength(const HgDict *dict) - +gboolean +hg_object_dict_replace_without_consistency(hg_object_t *dict, + hg_object_t *key, + hg_object_t *value) { - g_return_val_if_fail (dict != NULL, 0); - g_return_val_if_fail (hg_object_is_readable((HgObject *)dict), 0); + hg_return_val_if_fail (dict != NULL, FALSE); + hg_return_val_if_fail (key != NULL, FALSE); + hg_return_val_if_fail (value != NULL, FALSE); + hg_return_val_if_fail (HG_OBJECT_IS_DICT (dict), FALSE); - return dict->n_prealloc; + return _hg_object_dict_insert(dict, key, value, TRUE); } gboolean -hg_dict_traverse(const HgDict *dict, - HgTraverseFunc func, - gpointer data) +hg_object_dict_remove(hg_object_t *dict, + hg_object_t *key) { - HgDictTraverseInfo info; - - g_return_val_if_fail (dict != NULL, FALSE); - g_return_val_if_fail (func != NULL, FALSE); - - info.func = func; - info.data = data; - hg_btree_foreach(dict->dict, _hg_dict_traverse_real_traverse, &info); + guint16 hash; - return TRUE; -} + hg_return_val_if_fail (dict != NULL, FALSE); + hg_return_val_if_fail (key != NULL, FALSE); + hg_return_val_if_fail (HG_OBJECT_IS_DICT (dict), FALSE); -gboolean -hg_dict_first(HgDict *dict, - HgValueNode **key, - HgValueNode **val) -{ - HgBTreeIter iter; - HgListIter liter; - HgDictNode *node; + if (_hg_object_dict_lookup(dict, key, &hash)) { + hg_dictdata_t *data = HG_OBJECT_DICT_DATA (dict); - g_return_val_if_fail (dict != NULL, FALSE); - g_return_val_if_fail (key != NULL, FALSE); - g_return_val_if_fail (val != NULL, FALSE); + data[hash].key = NULL; + data[hash].value = NULL; - iter = hg_btree_iter_new(); - if (!hg_btree_get_iter_first(dict->dict, iter)) { - hg_btree_iter_free(iter); - return FALSE; - } - if (iter->val == NULL) { - /* FIXME: why does this happen? */ - hg_btree_iter_free(iter); - return FALSE; - } - liter = hg_list_iter_new(iter->val); - if (liter == NULL) { - hg_log_warning("Failed to create an iter to traverse a Dict."); - hg_btree_iter_free(iter); - return FALSE; + return TRUE; } - node = hg_list_iter_get_data(liter); - *key = node->key; - *val = node->val; - hg_btree_iter_free(iter); - hg_list_iter_free(liter); - return TRUE; + return FALSE; } -gboolean -hg_dict_compare(const HgDict *a, - const HgDict *b, - guint attributes_mask) +hg_object_t * +hg_object_dict_lookup(hg_object_t *dict, + hg_object_t *key) { - HgDictCompareData info; - HgMemObject *obj; + guint16 hash; - g_return_val_if_fail (a != NULL, FALSE); - g_return_val_if_fail (b != NULL, FALSE); - - if (a->n_keys != b->n_keys) - return FALSE; + hg_return_val_if_fail (dict != NULL, NULL); + hg_return_val_if_fail (key != NULL, NULL); + hg_return_val_if_fail (HG_OBJECT_IS_DICT (dict), NULL); - hg_mem_get_object__inline(a, obj); - if (obj == NULL) - return FALSE; + if (_hg_object_dict_lookup(dict, key, &hash)) { + hg_dictdata_t *data = HG_OBJECT_DICT_DATA (dict); - if (hg_mem_is_copying(obj)) { - /* postpone the decision. leave it to later comparing so far */ - return TRUE; + return data[hash].value; } - hg_mem_set_copying(obj); - - info.opposite_dict = b; - info.attributes_mask = attributes_mask; - info.result = TRUE; - - hg_dict_traverse(a, _hg_dict_compare_on_traverse, &info); - - hg_mem_unset_copying(obj); - return info.result; + return NULL; } diff --git a/hieroglyph/hgdict.h b/hieroglyph/hgdict.h index 7e91c56..cb3cd2a 100644 --- a/hieroglyph/hgdict.h +++ b/hieroglyph/hgdict.h @@ -1,10 +1,10 @@ /* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ /* * hgdict.h - * Copyright (C) 2005-2006 Akira TAGOH + * Copyright (C) 2005-2007 Akira TAGOH * * Authors: - * Akira TAGOH <at@gclab.org> + * Akira TAGOH <akira@tagoh.org> * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -21,44 +21,37 @@ * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ -#ifndef __HG_DICT_H__ -#define __HG_DICT_H__ +#ifndef __HIEROGLYPH_HGDICT_H__ +#define __HIEROGLYPH_HGDICT_H__ #include <hieroglyph/hgtypes.h> -G_BEGIN_DECLS - -HgDict *hg_dict_new (HgMemPool *pool, - guint n_prealloc); -gboolean hg_dict_insert (HgMemPool *pool, - HgDict *dict, - HgValueNode *key, - HgValueNode *val); -gboolean hg_dict_insert_forcibly (HgMemPool *pool, - HgDict *dict, - HgValueNode *key, - HgValueNode *val, - gboolean force); -gboolean hg_dict_remove (HgDict *dict, - HgValueNode *key); -HgValueNode *hg_dict_lookup (const HgDict *dict, - HgValueNode *key); -HgValueNode *hg_dict_lookup_with_string(HgDict *dict, - const gchar *key); -guint hg_dict_length (const HgDict *dict); -guint hg_dict_maxlength (const HgDict *dict); -gboolean hg_dict_traverse (const HgDict *dict, - HgTraverseFunc func, - gpointer data); -gboolean hg_dict_first (HgDict *dict, - HgValueNode **key, - HgValueNode **val); -gboolean hg_dict_compare (const HgDict *a, - const HgDict *b, - guint attributes_mask); +G_BEGIN_DECLS +hg_object_t *hg_object_dict_new (hg_vm_t *vm, + guint16 n_nodes) G_GNUC_WARN_UNUSED_RESULT; +gboolean hg_object_dict_compare (hg_object_t *object1, + hg_object_t *object2); +gchar *hg_object_dict_dump (hg_object_t *object, + gboolean verbose) G_GNUC_MALLOC; +gboolean hg_object_dict_insert (hg_object_t *dict, + hg_object_t *key, + hg_object_t *value); +gboolean hg_object_dict_insert_without_consistency (hg_object_t *dict, + hg_object_t *key, + hg_object_t *value); +gboolean hg_object_dict_replace (hg_object_t *dict, + hg_object_t *key, + hg_object_t *value); +gboolean hg_object_dict_replace_without_consistency(hg_object_t *dict, + hg_object_t *key, + hg_object_t *value); +gboolean hg_object_dict_remove (hg_object_t *dict, + hg_object_t *key); +hg_object_t *hg_object_dict_lookup (hg_object_t *dict, + hg_object_t *key); G_END_DECLS -#endif /* __HG_DICT_H__ */ +#endif /* __HIEROGLYPH_HGDICT_H__ */ diff --git a/hieroglyph/hgdictprime.h b/hieroglyph/hgdictprime.h new file mode 100644 index 0000000..83572d6 --- /dev/null +++ b/hieroglyph/hgdictprime.h @@ -0,0 +1,7093 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ +/* + * hgdictprime.h + * Copyright (C) 2005-2007 Akira TAGOH + * + * Authors: + * Akira TAGOH <akira@tagoh.org> + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +#include <glib/gtypes.h> + +static guint32 __hg_dict_primes[] = { + 2, 2, 2, 3, 5, 5, 7, 7, 11, 11, 11, 11, 13, 13, 17, 17, 17, + 19, 19, 23, 23, 23, 23, 29, 29, 29, 29, 29, 29, 31, 31, 37, + 37, 37, 37, 37, 41, 41, 41, 41, 43, 43, 47, 47, 47, 47, 53, + 53, 53, 53, 53, 59, 59, 59, 59, 59, 59, 61, 61, 67, 67, 67, + 67, 67, 71, 71, 71, 71, 73, 73, 79, 79, 79, 79, 79, 79, 83, + 83, 83, 89, 89, 89, 89, 89, 89, 97, 97, 97, 97, 97, 97, 97, + 101, 101, 101, 101, 103, 103, 107, 107, 107, 107, 109, 109, + 113, 113, 113, 127, 127, 127, 127, 127, 127, 127, 127, 127, + 127, 127, 127, 127, 131, 131, 131, 131, 137, 137, 137, 137, + 137, 139, 139, 149, 149, 149, 149, 149, 149, 149, 149, 149, + 151, 151, 157, 157, 157, 157, 157, 157, 163, 163, 163, 163, + 163, 167, 167, 167, 167, 173, 173, 173, 173, 173, 173, 179, + 179, 179, 179, 179, 181, 181, 191, 191, 191, 191, 191, 191, + 191, 191, 191, 193, 193, 197, 197, 197, 197, 199, 199, 211, + 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 223, 223, + 223, 223, 223, 223, 223, 223, 223, 223, 223, 227, 227, 227, + 229, 229, 233, 233, 233, 233, 239, 239, 239, 239, 239, 239, + 241, 251, 251, 251, 251, 251, 251, 251, 251, 251, 251, 257, + 257, 257, 257, 257, 263, 263, 263, 263, 263, 263, 269, 269, + 269, 269, 269, 271, 271, 277, 277, 277, 277, 277, 277, 281, + 281, 281, 283, 283, 293, 293, 293, 293, 293, 293, 293, 293, + 293, 307, 307, 307, 307, 307, 307, 307, 307, 307, 307, 307, + 307, 307, 311, 311, 311, 311, 313, 313, 317, 317, 317, 317, + 331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331, + 337, 337, 337, 337, 337, 337, 347, 347, 347, 347, 347, 347, + 347, 347, 347, 349, 349, 353, 353, 353, 353, 359, 359, 359, + 359, 359, 367, 367, 367, 367, 367, 367, 367, 367, 373, 373, + 373, 373, 373, 379, 379, 379, 379, 379, 379, 383, 383, 383, + 389, 389, 389, 389, 389, 389, 397, 397, 397, 397, 397, 397, + 397, 401, 401, 401, 401, 409, 409, 409, 409, 409, 409, 409, + 419, 419, 419, 419, 419, 419, 419, 419, 419, 419, 421, 421, + 431, 431, 431, 431, 431, 431, 431, 431, 431, 433, 433, 439, + 439, 439, 439, 439, 443, 443, 443, 443, 449, 449, 449, 449, + 449, 457, 457, 457, 457, 457, 457, 457, 457, 461, 461, 461, + 463, 463, 467, 467, 467, 467, 479, 479, 479, 479, 479, 479, + 479, 479, 479, 479, 479, 487, 487, 487, 487, 487, 487, 487, + 491, 491, 491, 491, 499, 499, 499, 499, 499, 499, 499, 499, + 503, 503, 503, 509, 509, 509, 509, 509, 509, 521, 521, 521, + 521, 521, 521, 521, 521, 521, 521, 521, 523, 523, 541, 541, + 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, + 541, 541, 547, 547, 547, 547, 547, 547, 557, 557, 557, 557, + 557, 557, 557, 557, 557, 563, 563, 563, 563, 563, 563, 569, + 569, 569, 569, 569, 571, 571, 577, 577, 577, 577, 577, 577, + 587, 587, 587, 587, 587, 587, 587, 587, 587, 593, 593, 593, + 593, 593, 599, 599, 599, 599, 599, 599, 601, 601, 607, 607, + 607, 607, 607, 613, 613, 613, 613, 613, 613, 617, 617, 617, + 619, 619, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, + 631, 641, 641, 641, 641, 641, 641, 641, 641, 641, 641, 643, + 647, 647, 647, 647, 653, 653, 653, 653, 653, 653, 659, 659, + 659, 659, 659, 661, 661, 673, 673, 673, 673, 673, 673, 673, + 673, 673, 673, 673, 677, 677, 677, 677, 683, 683, 683, 683, + 683, 691, 691, 691, 691, 691, 691, 691, 691, 701, 701, 701, + 701, 701, 701, 701, 701, 701, 709, 709, 709, 709, 709, 709, + 709, 719, 719, 719, 719, 719, 719, 719, 719, 719, 719, 727, + 727, 727, 727, 727, 727, 727, 733, 733, 733, 733, 733, 733, + 739, 739, 739, 739, 739, 743, 743, 743, 743, 751, 751, 751, + 751, 751, 751, 751, 757, 757, 757, 757, 757, 757, 761, 761, + 761, 769, 769, 769, 769, 769, 769, 769, 769, 773, 773, 773, + 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, 787, + 787, 797, 797, 797, 797, 797, 797, 797, 797, 797, 797, 809, + 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 811, 811, + 821, 821, 821, 821, 821, 821, 821, 821, 821, 823, 823, 827, + 827, 827, 829, 829, 839, 839, 839, 839, 839, 839, 839, 839, + 839, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, 853, + 853, 853, 857, 857, 857, 857, 859, 859, 863, 863, 863, 863, + 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, 877, + 881, 881, 881, 881, 883, 883, 887, 887, 887, 887, 907, 907, + 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, 907, + 907, 907, 907, 907, 911, 911, 911, 911, 919, 919, 919, 919, + 919, 919, 919, 929, 929, 929, 929, 929, 929, 929, 929, 929, + 937, 937, 937, 937, 937, 937, 937, 937, 941, 941, 941, 941, + 947, 947, 947, 947, 947, 953, 953, 953, 953, 953, 953, 967, + 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, 967, + 971, 971, 971, 977, 977, 977, 977, 977, 977, 983, 983, 983, + 983, 983, 991, 991, 991, 991, 991, 991, 991, 991, 997, 997, + 997, 997, 997, 1009, 1009, 1009, 1009, 1009, 1009, 1009, + 1009, 1009, 1009, 1009, 1013, 1013, 1013, 1013, 1019, 1019, + 1019, 1019, 1019, 1021, 1021, 1031, 1031, 1031, 1031, 1031, + 1031, 1031, 1031, 1031, 1033, 1033, 1039, 1039, 1039, 1039, + 1039, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, 1049, + 1051, 1051, 1061, 1061, 1061, 1061, 1061, 1061, 1061, 1061, + 1061, 1063, 1063, 1069, 1069, 1069, 1069, 1069, 1069, 1087, + 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, 1087, + 1087, 1087, 1087, 1087, 1087, 1091, 1091, 1091, 1091, 1093, + 1097, 1097, 1097, 1097, 1103, 1103, 1103, 1103, 1103, 1103, + 1109, 1109, 1109, 1109, 1109, 1117, 1117, 1117, 1117, 1117, + 1117, 1117, 1123, 1123, 1123, 1123, 1123, 1123, 1129, 1129, + 1129, 1129, 1129, 1151, 1151, 1151, 1151, 1151, 1151, 1151, + 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, + 1151, 1151, 1151, 1153, 1153, 1163, 1163, 1163, 1163, 1163, + 1163, 1163, 1163, 1163, 1171, 1171, 1171, 1171, 1171, 1171, + 1171, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, + 1187, 1187, 1187, 1187, 1187, 1187, 1193, 1193, 1193, 1193, + 1193, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1201, 1213, + 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, + 1217, 1217, 1217, 1223, 1223, 1223, 1223, 1223, 1223, 1229, + 1229, 1229, 1229, 1229, 1231, 1231, 1237, 1237, 1237, 1237, + 1237, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, 1249, + 1249, 1249, 1259, 1259, 1259, 1259, 1259, 1259, 1259, 1259, + 1259, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, + 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1277, 1279, 1279, + 1283, 1283, 1283, 1289, 1289, 1289, 1289, 1289, 1289, 1291, + 1297, 1297, 1297, 1297, 1297, 1297, 1301, 1301, 1301, 1301, + 1303, 1307, 1307, 1307, 1307, 1319, 1319, 1319, 1319, 1319, + 1319, 1319, 1319, 1319, 1319, 1319, 1321, 1321, 1327, 1327, + 1327, 1327, 1327, 1361, 1361, 1361, 1361, 1361, 1361, 1361, + 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, + 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, + 1361, 1361, 1361, 1361, 1367, 1367, 1367, 1367, 1367, 1367, + 1373, 1373, 1373, 1373, 1373, 1381, 1381, 1381, 1381, 1381, + 1381, 1381, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, + 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1399, 1409, + 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1409, 1423, 1423, + 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, 1423, + 1427, 1427, 1427, 1427, 1429, 1429, 1433, 1433, 1433, 1433, + 1439, 1439, 1439, 1439, 1439, 1447, 1447, 1447, 1447, 1447, + 1447, 1447, 1451, 1451, 1451, 1451, 1453, 1453, 1459, 1459, + 1459, 1459, 1459, 1471, 1471, 1471, 1471, 1471, 1471, 1471, + 1471, 1471, 1471, 1471, 1481, 1481, 1481, 1481, 1481, 1481, + 1481, 1481, 1481, 1483, 1483, 1487, 1487, 1487, 1487, 1489, + 1493, 1493, 1493, 1493, 1499, 1499, 1499, 1499, 1499, 1499, + 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, 1511, + 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, 1523, + 1523, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1531, 1543, + 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, 1543, + 1549, 1549, 1549, 1549, 1549, 1553, 1553, 1553, 1553, 1559, + 1559, 1559, 1559, 1559, 1567, 1567, 1567, 1567, 1567, 1567, + 1567, 1571, 1571, 1571, 1571, 1579, 1579, 1579, 1579, 1579, + 1579, 1579, 1583, 1583, 1583, 1583, 1597, 1597, 1597, 1597, + 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1597, 1601, + 1601, 1601, 1607, 1607, 1607, 1607, 1607, 1607, 1609, 1609, + 1613, 1613, 1613, 1619, 1619, 1619, 1619, 1619, 1619, 1621, + 1627, 1627, 1627, 1627, 1627, 1627, 1637, 1637, 1637, 1637, + 1637, 1637, 1637, 1637, 1637, 1657, 1657, 1657, 1657, 1657, + 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, 1657, + 1657, 1657, 1657, 1663, 1663, 1663, 1663, 1663, 1663, 1667, + 1667, 1667, 1669, 1669, 1693, 1693, 1693, 1693, 1693, 1693, + 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, 1693, + 1693, 1693, 1693, 1693, 1693, 1693, 1697, 1697, 1697, 1697, + 1699, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, 1709, + 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, + 1721, 1723, 1723, 1733, 1733, 1733, 1733, 1733, 1733, 1733, + 1733, 1733, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, + 1747, 1747, 1747, 1747, 1747, 1753, 1753, 1753, 1753, 1753, + 1759, 1759, 1759, 1759, 1759, 1759, 1777, 1777, 1777, 1777, + 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, 1777, + 1777, 1777, 1783, 1783, 1783, 1783, 1783, 1783, 1787, 1787, + 1787, 1789, 1789, 1801, 1801, 1801, 1801, 1801, 1801, 1801, + 1801, 1801, 1801, 1801, 1811, 1811, 1811, 1811, 1811, 1811, + 1811, 1811, 1811, 1823, 1823, 1823, 1823, 1823, 1823, 1823, + 1823, 1823, 1823, 1823, 1831, 1831, 1831, 1831, 1831, 1831, + 1831, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, + 1847, 1847, 1847, 1847, 1847, 1847, 1861, 1861, 1861, 1861, + 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1867, + 1867, 1867, 1867, 1867, 1871, 1871, 1871, 1871, 1873, 1873, + 1877, 1877, 1877, 1879, 1879, 1889, 1889, 1889, 1889, 1889, + 1889, 1889, 1889, 1889, 1901, 1901, 1901, 1901, 1901, 1901, + 1901, 1901, 1901, 1901, 1901, 1907, 1907, 1907, 1907, 1907, + 1913, 1913, 1913, 1913, 1913, 1913, 1931, 1931, 1931, 1931, + 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, 1931, + 1931, 1931, 1933, 1933, 1949, 1949, 1949, 1949, 1949, 1949, + 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1949, 1951, + 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, + 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, 1973, + 1979, 1979, 1979, 1979, 1979, 1979, 1987, 1987, 1987, 1987, + 1987, 1987, 1987, 1993, 1993, 1993, 1993, 1993, 1993, 1997, + 1997, 1997, 1999, 1999, 2003, 2003, 2003, 2003, 2011, 2011, + 2011, 2011, 2011, 2011, 2011, 2017, 2017, 2017, 2017, 2017, + 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, 2027, + 2029, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, 2039, + 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, 2053, + 2053, 2053, 2053, 2063, 2063, 2063, 2063, 2063, 2063, 2063, + 2063, 2063, 2069, 2069, 2069, 2069, 2069, 2069, 2081, 2081, + 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2081, 2083, + 2087, 2087, 2087, 2087, 2089, 2089, 2099, 2099, 2099, 2099, + 2099, 2099, 2099, 2099, 2099, 2111, 2111, 2111, 2111, 2111, + 2111, 2111, 2111, 2111, 2111, 2111, 2113, 2113, 2129, 2129, + 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, 2129, + 2129, 2129, 2131, 2131, 2137, 2137, 2137, 2137, 2137, 2137, + 2141, 2141, 2141, 2143, 2143, 2153, 2153, 2153, 2153, 2153, + 2153, 2153, 2153, 2153, 2161, 2161, 2161, 2161, 2161, 2161, + 2161, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, + 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2179, 2203, 2203, + 2203, 2203, 2203, 2203, 2203, 2203, 2203, 2203, 2203, 2203, + 2203, 2203, 2203, 2203, 2203, 2203, 2203, 2203, 2203, 2203, + 2207, 2207, 2207, 2213, 2213, 2213, 2213, 2213, 2213, 2221, + 2221, 2221, 2221, 2221, 2221, 2221, 2237, 2237, 2237, 2237, + 2237, 2237, 2237, 2237, 2237, 2237, 2237, 2237, 2237, 2237, + 2239, 2239, 2243, 2243, 2243, 2243, 2251, 2251, 2251, 2251, + 2251, 2251, 2251, 2267, 2267, 2267, 2267, 2267, 2267, 2267, + 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2267, 2269, 2269, + 2273, 2273, 2273, 2281, 2281, 2281, 2281, 2281, 2281, 2281, + 2287, 2287, 2287, 2287, 2287, 2287, 2293, 2293, 2293, 2293, + 2293, 2297, 2297, 2297, 2297, 2309, 2309, 2309, 2309, 2309, + 2309, 2309, 2309, 2309, 2309, 2309, 2311, 2311, 2333, 2333, + 2333, 2333, 2333, 2333, 2333, 2333, 2333, 2333, 2333, 2333, + 2333, 2333, 2333, 2333, 2333, 2333, 2333, 2333, 2339, 2339, + 2339, 2339, 2339, 2341, 2341, 2347, 2347, 2347, 2347, 2347, + 2351, 2351, 2351, 2351, 2357, 2357, 2357, 2357, 2357, 2357, + 2371, 2371, 2371, 2371, 2371, 2371, 2371, 2371, 2371, 2371, + 2371, 2371, 2377, 2377, 2377, 2377, 2377, 2377, 2381, 2381, + 2381, 2383, 2383, 2389, 2389, 2389, 2389, 2389, 2389, 2393, + 2393, 2393, 2399, 2399, 2399, 2399, 2399, 2399, 2411, 2411, + 2411, 2411, 2411, 2411, 2411, 2411, 2411, 2411, 2411, 2417, + 2417, 2417, 2417, 2417, 2423, 2423, 2423, 2423, 2423, 2423, + 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, 2437, + 2437, 2437, 2441, 2441, 2441, 2441, 2447, 2447, 2447, 2447, + 2447, 2459, 2459, 2459, 2459, 2459, 2459, 2459, 2459, 2459, + 2459, 2459, 2467, 2467, 2467, 2467, 2467, 2467, 2467, 2467, + 2473, 2473, 2473, 2473, 2473, 2477, 2477, 2477, 2477, 2503, + 2503, 2503, 2503, 2503, 2503, 2503, 2503, 2503, 2503, 2503, + 2503, 2503, 2503, 2503, 2503, 2503, 2503, 2503, 2503, 2503, + 2503, 2503, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, + 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2521, 2531, + 2531, 2531, 2531, 2531, 2531, 2531, 2531, 2531, 2539, 2539, + 2539, 2539, 2539, 2539, 2539, 2543, 2543, 2543, 2543, 2549, + 2549, 2549, 2549, 2549, 2551, 2551, 2557, 2557, 2557, 2557, + 2557, 2579, 2579, 2579, 2579, 2579, 2579, 2579, 2579, 2579, + 2579, 2579, 2579, 2579, 2579, 2579, 2579, 2579, 2579, 2579, + 2579, 2591, 2591, 2591, 2591, 2591, 2591, 2591, 2591, 2591, + 2591, 2591, 2593, 2593, 2609, 2609, 2609, 2609, 2609, 2609, + 2609, 2609, 2609, 2609, 2609, 2609, 2609, 2609, 2609, 2617, + 2617, 2617, 2617, 2617, 2617, 2617, 2621, 2621, 2621, 2621, + 2633, 2633, 2633, 2633, 2633, 2633, 2633, 2633, 2633, 2633, + 2647, 2647, 2647, 2647, 2647, 2647, 2647, 2647, 2647, 2647, + 2647, 2647, 2647, 2657, 2657, 2657, 2657, 2657, 2657, 2657, + 2657, 2657, 2659, 2659, 2663, 2663, 2663, 2663, 2671, 2671, + 2671, 2671, 2671, 2671, 2671, 2677, 2677, 2677, 2677, 2677, + 2683, 2683, 2683, 2683, 2683, 2683, 2687, 2687, 2687, 2687, + 2689, 2693, 2693, 2693, 2693, 2699, 2699, 2699, 2699, 2699, + 2707, 2707, 2707, 2707, 2707, 2707, 2707, 2707, 2711, 2711, + 2711, 2713, 2713, 2719, 2719, 2719, 2719, 2719, 2719, 2729, + 2729, 2729, 2729, 2729, 2729, 2729, 2729, 2729, 2731, 2731, + 2741, 2741, 2741, 2741, 2741, 2741, 2741, 2741, 2741, 2749, + 2749, 2749, 2749, 2749, 2749, 2749, 2753, 2753, 2753, 2753, + 2767, 2767, 2767, 2767, 2767, 2767, 2767, 2767, 2767, 2767, + 2767, 2767, 2777, 2777, 2777, 2777, 2777, 2777, 2777, 2777, + 2777, 2789, 2789, 2789, 2789, 2789, 2789, 2789, 2789, 2789, + 2789, 2789, 2791, 2791, 2797, 2797, 2797, 2797, 2797, 2797, + 2801, 2801, 2801, 2803, 2803, 2819, 2819, 2819, 2819, 2819, + 2819, 2819, 2819, 2819, 2819, 2819, 2819, 2819, 2819, 2819, + 2833, 2833, 2833, 2833, 2833, 2833, 2833, 2833, 2833, 2833, + 2833, 2833, 2837, 2837, 2837, 2837, 2843, 2843, 2843, 2843, + 2843, 2851, 2851, 2851, 2851, 2851, 2851, 2851, 2851, 2857, + 2857, 2857, 2857, 2857, 2861, 2861, 2861, 2861, 2879, 2879, + 2879, 2879, 2879, 2879, 2879, 2879, 2879, 2879, 2879, 2879, + 2879, 2879, 2879, 2879, 2887, 2887, 2887, 2887, 2887, 2887, + 2887, 2897, 2897, 2897, 2897, 2897, 2897, 2897, 2897, 2897, + 2903, 2903, 2903, 2903, 2903, 2903, 2909, 2909, 2909, 2909, + 2909, 2917, 2917, 2917, 2917, 2917, 2917, 2917, 2917, 2927, + 2927, 2927, 2927, 2927, 2927, 2927, 2927, 2927, 2939, 2939, + 2939, 2939, 2939, 2939, 2939, 2939, 2939, 2939, 2939, 2953, + 2953, 2953, 2953, 2953, 2953, 2953, 2953, 2953, 2953, 2953, + 2953, 2957, 2957, 2957, 2957, 2963, 2963, 2963, 2963, 2963, + 2969, 2969, 2969, 2969, 2969, 2969, 2971, 2971, 2999, 2999, + 2999, 2999, 2999, 2999, 2999, 2999, 2999, 2999, 2999, 2999, + 2999, 2999, 2999, 2999, 2999, 2999, 2999, 2999, 2999, 2999, + 2999, 2999, 2999, 3001, 3001, 3011, 3011, 3011, 3011, 3011, + 3011, 3011, 3011, 3011, 3019, 3019, 3019, 3019, 3019, 3019, + 3019, 3023, 3023, 3023, 3023, 3037, 3037, 3037, 3037, 3037, + 3037, 3037, 3037, 3037, 3037, 3037, 3037, 3037, 3041, 3041, + 3041, 3049, 3049, 3049, 3049, 3049, 3049, 3049, 3049, 3061, + 3061, 3061, 3061, 3061, 3061, 3061, 3061, 3061, 3061, 3061, + 3067, 3067, 3067, 3067, 3067, 3079, 3079, 3079, 3079, 3079, + 3079, 3079, 3079, 3079, 3079, 3079, 3083, 3083, 3083, 3083, + 3089, 3089, 3089, 3089, 3089, 3109, 3109, 3109, 3109, 3109, + 3109, 3109, 3109, 3109, 3109, 3109, 3109, 3109, 3109, 3109, + 3109, 3109, 3109, 3119, 3119, 3119, 3119, 3119, 3119, 3119, + 3119, 3119, 3121, 3121, 3137, 3137, 3137, 3137, 3137, 3137, + 3137, 3137, 3137, 3137, 3137, 3137, 3137, 3137, 3137, 3163, + 3163, 3163, 3163, 3163, 3163, 3163, 3163, 3163, 3163, 3163, + 3163, 3163, 3163, 3163, 3163, 3163, 3163, 3163, 3163, 3163, + 3163, 3163, 3167, 3167, 3167, 3167, 3169, 3169, 3181, 3181, + 3181, 3181, 3181, 3181, 3181, 3181, 3181, 3181, 3181, 3187, + 3187, 3187, 3187, 3187, 3191, 3191, 3191, 3191, 3203, 3203, + 3203, 3203, 3203, 3203, 3203, 3203, 3203, 3203, 3203, 3209, + 3209, 3209, 3209, 3209, 3217, 3217, 3217, 3217, 3217, 3217, + 3217, 3221, 3221, 3221, 3221, 3229, 3229, 3229, 3229, 3229, + 3229, 3229, 3251, 3251, 3251, 3251, 3251, 3251, 3251, 3251, + 3251, 3251, 3251, 3251, 3251, 3251, 3251, 3251, 3251, 3251, + 3251, 3251, 3253, 3253, 3257, 3257, 3257, 3257, 3259, 3259, + 3271, 3271, 3271, 3271, 3271, 3271, 3271, 3271, 3271, 3271, + 3299, 3299, 3299, 3299, 3299, 3299, 3299, 3299, 3299, 3299, + 3299, 3299, 3299, 3299, 3299, 3299, 3299, 3299, 3299, 3299, + 3299, 3299, 3299, 3299, 3299, 3299, 3301, 3301, 3307, 3307, + 3307, 3307, 3307, 3313, 3313, 3313, 3313, 3313, 3313, 3319, + 3319, 3319, 3319, 3319, 3323, 3323, 3323, 3323, 3329, 3329, + 3329, 3329, 3329, 3331, 3331, 3343, 3343, 3343, 3343, 3343, + 3343, 3343, 3343, 3343, 3343, 3343, 3347, 3347, 3347, 3347, + 3359, 3359, 3359, 3359, 3359, 3359, 3359, 3359, 3359, 3359, + 3361, 3361, 3371, 3371, 3371, 3371, 3371, 3371, 3371, 3371, + 3371, 3373, 3373, 3389, 3389, 3389, 3389, 3389, 3389, 3389, + 3389, 3389, 3389, 3389, 3389, 3389, 3389, 3389, 3391, 3391, + 3407, 3407, 3407, 3407, 3407, 3407, 3407, 3407, 3407, 3407, + 3407, 3407, 3407, 3407, 3413, 3413, 3413, 3413, 3413, 3413, + 3433, 3433, 3433, 3433, 3433, 3433, 3433, 3433, 3433, 3433, + 3433, 3433, 3433, 3433, 3433, 3433, 3433, 3433, 3449, 3449, + 3449, 3449, 3449, 3449, 3449, 3449, 3449, 3449, 3449, 3449, + 3449, 3449, 3457, 3457, 3457, 3457, 3457, 3457, 3457, 3457, + 3461, 3461, 3461, 3463, 3463, 3467, 3467, 3467, 3467, 3469, + 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, + 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, 3491, + 3499, 3499, 3499, 3499, 3499, 3499, 3499, 3499, 3511, 3511, + 3511, 3511, 3511, 3511, 3511, 3511, 3511, 3511, 3511, 3517, + 3517, 3517, 3517, 3517, 3527, 3527, 3527, 3527, 3527, 3527, + 3527, 3527, 3527, 3529, 3529, 3533, 3533, 3533, 3533, 3539, + 3539, 3539, 3539, 3539, 3541, 3541, 3547, 3547, 3547, 3547, + 3547, 3557, 3557, 3557, 3557, 3557, 3557, 3557, 3557, 3557, + 3559, 3559, 3571, 3571, 3571, 3571, 3571, 3571, 3571, 3571, + 3571, 3571, 3571, 3581, 3581, 3581, 3581, 3581, 3581, 3581, + 3581, 3581, 3583, 3583, 3593, 3593, 3593, 3593, 3593, 3593, + 3593, 3593, 3593, 3607, 3607, 3607, 3607, 3607, 3607, 3607, + 3607, 3607, 3607, 3607, 3607, 3607, 3613, 3613, 3613, 3613, + 3613, 3617, 3617, 3617, 3617, 3623, 3623, 3623, 3623, 3623, + 3631, 3631, 3631, 3631, 3631, 3631, 3631, 3631, 3637, 3637, + 3637, 3637, 3637, 3643, 3643, 3643, 3643, 3643, 3643, 3659, + 3659, 3659, 3659, 3659, 3659, 3659, 3659, 3659, 3659, 3659, + 3659, 3659, 3659, 3671, 3671, 3671, 3671, 3671, 3671, 3671, + 3671, 3671, 3671, 3671, 3673, 3673, 3677, 3677, 3677, 3677, + 3691, 3691, 3691, 3691, 3691, 3691, 3691, 3691, 3691, 3691, + 3691, 3691, 3697, 3697, 3697, 3697, 3697, 3697, 3701, 3701, + 3701, 3709, 3709, 3709, 3709, 3709, 3709, 3709, 3709, 3719, + 3719, 3719, 3719, 3719, 3719, 3719, 3719, 3719, 3727, 3727, + 3727, 3727, 3727, 3727, 3727, 3733, 3733, 3733, 3733, 3733, + 3739, 3739, 3739, 3739, 3739, 3739, 3761, 3761, 3761, 3761, + 3761, 3761, 3761, 3761, 3761, 3761, 3761, 3761, 3761, 3761, + 3761, 3761, 3761, 3761, 3761, 3761, 3767, 3767, 3767, 3767, + 3767, 3769, 3769, 3779, 3779, 3779, 3779, 3779, 3779, 3779, + 3779, 3779, 3793, 3793, 3793, 3793, 3793, 3793, 3793, 3793, + 3793, 3793, 3793, 3793, 3793, 3797, 3797, 3797, 3797, 3803, + 3803, 3803, 3803, 3803, 3821, 3821, 3821, 3821, 3821, 3821, + 3821, 3821, 3821, 3821, 3821, 3821, 3821, 3821, 3821, 3821, + 3823, 3823, 3833, 3833, 3833, 3833, 3833, 3833, 3833, 3833, + 3833, 3847, 3847, 3847, 3847, 3847, 3847, 3847, 3847, 3847, + 3847, 3847, 3847, 3847, 3851, 3851, 3851, 3851, 3853, 3853, + 3863, 3863, 3863, 3863, 3863, 3863, 3863, 3863, 3863, 3877, + 3877, 3877, 3877, 3877, 3877, 3877, 3877, 3877, 3877, 3877, + 3877, 3881, 3881, 3881, 3881, 3889, 3889, 3889, 3889, 3889, + 3889, 3889, 3907, 3907, 3907, 3907, 3907, 3907, 3907, 3907, + 3907, 3907, 3907, 3907, 3907, 3907, 3907, 3907, 3907, 3911, + 3911, 3911, 3917, 3917, 3917, 3917, 3917, 3917, 3919, 3919, + 3923, 3923, 3923, 3929, 3929, 3929, 3929, 3929, 3929, 3931, + 3943, 3943, 3943, 3943, 3943, 3943, 3943, 3943, 3943, 3943, + 3943, 3947, 3947, 3947, 3947, 3967, 3967, 3967, 3967, 3967, + 3967, 3967, 3967, 3967, 3967, 3967, 3967, 3967, 3967, 3967, + 3967, 3967, 3967, 3989, 3989, 3989, 3989, 3989, 3989, 3989, + 3989, 3989, 3989, 3989, 3989, 3989, 3989, 3989, 3989, 3989, + 3989, 3989, 3989, 4001, 4001, 4001, 4001, 4001, 4001, 4001, + 4001, 4001, 4001, 4001, 4003, 4003, 4007, 4007, 4007, 4007, + 4013, 4013, 4013, 4013, 4013, 4019, 4019, 4019, 4019, 4019, + 4021, 4021, 4027, 4027, 4027, 4027, 4027, 4027, 4049, 4049, + 4049, 4049, 4049, 4049, 4049, 4049, 4049, 4049, 4049, 4049, + 4049, 4049, 4049, 4049, 4049, 4049, 4049, 4049, 4051, 4051, + 4057, 4057, 4057, 4057, 4057, 4073, 4073, 4073, 4073, 4073, + 4073, 4073, 4073, 4073, 4073, 4073, 4073, 4073, 4073, 4073, + 4079, 4079, 4079, 4079, 4079, 4091, 4091, 4091, 4091, 4091, + 4091, 4091, 4091, 4091, 4091, 4091, 4093, 4093, 4099, 4099, + 4099, 4099, 4099, 4111, 4111, 4111, 4111, 4111, 4111, 4111, + 4111, 4111, 4111, 4111, 4127, 4127, 4127, 4127, 4127, 4127, + 4127, 4127, 4127, 4127, 4127, 4127, 4127, 4127, 4127, 4129, + 4133, 4133, 4133, 4133, 4139, 4139, 4139, 4139, 4139, 4139, + 4153, 4153, 4153, 4153, 4153, 4153, 4153, 4153, 4153, 4153, + 4153, 4153, 4157, 4157, 4157, 4157, 4159, 4159, 4177, 4177, + 4177, 4177, 4177, 4177, 4177, 4177, 4177, 4177, 4177, 4177, + 4177, 4177, 4177, 4177, 4201, 4201, 4201, 4201, 4201, 4201, + 4201, 4201, 4201, 4201, 4201, 4201, 4201, 4201, 4201, 4201, + 4201, 4201, 4201, 4201, 4201, 4201, 4211, 4211, 4211, 4211, + 4211, 4211, 4211, 4211, 4211, 4217, 4217, 4217, 4217, 4217, + 4219, 4219, 4229, 4229, 4229, 4229, 4229, 4229, 4229, 4229, + 4229, 4231, 4231, 4241, 4241, 4241, 4241, 4241, 4241, 4241, + 4241, 4241, 4243, 4243, 4253, 4253, 4253, 4253, 4253, 4253, + 4253, 4253, 4253, 4259, 4259, 4259, 4259, 4259, 4259, 4261, + 4271, 4271, 4271, 4271, 4271, 4271, 4271, 4271, 4271, 4271, + 4273, 4283, 4283, 4283, 4283, 4283, 4283, 4283, 4283, 4283, + 4289, 4289, 4289, 4289, 4289, 4289, 4297, 4297, 4297, 4297, + 4297, 4297, 4297, 4327, 4327, 4327, 4327, 4327, 4327, 4327, + 4327, 4327, 4327, 4327, 4327, 4327, 4327, 4327, 4327, 4327, + 4327, 4327, 4327, 4327, 4327, 4327, 4327, 4327, 4327, 4327, + 4337, 4337, 4337, 4337, 4337, 4337, 4337, 4337, 4337, 4337, + 4339, 4349, 4349, 4349, 4349, 4349, 4349, 4349, 4349, 4349, + 4357, 4357, 4357, 4357, 4357, 4357, 4357, 4357, 4363, 4363, + 4363, 4363, 4363, 4373, 4373, 4373, 4373, 4373, 4373, 4373, + 4373, 4373, 4391, 4391, 4391, 4391, 4391, 4391, 4391, 4391, + 4391, 4391, 4391, 4391, 4391, 4391, 4391, 4391, 4391, 4397, + 4397, 4397, 4397, 4397, 4409, 4409, 4409, 4409, 4409, 4409, + 4409, 4409, 4409, 4409, 4409, 4421, 4421, 4421, 4421, 4421, + 4421, 4421, 4421, 4421, 4421, 4421, 4423, 4423, 4441, 4441, + 4441, 4441, 4441, 4441, 4441, 4441, 4441, 4441, 4441, 4441, + 4441, 4441, 4441, 4441, 4447, 4447, 4447, 4447, 4447, 4447, + 4451, 4451, 4451, 4457, 4457, 4457, 4457, 4457, 4457, 4463, + 4463, 4463, 4463, 4463, 4481, 4481, 4481, 4481, 4481, 4481, + 4481, 4481, 4481, 4481, 4481, 4481, 4481, 4481, 4481, 4481, + 4483, 4483, 4493, 4493, 4493, 4493, 4493, 4493, 4493, 4493, + 4493, 4507, 4507, 4507, 4507, 4507, 4507, 4507, 4507, 4507, + 4507, 4507, 4507, 4507, 4513, 4513, 4513, 4513, 4513, 4513, + 4517, 4517, 4517, 4519, 4519, 4523, 4523, 4523, 4523, 4547, + 4547, 4547, 4547, 4547, 4547, 4547, 4547, 4547, 4547, 4547, + 4547, 4547, 4547, 4547, 4547, 4547, 4547, 4547, 4547, 4547, + 4549, 4549, 4561, 4561, 4561, 4561, 4561, 4561, 4561, 4561, + 4561, 4561, 4561, 4567, 4567, 4567, 4567, 4567, 4567, 4583, + 4583, 4583, 4583, 4583, 4583, 4583, 4583, 4583, 4583, 4583, + 4583, 4583, 4583, 4591, 4591, 4591, 4591, 4591, 4591, 4591, + 4597, 4597, 4597, 4597, 4597, 4597, 4603, 4603, 4603, 4603, + 4603, 4621, 4621, 4621, 4621, 4621, 4621, 4621, 4621, 4621, + 4621, 4621, 4621, 4621, 4621, 4621, 4621, 4621, 4637, 4637, + 4637, 4637, 4637, 4637, 4637, 4637, 4637, 4637, 4637, 4637, + 4637, 4637, 4639, 4639, 4643, 4643, 4643, 4643, 4649, 4649, + 4649, 4649, 4649, 4651, 4651, 4657, 4657, 4657, 4657, 4657, + 4663, 4663, 4663, 4663, 4663, 4663, 4673, 4673, 4673, 4673, + 4673, 4673, 4673, 4673, 4673, 4679, 4679, 4679, 4679, 4679, + 4691, 4691, 4691, 4691, 4691, 4691, 4691, 4691, 4691, 4691, + 4691, 4703, 4703, 4703, 4703, 4703, 4703, 4703, 4703, 4703, + 4703, 4703, 4721, 4721, 4721, 4721, 4721, 4721, 4721, 4721, + 4721, 4721, 4721, 4721, 4721, 4721, 4721, 4721, 4721, 4723, + 4729, 4729, 4729, 4729, 4729, 4729, 4733, 4733, 4733, 4733, + 4751, 4751, 4751, 4751, 4751, 4751, 4751, 4751, 4751, 4751, + 4751, 4751, 4751, 4751, 4751, 4751, 4759, 4759, 4759, 4759, + 4759, 4759, 4759, 4783, 4783, 4783, 4783, 4783, 4783, 4783, + 4783, 4783, 4783, 4783, 4783, 4783, 4783, 4783, 4783, 4783, + 4783, 4783, 4783, 4783, 4783, 4787, 4787, 4787, 4787, 4789, + 4793, 4793, 4793, 4793, 4799, 4799, 4799, 4799, 4799, 4799, + 4801, 4813, 4813, 4813, 4813, 4813, 4813, 4813, 4813, 4813, + 4813, 4813, 4817, 4817, 4817, 4817, 4831, 4831, 4831, 4831, + 4831, 4831, 4831, 4831, 4831, 4831, 4831, 4831, 4831, 4861, + 4861, 4861, 4861, 4861, 4861, 4861, 4861, 4861, 4861, 4861, + 4861, 4861, 4861, 4861, 4861, 4861, 4861, 4861, 4861, 4861, + 4861, 4861, 4861, 4861, 4861, 4861, 4871, 4871, 4871, 4871, + 4871, 4871, 4871, 4871, 4871, 4877, 4877, 4877, 4877, 4877, + 4889, 4889, 4889, 4889, 4889, 4889, 4889, 4889, 4889, 4889, + 4889, 4903, 4903, 4903, 4903, 4903, 4903, 4903, 4903, 4903, + 4903, 4903, 4903, 4903, 4909, 4909, 4909, 4909, 4909, 4909, + 4919, 4919, 4919, 4919, 4919, 4919, 4919, 4919, 4919, 4931, + 4931, 4931, 4931, 4931, 4931, 4931, 4931, 4931, 4931, 4931, + 4933, 4937, 4937, 4937, 4937, 4943, 4943, 4943, 4943, 4943, + 4951, 4951, 4951, 4951, 4951, 4951, 4951, 4951, 4957, 4957, + 4957, 4957, 4957, 4967, 4967, 4967, 4967, 4967, 4967, 4967, + 4967, 4967, 4969, 4969, 4973, 4973, 4973, 4973, 4987, 4987, + 4987, 4987, 4987, 4987, 4987, 4987, 4987, 4987, 4987, 4987, + 4993, 4993, 4993, 4993, 4993, 4993, 4999, 4999, 4999, 4999, + 4999, 5003, 5003, 5003, 5003, 5009, 5009, 5009, 5009, 5009, + 5011, 5011, 5021, 5021, 5021, 5021, 5021, 5021, 5021, 5021, + 5021, 5023, 5023, 5039, 5039, 5039, 5039, 5039, 5039, 5039, + 5039, 5039, 5039, 5039, 5039, 5039, 5039, 5039, 5051, 5051, + 5051, 5051, 5051, 5051, 5051, 5051, 5051, 5051, 5051, 5059, + 5059, 5059, 5059, 5059, 5059, 5059, 5077, 5077, 5077, 5077, + 5077, 5077, 5077, 5077, 5077, 5077, 5077, 5077, 5077, 5077, + 5077, 5077, 5081, 5081, 5081, 5081, 5087, 5087, 5087, 5087, + 5087, 5099, 5099, 5099, 5099, 5099, 5099, 5099, 5099, 5099, + 5099, 5099, 5101, 5101, 5107, 5107, 5107, 5107, 5107, 5107, + 5113, 5113, 5113, 5113, 5113, 5119, 5119, 5119, 5119, 5119, + 5147, 5147, 5147, 5147, 5147, 5147, 5147, 5147, 5147, 5147, + 5147, 5147, 5147, 5147, 5147, 5147, 5147, 5147, 5147, 5147, + 5147, 5147, 5147, 5147, 5147, 5147, 5153, 5153, 5153, 5153, + 5153, 5167, 5167, 5167, 5167, 5167, 5167, 5167, 5167, 5167, + 5167, 5167, 5167, 5167, 5171, 5171, 5171, 5171, 5179, 5179, + 5179, 5179, 5179, 5179, 5179, 5189, 5189, 5189, 5189, 5189, + 5189, 5189, 5189, 5189, 5197, 5197, 5197, 5197, 5197, 5197, + 5197, 5209, 5209, 5209, 5209, 5209, 5209, 5209, 5209, 5209, + 5209, 5209, 5227, 5227, 5227, 5227, 5227, 5227, 5227, 5227, + 5227, 5227, 5227, 5227, 5227, 5227, 5227, 5227, 5227, 5231, + 5231, 5231, 5233, 5233, 5237, 5237, 5237, 5237, 5261, 5261, + 5261, 5261, 5261, 5261, 5261, 5261, 5261, 5261, 5261, 5261, + 5261, 5261, 5261, 5261, 5261, 5261, 5261, 5261, 5261, 5261, + 5273, 5273, 5273, 5273, 5273, 5273, 5273, 5273, 5273, 5273, + 5279, 5279, 5279, 5279, 5279, 5279, 5281, 5281, 5297, 5297, + 5297, 5297, 5297, 5297, 5297, 5297, 5297, 5297, 5297, 5297, + 5297, 5297, 5303, 5303, 5303, 5303, 5303, 5303, 5309, 5309, + 5309, 5309, 5309, 5323, 5323, 5323, 5323, 5323, 5323, 5323, + 5323, 5323, 5323, 5323, 5323, 5323, 5333, 5333, 5333, 5333, + 5333, 5333, 5333, 5333, 5333, 5347, 5347, 5347, 5347, 5347, + 5347, 5347, 5347, 5347, 5347, 5347, 5347, 5347, 5351, 5351, + 5351, 5381, 5381, 5381, 5381, 5381, 5381, 5381, 5381, 5381, + 5381, 5381, 5381, 5381, 5381, 5381, 5381, 5381, 5381, 5381, + 5381, 5381, 5381, 5381, 5381, 5381, 5381, 5381, 5381, 5387, + 5387, 5387, 5387, 5387, 5393, 5393, 5393, 5393, 5393, 5393, + 5399, 5399, 5399, 5399, 5399, 5407, 5407, 5407, 5407, 5407, + 5407, 5407, 5413, 5413, 5413, 5413, 5413, 5413, 5417, 5417, + 5417, 5419, 5419, 5431, 5431, 5431, 5431, 5431, 5431, 5431, + 5431, 5431, 5431, 5431, 5437, 5437, 5437, 5437, 5437, 5437, + 5441, 5441, 5441, 5443, 5443, 5449, 5449, 5449, 5449, 5449, + 5471, 5471, 5471, 5471, 5471, 5471, 5471, 5471, 5471, 5471, + 5471, 5471, 5471, 5471, 5471, 5471, 5471, 5471, 5471, 5471, + 5477, 5477, 5477, 5477, 5477, 5477, 5479, 5479, 5483, 5483, + 5483, 5501, 5501, 5501, 5501, 5501, 5501, 5501, 5501, 5501, + 5501, 5501, 5501, 5501, 5501, 5501, 5501, 5501, 5503, 5503, + 5507, 5507, 5507, 5519, 5519, 5519, 5519, 5519, 5519, 5519, + 5519, 5519, 5519, 5519, 5521, 5521, 5527, 5527, 5527, 5527, + 5527, 5531, 5531, 5531, 5531, 5557, 5557, 5557, 5557, 5557, + 5557, 5557, 5557, 5557, 5557, 5557, 5557, 5557, 5557, 5557, + 5557, 5557, 5557, 5557, 5557, 5557, 5557, 5557, 5557, 5563, + 5563, 5563, 5563, 5563, 5569, 5569, 5569, 5569, 5569, 5569, + 5573, 5573, 5573, 5581, 5581, 5581, 5581, 5581, 5581, 5581, + 5591, 5591, 5591, 5591, 5591, 5591, 5591, 5591, 5591, 5591, + 5623, 5623, 5623, 5623, 5623, 5623, 5623, 5623, 5623, 5623, + 5623, 5623, 5623, 5623, 5623, 5623, 5623, 5623, 5623, 5623, + 5623, 5623, 5623, 5623, 5623, 5623, 5623, 5623, 5623, 5639, + 5639, 5639, 5639, 5639, 5639, 5639, 5639, 5639, 5639, 5639, + 5639, 5639, 5639, 5641, 5641, 5647, 5647, 5647, 5647, 5647, + 5651, 5651, 5651, 5651, 5653, 5653, 5657, 5657, 5657, 5657, + 5659, 5669, 5669, 5669, 5669, 5669, 5669, 5669, 5669, 5669, + 5683, 5683, 5683, 5683, 5683, 5683, 5683, 5683, 5683, 5683, + 5683, 5683, 5683, 5689, 5689, 5689, 5689, 5689, 5689, 5693, + 5693, 5693, 5701, 5701, 5701, 5701, 5701, 5701, 5701, 5701, + 5711, 5711, 5711, 5711, 5711, 5711, 5711, 5711, 5711, 5717, + 5717, 5717, 5717, 5717, 5737, 5737, 5737, 5737, 5737, 5737, + 5737, 5737, 5737, 5737, 5737, 5737, 5737, 5737, 5737, 5737, + 5737, 5737, 5741, 5741, 5741, 5741, 5743, 5743, 5749, 5749, + 5749, 5749, 5749, 5779, 5779, 5779, 5779, 5779, 5779, 5779, + 5779, 5779, 5779, 5779, 5779, 5779, 5779, 5779, 5779, 5779, + 5779, 5779, 5779, 5779, 5779, 5779, 5779, 5779, 5779, 5779, + 5783, 5783, 5783, 5783, 5791, 5791, 5791, 5791, 5791, 5791, + 5791, 5801, 5801, 5801, 5801, 5801, 5801, 5801, 5801, 5801, + 5807, 5807, 5807, 5807, 5807, 5807, 5813, 5813, 5813, 5813, + 5813, 5821, 5821, 5821, 5821, 5821, 5821, 5821, 5821, 5827, + 5827, 5827, 5827, 5827, 5839, 5839, 5839, 5839, 5839, 5839, + 5839, 5839, 5839, 5839, 5839, 5843, 5843, 5843, 5843, 5849, + 5849, 5849, 5849, 5849, 5851, 5851, 5857, 5857, 5857, 5857, + 5857, 5861, 5861, 5861, 5861, 5867, 5867, 5867, 5867, 5867, + 5869, 5869, 5879, 5879, 5879, 5879, 5879, 5879, 5879, 5879, + 5879, 5881, 5881, 5897, 5897, 5897, 5897, 5897, 5897, 5897, + 5897, 5897, 5897, 5897, 5897, 5897, 5897, 5897, 5903, 5903, + 5903, 5903, 5903, 5923, 5923, 5923, 5923, 5923, 5923, 5923, + 5923, 5923, 5923, 5923, 5923, 5923, 5923, 5923, 5923, 5923, + 5923, 5927, 5927, 5927, 5927, 5939, 5939, 5939, 5939, 5939, + 5939, 5939, 5939, 5939, 5939, 5939, 5953, 5953, 5953, 5953, + 5953, 5953, 5953, 5953, 5953, 5953, 5953, 5953, 5953, 5981, + 5981, 5981, 5981, 5981, 5981, 5981, 5981, 5981, 5981, 5981, + 5981, 5981, 5981, 5981, 5981, 5981, 5981, 5981, 5981, 5981, + 5981, 5981, 5981, 5981, 5987, 5987, 5987, 5987, 5987, 5987, + 6007, 6007, 6007, 6007, 6007, 6007, 6007, 6007, 6007, 6007, + 6007, 6007, 6007, 6007, 6007, 6007, 6007, 6007, 6011, 6011, + 6011, 6029, 6029, 6029, 6029, 6029, 6029, 6029, 6029, 6029, + 6029, 6029, 6029, 6029, 6029, 6029, 6029, 6029, 6037, 6037, + 6037, 6037, 6037, 6037, 6037, 6043, 6043, 6043, 6043, 6043, + 6047, 6047, 6047, 6047, 6053, 6053, 6053, 6053, 6053, 6053, + 6067, 6067, 6067, 6067, 6067, 6067, 6067, 6067, 6067, 6067, + 6067, 6067, 6073, 6073, 6073, 6073, 6073, 6073, 6079, 6079, + 6079, 6079, 6079, 6089, 6089, 6089, 6089, 6089, 6089, 6089, + 6089, 6089, 6091, 6091, 6101, 6101, 6101, 6101, 6101, 6101, + 6101, 6101, 6101, 6113, 6113, 6113, 6113, 6113, 6113, 6113, + 6113, 6113, 6113, 6113, 6121, 6121, 6121, 6121, 6121, 6121, + 6121, 6131, 6131, 6131, 6131, 6131, 6131, 6131, 6131, 6131, + 6133, 6133, 6143, 6143, 6143, 6143, 6143, 6143, 6143, 6143, + 6143, 6151, 6151, 6151, 6151, 6151, 6151, 6151, 6151, 6163, + 6163, 6163, 6163, 6163, 6163, 6163, 6163, 6163, 6163, 6163, + 6173, 6173, 6173, 6173, 6173, 6173, 6173, 6173, 6173, 6197, + 6197, 6197, 6197, 6197, 6197, 6197, 6197, 6197, 6197, 6197, + 6197, 6197, 6197, 6197, 6197, 6197, 6197, 6197, 6197, 6197, + 6199, 6199, 6203, 6203, 6203, 6203, 6211, 6211, 6211, 6211, + 6211, 6211, 6211, 6217, 6217, 6217, 6217, 6217, 6217, 6221, + 6221, 6221, 6229, 6229, 6229, 6229, 6229, 6229, 6229, 6229, + 6247, 6247, 6247, 6247, 6247, 6247, 6247, 6247, 6247, 6247, + 6247, 6247, 6247, 6247, 6247, 6247, 6257, 6257, 6257, 6257, + 6257, 6257, 6257, 6257, 6257, 6263, 6263, 6263, 6263, 6263, + 6269, 6269, 6269, 6269, 6269, 6269, 6271, 6271, 6277, 6277, + 6277, 6277, 6277, 6287, 6287, 6287, 6287, 6287, 6287, 6287, + 6287, 6287, 6299, 6299, 6299, 6299, 6299, 6299, 6299, 6299, + 6299, 6299, 6299, 6301, 6301, 6311, 6311, 6311, 6311, 6311, + 6311, 6311, 6311, 6311, 6317, 6317, 6317, 6317, 6317, 6317, + 6323, 6323, 6323, 6323, 6323, 6329, 6329, 6329, 6329, 6329, + 6337, 6337, 6337, 6337, 6337, 6337, 6337, 6337, 6343, 6343, + 6343, 6343, 6343, 6353, 6353, 6353, 6353, 6353, 6353, 6353, + 6353, 6353, 6359, 6359, 6359, 6359, 6359, 6359, 6361, 6361, + 6367, 6367, 6367, 6367, 6367, 6373, 6373, 6373, 6373, 6373, + 6379, 6379, 6379, 6379, 6379, 6379, 6389, 6389, 6389, 6389, + 6389, 6389, 6389, 6389, 6389, 6397, 6397, 6397, 6397, 6397, + 6397, 6397, 6421, 6421, 6421, 6421, 6421, 6421, 6421, 6421, + 6421, 6421, 6421, 6421, 6421, 6421, 6421, 6421, 6421, 6421, + 6421, 6421, 6421, 6421, 6427, 6427, 6427, 6427, 6427, 6427, + 6449, 6449, 6449, 6449, 6449, 6449, 6449, 6449, 6449, 6449, + 6449, 6449, 6449, 6449, 6449, 6449, 6449, 6449, 6449, 6449, + 6451, 6469, 6469, 6469, 6469, 6469, 6469, 6469, 6469, 6469, + 6469, 6469, 6469, 6469, 6469, 6469, 6469, 6469, 6473, 6473, + 6473, 6481, 6481, 6481, 6481, 6481, 6481, 6481, 6481, 6491, + 6491, 6491, 6491, 6491, 6491, 6491, 6491, 6491, 6521, 6521, + 6521, 6521, 6521, 6521, 6521, 6521, 6521, 6521, 6521, 6521, + 6521, 6521, 6521, 6521, 6521, 6521, 6521, 6521, 6521, 6521, + 6521, 6521, 6521, 6521, 6521, 6529, 6529, 6529, 6529, 6529, + 6529, 6529, 6547, 6547, 6547, 6547, 6547, 6547, 6547, 6547, + 6547, 6547, 6547, 6547, 6547, 6547, 6547, 6547, 6547, 6551, + 6551, 6551, 6553, 6553, 6563, 6563, 6563, 6563, 6563, 6563, + 6563, 6563, 6563, 6569, 6569, 6569, 6569, 6569, 6569, 6571, + 6577, 6577, 6577, 6577, 6577, 6577, 6581, 6581, 6581, 6581, + 6599, 6599, 6599, 6599, 6599, 6599, 6599, 6599, 6599, 6599, + 6599, 6599, 6599, 6599, 6599, 6599, 6607, 6607, 6607, 6607, + 6607, 6607, 6607, 6619, 6619, 6619, 6619, 6619, 6619, 6619, + 6619, 6619, 6619, 6619, 6637, 6637, 6637, 6637, 6637, 6637, + 6637, 6637, 6637, 6637, 6637, 6637, 6637, 6637, 6637, 6637, + 6653, 6653, 6653, 6653, 6653, 6653, 6653, 6653, 6653, 6653, + 6653, 6653, 6653, 6653, 6653, 6659, 6659, 6659, 6659, 6659, + 6661, 6661, 6673, 6673, 6673, 6673, 6673, 6673, 6673, 6673, + 6673, 6673, 6673, 6679, 6679, 6679, 6679, 6679, 6679, 6689, + 6689, 6689, 6689, 6689, 6689, 6689, 6689, 6689, 6691, 6691, + 6701, 6701, 6701, 6701, 6701, 6701, 6701, 6701, 6701, 6703, + 6709, 6709, 6709, 6709, 6709, 6709, 6719, 6719, 6719, 6719, + 6719, 6719, 6719, 6719, 6719, 6733, 6733, 6733, 6733, 6733, + 6733, 6733, 6733, 6733, 6733, 6733, 6733, 6733, 6737, 6737, + 6737, 6761, 6761, 6761, 6761, 6761, 6761, 6761, 6761, 6761, + 6761, 6761, 6761, 6761, 6761, 6761, 6761, 6761, 6761, 6761, + 6761, 6761, 6761, 6763, 6763, 6779, 6779, 6779, 6779, 6779, + 6779, 6779, 6779, 6779, 6779, 6779, 6779, 6779, 6779, 6779, + 6781, 6791, 6791, 6791, 6791, 6791, 6791, 6791, 6791, 6791, + 6793, 6793, 6803, 6803, 6803, 6803, 6803, 6803, 6803, 6803, + 6803, 6823, 6823, 6823, 6823, 6823, 6823, 6823, 6823, 6823, + 6823, 6823, 6823, 6823, 6823, 6823, 6823, 6823, 6823, 6823, + 6827, 6827, 6827, 6829, 6829, 6833, 6833, 6833, 6833, 6841, + 6841, 6841, 6841, 6841, 6841, 6841, 6857, 6857, 6857, 6857, + 6857, 6857, 6857, 6857, 6857, 6857, 6857, 6857, 6857, 6857, + 6863, 6863, 6863, 6863, 6863, 6863, 6869, 6869, 6869, 6869, + 6869, 6871, 6871, 6883, 6883, 6883, 6883, 6883, 6883, 6883, + 6883, 6883, 6883, 6883, 6899, 6899, 6899, 6899, 6899, 6899, + 6899, 6899, 6899, 6899, 6899, 6899, 6899, 6899, 6899, 6907, + 6907, 6907, 6907, 6907, 6907, 6907, 6911, 6911, 6911, 6911, + 6917, 6917, 6917, 6917, 6917, 6947, 6947, 6947, 6947, 6947, + 6947, 6947, 6947, 6947, 6947, 6947, 6947, 6947, 6947, 6947, + 6947, 6947, 6947, 6947, 6947, 6947, 6947, 6947, 6947, 6947, + 6947, 6947, 6949, 6949, 6959, 6959, 6959, 6959, 6959, 6959, + 6959, 6959, 6959, 6961, 6961, 6967, 6967, 6967, 6967, 6967, + 6971, 6971, 6971, 6971, 6977, 6977, 6977, 6977, 6977, 6977, + 6983, 6983, 6983, 6983, 6983, 6991, 6991, 6991, 6991, 6991, + 6991, 6991, 6997, 6997, 6997, 6997, 6997, 6997, 7001, 7001, + 7001, 7013, 7013, 7013, 7013, 7013, 7013, 7013, 7013, 7013, + 7013, 7013, 7019, 7019, 7019, 7019, 7019, 7019, 7027, 7027, + 7027, 7027, 7027, 7027, 7027, 7039, 7039, 7039, 7039, 7039, + 7039, 7039, 7039, 7039, 7039, 7039, 7043, 7043, 7043, 7043, + 7057, 7057, 7057, 7057, 7057, 7057, 7057, 7057, 7057, 7057, + 7057, 7057, 7069, 7069, 7069, 7069, 7069, 7069, 7069, 7069, + 7069, 7069, 7069, 7079, 7079, 7079, 7079, 7079, 7079, 7079, + 7079, 7079, 7103, 7103, 7103, 7103, 7103, 7103, 7103, 7103, + 7103, 7103, 7103, 7103, 7103, 7103, 7103, 7103, 7103, 7103, + 7103, 7103, 7103, 7103, 7109, 7109, 7109, 7109, 7109, 7109, + 7121, 7121, 7121, 7121, 7121, 7121, 7121, 7121, 7121, 7121, + 7127, 7127, 7127, 7127, 7127, 7127, 7129, 7129, 7151, 7151, + 7151, 7151, 7151, 7151, 7151, 7151, 7151, 7151, 7151, 7151, + 7151, 7151, 7151, 7151, 7151, 7151, 7151, 7151, 7159, 7159, + 7159, 7159, 7159, 7159, 7159, 7177, 7177, 7177, 7177, 7177, + 7177, 7177, 7177, 7177, 7177, 7177, 7177, 7177, 7177, 7177, + 7177, 7187, 7187, 7187, 7187, 7187, 7187, 7187, 7187, 7187, + 7193, 7193, 7193, 7193, 7193, 7193, 7207, 7207, 7207, 7207, + 7207, 7207, 7207, 7207, 7207, 7207, 7207, 7207, 7207, 7211, + 7211, 7211, 7213, 7213, 7219, 7219, 7219, 7219, 7219, 7219, + 7229, 7229, 7229, 7229, 7229, 7229, 7229, 7229, 7229, 7237, + 7237, 7237, 7237, 7237, 7237, 7237, 7243, 7243, 7243, 7243, + 7243, 7247, 7247, 7247, 7247, 7253, 7253, 7253, 7253, 7253, + 7283, 7283, 7283, 7283, 7283, 7283, 7283, 7283, 7283, 7283, + 7283, 7283, 7283, 7283, 7283, 7283, 7283, 7283, 7283, 7283, + 7283, 7283, 7283, 7283, 7283, 7283, 7283, 7283, 7297, 7297, + 7297, 7297, 7297, 7297, 7297, 7297, 7297, 7297, 7297, 7297, + 7307, 7307, 7307, 7307, 7307, 7307, 7307, 7307, 7307, 7307, + 7309, 7321, 7321, 7321, 7321, 7321, 7321, 7321, 7321, 7321, + 7321, 7321, 7331, 7331, 7331, 7331, 7331, 7331, 7331, 7331, + 7331, 7333, 7333, 7349, 7349, 7349, 7349, 7349, 7349, 7349, + 7349, 7349, 7349, 7349, 7349, 7349, 7349, 7349, 7351, 7351, + 7369, 7369, 7369, 7369, 7369, 7369, 7369, 7369, 7369, 7369, + 7369, 7369, 7369, 7369, 7369, 7369, 7393, 7393, 7393, 7393, + 7393, 7393, 7393, 7393, 7393, 7393, 7393, 7393, 7393, 7393, + 7393, 7393, 7393, 7393, 7393, 7393, 7393, 7393, 7411, 7411, + 7411, 7411, 7411, 7411, 7411, 7411, 7411, 7411, 7411, 7411, + 7411, 7411, 7411, 7411, 7417, 7417, 7417, 7417, 7417, 7417, + 7433, 7433, 7433, 7433, 7433, 7433, 7433, 7433, 7433, 7433, + 7433, 7433, 7433, 7433, 7451, 7451, 7451, 7451, 7451, 7451, + 7451, 7451, 7451, 7451, 7451, 7451, 7451, 7451, 7451, 7451, + 7457, 7457, 7457, 7457, 7457, 7457, 7459, 7459, 7477, 7477, + 7477, 7477, 7477, 7477, 7477, 7477, 7477, 7477, 7477, 7477, + 7477, 7477, 7477, 7477, 7481, 7481, 7481, 7481, 7487, 7487, + 7487, 7487, 7487, 7489, 7489, 7499, 7499, 7499, 7499, 7499, + 7499, 7499, 7499, 7499, 7507, 7507, 7507, 7507, 7507, 7507, + 7507, 7517, 7517, 7517, 7517, 7517, 7517, 7517, 7517, 7517, + 7523, 7523, 7523, 7523, 7523, 7523, 7529, 7529, 7529, 7529, + 7529, 7537, 7537, 7537, 7537, 7537, 7537, 7537, 7537, 7541, + 7541, 7541, 7547, 7547, 7547, 7547, 7547, 7547, 7549, 7549, + 7559, 7559, 7559, 7559, 7559, 7559, 7559, 7559, 7559, 7561, + 7573, 7573, 7573, 7573, 7573, 7573, 7573, 7573, 7573, 7573, + 7573, 7577, 7577, 7577, 7577, 7583, 7583, 7583, 7583, 7583, + 7589, 7589, 7589, 7589, 7589, 7589, 7591, 7591, 7603, 7603, + 7603, 7603, 7603, 7603, 7603, 7603, 7603, 7603, 7603, 7607, + 7607, 7607, 7621, 7621, 7621, 7621, 7621, 7621, 7621, 7621, + 7621, 7621, 7621, 7621, 7621, 7639, 7639, 7639, 7639, 7639, + 7639, 7639, 7639, 7639, 7639, 7639, 7639, 7639, 7639, 7639, + 7639, 7643, 7643, 7643, 7643, 7649, 7649, 7649, 7649, 7649, + 7669, 7669, 7669, 7669, 7669, 7669, 7669, 7669, 7669, 7669, + 7669, 7669, 7669, 7669, 7669, 7669, 7669, 7669, 7669, 7673, + 7673, 7673, 7681, 7681, 7681, 7681, 7681, 7681, 7681, 7681, + 7687, 7687, 7687, 7687, 7687, 7691, 7691, 7691, 7691, 7699, + 7699, 7699, 7699, 7699, 7699, 7699, 7703, 7703, 7703, 7703, + 7717, 7717, 7717, 7717, 7717, 7717, 7717, 7717, 7717, 7717, + 7717, 7717, 7723, 7723, 7723, 7723, 7723, 7723, 7727, 7727, + 7727, 7741, 7741, 7741, 7741, 7741, 7741, 7741, 7741, 7741, + 7741, 7741, 7741, 7741, 7753, 7753, 7753, 7753, 7753, 7753, + 7753, 7753, 7753, 7753, 7753, 7757, 7757, 7757, 7757, 7759, + 7789, 7789, 7789, 7789, 7789, 7789, 7789, 7789, 7789, 7789, + 7789, 7789, 7789, 7789, 7789, 7789, 7789, 7789, 7789, 7789, + 7789, 7789, 7789, 7789, 7789, 7789, 7789, 7789, 7793, 7793, + 7793, 7817, 7817, 7817, 7817, 7817, 7817, 7817, 7817, 7817, + 7817, 7817, 7817, 7817, 7817, 7817, 7817, 7817, 7817, 7817, + 7817, 7817, 7817, 7823, 7823, 7823, 7823, 7823, 7823, 7829, + 7829, 7829, 7829, 7829, 7841, 7841, 7841, 7841, 7841, 7841, + 7841, 7841, 7841, 7841, 7841, 7853, 7853, 7853, 7853, 7853, + 7853, 7853, 7853, 7853, 7853, 7853, 7867, 7867, 7867, 7867, + 7867, 7867, 7867, 7867, 7867, 7867, 7867, 7867, 7867, 7873, + 7873, 7873, 7873, 7873, 7877, 7877, 7877, 7877, 7879, 7879, + 7883, 7883, 7883, 7901, 7901, 7901, 7901, 7901, 7901, 7901, + 7901, 7901, 7901, 7901, 7901, 7901, 7901, 7901, 7901, 7901, + 7907, 7907, 7907, 7907, 7907, 7919, 7919, 7919, 7919, 7919, + 7919, 7919, 7919, 7919, 7919, 7919, 7927, 7927, 7927, 7927, + 7927, 7927, 7927, 7933, 7933, 7933, 7933, 7933, 7933, 7937, + 7937, 7937, 7949, 7949, 7949, 7949, 7949, 7949, 7949, 7949, + 7949, 7949, 7949, 7951, 7951, 7963, 7963, 7963, 7963, 7963, + 7963, 7963, 7963, 7963, 7963, 7963, 7993, 7993, 7993, 7993, + 7993, 7993, 7993, 7993, 7993, 7993, 7993, 7993, 7993, 7993, + 7993, 7993, 7993, 7993, 7993, 7993, 7993, 7993, 7993, 7993, + 7993, 7993, 7993, 8009, 8009, 8009, 8009, 8009, 8009, 8009, + 8009, 8009, 8009, 8009, 8009, 8009, 8009, 8009, 8011, 8011, + 8017, 8017, 8017, 8017, 8017, 8039, 8039, 8039, 8039, 8039, + 8039, 8039, 8039, 8039, 8039, 8039, 8039, 8039, 8039, 8039, + 8039, 8039, 8039, 8039, 8039, 8053, 8053, 8053, 8053, 8053, + 8053, 8053, 8053, 8053, 8053, 8053, 8053, 8053, 8059, 8059, + 8059, 8059, 8059, 8069, 8069, 8069, 8069, 8069, 8069, 8069, + 8069, 8069, 8081, 8081, 8081, 8081, 8081, 8081, 8081, 8081, + 8081, 8081, 8081, 8087, 8087, 8087, 8087, 8087, 8087, 8089, + 8093, 8093, 8093, 8093, 8101, 8101, 8101, 8101, 8101, 8101, + 8101, 8111, 8111, 8111, 8111, 8111, 8111, 8111, 8111, 8111, + 8117, 8117, 8117, 8117, 8117, 8117, 8123, 8123, 8123, 8123, + 8123, 8147, 8147, 8147, 8147, 8147, 8147, 8147, 8147, 8147, + 8147, 8147, 8147, 8147, 8147, 8147, 8147, 8147, 8147, 8147, + 8147, 8147, 8147, 8161, 8161, 8161, 8161, 8161, 8161, 8161, + 8161, 8161, 8161, 8161, 8161, 8161, 8167, 8167, 8167, 8167, + 8167, 8171, 8171, 8171, 8171, 8179, 8179, 8179, 8179, 8179, + 8179, 8179, 8191, 8191, 8191, 8191, 8191, 8191, 8191, 8191, + 8191, 8191, 8191, 8209, 8209, 8209, 8209, 8209, 8209, 8209, + 8209, 8209, 8209, 8209, 8209, 8209, 8209, 8209, 8209, 8209, + 8219, 8219, 8219, 8219, 8219, 8219, 8219, 8219, 8219, 8221, + 8231, 8231, 8231, 8231, 8231, 8231, 8231, 8231, 8231, 8231, + 8233, 8237, 8237, 8237, 8237, 8243, 8243, 8243, 8243, 8243, + 8263, 8263, 8263, 8263, 8263, 8263, 8263, 8263, 8263, 8263, + 8263, 8263, 8263, 8263, 8263, 8263, 8263, 8263, 8263, 8269, + 8269, 8269, 8269, 8269, 8273, 8273, 8273, 8273, 8287, 8287, + 8287, 8287, 8287, 8287, 8287, 8287, 8287, 8287, 8287, 8287, + 8291, 8291, 8291, 8291, 8293, 8293, 8297, 8297, 8297, 8297, + 8311, 8311, 8311, 8311, 8311, 8311, 8311, 8311, 8311, 8311, + 8311, 8311, 8317, 8317, 8317, 8317, 8317, 8317, 8329, 8329, + 8329, 8329, 8329, 8329, 8329, 8329, 8329, 8329, 8329, 8353, + 8353, 8353, 8353, 8353, 8353, 8353, 8353, 8353, 8353, 8353, + 8353, 8353, 8353, 8353, 8353, 8353, 8353, 8353, 8353, 8353, + 8363, 8363, 8363, 8363, 8363, 8363, 8363, 8363, 8363, 8363, + 8369, 8369, 8369, 8369, 8369, 8377, 8377, 8377, 8377, 8377, + 8377, 8377, 8387, 8387, 8387, 8387, 8387, 8387, 8387, 8387, + 8387, 8389, 8389, 8419, 8419, 8419, 8419, 8419, 8419, 8419, + 8419, 8419, 8419, 8419, 8419, 8419, 8419, 8419, 8419, 8419, + 8419, 8419, 8419, 8419, 8419, 8419, 8419, 8419, 8419, 8419, + 8423, 8423, 8423, 8423, 8429, 8429, 8429, 8429, 8429, 8429, + 8431, 8443, 8443, 8443, 8443, 8443, 8443, 8443, 8443, 8443, + 8443, 8443, 8447, 8447, 8447, 8447, 8461, 8461, 8461, 8461, + 8461, 8461, 8461, 8461, 8461, 8461, 8461, 8461, 8461, 8467, + 8467, 8467, 8467, 8467, 8501, 8501, 8501, 8501, 8501, 8501, + 8501, 8501, 8501, 8501, 8501, 8501, 8501, 8501, 8501, 8501, + 8501, 8501, 8501, 8501, 8501, 8501, 8501, 8501, 8501, 8501, + 8501, 8501, 8501, 8501, 8501, 8513, 8513, 8513, 8513, 8513, + 8513, 8513, 8513, 8513, 8513, 8513, 8521, 8521, 8521, 8521, + 8521, 8521, 8521, 8527, 8527, 8527, 8527, 8527, 8527, 8537, + 8537, 8537, 8537, 8537, 8537, 8537, 8537, 8537, 8539, 8539, + 8543, 8543, 8543, 8563, 8563, 8563, 8563, 8563, 8563, 8563, + 8563, 8563, 8563, 8563, 8563, 8563, 8563, 8563, 8563, 8563, + 8563, 8573, 8573, 8573, 8573, 8573, 8573, 8573, 8573, 8573, + 8581, 8581, 8581, 8581, 8581, 8581, 8581, 8581, 8597, 8597, + 8597, 8597, 8597, 8597, 8597, 8597, 8597, 8597, 8597, 8597, + 8597, 8597, 8599, 8599, 8609, 8609, 8609, 8609, 8609, 8609, + 8609, 8609, 8609, 8623, 8623, 8623, 8623, 8623, 8623, 8623, + 8623, 8623, 8623, 8623, 8623, 8623, 8627, 8627, 8627, 8627, + 8629, 8641, 8641, 8641, 8641, 8641, 8641, 8641, 8641, 8641, + 8641, 8641, 8647, 8647, 8647, 8647, 8647, 8647, 8663, 8663, + 8663, 8663, 8663, 8663, 8663, 8663, 8663, 8663, 8663, 8663, + 8663, 8663, 8669, 8669, 8669, 8669, 8669, 8669, 8677, 8677, + 8677, 8677, 8677, 8677, 8677, 8681, 8681, 8681, 8681, 8689, + 8689, 8689, 8689, 8689, 8689, 8689, 8693, 8693, 8693, 8693, + 8699, 8699, 8699, 8699, 8699, 8707, 8707, 8707, 8707, 8707, + 8707, 8707, 8713, 8713, 8713, 8713, 8713, 8713, 8719, 8719, + 8719, 8719, 8719, 8731, 8731, 8731, 8731, 8731, 8731, 8731, + 8731, 8731, 8731, 8731, 8737, 8737, 8737, 8737, 8737, 8737, + 8741, 8741, 8741, 8747, 8747, 8747, 8747, 8747, 8747, 8753, + 8753, 8753, 8753, 8753, 8761, 8761, 8761, 8761, 8761, 8761, + 8761, 8779, 8779, 8779, 8779, 8779, 8779, 8779, 8779, 8779, + 8779, 8779, 8779, 8779, 8779, 8779, 8779, 8779, 8783, 8783, + 8783, 8803, 8803, 8803, 8803, 8803, 8803, 8803, 8803, 8803, + 8803, 8803, 8803, 8803, 8803, 8803, 8803, 8803, 8803, 8803, + 8807, 8807, 8807, 8819, 8819, 8819, 8819, 8819, 8819, 8819, + 8819, 8819, 8819, 8819, 8821, 8821, 8831, 8831, 8831, 8831, + 8831, 8831, 8831, 8831, 8831, 8837, 8837, 8837, 8837, 8837, + 8839, 8839, 8849, 8849, 8849, 8849, 8849, 8849, 8849, 8849, + 8849, 8861, 8861, 8861, 8861, 8861, 8861, 8861, 8861, 8861, + 8861, 8861, 8863, 8863, 8867, 8867, 8867, 8867, 8887, 8887, + 8887, 8887, 8887, 8887, 8887, 8887, 8887, 8887, 8887, 8887, + 8887, 8887, 8887, 8887, 8887, 8887, 8893, 8893, 8893, 8893, + 8893, 8923, 8923, 8923, 8923, 8923, 8923, 8923, 8923, 8923, + 8923, 8923, 8923, 8923, 8923, 8923, 8923, 8923, 8923, 8923, + 8923, 8923, 8923, 8923, 8923, 8923, 8923, 8923, 8923, 8929, + 8929, 8929, 8929, 8929, 8933, 8933, 8933, 8933, 8941, 8941, + 8941, 8941, 8941, 8941, 8941, 8951, 8951, 8951, 8951, 8951, + 8951, 8951, 8951, 8951, 8963, 8963, 8963, 8963, 8963, 8963, + 8963, 8963, 8963, 8963, 8963, 8969, 8969, 8969, 8969, 8969, + 8971, 8971, 8999, 8999, 8999, 8999, 8999, 8999, 8999, 8999, + 8999, 8999, 8999, 8999, 8999, 8999, 8999, 8999, 8999, 8999, + 8999, 8999, 8999, 8999, 8999, 8999, 8999, 8999, 9001, 9001, + 9007, 9007, 9007, 9007, 9007, 9011, 9011, 9011, 9011, 9013, + 9029, 9029, 9029, 9029, 9029, 9029, 9029, 9029, 9029, 9029, + 9029, 9029, 9029, 9029, 9029, 9041, 9041, 9041, 9041, 9041, + 9041, 9041, 9041, 9041, 9041, 9041, 9043, 9043, 9049, 9049, + 9049, 9049, 9049, 9059, 9059, 9059, 9059, 9059, 9059, 9059, + 9059, 9059, 9067, 9067, 9067, 9067, 9067, 9067, 9067, 9067, + 9091, 9091, 9091, 9091, 9091, 9091, 9091, 9091, 9091, 9091, + 9091, 9091, 9091, 9091, 9091, 9091, 9091, 9091, 9091, 9091, + 9091, 9103, 9103, 9103, 9103, 9103, 9103, 9103, 9103, 9103, + 9103, 9103, 9109, 9109, 9109, 9109, 9109, 9109, 9127, 9127, + 9127, 9127, 9127, 9127, 9127, 9127, 9127, 9127, 9127, 9127, + 9127, 9127, 9127, 9127, 9133, 9133, 9133, 9133, 9133, 9133, + 9137, 9137, 9137, 9151, 9151, 9151, 9151, 9151, 9151, 9151, + 9151, 9151, 9151, 9151, 9151, 9151, 9157, 9157, 9157, 9157, + 9157, 9161, 9161, 9161, 9161, 9173, 9173, 9173, 9173, 9173, + 9173, 9173, 9173, 9173, 9173, 9173, 9181, 9181, 9181, 9181, + 9181, 9181, 9181, 9187, 9187, 9187, 9187, 9187, 9187, 9199, + 9199, 9199, 9199, 9199, 9199, 9199, 9199, 9199, 9199, 9199, + 9203, 9203, 9203, 9209, 9209, 9209, 9209, 9209, 9209, 9221, + 9221, 9221, 9221, 9221, 9221, 9221, 9221, 9221, 9221, 9221, + 9227, 9227, 9227, 9227, 9227, 9239, 9239, 9239, 9239, 9239, + 9239, 9239, 9239, 9239, 9239, 9239, 9241, 9241, 9257, 9257, + 9257, 9257, 9257, 9257, 9257, 9257, 9257, 9257, 9257, 9257, + 9257, 9257, 9277, 9277, 9277, 9277, 9277, 9277, 9277, 9277, + 9277, 9277, 9277, 9277, 9277, 9277, 9277, 9277, 9277, 9277, + 9281, 9281, 9281, 9281, 9283, 9283, 9293, 9293, 9293, 9293, + 9293, 9293, 9293, 9293, 9293, 9311, 9311, 9311, 9311, 9311, + 9311, 9311, 9311, 9311, 9311, 9311, 9311, 9311, 9311, 9311, + 9311, 9319, 9319, 9319, 9319, 9319, 9319, 9319, 9319, 9323, + 9323, 9323, 9337, 9337, 9337, 9337, 9337, 9337, 9337, 9337, + 9337, 9337, 9337, 9337, 9337, 9341, 9341, 9341, 9341, 9343, + 9349, 9349, 9349, 9349, 9349, 9349, 9371, 9371, 9371, 9371, + 9371, 9371, 9371, 9371, 9371, 9371, 9371, 9371, 9371, 9371, + 9371, 9371, 9371, 9371, 9371, 9371, 9377, 9377, 9377, 9377, + 9377, 9391, 9391, 9391, 9391, 9391, 9391, 9391, 9391, 9391, + 9391, 9391, 9391, 9391, 9397, 9397, 9397, 9397, 9397, 9397, + 9403, 9403, 9403, 9403, 9403, 9413, 9413, 9413, 9413, 9413, + 9413, 9413, 9413, 9413, 9419, 9419, 9419, 9419, 9419, 9419, + 9421, 9431, 9431, 9431, 9431, 9431, 9431, 9431, 9431, 9431, + 9433, 9433, 9437, 9437, 9437, 9437, 9439, 9439, 9461, 9461, + 9461, 9461, 9461, 9461, 9461, 9461, 9461, 9461, 9461, 9461, + 9461, 9461, 9461, 9461, 9461, 9461, 9461, 9461, 9463, 9463, + 9467, 9467, 9467, 9473, 9473, 9473, 9473, 9473, 9473, 9479, + 9479, 9479, 9479, 9479, 9491, 9491, 9491, 9491, 9491, 9491, + 9491, 9491, 9491, 9491, 9491, 9497, 9497, 9497, 9497, 9497, + 9511, 9511, 9511, 9511, 9511, 9511, 9511, 9511, 9511, 9511, + 9511, 9511, 9511, 9521, 9521, 9521, 9521, 9521, 9521, 9521, + 9521, 9521, 9533, 9533, 9533, 9533, 9533, 9533, 9533, 9533, + 9533, 9533, 9533, 9539, 9539, 9539, 9539, 9539, 9539, 9547, + 9547, 9547, 9547, 9547, 9547, 9547, 9551, 9551, 9551, 9551, + 9587, 9587, 9587, 9587, 9587, 9587, 9587, 9587, 9587, 9587, + 9587, 9587, 9587, 9587, 9587, 9587, 9587, 9587, 9587, 9587, + 9587, 9587, 9587, 9587, 9587, 9587, 9587, 9587, 9587, 9587, + 9587, 9587, 9601, 9601, 9601, 9601, 9601, 9601, 9601, 9601, + 9601, 9601, 9601, 9601, 9601, 9613, 9613, 9613, 9613, 9613, + 9613, 9613, 9613, 9613, 9613, 9613, 9619, 9619, 9619, 9619, + 9619, 9623, 9623, 9623, 9623, 9629, 9629, 9629, 9629, 9629, + 9631, 9631, 9643, 9643, 9643, 9643, 9643, 9643, 9643, 9643, + 9643, 9643, 9643, 9649, 9649, 9649, 9649, 9649, 9649, 9661, + 9661, 9661, 9661, 9661, 9661, 9661, 9661, 9661, 9661, 9661, + 9677, 9677, 9677, 9677, 9677, 9677, 9677, 9677, 9677, 9677, + 9677, 9677, 9677, 9677, 9679, 9679, 9689, 9689, 9689, 9689, + 9689, 9689, 9689, 9689, 9689, 9697, 9697, 9697, 9697, 9697, + 9697, 9697, 9719, 9719, 9719, 9719, 9719, 9719, 9719, 9719, + 9719, 9719, 9719, 9719, 9719, 9719, 9719, 9719, 9719, 9719, + 9719, 9719, 9721, 9721, 9733, 9733, 9733, 9733, 9733, 9733, + 9733, 9733, 9733, 9733, 9733, 9739, 9739, 9739, 9739, 9739, + 9743, 9743, 9743, 9743, 9749, 9749, 9749, 9749, 9749, 9749, + 9767, 9767, 9767, 9767, 9767, 9767, 9767, 9767, 9767, 9767, + 9767, 9767, 9767, 9767, 9767, 9767, 9769, 9769, 9781, 9781, + 9781, 9781, 9781, 9781, 9781, 9781, 9781, 9781, 9781, 9787, + 9787, 9787, 9787, 9787, 9791, 9791, 9791, 9791, 9803, 9803, + 9803, 9803, 9803, 9803, 9803, 9803, 9803, 9803, 9803, 9811, + 9811, 9811, 9811, 9811, 9811, 9811, 9817, 9817, 9817, 9817, + 9817, 9829, 9829, 9829, 9829, 9829, 9829, 9829, 9829, 9829, + 9829, 9829, 9833, 9833, 9833, 9833, 9839, 9839, 9839, 9839, + 9839, 9851, 9851, 9851, 9851, 9851, 9851, 9851, 9851, 9851, + 9851, 9851, 9857, 9857, 9857, 9857, 9857, 9857, 9859, 9859, + 9871, 9871, 9871, 9871, 9871, 9871, 9871, 9871, 9871, 9871, + 9883, 9883, 9883, 9883, 9883, 9883, 9883, 9883, 9883, 9883, + 9883, 9887, 9887, 9887, 9887, 9901, 9901, 9901, 9901, 9901, + 9901, 9901, 9901, 9901, 9901, 9901, 9901, 9901, 9907, 9907, + 9907, 9907, 9907, 9923, 9923, 9923, 9923, 9923, 9923, 9923, + 9923, 9923, 9923, 9923, 9923, 9923, 9923, 9923, 9929, 9929, + 9929, 9929, 9929, 9931, 9931, 9941, 9941, 9941, 9941, 9941, + 9941, 9941, 9941, 9941, 9949, 9949, 9949, 9949, 9949, 9949, + 9949, 9967, 9967, 9967, 9967, 9967, 9967, 9967, 9967, 9967, + 9967, 9967, 9967, 9967, 9967, 9967, 9967, 9967, 9973, 9973, + 9973, 9973, 9973, 10007, 10007, 10007, 10007, 10007, 10007, + 10007, 10007, 10007, 10007, 10007, 10007, 10007, 10007, + 10007, 10007, 10007, 10007, 10007, 10007, 10007, 10007, + 10007, 10007, 10007, 10007, 10007, 10007, 10007, 10007, + 10009, 10009, 10037, 10037, 10037, 10037, 10037, 10037, + 10037, 10037, 10037, 10037, 10037, 10037, 10037, 10037, + 10037, 10037, 10037, 10037, 10037, 10037, 10037, 10037, + 10037, 10037, 10037, 10039, 10039, 10061, 10061, 10061, + 10061, 10061, 10061, 10061, 10061, 10061, 10061, 10061, + 10061, 10061, 10061, 10061, 10061, 10061, 10061, 10061, + 10067, 10067, 10067, 10067, 10067, 10067, 10069, 10069, + 10079, 10079, 10079, 10079, 10079, 10079, 10079, 10079, + 10091, 10091, 10091, 10091, 10091, 10091, 10091, 10091, + 10091, 10091, 10091, 10093, 10093, 10099, 10099, 10099, + 10099, 10099, 10103, 10103, 10103, 10103, 10111, 10111, + 10111, 10111, 10111, 10111, 10111, 10133, 10133, 10133, + 10133, 10133, 10133, 10133, 10133, 10133, 10133, 10133, + 10133, 10133, 10133, 10133, 10133, 10133, 10133, 10133, + 10139, 10139, 10139, 10139, 10139, 10139, 10141, 10141, + 10151, 10151, 10151, 10151, 10151, 10151, 10151, 10151, + 10159, 10159, 10159, 10159, 10159, 10159, 10159, 10159, + 10163, 10163, 10163, 10169, 10169, 10169, 10169, 10169, + 10177, 10177, 10177, 10177, 10177, 10177, 10177, 10177, + 10181, 10181, 10181, 10193, 10193, 10193, 10193, 10193, + 10193, 10193, 10193, 10193, 10193, 10193, 10211, 10211, + 10211, 10211, 10211, 10211, 10211, 10211, 10211, 10211, + 10211, 10211, 10211, 10211, 10211, 10211, 10223, 10223, + 10223, 10223, 10223, 10223, 10223, 10223, 10223, 10223, + 10243, 10243, 10243, 10243, 10243, 10243, 10243, 10243, + 10243, 10243, 10243, 10243, 10243, 10243, 10243, 10243, + 10243, 10243, 10247, 10247, 10247, 10247, 10253, 10253, + 10253, 10253, 10253, 10259, 10259, 10259, 10259, 10259, + 10267, 10267, 10267, 10267, 10267, 10267, 10267, 10267, + 10271, 10271, 10271, 10273, 10273, 10289, 10289, 10289, + 10289, 10289, 10289, 10289, 10289, 10289, 10289, 10289, + 10289, 10289, 10289, 10301, 10301, 10301, 10301, 10301, + 10301, 10301, 10301, 10301, 10301, 10301, 10303, 10303, + 10313, 10313, 10313, 10313, 10313, 10313, 10313, 10313, + 10321, 10321, 10321, 10321, 10321, 10321, 10321, 10321, + 10331, 10331, 10331, 10331, 10331, 10331, 10331, 10331, + 10333, 10333, 10337, 10337, 10337, 10337, 10343, 10343, + 10343, 10343, 10343, 10357, 10357, 10357, 10357, 10357, + 10357, 10357, 10357, 10357, 10357, 10357, 10357, 10357, + 10369, 10369, 10369, 10369, 10369, 10369, 10369, 10369, + 10369, 10369, 10391, 10391, 10391, 10391, 10391, 10391, + 10391, 10391, 10391, 10391, 10391, 10391, 10391, 10391, + 10391, 10391, 10391, 10391, 10391, 10391, 10399, 10399, + 10399, 10399, 10399, 10399, 10399, 10427, 10427, 10427, + 10427, 10427, 10427, 10427, 10427, 10427, 10427, 10427, + 10427, 10427, 10427, 10427, 10427, 10427, 10427, 10427, + 10427, 10427, 10427, 10427, 10427, 10427, 10429, 10429, + 10433, 10433, 10433, 10453, 10453, 10453, 10453, 10453, + 10453, 10453, 10453, 10453, 10453, 10453, 10453, 10453, + 10453, 10453, 10453, 10453, 10453, 10457, 10457, 10457, + 10459, 10459, 10463, 10463, 10463, 10463, 10477, 10477, + 10477, 10477, 10477, 10477, 10477, 10477, 10477, 10477, + 10477, 10477, 10487, 10487, 10487, 10487, 10487, 10487, + 10487, 10487, 10487, 10499, 10499, 10499, 10499, 10499, + 10499, 10499, 10499, 10499, 10499, 10499, 10501, 10501, + 10513, 10513, 10513, 10513, 10513, 10513, 10513, 10513, + 10513, 10513, 10529, 10529, 10529, 10529, 10529, 10529, + 10529, 10529, 10529, 10529, 10529, 10529, 10529, 10529, + 10531, 10531, 10559, 10559, 10559, 10559, 10559, 10559, + 10559, 10559, 10559, 10559, 10559, 10559, 10559, 10559, + 10559, 10559, 10559, 10559, 10559, 10559, 10559, 10559, + 10559, 10559, 10559, 10567, 10567, 10567, 10567, 10567, + 10567, 10567, 10589, 10589, 10589, 10589, 10589, 10589, + 10589, 10589, 10589, 10589, 10589, 10589, 10589, 10589, + 10589, 10589, 10589, 10589, 10589, 10589, 10597, 10597, + 10597, 10597, 10597, 10597, 10597, 10601, 10601, 10601, + 10607, 10607, 10607, 10607, 10607, 10607, 10613, 10613, + 10613, 10613, 10613, 10627, 10627, 10627, 10627, 10627, + 10627, 10627, 10627, 10627, 10627, 10627, 10627, 10627, + 10631, 10631, 10631, 10639, 10639, 10639, 10639, 10639, + 10639, 10639, 10651, 10651, 10651, 10651, 10651, 10651, + 10651, 10651, 10651, 10651, 10651, 10657, 10657, 10657, + 10657, 10657, 10663, 10663, 10663, 10663, 10663, 10663, + 10667, 10667, 10667, 10687, 10687, 10687, 10687, 10687, + 10687, 10687, 10687, 10687, 10687, 10687, 10687, 10687, + 10687, 10687, 10687, 10687, 10687, 10691, 10691, 10691, + 10709, 10709, 10709, 10709, 10709, 10709, 10709, 10709, + 10709, 10709, 10709, 10709, 10709, 10709, 10709, 10709, + 10711, 10711, 10723, 10723, 10723, 10723, 10723, 10723, + 10723, 10723, 10723, 10723, 10723, 10729, 10729, 10729, + 10729, 10729, 10733, 10733, 10733, 10733, 10739, 10739, + 10739, 10739, 10739, 10753, 10753, 10753, 10753, 10753, + 10753, 10753, 10753, 10753, 10753, 10753, 10753, 10753, + 10771, 10771, 10771, 10771, 10771, 10771, 10771, 10771, + 10771, 10771, 10771, 10771, 10771, 10771, 10771, 10771, + 10781, 10781, 10781, 10781, 10781, 10781, 10781, 10781, + 10789, 10789, 10789, 10789, 10789, 10789, 10789, 10789, + 10799, 10799, 10799, 10799, 10799, 10799, 10799, 10799, + 10831, 10831, 10831, 10831, 10831, 10831, 10831, 10831, + 10831, 10831, 10831, 10831, 10831, 10831, 10831, 10831, + 10831, 10831, 10831, 10831, 10831, 10831, 10831, 10831, + 10831, 10831, 10831, 10831, 10831, 10837, 10837, 10837, + 10837, 10837, 10847, 10847, 10847, 10847, 10847, 10847, + 10847, 10847, 10847, 10853, 10853, 10853, 10853, 10853, + 10859, 10859, 10859, 10859, 10859, 10859, 10861, 10861, + 10867, 10867, 10867, 10867, 10867, 10883, 10883, 10883, + 10883, 10883, 10883, 10883, 10883, 10883, 10883, 10883, + 10883, 10883, 10883, 10889, 10889, 10889, 10889, 10889, + 10891, 10891, 10903, 10903, 10903, 10903, 10903, 10903, + 10903, 10903, 10903, 10903, 10903, 10909, 10909, 10909, + 10909, 10909, 10937, 10937, 10937, 10937, 10937, 10937, + 10937, 10937, 10937, 10937, 10937, 10937, 10937, 10937, + 10937, 10937, 10937, 10937, 10937, 10937, 10937, 10937, + 10937, 10937, 10937, 10939, 10939, 10949, 10949, 10949, + 10949, 10949, 10949, 10949, 10949, 10949, 10957, 10957, + 10957, 10957, 10957, 10957, 10957, 10973, 10973, 10973, + 10973, 10973, 10973, 10973, 10973, 10973, 10973, 10973, + 10973, 10973, 10973, 10979, 10979, 10979, 10979, 10979, + 10987, 10987, 10987, 10987, 10987, 10987, 10987, 10987, + 10993, 10993, 10993, 10993, 10993, 11003, 11003, 11003, + 11003, 11003, 11003, 11003, 11003, 11003, 11027, 11027, + 11027, 11027, 11027, 11027, 11027, 11027, 11027, 11027, + 11027, 11027, 11027, 11027, 11027, 11027, 11027, 11027, + 11027, 11027, 11027, 11047, 11047, 11047, 11047, 11047, + 11047, 11047, 11047, 11047, 11047, 11047, 11047, 11047, + 11047, 11047, 11047, 11047, 11047, 11057, 11057, 11057, + 11057, 11057, 11057, 11057, 11057, 11057, 11059, 11059, + 11069, 11069, 11069, 11069, 11069, 11069, 11069, 11069, + 11071, 11071, 11083, 11083, 11083, 11083, 11083, 11083, + 11083, 11083, 11083, 11083, 11083, 11087, 11087, 11087, + 11093, 11093, 11093, 11093, 11093, 11093, 11113, 11113, + 11113, 11113, 11113, 11113, 11113, 11113, 11113, 11113, + 11113, 11113, 11113, 11113, 11113, 11113, 11113, 11113, + 11117, 11117, 11117, 11119, 11119, 11131, 11131, 11131, + 11131, 11131, 11131, 11131, 11131, 11131, 11131, 11131, + 11149, 11149, 11149, 11149, 11149, 11149, 11149, 11149, + 11149, 11149, 11149, 11149, 11149, 11149, 11149, 11149, + 11159, 11159, 11159, 11159, 11159, 11159, 11159, 11159, + 11161, 11161, 11171, 11171, 11171, 11171, 11171, 11171, + 11171, 11171, 11171, 11173, 11173, 11177, 11177, 11177, + 11197, 11197, 11197, 11197, 11197, 11197, 11197, 11197, + 11197, 11197, 11197, 11197, 11197, 11197, 11197, 11197, + 11197, 11197, 11213, 11213, 11213, 11213, 11213, 11213, + 11213, 11213, 11213, 11213, 11213, 11213, 11213, 11213, + 11239, 11239, 11239, 11239, 11239, 11239, 11239, 11239, + 11239, 11239, 11239, 11239, 11239, 11239, 11239, 11239, + 11239, 11239, 11239, 11239, 11239, 11239, 11239, 11239, + 11243, 11243, 11243, 11251, 11251, 11251, 11251, 11251, + 11251, 11251, 11257, 11257, 11257, 11257, 11257, 11257, + 11261, 11261, 11261, 11273, 11273, 11273, 11273, 11273, + 11273, 11273, 11273, 11273, 11273, 11273, 11279, 11279, + 11279, 11279, 11279, 11287, 11287, 11287, 11287, 11287, + 11287, 11287, 11299, 11299, 11299, 11299, 11299, 11299, + 11299, 11299, 11299, 11299, 11299, 11311, 11311, 11311, + 11311, 11311, 11311, 11311, 11311, 11311, 11311, 11311, + 11317, 11317, 11317, 11317, 11317, 11321, 11321, 11321, + 11329, 11329, 11329, 11329, 11329, 11329, 11329, 11329, + 11351, 11351, 11351, 11351, 11351, 11351, 11351, 11351, + 11351, 11351, 11351, 11351, 11351, 11351, 11351, 11351, + 11351, 11351, 11351, 11353, 11353, 11369, 11369, 11369, + 11369, 11369, 11369, 11369, 11369, 11369, 11369, 11369, + 11369, 11369, 11369, 11383, 11383, 11383, 11383, 11383, + 11383, 11383, 11383, 11383, 11383, 11383, 11383, 11383, + 11393, 11393, 11393, 11393, 11393, 11393, 11393, 11393, + 11399, 11399, 11399, 11399, 11399, 11399, 11411, 11411, + 11411, 11411, 11411, 11411, 11411, 11411, 11411, 11411, + 11423, 11423, 11423, 11423, 11423, 11423, 11423, 11423, + 11423, 11423, 11423, 11437, 11437, 11437, 11437, 11437, + 11437, 11437, 11437, 11437, 11437, 11437, 11437, 11437, + 11443, 11443, 11443, 11443, 11443, 11447, 11447, 11447, + 11467, 11467, 11467, 11467, 11467, 11467, 11467, 11467, + 11467, 11467, 11467, 11467, 11467, 11467, 11467, 11467, + 11467, 11467, 11471, 11471, 11471, 11471, 11483, 11483, + 11483, 11483, 11483, 11483, 11483, 11483, 11483, 11483, + 11489, 11489, 11489, 11489, 11489, 11489, 11491, 11491, + 11497, 11497, 11497, 11497, 11497, 11503, 11503, 11503, + 11503, 11503, 11519, 11519, 11519, 11519, 11519, 11519, + 11519, 11519, 11519, 11519, 11519, 11519, 11519, 11519, + 11527, 11527, 11527, 11527, 11527, 11527, 11527, 11527, + 11549, 11549, 11549, 11549, 11549, 11549, 11549, 11549, + 11549, 11549, 11549, 11549, 11549, 11549, 11549, 11549, + 11549, 11549, 11549, 11551, 11551, 11579, 11579, 11579, + 11579, 11579, 11579, 11579, 11579, 11579, 11579, 11579, + 11579, 11579, 11579, 11579, 11579, 11579, 11579, 11579, + 11579, 11579, 11579, 11579, 11579, 11579, 11587, 11587, + 11587, 11587, 11587, 11587, 11587, 11593, 11593, 11593, + 11593, 11593, 11597, 11597, 11597, 11597, 11617, 11617, + 11617, 11617, 11617, 11617, 11617, 11617, 11617, 11617, + 11617, 11617, 11617, 11617, 11617, 11617, 11617, 11617, + 11621, 11621, 11621, 11633, 11633, 11633, 11633, 11633, + 11633, 11633, 11633, 11633, 11633, 11633, 11657, 11657, + 11657, 11657, 11657, 11657, 11657, 11657, 11657, 11657, + 11657, 11657, 11657, 11657, 11657, 11657, 11657, 11657, + 11657, 11657, 11657, 11677, 11677, 11677, 11677, 11677, + 11677, 11677, 11677, 11677, 11677, 11677, 11677, 11677, + 11677, 11677, 11677, 11677, 11677, 11681, 11681, 11681, + 11689, 11689, 11689, 11689, 11689, 11689, 11689, 11689, + 11699, 11699, 11699, 11699, 11699, 11699, 11699, 11699, + 11701, 11701, 11717, 11717, 11717, 11717, 11717, 11717, + 11717, 11717, 11717, 11717, 11717, 11717, 11717, 11717, + 11719, 11719, 11731, 11731, 11731, 11731, 11731, 11731, + 11731, 11731, 11731, 11731, 11731, 11743, 11743, 11743, + 11743, 11743, 11743, 11743, 11743, 11743, 11743, 11743, + 11777, 11777, 11777, 11777, 11777, 11777, 11777, 11777, + 11777, 11777, 11777, 11777, 11777, 11777, 11777, 11777, + 11777, 11777, 11777, 11777, 11777, 11777, 11777, 11777, + 11777, 11777, 11777, 11777, 11777, 11777, 11779, 11779, + 11783, 11783, 11783, 11789, 11789, 11789, 11789, 11789, + 11801, 11801, 11801, 11801, 11801, 11801, 11801, 11801, + 11801, 11801, 11801, 11807, 11807, 11807, 11807, 11807, + 11813, 11813, 11813, 11813, 11813, 11813, 11821, 11821, + 11821, 11821, 11821, 11821, 11821, 11827, 11827, 11827, + 11827, 11827, 11831, 11831, 11831, 11831, 11833, 11833, + 11839, 11839, 11839, 11839, 11839, 11863, 11863, 11863, + 11863, 11863, 11863, 11863, 11863, 11863, 11863, 11863, + 11863, 11863, 11863, 11863, 11863, 11863, 11863, 11863, + 11863, 11863, 11867, 11867, 11867, 11867, 11887, 11887, + 11887, 11887, 11887, 11887, 11887, 11887, 11887, 11887, + 11887, 11887, 11887, 11887, 11887, 11887, 11887, 11887, + 11897, 11897, 11897, 11897, 11897, 11897, 11897, 11897, + 11903, 11903, 11903, 11903, 11903, 11903, 11909, 11909, + 11909, 11909, 11909, 11923, 11923, 11923, 11923, 11923, + 11923, 11923, 11923, 11923, 11923, 11923, 11923, 11923, + 11927, 11927, 11927, 11933, 11933, 11933, 11933, 11933, + 11939, 11939, 11939, 11939, 11939, 11939, 11941, 11941, + 11953, 11953, 11953, 11953, 11953, 11953, 11953, 11953, + 11953, 11953, 11959, 11959, 11959, 11959, 11959, 11959, + 11969, 11969, 11969, 11969, 11969, 11969, 11969, 11969, + 11971, 11971, 11981, 11981, 11981, 11981, 11981, 11981, + 11981, 11981, 11981, 11987, 11987, 11987, 11987, 11987, + 12007, 12007, 12007, 12007, 12007, 12007, 12007, 12007, + 12007, 12007, 12007, 12007, 12007, 12007, 12007, 12007, + 12007, 12007, 12011, 12011, 12011, 12011, 12037, 12037, + 12037, 12037, 12037, 12037, 12037, 12037, 12037, 12037, + 12037, 12037, 12037, 12037, 12037, 12037, 12037, 12037, + 12037, 12037, 12037, 12037, 12037, 12041, 12041, 12041, + 12043, 12043, 12049, 12049, 12049, 12049, 12049, 12049, + 12071, 12071, 12071, 12071, 12071, 12071, 12071, 12071, + 12071, 12071, 12071, 12071, 12071, 12071, 12071, 12071, + 12071, 12071, 12071, 12073, 12073, 12097, 12097, 12097, + 12097, 12097, 12097, 12097, 12097, 12097, 12097, 12097, + 12097, 12097, 12097, 12097, 12097, 12097, 12097, 12097, + 12097, 12097, 12101, 12101, 12101, 12101, 12107, 12107, + 12107, 12107, 12107, 12109, 12109, 12113, 12113, 12113, + 12119, 12119, 12119, 12119, 12119, 12119, 12143, 12143, + 12143, 12143, 12143, 12143, 12143, 12143, 12143, 12143, + 12143, 12143, 12143, 12143, 12143, 12143, 12143, 12143, + 12143, 12143, 12143, 12149, 12149, 12149, 12149, 12149, + 12157, 12157, 12157, 12157, 12157, 12157, 12157, 12157, + 12161, 12161, 12161, 12163, 12163, 12197, 12197, 12197, + 12197, 12197, 12197, 12197, 12197, 12197, 12197, 12197, + 12197, 12197, 12197, 12197, 12197, 12197, 12197, 12197, + 12197, 12197, 12197, 12197, 12197, 12197, 12197, 12197, + 12197, 12197, 12197, 12203, 12203, 12203, 12203, 12203, + 12211, 12211, 12211, 12211, 12211, 12211, 12211, 12211, + 12227, 12227, 12227, 12227, 12227, 12227, 12227, 12227, + 12227, 12227, 12227, 12227, 12227, 12227, 12239, 12239, + 12239, 12239, 12239, 12239, 12239, 12239, 12239, 12239, + 12241, 12241, 12251, 12251, 12251, 12251, 12251, 12251, + 12251, 12251, 12251, 12253, 12253, 12263, 12263, 12263, + 12263, 12263, 12263, 12263, 12263, 12263, 12269, 12269, + 12269, 12269, 12269, 12277, 12277, 12277, 12277, 12277, + 12277, 12277, 12281, 12281, 12281, 12281, 12289, 12289, + 12289, 12289, 12289, 12289, 12289, 12301, 12301, 12301, + 12301, 12301, 12301, 12301, 12301, 12301, 12301, 12301, + 12323, 12323, 12323, 12323, 12323, 12323, 12323, 12323, + 12323, 12323, 12323, 12323, 12323, 12323, 12323, 12323, + 12323, 12323, 12323, 12329, 12329, 12329, 12329, 12329, + 12343, 12343, 12343, 12343, 12343, 12343, 12343, 12343, + 12343, 12343, 12343, 12343, 12343, 12347, 12347, 12347, + 12373, 12373, 12373, 12373, 12373, 12373, 12373, 12373, + 12373, 12373, 12373, 12373, 12373, 12373, 12373, 12373, + 12373, 12373, 12373, 12373, 12373, 12373, 12373, 12373, + 12377, 12377, 12377, 12379, 12379, 12391, 12391, 12391, + 12391, 12391, 12391, 12391, 12391, 12391, 12391, 12391, + 12401, 12401, 12401, 12401, 12401, 12401, 12401, 12401, + 12409, 12409, 12409, 12409, 12409, 12409, 12409, 12409, + 12413, 12413, 12413, 12421, 12421, 12421, 12421, 12421, + 12421, 12421, 12433, 12433, 12433, 12433, 12433, 12433, + 12433, 12433, 12433, 12433, 12433, 12437, 12437, 12437, + 12451, 12451, 12451, 12451, 12451, 12451, 12451, 12451, + 12451, 12451, 12451, 12451, 12451, 12457, 12457, 12457, + 12457, 12457, 12473, 12473, 12473, 12473, 12473, 12473, + 12473, 12473, 12473, 12473, 12473, 12473, 12473, 12473, + 12479, 12479, 12479, 12479, 12479, 12479, 12487, 12487, + 12487, 12487, 12487, 12487, 12487, 12491, 12491, 12491, + 12497, 12497, 12497, 12497, 12497, 12497, 12503, 12503, + 12503, 12503, 12503, 12511, 12511, 12511, 12511, 12511, + 12511, 12511, 12517, 12517, 12517, 12517, 12517, 12517, + 12527, 12527, 12527, 12527, 12527, 12527, 12527, 12527, + 12539, 12539, 12539, 12539, 12539, 12539, 12539, 12539, + 12539, 12539, 12539, 12541, 12541, 12547, 12547, 12547, + 12547, 12547, 12553, 12553, 12553, 12553, 12553, 12553, + 12569, 12569, 12569, 12569, 12569, 12569, 12569, 12569, + 12569, 12569, 12569, 12569, 12569, 12569, 12577, 12577, + 12577, 12577, 12577, 12577, 12577, 12583, 12583, 12583, + 12583, 12583, 12589, 12589, 12589, 12589, 12589, 12589, + 12601, 12601, 12601, 12601, 12601, 12601, 12601, 12601, + 12601, 12601, 12611, 12611, 12611, 12611, 12611, 12611, + 12611, 12611, 12611, 12613, 12613, 12619, 12619, 12619, + 12619, 12619, 12637, 12637, 12637, 12637, 12637, 12637, + 12637, 12637, 12637, 12637, 12637, 12637, 12637, 12637, + 12637, 12637, 12641, 12641, 12641, 12641, 12647, 12647, + 12647, 12647, 12647, 12653, 12653, 12653, 12653, 12653, + 12659, 12659, 12659, 12659, 12659, 12659, 12671, 12671, + 12671, 12671, 12671, 12671, 12671, 12671, 12671, 12671, + 12689, 12689, 12689, 12689, 12689, 12689, 12689, 12689, + 12689, 12689, 12689, 12689, 12689, 12689, 12689, 12689, + 12697, 12697, 12697, 12697, 12697, 12697, 12697, 12697, + 12703, 12703, 12703, 12703, 12703, 12713, 12713, 12713, + 12713, 12713, 12713, 12713, 12713, 12713, 12721, 12721, + 12721, 12721, 12721, 12721, 12721, 12739, 12739, 12739, + 12739, 12739, 12739, 12739, 12739, 12739, 12739, 12739, + 12739, 12739, 12739, 12739, 12739, 12743, 12743, 12743, + 12757, 12757, 12757, 12757, 12757, 12757, 12757, 12757, + 12757, 12757, 12757, 12757, 12757, 12763, 12763, 12763, + 12763, 12763, 12781, 12781, 12781, 12781, 12781, 12781, + 12781, 12781, 12781, 12781, 12781, 12781, 12781, 12781, + 12781, 12781, 12791, 12791, 12791, 12791, 12791, 12791, + 12791, 12791, 12791, 12799, 12799, 12799, 12799, 12799, + 12799, 12799, 12809, 12809, 12809, 12809, 12809, 12809, + 12809, 12809, 12809, 12821, 12821, 12821, 12821, 12821, + 12821, 12821, 12821, 12821, 12821, 12821, 12823, 12823, + 12829, 12829, 12829, 12829, 12829, 12841, 12841, 12841, + 12841, 12841, 12841, 12841, 12841, 12841, 12841, 12841, + 12853, 12853, 12853, 12853, 12853, 12853, 12853, 12853, + 12853, 12853, 12889, 12889, 12889, 12889, 12889, 12889, + 12889, 12889, 12889, 12889, 12889, 12889, 12889, 12889, + 12889, 12889, 12889, 12889, 12889, 12889, 12889, 12889, + 12889, 12889, 12889, 12889, 12889, 12889, 12889, 12889, + 12889, 12889, 12893, 12893, 12893, 12893, 12899, 12899, + 12899, 12899, 12899, 12907, 12907, 12907, 12907, 12907, + 12907, 12907, 12911, 12911, 12911, 12911, 12917, 12917, + 12917, 12917, 12917, 12919, 12919, 12923, 12923, 12923, + 12941, 12941, 12941, 12941, 12941, 12941, 12941, 12941, + 12941, 12941, 12941, 12941, 12941, 12941, 12941, 12941, + 12953, 12953, 12953, 12953, 12953, 12953, 12953, 12953, + 12953, 12953, 12953, 12959, 12959, 12959, 12959, 12959, + 12967, 12967, 12967, 12967, 12967, 12967, 12967, 12967, + 12973, 12973, 12973, 12973, 12973, 12979, 12979, 12979, + 12979, 12979, 12983, 12983, 12983, 12983, 13001, 13001, + 13001, 13001, 13001, 13001, 13001, 13001, 13001, 13001, + 13001, 13001, 13001, 13001, 13001, 13001, 13003, 13003, + 13007, 13007, 13007, 13009, 13009, 13033, 13033, 13033, + 13033, 13033, 13033, 13033, 13033, 13033, 13033, 13033, + 13033, 13033, 13033, 13033, 13033, 13033, 13033, 13033, + 13033, 13033, 13037, 13037, 13037, 13037, 13043, 13043, + 13043, 13043, 13043, 13049, 13049, 13049, 13049, 13049, + 13063, 13063, 13063, 13063, 13063, 13063, 13063, 13063, + 13063, 13063, 13063, 13063, 13063, 13093, 13093, 13093, + 13093, 13093, 13093, 13093, 13093, 13093, 13093, 13093, + 13093, 13093, 13093, 13093, 13093, 13093, 13093, 13093, + 13093, 13093, 13093, 13093, 13093, 13093, 13093, 13093, + 13099, 13099, 13099, 13099, 13099, 13103, 13103, 13103, + 13109, 13109, 13109, 13109, 13109, 13109, 13121, 13121, + 13121, 13121, 13121, 13121, 13121, 13121, 13121, 13121, + 13127, 13127, 13127, 13127, 13127, 13127, 13147, 13147, + 13147, 13147, 13147, 13147, 13147, 13147, 13147, 13147, + 13147, 13147, 13147, 13147, 13147, 13147, 13147, 13147, + 13151, 13151, 13151, 13159, 13159, 13159, 13159, 13159, + 13159, 13159, 13163, 13163, 13163, 13163, 13171, 13171, + 13171, 13171, 13171, 13171, 13171, 13177, 13177, 13177, + 13177, 13177, 13183, 13183, 13183, 13183, 13183, 13183, + 13187, 13187, 13187, 13217, 13217, 13217, 13217, 13217, + 13217, 13217, 13217, 13217, 13217, 13217, 13217, 13217, + 13217, 13217, 13217, 13217, 13217, 13217, 13217, 13217, + 13217, 13217, 13217, 13217, 13217, 13217, 13219, 13219, + 13229, 13229, 13229, 13229, 13229, 13229, 13229, 13229, + 13241, 13241, 13241, 13241, 13241, 13241, 13241, 13241, + 13241, 13241, 13241, 13249, 13249, 13249, 13249, 13249, + 13249, 13249, 13259, 13259, 13259, 13259, 13259, 13259, + 13259, 13259, 13259, 13267, 13267, 13267, 13267, 13267, + 13267, 13267, 13291, 13291, 13291, 13291, 13291, 13291, + 13291, 13291, 13291, 13291, 13291, 13291, 13291, 13291, + 13291, 13291, 13291, 13291, 13291, 13291, 13291, 13291, + 13297, 13297, 13297, 13297, 13297, 13309, 13309, 13309, + 13309, 13309, 13309, 13309, 13309, 13309, 13309, 13309, + 13313, 13313, 13313, 13327, 13327, 13327, 13327, 13327, + 13327, 13327, 13327, 13327, 13327, 13327, 13327, 13327, + 13331, 13331, 13331, 13337, 13337, 13337, 13337, 13337, + 13339, 13339, 13367, 13367, 13367, 13367, 13367, 13367, + 13367, 13367, 13367, 13367, 13367, 13367, 13367, 13367, + 13367, 13367, 13367, 13367, 13367, 13367, 13367, 13367, + 13367, 13367, 13367, 13381, 13381, 13381, 13381, 13381, + 13381, 13381, 13381, 13381, 13381, 13381, 13381, 13381, + 13397, 13397, 13397, 13397, 13397, 13397, 13397, 13397, + 13397, 13397, 13397, 13397, 13397, 13397, 13399, 13399, + 13411, 13411, 13411, 13411, 13411, 13411, 13411, 13411, + 13411, 13411, 13417, 13417, 13417, 13417, 13417, 13417, + 13421, 13421, 13421, 13441, 13441, 13441, 13441, 13441, + 13441, 13441, 13441, 13441, 13441, 13441, 13441, 13441, + 13441, 13441, 13441, 13441, 13441, 13451, 13451, 13451, + 13451, 13451, 13451, 13451, 13451, 13451, 13457, 13457, + 13457, 13457, 13457, 13463, 13463, 13463, 13463, 13463, + 13469, 13469, 13469, 13469, 13469, 13469, 13477, 13477, + 13477, 13477, 13477, 13477, 13477, 13487, 13487, 13487, + 13487, 13487, 13487, 13487, 13487, 13487, 13499, 13499, + 13499, 13499, 13499, 13499, 13499, 13499, 13499, 13499, + 13513, 13513, 13513, 13513, 13513, 13513, 13513, 13513, + 13513, 13513, 13513, 13513, 13513, 13523, 13523, 13523, + 13523, 13523, 13523, 13523, 13523, 13523, 13537, 13537, + 13537, 13537, 13537, 13537, 13537, 13537, 13537, 13537, + 13537, 13537, 13553, 13553, 13553, 13553, 13553, 13553, + 13553, 13553, 13553, 13553, 13553, 13553, 13553, 13553, + 13567, 13567, 13567, 13567, 13567, 13567, 13567, 13567, + 13567, 13567, 13567, 13567, 13567, 13577, 13577, 13577, + 13577, 13577, 13577, 13577, 13577, 13577, 13591, 13591, + 13591, 13591, 13591, 13591, 13591, 13591, 13591, 13591, + 13591, 13591, 13597, 13597, 13597, 13597, 13597, 13597, + 13613, 13613, 13613, 13613, 13613, 13613, 13613, 13613, + 13613, 13613, 13613, 13613, 13613, 13613, 13619, 13619, + 13619, 13619, 13619, 13627, 13627, 13627, 13627, 13627, + 13627, 13627, 13633, 13633, 13633, 13633, 13633, 13633, + 13649, 13649, 13649, 13649, 13649, 13649, 13649, 13649, + 13649, 13649, 13649, 13649, 13649, 13649, 13669, 13669, + 13669, 13669, 13669, 13669, 13669, 13669, 13669, 13669, + 13669, 13669, 13669, 13669, 13669, 13669, 13669, 13669, + 13679, 13679, 13679, 13679, 13679, 13679, 13679, 13679, + 13681, 13681, 13687, 13687, 13687, 13687, 13687, 13687, + 13691, 13691, 13691, 13693, 13693, 13697, 13697, 13697, + 13709, 13709, 13709, 13709, 13709, 13709, 13709, 13709, + 13709, 13709, 13709, 13711, 13711, 13721, 13721, 13721, + 13721, 13721, 13721, 13721, 13721, 13721, 13723, 13723, + 13729, 13729, 13729, 13729, 13729, 13751, 13751, 13751, + 13751, 13751, 13751, 13751, 13751, 13751, 13751, 13751, + 13751, 13751, 13751, 13751, 13751, 13751, 13751, 13751, + 13757, 13757, 13757, 13757, 13757, 13757, 13759, 13759, + 13763, 13763, 13763, 13781, 13781, 13781, 13781, 13781, + 13781, 13781, 13781, 13781, 13781, 13781, 13781, 13781, + 13781, 13781, 13781, 13789, 13789, 13789, 13789, 13789, + 13789, 13789, 13799, 13799, 13799, 13799, 13799, 13799, + 13799, 13799, 13799, 13807, 13807, 13807, 13807, 13807, + 13807, 13807, 13829, 13829, 13829, 13829, 13829, 13829, + 13829, 13829, 13829, 13829, 13829, 13829, 13829, 13829, + 13829, 13829, 13829, 13829, 13829, 13829, 13831, 13831, + 13841, 13841, 13841, 13841, 13841, 13841, 13841, 13841, + 13859, 13859, 13859, 13859, 13859, 13859, 13859, 13859, + 13859, 13859, 13859, 13859, 13859, 13859, 13859, 13859, + 13873, 13873, 13873, 13873, 13873, 13873, 13873, 13873, + 13873, 13873, 13873, 13873, 13873, 13877, 13877, 13877, + 13879, 13879, 13883, 13883, 13883, 13883, 13901, 13901, + 13901, 13901, 13901, 13901, 13901, 13901, 13901, 13901, + 13901, 13901, 13901, 13901, 13901, 13901, 13903, 13903, + 13907, 13907, 13907, 13913, 13913, 13913, 13913, 13913, + 13921, 13921, 13921, 13921, 13921, 13921, 13921, 13921, + 13931, 13931, 13931, 13931, 13931, 13931, 13931, 13931, + 13933, 13933, 13963, 13963, 13963, 13963, 13963, 13963, + 13963, 13963, 13963, 13963, 13963, 13963, 13963, 13963, + 13963, 13963, 13963, 13963, 13963, 13963, 13963, 13963, + 13963, 13963, 13963, 13963, 13963, 13967, 13967, 13967, + 13997, 13997, 13997, 13997, 13997, 13997, 13997, 13997, + 13997, 13997, 13997, 13997, 13997, 13997, 13997, 13997, + 13997, 13997, 13997, 13997, 13997, 13997, 13997, 13997, + 13997, 13997, 13997, 13999, 13999, 14009, 14009, 14009, + 14009, 14009, 14009, 14009, 14009, 14009, 14011, 14011, + 14029, 14029, 14029, 14029, 14029, 14029, 14029, 14029, + 14029, 14029, 14029, 14029, 14029, 14029, 14029, 14029, + 14033, 14033, 14033, 14051, 14051, 14051, 14051, 14051, + 14051, 14051, 14051, 14051, 14051, 14051, 14051, 14051, + 14051, 14051, 14051, 14057, 14057, 14057, 14057, 14057, + 14071, 14071, 14071, 14071, 14071, 14071, 14071, 14071, + 14071, 14071, 14071, 14071, 14071, 14081, 14081, 14081, + 14081, 14081, 14081, 14081, 14081, 14081, 14083, 14083, + 14087, 14087, 14087, 14107, 14107, 14107, 14107, 14107, + 14107, 14107, 14107, 14107, 14107, 14107, 14107, 14107, + 14107, 14107, 14107, 14107, 14107, 14143, 14143, 14143, + 14143, 14143, 14143, 14143, 14143, 14143, 14143, 14143, + 14143, 14143, 14143, 14143, 14143, 14143, 14143, 14143, + 14143, 14143, 14143, 14143, 14143, 14143, 14143, 14143, + 14143, 14143, 14143, 14143, 14143, 14149, 14149, 14149, + 14149, 14149, 14153, 14153, 14153, 14153, 14159, 14159, + 14159, 14159, 14159, 14173, 14173, 14173, 14173, 14173, + 14173, 14173, 14173, 14173, 14173, 14173, 14173, 14173, + 14177, 14177, 14177, 14197, 14197, 14197, 14197, 14197, + 14197, 14197, 14197, 14197, 14197, 14197, 14197, 14197, + 14197, 14197, 14197, 14197, 14197, 14207, 14207, 14207, + 14207, 14207, 14207, 14207, 14207, 14207, 14221, 14221, + 14221, 14221, 14221, 14221, 14221, 14221, 14221, 14221, + 14221, 14221, 14243, 14243, 14243, 14243, 14243, 14243, + 14243, 14243, 14243, 14243, 14243, 14243, 14243, 14243, + 14243, 14243, 14243, 14243, 14243, 14243, 14249, 14249, + 14249, 14249, 14249, 14251, 14251, 14281, 14281, 14281, + 14281, 14281, 14281, 14281, 14281, 14281, 14281, 14281, + 14281, 14281, 14281, 14281, 14281, 14281, 14281, 14281, + 14281, 14281, 14281, 14281, 14281, 14281, 14281, 14281, + 14293, 14293, 14293, 14293, 14293, 14293, 14293, 14293, + 14293, 14293, 14303, 14303, 14303, 14303, 14303, 14303, + 14303, 14303, 14303, 14321, 14321, 14321, 14321, 14321, + 14321, 14321, 14321, 14321, 14321, 14321, 14321, 14321, + 14321, 14321, 14321, 14323, 14323, 14327, 14327, 14327, + 14341, 14341, 14341, 14341, 14341, 14341, 14341, 14341, + 14341, 14341, 14341, 14341, 14341, 14347, 14347, 14347, + 14347, 14347, 14369, 14369, 14369, 14369, 14369, 14369, + 14369, 14369, 14369, 14369, 14369, 14369, 14369, 14369, + 14369, 14369, 14369, 14369, 14369, 14369, 14387, 14387, + 14387, 14387, 14387, 14387, 14387, 14387, 14387, 14387, + 14387, 14387, 14387, 14387, 14387, 14387, 14389, 14389, + 14401, 14401, 14401, 14401, 14401, 14401, 14401, 14401, + 14401, 14401, 14407, 14407, 14407, 14407, 14407, 14407, + 14411, 14411, 14411, 14419, 14419, 14419, 14419, 14419, + 14419, 14419, 14423, 14423, 14423, 14423, 14431, 14431, + 14431, 14431, 14431, 14431, 14431, 14437, 14437, 14437, + 14437, 14437, 14447, 14447, 14447, 14447, 14447, 14447, + 14447, 14447, 14447, 14449, 14449, 14461, 14461, 14461, + 14461, 14461, 14461, 14461, 14461, 14461, 14461, 14461, + 14479, 14479, 14479, 14479, 14479, 14479, 14479, 14479, + 14479, 14479, 14479, 14479, 14479, 14479, 14479, 14479, + 14489, 14489, 14489, 14489, 14489, 14489, 14489, 14489, + 14503, 14503, 14503, 14503, 14503, 14503, 14503, 14503, + 14503, 14503, 14503, 14503, 14503, 14519, 14519, 14519, + 14519, 14519, 14519, 14519, 14519, 14519, 14519, 14519, + 14519, 14519, 14519, 14533, 14533, 14533, 14533, 14533, + 14533, 14533, 14533, 14533, 14533, 14533, 14533, 14533, + 14537, 14537, 14537, 14543, 14543, 14543, 14543, 14543, + 14549, 14549, 14549, 14549, 14549, 14549, 14551, 14551, + 14557, 14557, 14557, 14557, 14557, 14561, 14561, 14561, + 14563, 14563, 14591, 14591, 14591, 14591, 14591, 14591, + 14591, 14591, 14591, 14591, 14591, 14591, 14591, 14591, + 14591, 14591, 14591, 14591, 14591, 14591, 14591, 14591, + 14591, 14591, 14591, 14593, 14593, 14621, 14621, 14621, + 14621, 14621, 14621, 14621, 14621, 14621, 14621, 14621, + 14621, 14621, 14621, 14621, 14621, 14621, 14621, 14621, + 14621, 14621, 14621, 14621, 14621, 14621, 14627, 14627, + 14627, 14627, 14627, 14629, 14629, 14633, 14633, 14633, + 14639, 14639, 14639, 14639, 14639, 14639, 14653, 14653, + 14653, 14653, 14653, 14653, 14653, 14653, 14653, 14653, + 14653, 14653, 14657, 14657, 14657, 14657, 14669, 14669, + 14669, 14669, 14669, 14669, 14669, 14669, 14669, 14669, + 14683, 14683, 14683, 14683, 14683, 14683, 14683, 14683, + 14683, 14683, 14683, 14683, 14683, 14699, 14699, 14699, + 14699, 14699, 14699, 14699, 14699, 14699, 14699, 14699, + 14699, 14699, 14699, 14713, 14713, 14713, 14713, 14713, + 14713, 14713, 14713, 14713, 14713, 14713, 14713, 14713, + 14717, 14717, 14717, 14723, 14723, 14723, 14723, 14723, + 14731, 14731, 14731, 14731, 14731, 14731, 14731, 14731, + 14737, 14737, 14737, 14737, 14737, 14741, 14741, 14741, + 14747, 14747, 14747, 14747, 14747, 14747, 14753, 14753, + 14753, 14753, 14753, 14759, 14759, 14759, 14759, 14759, + 14767, 14767, 14767, 14767, 14767, 14767, 14767, 14767, + 14771, 14771, 14771, 14779, 14779, 14779, 14779, 14779, + 14779, 14779, 14783, 14783, 14783, 14783, 14797, 14797, + 14797, 14797, 14797, 14797, 14797, 14797, 14797, 14797, + 14797, 14797, 14813, 14813, 14813, 14813, 14813, 14813, + 14813, 14813, 14813, 14813, 14813, 14813, 14813, 14813, + 14821, 14821, 14821, 14821, 14821, 14821, 14821, 14821, + 14827, 14827, 14827, 14827, 14827, 14831, 14831, 14831, + 14843, 14843, 14843, 14843, 14843, 14843, 14843, 14843, + 14843, 14843, 14843, 14851, 14851, 14851, 14851, 14851, + 14851, 14851, 14867, 14867, 14867, 14867, 14867, 14867, + 14867, 14867, 14867, 14867, 14867, 14867, 14867, 14867, + 14869, 14869, 14879, 14879, 14879, 14879, 14879, 14879, + 14879, 14879, 14879, 14887, 14887, 14887, 14887, 14887, + 14887, 14887, 14891, 14891, 14891, 14891, 14897, 14897, + 14897, 14897, 14897, 14923, 14923, 14923, 14923, 14923, + 14923, 14923, 14923, 14923, 14923, 14923, 14923, 14923, + 14923, 14923, 14923, 14923, 14923, 14923, 14923, 14923, + 14923, 14923, 14929, 14929, 14929, 14929, 14929, 14929, + 14939, 14939, 14939, 14939, 14939, 14939, 14939, 14939, + 14947, 14947, 14947, 14947, 14947, 14947, 14947, 14947, + 14951, 14951, 14951, 14957, 14957, 14957, 14957, 14957, + 14969, 14969, 14969, 14969, 14969, 14969, 14969, 14969, + 14969, 14969, 14969, 14983, 14983, 14983, 14983, 14983, + 14983, 14983, 14983, 14983, 14983, 14983, 14983, 14983, + 15013, 15013, 15013, 15013, 15013, 15013, 15013, 15013, + 15013, 15013, 15013, 15013, 15013, 15013, 15013, 15013, + 15013, 15013, 15013, 15013, 15013, 15013, 15013, 15013, + 15013, 15013, 15017, 15017, 15017, 15017, 15031, 15031, + 15031, 15031, 15031, 15031, 15031, 15031, 15031, 15031, + 15031, 15031, 15053, 15053, 15053, 15053, 15053, 15053, + 15053, 15053, 15053, 15053, 15053, 15053, 15053, 15053, + 15053, 15053, 15053, 15053, 15053, 15053, 15061, 15061, + 15061, 15061, 15061, 15061, 15061, 15073, 15073, 15073, + 15073, 15073, 15073, 15073, 15073, 15073, 15073, 15073, + 15077, 15077, 15077, 15083, 15083, 15083, 15083, 15083, + 15091, 15091, 15091, 15091, 15091, 15091, 15091, 15091, + 15101, 15101, 15101, 15101, 15101, 15101, 15101, 15101, + 15107, 15107, 15107, 15107, 15107, 15107, 15121, 15121, + 15121, 15121, 15121, 15121, 15121, 15121, 15121, 15121, + 15121, 15121, 15131, 15131, 15131, 15131, 15131, 15131, + 15131, 15131, 15131, 15137, 15137, 15137, 15137, 15137, + 15139, 15139, 15149, 15149, 15149, 15149, 15149, 15149, + 15149, 15149, 15149, 15161, 15161, 15161, 15161, 15161, + 15161, 15161, 15161, 15161, 15161, 15161, 15173, 15173, + 15173, 15173, 15173, 15173, 15173, 15173, 15173, 15173, + 15187, 15187, 15187, 15187, 15187, 15187, 15187, 15187, + 15187, 15187, 15187, 15187, 15187, 15193, 15193, 15193, + 15193, 15193, 15199, 15199, 15199, 15199, 15199, 15199, + 15217, 15217, 15217, 15217, 15217, 15217, 15217, 15217, + 15217, 15217, 15217, 15217, 15217, 15217, 15217, 15217, + 15227, 15227, 15227, 15227, 15227, 15227, 15227, 15227, + 15233, 15233, 15233, 15233, 15233, 15233, 15241, 15241, + 15241, 15241, 15241, 15241, 15241, 15259, 15259, 15259, + 15259, 15259, 15259, 15259, 15259, 15259, 15259, 15259, + 15259, 15259, 15259, 15259, 15259, 15263, 15263, 15263, + 15269, 15269, 15269, 15269, 15269, 15269, 15271, 15271, + 15277, 15277, 15277, 15277, 15277, 15287, 15287, 15287, + 15287, 15287, 15287, 15287, 15287, 15287, 15289, 15289, + 15299, 15299, 15299, 15299, 15299, 15299, 15299, 15299, + 15307, 15307, 15307, 15307, 15307, 15307, 15307, 15307, + 15313, 15313, 15313, 15313, 15313, 15319, 15319, 15319, + 15319, 15319, 15329, 15329, 15329, 15329, 15329, 15329, + 15329, 15329, 15329, 15331, 15331, 15349, 15349, 15349, + 15349, 15349, 15349, 15349, 15349, 15349, 15349, 15349, + 15349, 15349, 15349, 15349, 15349, 15359, 15359, 15359, + 15359, 15359, 15359, 15359, 15359, 15359, 15361, 15361, + 15373, 15373, 15373, 15373, 15373, 15373, 15373, 15373, + 15373, 15373, 15377, 15377, 15377, 15377, 15383, 15383, + 15383, 15383, 15383, 15391, 15391, 15391, 15391, 15391, + 15391, 15391, 15401, 15401, 15401, 15401, 15401, 15401, + 15401, 15401, 15401, 15413, 15413, 15413, 15413, 15413, + 15413, 15413, 15413, 15413, 15413, 15413, 15427, 15427, + 15427, 15427, 15427, 15427, 15427, 15427, 15427, 15427, + 15427, 15427, 15439, 15439, 15439, 15439, 15439, 15439, + 15439, 15439, 15439, 15439, 15439, 15443, 15443, 15443, + 15451, 15451, 15451, 15451, 15451, 15451, 15451, 15451, + 15461, 15461, 15461, 15461, 15461, 15461, 15461, 15461, + 15467, 15467, 15467, 15467, 15467, 15467, 15473, 15473, + 15473, 15473, 15473, 15493, 15493, 15493, 15493, 15493, + 15493, 15493, 15493, 15493, 15493, 15493, 15493, 15493, + 15493, 15493, 15493, 15493, 15493, 15497, 15497, 15497, + 15511, 15511, 15511, 15511, 15511, 15511, 15511, 15511, + 15511, 15511, 15511, 15511, 15511, 15527, 15527, 15527, + 15527, 15527, 15527, 15527, 15527, 15527, 15527, 15527, + 15527, 15527, 15527, 15541, 15541, 15541, 15541, 15541, + 15541, 15541, 15541, 15541, 15541, 15541, 15541, 15541, + 15551, 15551, 15551, 15551, 15551, 15551, 15551, 15551, + 15559, 15559, 15559, 15559, 15559, 15559, 15559, 15559, + 15569, 15569, 15569, 15569, 15569, 15569, 15569, 15569, + 15581, 15581, 15581, 15581, 15581, 15581, 15581, 15581, + 15581, 15581, 15581, 15583, 15583, 15601, 15601, 15601, + 15601, 15601, 15601, 15601, 15601, 15601, 15601, 15601, + 15601, 15601, 15601, 15601, 15601, 15607, 15607, 15607, + 15607, 15607, 15619, 15619, 15619, 15619, 15619, 15619, + 15619, 15619, 15619, 15619, 15619, 15629, 15629, 15629, + 15629, 15629, 15629, 15629, 15629, 15629, 15641, 15641, + 15641, 15641, 15641, 15641, 15641, 15641, 15641, 15641, + 15643, 15643, 15647, 15647, 15647, 15647, 15649, 15649, + 15661, 15661, 15661, 15661, 15661, 15661, 15661, 15661, + 15661, 15661, 15667, 15667, 15667, 15667, 15667, 15667, + 15671, 15671, 15671, 15679, 15679, 15679, 15679, 15679, + 15679, 15679, 15683, 15683, 15683, 15683, 15727, 15727, + 15727, 15727, 15727, 15727, 15727, 15727, 15727, 15727, + 15727, 15727, 15727, 15727, 15727, 15727, 15727, 15727, + 15727, 15727, 15727, 15727, 15727, 15727, 15727, 15727, + 15727, 15727, 15727, 15727, 15727, 15727, 15727, 15727, + 15727, 15727, 15727, 15727, 15727, 15731, 15731, 15731, + 15733, 15733, 15737, 15737, 15737, 15737, 15739, 15739, + 15749, 15749, 15749, 15749, 15749, 15749, 15749, 15749, + 15761, 15761, 15761, 15761, 15761, 15761, 15761, 15761, + 15761, 15761, 15761, 15767, 15767, 15767, 15767, 15767, + 15773, 15773, 15773, 15773, 15773, 15773, 15787, 15787, + 15787, 15787, 15787, 15787, 15787, 15787, 15787, 15787, + 15787, 15787, 15791, 15791, 15791, 15791, 15797, 15797, + 15797, 15797, 15797, 15803, 15803, 15803, 15803, 15803, + 15809, 15809, 15809, 15809, 15809, 15809, 15817, 15817, + 15817, 15817, 15817, 15817, 15817, 15823, 15823, 15823, + 15823, 15823, 15859, 15859, 15859, 15859, 15859, 15859, + 15859, 15859, 15859, 15859, 15859, 15859, 15859, 15859, + 15859, 15859, 15859, 15859, 15859, 15859, 15859, 15859, + 15859, 15859, 15859, 15859, 15859, 15859, 15859, 15859, + 15859, 15859, 15877, 15877, 15877, 15877, 15877, 15877, + 15877, 15877, 15877, 15877, 15877, 15877, 15877, 15877, + 15877, 15877, 15881, 15881, 15881, 15881, 15887, 15887, + 15887, 15887, 15887, 15889, 15889, 15901, 15901, 15901, + 15901, 15901, 15901, 15901, 15901, 15901, 15901, 15901, + 15907, 15907, 15907, 15907, 15907, 15913, 15913, 15913, + 15913, 15913, 15919, 15919, 15919, 15919, 15919, 15919, + 15923, 15923, 15923, 15937, 15937, 15937, 15937, 15937, + 15937, 15937, 15937, 15937, 15937, 15937, 15937, 15937, + 15959, 15959, 15959, 15959, 15959, 15959, 15959, 15959, + 15959, 15959, 15959, 15959, 15959, 15959, 15959, 15959, + 15959, 15959, 15959, 15971, 15971, 15971, 15971, 15971, + 15971, 15971, 15971, 15971, 15971, 15971, 15973, 15973, + 15991, 15991, 15991, 15991, 15991, 15991, 15991, 15991, + 15991, 15991, 15991, 15991, 15991, 15991, 15991, 15991, + 16001, 16001, 16001, 16001, 16001, 16001, 16001, 16001, + 16007, 16007, 16007, 16007, 16007, 16007, 16033, 16033, + 16033, 16033, 16033, 16033, 16033, 16033, 16033, 16033, + 16033, 16033, 16033, 16033, 16033, 16033, 16033, 16033, + 16033, 16033, 16033, 16033, 16033, 16057, 16057, 16057, + 16057, 16057, 16057, 16057, 16057, 16057, 16057, 16057, + 16057, 16057, 16057, 16057, 16057, 16057, 16057, 16057, + 16057, 16057, 16061, 16061, 16061, 16061, 16063, 16063, + 16067, 16067, 16067, 16069, 16069, 16073, 16073, 16073, + 16087, 16087, 16087, 16087, 16087, 16087, 16087, 16087, + 16087, 16087, 16087, 16087, 16087, 16091, 16091, 16091, + 16097, 16097, 16097, 16097, 16097, 16097, 16103, 16103, + 16103, 16103, 16103, 16111, 16111, 16111, 16111, 16111, + 16111, 16111, 16127, 16127, 16127, 16127, 16127, 16127, + 16127, 16127, 16127, 16127, 16127, 16127, 16127, 16127, + 16139, 16139, 16139, 16139, 16139, 16139, 16139, 16139, + 16139, 16139, 16139, 16141, 16141, 16183, 16183, 16183, + 16183, 16183, 16183, 16183, 16183, 16183, 16183, 16183, + 16183, 16183, 16183, 16183, 16183, 16183, 16183, 16183, + 16183, 16183, 16183, 16183, 16183, 16183, 16183, 16183, + 16183, 16183, 16183, 16183, 16183, 16183, 16183, 16183, + 16183, 16183, 16187, 16187, 16187, 16187, 16189, 16189, + 16193, 16193, 16193, 16217, 16217, 16217, 16217, 16217, + 16217, 16217, 16217, 16217, 16217, 16217, 16217, 16217, + 16217, 16217, 16217, 16217, 16217, 16217, 16217, 16217, + 16223, 16223, 16223, 16223, 16223, 16223, 16229, 16229, + 16229, 16229, 16229, 16231, 16231, 16249, 16249, 16249, + 16249, 16249, 16249, 16249, 16249, 16249, 16249, 16249, + 16249, 16249, 16249, 16249, 16249, 16253, 16253, 16253, + 16267, 16267, 16267, 16267, 16267, 16267, 16267, 16267, + 16267, 16267, 16267, 16267, 16267, 16273, 16273, 16273, + 16273, 16273, 16301, 16301, 16301, 16301, 16301, 16301, + 16301, 16301, 16301, 16301, 16301, 16301, 16301, 16301, + 16301, 16301, 16301, 16301, 16301, 16301, 16301, 16301, + 16301, 16301, 16301, 16319, 16319, 16319, 16319, 16319, + 16319, 16319, 16319, 16319, 16319, 16319, 16319, 16319, + 16319, 16319, 16319, 16333, 16333, 16333, 16333, 16333, + 16333, 16333, 16333, 16333, 16333, 16333, 16333, 16333, + 16339, 16339, 16339, 16339, 16339, 16349, 16349, 16349, + 16349, 16349, 16349, 16349, 16349, 16349, 16361, 16361, + 16361, 16361, 16361, 16361, 16361, 16361, 16361, 16361, + 16363, 16363, 16369, 16369, 16369, 16369, 16369, 16369, + 16381, 16381, 16381, 16381, 16381, 16381, 16381, 16381, + 16381, 16381, 16411, 16411, 16411, 16411, 16411, 16411, + 16411, 16411, 16411, 16411, 16411, 16411, 16411, 16411, + 16411, 16411, 16411, 16411, 16411, 16411, 16411, 16411, + 16411, 16411, 16411, 16411, 16411, 16417, 16417, 16417, + 16417, 16417, 16421, 16421, 16421, 16421, 16427, 16427, + 16427, 16427, 16427, 16433, 16433, 16433, 16433, 16433, + 16447, 16447, 16447, 16447, 16447, 16447, 16447, 16447, + 16447, 16447, 16447, 16447, 16447, 16451, 16451, 16451, + 16453, 16453, 16477, 16477, 16477, 16477, 16477, 16477, + 16477, 16477, 16477, 16477, 16477, 16477, 16477, 16477, + 16477, 16477, 16477, 16477, 16477, 16477, 16477, 16477, + 16481, 16481, 16481, 16487, 16487, 16487, 16487, 16487, + 16493, 16493, 16493, 16493, 16493, 16493, 16519, 16519, + 16519, 16519, 16519, 16519, 16519, 16519, 16519, 16519, + 16519, 16519, 16519, 16519, 16519, 16519, 16519, 16519, + 16519, 16519, 16519, 16519, 16519, 16529, 16529, 16529, + 16529, 16529, 16529, 16529, 16529, 16529, 16547, 16547, + 16547, 16547, 16547, 16547, 16547, 16547, 16547, 16547, + 16547, 16547, 16547, 16547, 16547, 16547, 16553, 16553, + 16553, 16553, 16553, 16561, 16561, 16561, 16561, 16561, + 16561, 16561, 16567, 16567, 16567, 16567, 16567, 16567, + 16573, 16573, 16573, 16573, 16573, 16603, 16603, 16603, + 16603, 16603, 16603, 16603, 16603, 16603, 16603, 16603, + 16603, 16603, 16603, 16603, 16603, 16603, 16603, 16603, + 16603, 16603, 16603, 16603, 16603, 16603, 16603, 16603, + 16607, 16607, 16607, 16619, 16619, 16619, 16619, 16619, + 16619, 16619, 16619, 16619, 16619, 16619, 16631, 16631, + 16631, 16631, 16631, 16631, 16631, 16631, 16631, 16631, + 16633, 16633, 16649, 16649, 16649, 16649, 16649, 16649, + 16649, 16649, 16649, 16649, 16649, 16649, 16649, 16649, + 16651, 16651, 16657, 16657, 16657, 16657, 16657, 16657, + 16661, 16661, 16661, 16673, 16673, 16673, 16673, 16673, + 16673, 16673, 16673, 16673, 16673, 16673, 16691, 16691, + 16691, 16691, 16691, 16691, 16691, 16691, 16691, 16691, + 16691, 16691, 16691, 16691, 16691, 16691, 16693, 16693, + 16699, 16699, 16699, 16699, 16699, 16703, 16703, 16703, + 16729, 16729, 16729, 16729, 16729, 16729, 16729, 16729, + 16729, 16729, 16729, 16729, 16729, 16729, 16729, 16729, + 16729, 16729, 16729, 16729, 16729, 16729, 16729, 16729, + 16741, 16741, 16741, 16741, 16741, 16741, 16741, 16741, + 16741, 16741, 16747, 16747, 16747, 16747, 16747, 16747, + 16759, 16759, 16759, 16759, 16759, 16759, 16759, 16759, + 16759, 16759, 16763, 16763, 16763, 16763, 16787, 16787, + 16787, 16787, 16787, 16787, 16787, 16787, 16787, 16787, + 16787, 16787, 16787, 16787, 16787, 16787, 16787, 16787, + 16787, 16787, 16787, 16811, 16811, 16811, 16811, 16811, + 16811, 16811, 16811, 16811, 16811, 16811, 16811, 16811, + 16811, 16811, 16811, 16811, 16811, 16811, 16811, 16811, + 16823, 16823, 16823, 16823, 16823, 16823, 16823, 16823, + 16823, 16823, 16823, 16829, 16829, 16829, 16829, 16829, + 16831, 16831, 16843, 16843, 16843, 16843, 16843, 16843, + 16843, 16843, 16843, 16843, 16843, 16871, 16871, 16871, + 16871, 16871, 16871, 16871, 16871, 16871, 16871, 16871, + 16871, 16871, 16871, 16871, 16871, 16871, 16871, 16871, + 16871, 16871, 16871, 16871, 16871, 16871, 16879, 16879, + 16879, 16879, 16879, 16879, 16879, 16883, 16883, 16883, + 16889, 16889, 16889, 16889, 16889, 16889, 16901, 16901, + 16901, 16901, 16901, 16901, 16901, 16901, 16901, 16901, + 16903, 16903, 16921, 16921, 16921, 16921, 16921, 16921, + 16921, 16921, 16921, 16921, 16921, 16921, 16921, 16921, + 16921, 16921, 16927, 16927, 16927, 16927, 16927, 16927, + 16931, 16931, 16931, 16937, 16937, 16937, 16937, 16937, + 16943, 16943, 16943, 16943, 16943, 16943, 16963, 16963, + 16963, 16963, 16963, 16963, 16963, 16963, 16963, 16963, + 16963, 16963, 16963, 16963, 16963, 16963, 16963, 16963, + 16979, 16979, 16979, 16979, 16979, 16979, 16979, 16979, + 16979, 16979, 16979, 16979, 16979, 16979, 16981, 16981, + 16987, 16987, 16987, 16987, 16987, 16993, 16993, 16993, + 16993, 16993, 17011, 17011, 17011, 17011, 17011, 17011, + 17011, 17011, 17011, 17011, 17011, 17011, 17011, 17011, + 17011, 17011, 17021, 17021, 17021, 17021, 17021, 17021, + 17021, 17021, 17021, 17027, 17027, 17027, 17027, 17027, + 17029, 17029, 17033, 17033, 17033, 17033, 17041, 17041, + 17041, 17041, 17041, 17041, 17041, 17047, 17047, 17047, + 17047, 17047, 17053, 17053, 17053, 17053, 17053, 17053, + 17077, 17077, 17077, 17077, 17077, 17077, 17077, 17077, + 17077, 17077, 17077, 17077, 17077, 17077, 17077, 17077, + 17077, 17077, 17077, 17077, 17077, 17093, 17093, 17093, + 17093, 17093, 17093, 17093, 17093, 17093, 17093, 17093, + 17093, 17093, 17093, 17099, 17099, 17099, 17099, 17099, + 17107, 17107, 17107, 17107, 17107, 17107, 17107, 17107, + 17117, 17117, 17117, 17117, 17117, 17117, 17117, 17117, + 17123, 17123, 17123, 17123, 17123, 17123, 17137, 17137, + 17137, 17137, 17137, 17137, 17137, 17137, 17137, 17137, + 17137, 17137, 17159, 17159, 17159, 17159, 17159, 17159, + 17159, 17159, 17159, 17159, 17159, 17159, 17159, 17159, + 17159, 17159, 17159, 17159, 17159, 17159, 17167, 17167, + 17167, 17167, 17167, 17167, 17167, 17183, 17183, 17183, + 17183, 17183, 17183, 17183, 17183, 17183, 17183, 17183, + 17183, 17183, 17183, 17189, 17189, 17189, 17189, 17189, + 17191, 17191, 17203, 17203, 17203, 17203, 17203, 17203, + 17203, 17203, 17203, 17203, 17203, 17207, 17207, 17207, + 17209, 17209, 17231, 17231, 17231, 17231, 17231, 17231, + 17231, 17231, 17231, 17231, 17231, 17231, 17231, 17231, + 17231, 17231, 17231, 17231, 17231, 17231, 17239, 17239, + 17239, 17239, 17239, 17239, 17239, 17257, 17257, 17257, + 17257, 17257, 17257, 17257, 17257, 17257, 17257, 17257, + 17257, 17257, 17257, 17257, 17257, 17291, 17291, 17291, + 17291, 17291, 17291, 17291, 17291, 17291, 17291, 17291, + 17291, 17291, 17291, 17291, 17291, 17291, 17291, 17291, + 17291, 17291, 17291, 17291, 17291, 17291, 17291, 17291, + 17291, 17291, 17291, 17293, 17293, 17299, 17299, 17299, + 17299, 17299, 17317, 17317, 17317, 17317, 17317, 17317, + 17317, 17317, 17317, 17317, 17317, 17317, 17317, 17317, + 17317, 17317, 17321, 17321, 17321, 17321, 17327, 17327, + 17327, 17327, 17327, 17333, 17333, 17333, 17333, 17333, + 17341, 17341, 17341, 17341, 17341, 17341, 17341, 17341, + 17351, 17351, 17351, 17351, 17351, 17351, 17351, 17351, + 17359, 17359, 17359, 17359, 17359, 17359, 17359, 17359, + 17377, 17377, 17377, 17377, 17377, 17377, 17377, 17377, + 17377, 17377, 17377, 17377, 17377, 17377, 17377, 17377, + 17383, 17383, 17383, 17383, 17383, 17387, 17387, 17387, + 17389, 17389, 17393, 17393, 17393, 17393, 17401, 17401, + 17401, 17401, 17401, 17401, 17401, 17417, 17417, 17417, + 17417, 17417, 17417, 17417, 17417, 17417, 17417, 17417, + 17417, 17417, 17417, 17419, 17419, 17431, 17431, 17431, + 17431, 17431, 17431, 17431, 17431, 17431, 17431, 17431, + 17443, 17443, 17443, 17443, 17443, 17443, 17443, 17443, + 17443, 17443, 17449, 17449, 17449, 17449, 17449, 17449, + 17467, 17467, 17467, 17467, 17467, 17467, 17467, 17467, + 17467, 17467, 17467, 17467, 17467, 17467, 17467, 17467, + 17471, 17471, 17471, 17477, 17477, 17477, 17477, 17477, + 17483, 17483, 17483, 17483, 17483, 17483, 17489, 17489, + 17489, 17489, 17489, 17491, 17491, 17497, 17497, 17497, + 17497, 17497, 17509, 17509, 17509, 17509, 17509, 17509, + 17509, 17509, 17509, 17509, 17509, 17519, 17519, 17519, + 17519, 17519, 17519, 17519, 17519, 17519, 17539, 17539, + 17539, 17539, 17539, 17539, 17539, 17539, 17539, 17539, + 17539, 17539, 17539, 17539, 17539, 17539, 17539, 17539, + 17551, 17551, 17551, 17551, 17551, 17551, 17551, 17551, + 17551, 17551, 17569, 17569, 17569, 17569, 17569, 17569, + 17569, 17569, 17569, 17569, 17569, 17569, 17569, 17569, + 17569, 17569, 17573, 17573, 17573, 17573, 17579, 17579, + 17579, 17579, 17579, 17581, 17581, 17597, 17597, 17597, + 17597, 17597, 17597, 17597, 17597, 17597, 17597, 17597, + 17597, 17597, 17597, 17599, 17599, 17609, 17609, 17609, + 17609, 17609, 17609, 17609, 17609, 17609, 17623, 17623, + 17623, 17623, 17623, 17623, 17623, 17623, 17623, 17623, + 17623, 17623, 17627, 17627, 17627, 17627, 17657, 17657, + 17657, 17657, 17657, 17657, 17657, 17657, 17657, 17657, + 17657, 17657, 17657, 17657, 17657, 17657, 17657, 17657, + 17657, 17657, 17657, 17657, 17657, 17657, 17657, 17657, + 17659, 17659, 17669, 17669, 17669, 17669, 17669, 17669, + 17669, 17669, 17669, 17681, 17681, 17681, 17681, 17681, + 17681, 17681, 17681, 17681, 17681, 17681, 17683, 17683, + 17707, 17707, 17707, 17707, 17707, 17707, 17707, 17707, + 17707, 17707, 17707, 17707, 17707, 17707, 17707, 17707, + 17707, 17707, 17707, 17707, 17707, 17713, 17713, 17713, + 17713, 17713, 17729, 17729, 17729, 17729, 17729, 17729, + 17729, 17729, 17729, 17729, 17729, 17729, 17729, 17729, + 17737, 17737, 17737, 17737, 17737, 17737, 17737, 17737, + 17747, 17747, 17747, 17747, 17747, 17747, 17747, 17747, + 17749, 17749, 17761, 17761, 17761, 17761, 17761, 17761, + 17761, 17761, 17761, 17761, 17761, 17783, 17783, 17783, + 17783, 17783, 17783, 17783, 17783, 17783, 17783, 17783, + 17783, 17783, 17783, 17783, 17783, 17783, 17783, 17783, + 17789, 17789, 17789, 17789, 17789, 17789, 17791, 17791, + 17807, 17807, 17807, 17807, 17807, 17807, 17807, 17807, + 17807, 17807, 17807, 17807, 17807, 17807, 17827, 17827, + 17827, 17827, 17827, 17827, 17827, 17827, 17827, 17827, + 17827, 17827, 17827, 17827, 17827, 17827, 17827, 17827, + 17837, 17837, 17837, 17837, 17837, 17837, 17837, 17837, + 17839, 17839, 17851, 17851, 17851, 17851, 17851, 17851, + 17851, 17851, 17851, 17851, 17851, 17863, 17863, 17863, + 17863, 17863, 17863, 17863, 17863, 17863, 17863, 17863, + 17881, 17881, 17881, 17881, 17881, 17881, 17881, 17881, + 17881, 17881, 17881, 17881, 17881, 17881, 17881, 17881, + 17891, 17891, 17891, 17891, 17891, 17891, 17891, 17891, + 17903, 17903, 17903, 17903, 17903, 17903, 17903, 17903, + 17903, 17903, 17903, 17909, 17909, 17909, 17909, 17909, + 17911, 17911, 17921, 17921, 17921, 17921, 17921, 17921, + 17921, 17921, 17921, 17923, 17923, 17929, 17929, 17929, + 17929, 17929, 17939, 17939, 17939, 17939, 17939, 17939, + 17939, 17939, 17939, 17957, 17957, 17957, 17957, 17957, + 17957, 17957, 17957, 17957, 17957, 17957, 17957, 17957, + 17957, 17957, 17957, 17959, 17959, 17971, 17971, 17971, + 17971, 17971, 17971, 17971, 17971, 17971, 17971, 17971, + 17977, 17977, 17977, 17977, 17977, 17981, 17981, 17981, + 17987, 17987, 17987, 17987, 17987, 17987, 17989, 17989, + 18013, 18013, 18013, 18013, 18013, 18013, 18013, 18013, + 18013, 18013, 18013, 18013, 18013, 18013, 18013, 18013, + 18013, 18013, 18013, 18013, 18013, 18041, 18041, 18041, + 18041, 18041, 18041, 18041, 18041, 18041, 18041, 18041, + 18041, 18041, 18041, 18041, 18041, 18041, 18041, 18041, + 18041, 18041, 18041, 18041, 18041, 18041, 18043, 18043, + 18047, 18047, 18047, 18049, 18049, 18059, 18059, 18059, + 18059, 18059, 18059, 18059, 18059, 18059, 18061, 18061, + 18077, 18077, 18077, 18077, 18077, 18077, 18077, 18077, + 18077, 18077, 18077, 18077, 18077, 18077, 18089, 18089, + 18089, 18089, 18089, 18089, 18089, 18089, 18089, 18089, + 18097, 18097, 18097, 18097, 18097, 18097, 18097, 18097, + 18119, 18119, 18119, 18119, 18119, 18119, 18119, 18119, + 18119, 18119, 18119, 18119, 18119, 18119, 18119, 18119, + 18119, 18119, 18119, 18121, 18121, 18127, 18127, 18127, + 18127, 18127, 18131, 18131, 18131, 18131, 18133, 18133, + 18143, 18143, 18143, 18143, 18143, 18143, 18143, 18143, + 18149, 18149, 18149, 18149, 18149, 18149, 18169, 18169, + 18169, 18169, 18169, 18169, 18169, 18169, 18169, 18169, + 18169, 18169, 18169, 18169, 18169, 18169, 18169, 18169, + 18181, 18181, 18181, 18181, 18181, 18181, 18181, 18181, + 18181, 18181, 18191, 18191, 18191, 18191, 18191, 18191, + 18191, 18191, 18191, 18199, 18199, 18199, 18199, 18199, + 18199, 18199, 18211, 18211, 18211, 18211, 18211, 18211, + 18211, 18211, 18211, 18211, 18211, 18217, 18217, 18217, + 18217, 18217, 18223, 18223, 18223, 18223, 18223, 18223, + 18229, 18229, 18229, 18229, 18229, 18233, 18233, 18233, + 18251, 18251, 18251, 18251, 18251, 18251, 18251, 18251, + 18251, 18251, 18251, 18251, 18251, 18251, 18251, 18251, + 18253, 18253, 18257, 18257, 18257, 18257, 18269, 18269, + 18269, 18269, 18269, 18269, 18269, 18269, 18269, 18269, + 18287, 18287, 18287, 18287, 18287, 18287, 18287, 18287, + 18287, 18287, 18287, 18287, 18287, 18287, 18287, 18287, + 18289, 18289, 18301, 18301, 18301, 18301, 18301, 18301, + 18301, 18301, 18301, 18301, 18301, 18307, 18307, 18307, + 18307, 18307, 18311, 18311, 18311, 18311, 18313, 18313, + 18329, 18329, 18329, 18329, 18329, 18329, 18329, 18329, + 18329, 18329, 18329, 18329, 18329, 18329, 18341, 18341, + 18341, 18341, 18341, 18341, 18341, 18341, 18341, 18341, + 18353, 18353, 18353, 18353, 18353, 18353, 18353, 18353, + 18353, 18353, 18353, 18367, 18367, 18367, 18367, 18367, + 18367, 18367, 18367, 18367, 18367, 18367, 18367, 18367, + 18371, 18371, 18371, 18379, 18379, 18379, 18379, 18379, + 18379, 18379, 18397, 18397, 18397, 18397, 18397, 18397, + 18397, 18397, 18397, 18397, 18397, 18397, 18397, 18397, + 18397, 18397, 18401, 18401, 18401, 18401, 18413, 18413, + 18413, 18413, 18413, 18413, 18413, 18413, 18413, 18413, + 18427, 18427, 18427, 18427, 18427, 18427, 18427, 18427, + 18427, 18427, 18427, 18427, 18427, 18433, 18433, 18433, + 18433, 18433, 18439, 18439, 18439, 18439, 18439, 18439, + 18443, 18443, 18443, 18451, 18451, 18451, 18451, 18451, + 18451, 18451, 18457, 18457, 18457, 18457, 18457, 18457, + 18461, 18461, 18461, 18481, 18481, 18481, 18481, 18481, + 18481, 18481, 18481, 18481, 18481, 18481, 18481, 18481, + 18481, 18481, 18481, 18481, 18481, 18493, 18493, 18493, + 18493, 18493, 18493, 18493, 18493, 18493, 18493, 18493, + 18503, 18503, 18503, 18503, 18503, 18503, 18503, 18503, + 18517, 18517, 18517, 18517, 18517, 18517, 18517, 18517, + 18517, 18517, 18517, 18517, 18517, 18521, 18521, 18521, + 18523, 18523, 18539, 18539, 18539, 18539, 18539, 18539, + 18539, 18539, 18539, 18539, 18539, 18539, 18539, 18539, + 18541, 18541, 18553, 18553, 18553, 18553, 18553, 18553, + 18553, 18553, 18553, 18553, 18553, 18583, 18583, 18583, + 18583, 18583, 18583, 18583, 18583, 18583, 18583, 18583, + 18583, 18583, 18583, 18583, 18583, 18583, 18583, 18583, + 18583, 18583, 18583, 18583, 18583, 18583, 18583, 18583, + 18587, 18587, 18587, 18593, 18593, 18593, 18593, 18593, + 18617, 18617, 18617, 18617, 18617, 18617, 18617, 18617, + 18617, 18617, 18617, 18617, 18617, 18617, 18617, 18617, + 18617, 18617, 18617, 18617, 18617, 18617, 18637, 18637, + 18637, 18637, 18637, 18637, 18637, 18637, 18637, 18637, + 18637, 18637, 18637, 18637, 18637, 18637, 18637, 18637, + 18661, 18661, 18661, 18661, 18661, 18661, 18661, 18661, + 18661, 18661, 18661, 18661, 18661, 18661, 18661, 18661, + 18661, 18661, 18661, 18661, 18661, 18671, 18671, 18671, + 18671, 18671, 18671, 18671, 18671, 18671, 18679, 18679, + 18679, 18679, 18679, 18679, 18679, 18691, 18691, 18691, + 18691, 18691, 18691, 18691, 18691, 18691, 18691, 18691, + 18701, 18701, 18701, 18701, 18701, 18701, 18701, 18701, + 18713, 18713, 18713, 18713, 18713, 18713, 18713, 18713, + 18713, 18713, 18713, 18719, 18719, 18719, 18719, 18719, + 18731, 18731, 18731, 18731, 18731, 18731, 18731, 18731, + 18731, 18731, 18731, 18743, 18743, 18743, 18743, 18743, + 18743, 18743, 18743, 18743, 18743, 18743, 18749, 18749, + 18749, 18749, 18749, 18757, 18757, 18757, 18757, 18757, + 18757, 18757, 18773, 18773, 18773, 18773, 18773, 18773, + 18773, 18773, 18773, 18773, 18773, 18773, 18773, 18773, + 18787, 18787, 18787, 18787, 18787, 18787, 18787, 18787, + 18787, 18787, 18787, 18787, 18787, 18793, 18793, 18793, + 18793, 18793, 18797, 18797, 18797, 18797, 18803, 18803, + 18803, 18803, 18803, 18839, 18839, 18839, 18839, 18839, + 18839, 18839, 18839, 18839, 18839, 18839, 18839, 18839, + 18839, 18839, 18839, 18839, 18839, 18839, 18839, 18839, + 18839, 18839, 18839, 18839, 18839, 18839, 18839, 18839, + 18839, 18839, 18839, 18859, 18859, 18859, 18859, 18859, + 18859, 18859, 18859, 18859, 18859, 18859, 18859, 18859, + 18859, 18859, 18859, 18859, 18859, 18869, 18869, 18869, + 18869, 18869, 18869, 18869, 18869, 18869, 18899, 18899, + 18899, 18899, 18899, 18899, 18899, 18899, 18899, 18899, + 18899, 18899, 18899, 18899, 18899, 18899, 18899, 18899, + 18899, 18899, 18899, 18899, 18899, 18899, 18899, 18899, + 18911, 18911, 18911, 18911, 18911, 18911, 18911, 18911, + 18911, 18911, 18911, 18913, 18913, 18917, 18917, 18917, + 18919, 18919, 18947, 18947, 18947, 18947, 18947, 18947, + 18947, 18947, 18947, 18947, 18947, 18947, 18947, 18947, + 18947, 18947, 18947, 18947, 18947, 18947, 18947, 18947, + 18947, 18947, 18947, 18959, 18959, 18959, 18959, 18959, + 18959, 18959, 18959, 18959, 18959, 18959, 18973, 18973, + 18973, 18973, 18973, 18973, 18973, 18973, 18973, 18973, + 18973, 18973, 18979, 18979, 18979, 18979, 18979, 18979, + 19001, 19001, 19001, 19001, 19001, 19001, 19001, 19001, + 19001, 19001, 19001, 19001, 19001, 19001, 19001, 19001, + 19001, 19001, 19001, 19009, 19009, 19009, 19009, 19009, + 19009, 19009, 19013, 19013, 19013, 19013, 19031, 19031, + 19031, 19031, 19031, 19031, 19031, 19031, 19031, 19031, + 19031, 19031, 19031, 19031, 19031, 19031, 19037, 19037, + 19037, 19037, 19037, 19051, 19051, 19051, 19051, 19051, + 19051, 19051, 19051, 19051, 19051, 19051, 19051, 19051, + 19069, 19069, 19069, 19069, 19069, 19069, 19069, 19069, + 19069, 19069, 19069, 19069, 19069, 19069, 19069, 19069, + 19073, 19073, 19073, 19079, 19079, 19079, 19079, 19079, + 19081, 19081, 19087, 19087, 19087, 19087, 19087, 19087, + 19121, 19121, 19121, 19121, 19121, 19121, 19121, 19121, + 19121, 19121, 19121, 19121, 19121, 19121, 19121, 19121, + 19121, 19121, 19121, 19121, 19121, 19121, 19121, 19121, + 19121, 19121, 19121, 19121, 19121, 19121, 19139, 19139, + 19139, 19139, 19139, 19139, 19139, 19139, 19139, 19139, + 19139, 19139, 19139, 19139, 19139, 19139, 19141, 19141, + 19157, 19157, 19157, 19157, 19157, 19157, 19157, 19157, + 19157, 19157, 19157, 19157, 19157, 19157, 19163, 19163, + 19163, 19163, 19163, 19181, 19181, 19181, 19181, 19181, + 19181, 19181, 19181, 19181, 19181, 19181, 19181, 19181, + 19181, 19181, 19181, 19183, 19183, 19207, 19207, 19207, + 19207, 19207, 19207, 19207, 19207, 19207, 19207, 19207, + 19207, 19207, 19207, 19207, 19207, 19207, 19207, 19207, + 19207, 19207, 19211, 19211, 19211, 19211, 19213, 19213, + 19219, 19219, 19219, 19219, 19219, 19231, 19231, 19231, + 19231, 19231, 19231, 19231, 19231, 19231, 19231, 19231, + 19237, 19237, 19237, 19237, 19237, 19249, 19249, 19249, + 19249, 19249, 19249, 19249, 19249, 19249, 19249, 19249, + 19259, 19259, 19259, 19259, 19259, 19259, 19259, 19259, + 19267, 19267, 19267, 19267, 19267, 19267, 19267, 19267, + 19273, 19273, 19273, 19273, 19273, 19289, 19289, 19289, + 19289, 19289, 19289, 19289, 19289, 19289, 19289, 19289, + 19289, 19289, 19289, 19301, 19301, 19301, 19301, 19301, + 19301, 19301, 19301, 19301, 19301, 19301, 19309, 19309, + 19309, 19309, 19309, 19309, 19309, 19319, 19319, 19319, + 19319, 19319, 19319, 19319, 19319, 19319, 19333, 19333, + 19333, 19333, 19333, 19333, 19333, 19333, 19333, 19333, + 19333, 19333, 19373, 19373, 19373, 19373, 19373, 19373, + 19373, 19373, 19373, 19373, 19373, 19373, 19373, 19373, + 19373, 19373, 19373, 19373, 19373, 19373, 19373, 19373, + 19373, 19373, 19373, 19373, 19373, 19373, 19373, 19373, + 19373, 19373, 19373, 19373, 19373, 19373, 19379, 19379, + 19379, 19379, 19379, 19381, 19381, 19387, 19387, 19387, + 19387, 19387, 19391, 19391, 19391, 19391, 19403, 19403, + 19403, 19403, 19403, 19403, 19403, 19403, 19403, 19403, + 19417, 19417, 19417, 19417, 19417, 19417, 19417, 19417, + 19417, 19417, 19417, 19417, 19417, 19421, 19421, 19421, + 19423, 19423, 19427, 19427, 19427, 19427, 19429, 19429, + 19433, 19433, 19433, 19441, 19441, 19441, 19441, 19441, + 19441, 19441, 19447, 19447, 19447, 19447, 19447, 19447, + 19457, 19457, 19457, 19457, 19457, 19457, 19457, 19457, + 19463, 19463, 19463, 19463, 19463, 19463, 19469, 19469, + 19469, 19469, 19469, 19471, 19471, 19477, 19477, 19477, + 19477, 19477, 19483, 19483, 19483, 19483, 19483, 19483, + 19489, 19489, 19489, 19489, 19489, 19501, 19501, 19501, + 19501, 19501, 19501, 19501, 19501, 19501, 19501, 19501, + 19507, 19507, 19507, 19507, 19507, 19531, 19531, 19531, + 19531, 19531, 19531, 19531, 19531, 19531, 19531, 19531, + 19531, 19531, 19531, 19531, 19531, 19531, 19531, 19531, + 19531, 19531, 19541, 19541, 19541, 19541, 19541, 19541, + 19541, 19541, 19541, 19543, 19543, 19553, 19553, 19553, + 19553, 19553, 19553, 19553, 19553, 19553, 19559, 19559, + 19559, 19559, 19559, 19571, 19571, 19571, 19571, 19571, + 19571, 19571, 19571, 19571, 19571, 19571, 19577, 19577, + 19577, 19577, 19577, 19583, 19583, 19583, 19583, 19583, + 19597, 19597, 19597, 19597, 19597, 19597, 19597, 19597, + 19597, 19597, 19597, 19597, 19597, 19603, 19603, 19603, + 19603, 19603, 19609, 19609, 19609, 19609, 19609, 19609, + 19661, 19661, 19661, 19661, 19661, 19661, 19661, 19661, + 19661, 19661, 19661, 19661, 19661, 19661, 19661, 19661, + 19661, 19661, 19661, 19661, 19661, 19661, 19661, 19661, + 19661, 19661, 19661, 19661, 19661, 19661, 19661, 19661, + 19661, 19661, 19661, 19661, 19661, 19661, 19661, 19661, + 19661, 19661, 19661, 19661, 19661, 19661, 19681, 19681, + 19681, 19681, 19681, 19681, 19681, 19681, 19681, 19681, + 19681, 19681, 19681, 19681, 19681, 19681, 19681, 19681, + 19687, 19687, 19687, 19687, 19687, 19697, 19697, 19697, + 19697, 19697, 19697, 19697, 19697, 19697, 19699, 19699, + 19709, 19709, 19709, 19709, 19709, 19709, 19709, 19709, + 19717, 19717, 19717, 19717, 19717, 19717, 19717, 19717, + 19727, 19727, 19727, 19727, 19727, 19727, 19727, 19727, + 19739, 19739, 19739, 19739, 19739, 19739, 19739, 19739, + 19739, 19739, 19739, 19751, 19751, 19751, 19751, 19751, + 19751, 19751, 19751, 19751, 19751, 19751, 19753, 19753, + 19759, 19759, 19759, 19759, 19759, 19763, 19763, 19763, + 19777, 19777, 19777, 19777, 19777, 19777, 19777, 19777, + 19777, 19777, 19777, 19777, 19777, 19793, 19793, 19793, + 19793, 19793, 19793, 19793, 19793, 19793, 19793, 19793, + 19793, 19793, 19793, 19801, 19801, 19801, 19801, 19801, + 19801, 19801, 19813, 19813, 19813, 19813, 19813, 19813, + 19813, 19813, 19813, 19813, 19813, 19819, 19819, 19819, + 19819, 19819, 19841, 19841, 19841, 19841, 19841, 19841, + 19841, 19841, 19841, 19841, 19841, 19841, 19841, 19841, + 19841, 19841, 19841, 19841, 19841, 19841, 19843, 19843, + 19853, 19853, 19853, 19853, 19853, 19853, 19853, 19853, + 19861, 19861, 19861, 19861, 19861, 19861, 19861, 19861, + 19867, 19867, 19867, 19867, 19867, 19889, 19889, 19889, + 19889, 19889, 19889, 19889, 19889, 19889, 19889, 19889, + 19889, 19889, 19889, 19889, 19889, 19889, 19889, 19889, + 19891, 19891, 19913, 19913, 19913, 19913, 19913, 19913, + 19913, 19913, 19913, 19913, 19913, 19913, 19913, 19913, + 19913, 19913, 19913, 19913, 19913, 19913, 19919, 19919, + 19919, 19919, 19919, 19927, 19927, 19927, 19927, 19927, + 19927, 19927, 19937, 19937, 19937, 19937, 19937, 19937, + 19937, 19937, 19937, 19949, 19949, 19949, 19949, 19949, + 19949, 19949, 19949, 19949, 19949, 19949, 19961, 19961, + 19961, 19961, 19961, 19961, 19961, 19961, 19961, 19961, + 19963, 19963, 19973, 19973, 19973, 19973, 19973, 19973, + 19973, 19973, 19973, 19979, 19979, 19979, 19979, 19979, + 19991, 19991, 19991, 19991, 19991, 19991, 19991, 19991, + 19991, 19991, 19991, 19993, 19993, 19997, 19997, 19997, + 20011, 20011, 20011, 20011, 20011, 20011, 20011, 20011, + 20011, 20011, 20011, 20011, 20011, 20021, 20021, 20021, + 20021, 20021, 20021, 20021, 20021, 20021, 20023, 20023, + 20029, 20029, 20029, 20029, 20029, 20047, 20047, 20047, + 20047, 20047, 20047, 20047, 20047, 20047, 20047, 20047, + 20047, 20047, 20047, 20047, 20047, 20051, 20051, 20051, + 20063, 20063, 20063, 20063, 20063, 20063, 20063, 20063, + 20063, 20063, 20063, 20071, 20071, 20071, 20071, 20071, + 20071, 20071, 20089, 20089, 20089, 20089, 20089, 20089, + 20089, 20089, 20089, 20089, 20089, 20089, 20089, 20089, + 20089, 20089, 20101, 20101, 20101, 20101, 20101, 20101, + 20101, 20101, 20101, 20101, 20101, 20107, 20107, 20107, + 20107, 20107, 20113, 20113, 20113, 20113, 20113, 20113, + 20117, 20117, 20117, 20123, 20123, 20123, 20123, 20123, + 20129, 20129, 20129, 20129, 20129, 20129, 20143, 20143, + 20143, 20143, 20143, 20143, 20143, 20143, 20143, 20143, + 20143, 20143, 20147, 20147, 20147, 20147, 20149, 20149, + 20161, 20161, 20161, 20161, 20161, 20161, 20161, 20161, + 20161, 20161, 20173, 20173, 20173, 20173, 20173, 20173, + 20173, 20173, 20173, 20173, 20173, 20177, 20177, 20177, + 20183, 20183, 20183, 20183, 20183, 20183, 20201, 20201, + 20201, 20201, 20201, 20201, 20201, 20201, 20201, 20201, + 20201, 20201, 20201, 20201, 20201, 20201, 20219, 20219, + 20219, 20219, 20219, 20219, 20219, 20219, 20219, 20219, + 20219, 20219, 20219, 20219, 20219, 20219, 20231, 20231, + 20231, 20231, 20231, 20231, 20231, 20231, 20231, 20231, + 20233, 20233, 20249, 20249, 20249, 20249, 20249, 20249, + 20249, 20249, 20249, 20249, 20249, 20249, 20249, 20249, + 20261, 20261, 20261, 20261, 20261, 20261, 20261, 20261, + 20261, 20261, 20261, 20269, 20269, 20269, 20269, 20269, + 20269, 20269, 20287, 20287, 20287, 20287, 20287, 20287, + 20287, 20287, 20287, 20287, 20287, 20287, 20287, 20287, + 20287, 20287, 20297, 20297, 20297, 20297, 20297, 20297, + 20297, 20297, 20297, 20323, 20323, 20323, 20323, 20323, + 20323, 20323, 20323, 20323, 20323, 20323, 20323, 20323, + 20323, 20323, 20323, 20323, 20323, 20323, 20323, 20323, + 20323, 20323, 20327, 20327, 20327, 20327, 20333, 20333, + 20333, 20333, 20333, 20341, 20341, 20341, 20341, 20341, + 20341, 20341, 20347, 20347, 20347, 20347, 20347, 20347, + 20353, 20353, 20353, 20353, 20353, 20357, 20357, 20357, + 20359, 20359, 20369, 20369, 20369, 20369, 20369, 20369, + 20369, 20369, 20369, 20389, 20389, 20389, 20389, 20389, + 20389, 20389, 20389, 20389, 20389, 20389, 20389, 20389, + 20389, 20389, 20389, 20389, 20389, 20393, 20393, 20393, + 20399, 20399, 20399, 20399, 20399, 20399, 20407, 20407, + 20407, 20407, 20407, 20407, 20407, 20411, 20411, 20411, + 20431, 20431, 20431, 20431, 20431, 20431, 20431, 20431, + 20431, 20431, 20431, 20431, 20431, 20431, 20431, 20431, + 20431, 20431, 20441, 20441, 20441, 20441, 20441, 20441, + 20441, 20441, 20441, 20443, 20443, 20477, 20477, 20477, + 20477, 20477, 20477, 20477, 20477, 20477, 20477, 20477, + 20477, 20477, 20477, 20477, 20477, 20477, 20477, 20477, + 20477, 20477, 20477, 20477, 20477, 20477, 20477, 20477, + 20477, 20477, 20477, 20479, 20479, 20483, 20483, 20483, + 20507, 20507, 20507, 20507, 20507, 20507, 20507, 20507, + 20507, 20507, 20507, 20507, 20507, 20507, 20507, 20507, + 20507, 20507, 20507, 20507, 20507, 20507, 20509, 20509, + 20521, 20521, 20521, 20521, 20521, 20521, 20521, 20521, + 20521, 20521, 20533, 20533, 20533, 20533, 20533, 20533, + 20533, 20533, 20533, 20533, 20533, 20543, 20543, 20543, + 20543, 20543, 20543, 20543, 20543, 20543, 20549, 20549, + 20549, 20549, 20549, 20551, 20551, 20563, 20563, 20563, + 20563, 20563, 20563, 20563, 20563, 20563, 20563, 20563, + 20593, 20593, 20593, 20593, 20593, 20593, 20593, 20593, + 20593, 20593, 20593, 20593, 20593, 20593, 20593, 20593, + 20593, 20593, 20593, 20593, 20593, 20593, 20593, 20593, + 20593, 20593, 20599, 20599, 20599, 20599, 20599, 20599, + 20611, 20611, 20611, 20611, 20611, 20611, 20611, 20611, + 20611, 20611, 20627, 20627, 20627, 20627, 20627, 20627, + 20627, 20627, 20627, 20627, 20627, 20627, 20627, 20627, + 20639, 20639, 20639, 20639, 20639, 20639, 20639, 20639, + 20639, 20639, 20639, 20641, 20641, 20663, 20663, 20663, + 20663, 20663, 20663, 20663, 20663, 20663, 20663, 20663, + 20663, 20663, 20663, 20663, 20663, 20663, 20663, 20663, + 20681, 20681, 20681, 20681, 20681, 20681, 20681, 20681, + 20681, 20681, 20681, 20681, 20681, 20681, 20681, 20681, + 20693, 20693, 20693, 20693, 20693, 20693, 20693, 20693, + 20693, 20693, 20693, 20707, 20707, 20707, 20707, 20707, + 20707, 20707, 20707, 20707, 20707, 20707, 20707, 20707, + 20717, 20717, 20717, 20717, 20717, 20717, 20717, 20717, + 20719, 20719, 20731, 20731, 20731, 20731, 20731, 20731, + 20731, 20731, 20731, 20731, 20731, 20743, 20743, 20743, + 20743, 20743, 20743, 20743, 20743, 20743, 20743, 20743, + 20747, 20747, 20747, 20749, 20749, 20753, 20753, 20753, + 20759, 20759, 20759, 20759, 20759, 20759, 20771, 20771, + 20771, 20771, 20771, 20771, 20771, 20771, 20771, 20771, + 20773, 20773, 20789, 20789, 20789, 20789, 20789, 20789, + 20789, 20789, 20789, 20789, 20789, 20789, 20789, 20789, + 20807, 20807, 20807, 20807, 20807, 20807, 20807, 20807, + 20807, 20807, 20807, 20807, 20807, 20807, 20807, 20807, + 20809, 20809, 20849, 20849, 20849, 20849, 20849, 20849, + 20849, 20849, 20849, 20849, 20849, 20849, 20849, 20849, + 20849, 20849, 20849, 20849, 20849, 20849, 20849, 20849, + 20849, 20849, 20849, 20849, 20849, 20849, 20849, 20849, + 20849, 20849, 20849, 20849, 20849, 20849, 20857, 20857, + 20857, 20857, 20857, 20857, 20857, 20873, 20873, 20873, + 20873, 20873, 20873, 20873, 20873, 20873, 20873, 20873, + 20873, 20873, 20873, 20879, 20879, 20879, 20879, 20879, + 20887, 20887, 20887, 20887, 20887, 20887, 20887, 20887, + 20897, 20897, 20897, 20897, 20897, 20897, 20897, 20897, + 20899, 20899, 20903, 20903, 20903, 20903, 20921, 20921, + 20921, 20921, 20921, 20921, 20921, 20921, 20921, 20921, + 20921, 20921, 20921, 20921, 20921, 20921, 20929, 20929, + 20929, 20929, 20929, 20929, 20929, 20939, 20939, 20939, + 20939, 20939, 20939, 20939, 20939, 20939, 20947, 20947, + 20947, 20947, 20947, 20947, 20947, 20959, 20959, 20959, + 20959, 20959, 20959, 20959, 20959, 20959, 20959, 20959, + 20963, 20963, 20963, 20981, 20981, 20981, 20981, 20981, + 20981, 20981, 20981, 20981, 20981, 20981, 20981, 20981, + 20981, 20981, 20981, 20983, 20983, 21001, 21001, 21001, + 21001, 21001, 21001, 21001, 21001, 21001, 21001, 21001, + 21001, 21001, 21001, 21001, 21001, 21011, 21011, 21011, + 21011, 21011, 21011, 21011, 21011, 21011, 21013, 21013, + 21017, 21017, 21017, 21019, 21019, 21023, 21023, 21023, + 21031, 21031, 21031, 21031, 21031, 21031, 21031, 21031, + 21059, 21059, 21059, 21059, 21059, 21059, 21059, 21059, + 21059, 21059, 21059, 21059, 21059, 21059, 21059, 21059, + 21059, 21059, 21059, 21059, 21059, 21059, 21059, 21059, + 21061, 21061, 21067, 21067, 21067, 21067, 21067, 21067, + 21089, 21089, 21089, 21089, 21089, 21089, 21089, 21089, + 21089, 21089, 21089, 21089, 21089, 21089, 21089, 21089, + 21089, 21089, 21089, 21101, 21101, 21101, 21101, 21101, + 21101, 21101, 21101, 21101, 21101, 21101, 21107, 21107, + 21107, 21107, 21107, 21121, 21121, 21121, 21121, 21121, + 21121, 21121, 21121, 21121, 21121, 21121, 21121, 21121, + 21139, 21139, 21139, 21139, 21139, 21139, 21139, 21139, + 21139, 21139, 21139, 21139, 21139, 21139, 21139, 21139, + 21143, 21143, 21143, 21149, 21149, 21149, 21149, 21149, + 21157, 21157, 21157, 21157, 21157, 21157, 21157, 21157, + 21163, 21163, 21163, 21163, 21163, 21169, 21169, 21169, + 21169, 21169, 21179, 21179, 21179, 21179, 21179, 21179, + 21179, 21179, 21179, 21187, 21187, 21187, 21187, 21187, + 21187, 21187, 21191, 21191, 21191, 21191, 21193, 21193, + 21211, 21211, 21211, 21211, 21211, 21211, 21211, 21211, + 21211, 21211, 21211, 21211, 21211, 21211, 21211, 21211, + 21221, 21221, 21221, 21221, 21221, 21221, 21221, 21221, + 21227, 21227, 21227, 21227, 21227, 21227, 21247, 21247, + 21247, 21247, 21247, 21247, 21247, 21247, 21247, 21247, + 21247, 21247, 21247, 21247, 21247, 21247, 21247, 21247, + 21269, 21269, 21269, 21269, 21269, 21269, 21269, 21269, + 21269, 21269, 21269, 21269, 21269, 21269, 21269, 21269, + 21269, 21269, 21269, 21277, 21277, 21277, 21277, 21277, + 21277, 21277, 21283, 21283, 21283, 21283, 21283, 21283, + 21313, 21313, 21313, 21313, 21313, 21313, 21313, 21313, + 21313, 21313, 21313, 21313, 21313, 21313, 21313, 21313, + 21313, 21313, 21313, 21313, 21313, 21313, 21313, 21313, + 21313, 21313, 21317, 21317, 21317, 21317, 21319, 21319, + 21323, 21323, 21323, 21341, 21341, 21341, 21341, 21341, + 21341, 21341, 21341, 21341, 21341, 21341, 21341, 21341, + 21341, 21341, 21341, 21347, 21347, 21347, 21347, 21347, + 21377, 21377, 21377, 21377, 21377, 21377, 21377, 21377, + 21377, 21377, 21377, 21377, 21377, 21377, 21377, 21377, + 21377, 21377, 21377, 21377, 21377, 21377, 21377, 21377, + 21377, 21377, 21377, 21379, 21379, 21383, 21383, 21383, + 21391, 21391, 21391, 21391, 21391, 21391, 21391, 21391, + 21397, 21397, 21397, 21397, 21397, 21401, 21401, 21401, + 21407, 21407, 21407, 21407, 21407, 21407, 21419, 21419, + 21419, 21419, 21419, 21419, 21419, 21419, 21419, 21419, + 21433, 21433, 21433, 21433, 21433, 21433, 21433, 21433, + 21433, 21433, 21433, 21433, 21433, 21467, 21467, 21467, + 21467, 21467, 21467, 21467, 21467, 21467, 21467, 21467, + 21467, 21467, 21467, 21467, 21467, 21467, 21467, 21467, + 21467, 21467, 21467, 21467, 21467, 21467, 21467, 21467, + 21467, 21467, 21467, 21481, 21481, 21481, 21481, 21481, + 21481, 21481, 21481, 21481, 21481, 21481, 21481, 21481, + 21487, 21487, 21487, 21487, 21487, 21491, 21491, 21491, + 21493, 21493, 21499, 21499, 21499, 21499, 21499, 21499, + 21503, 21503, 21503, 21517, 21517, 21517, 21517, 21517, + 21517, 21517, 21517, 21517, 21517, 21517, 21517, 21517, + 21521, 21521, 21521, 21523, 21523, 21529, 21529, 21529, + 21529, 21529, 21557, 21557, 21557, 21557, 21557, 21557, + 21557, 21557, 21557, 21557, 21557, 21557, 21557, 21557, + 21557, 21557, 21557, 21557, 21557, 21557, 21557, 21557, + 21557, 21557, 21557, 21559, 21559, 21563, 21563, 21563, + 21569, 21569, 21569, 21569, 21569, 21569, 21577, 21577, + 21577, 21577, 21577, 21577, 21577, 21587, 21587, 21587, + 21587, 21587, 21587, 21587, 21587, 21587, 21589, 21589, + 21599, 21599, 21599, 21599, 21599, 21599, 21599, 21599, + 21601, 21601, 21611, 21611, 21611, 21611, 21611, 21611, + 21611, 21611, 21611, 21613, 21613, 21617, 21617, 21617, + 21647, 21647, 21647, 21647, 21647, 21647, 21647, 21647, + 21647, 21647, 21647, 21647, 21647, 21647, 21647, 21647, + 21647, 21647, 21647, 21647, 21647, 21647, 21647, 21647, + 21647, 21647, 21647, 21649, 21649, 21661, 21661, 21661, + 21661, 21661, 21661, 21661, 21661, 21661, 21661, 21661, + 21673, 21673, 21673, 21673, 21673, 21673, 21673, 21673, + 21673, 21673, 21683, 21683, 21683, 21683, 21683, 21683, + 21683, 21683, 21683, 21701, 21701, 21701, 21701, 21701, + 21701, 21701, 21701, 21701, 21701, 21701, 21701, 21701, + 21701, 21701, 21701, 21713, 21713, 21713, 21713, 21713, + 21713, 21713, 21713, 21713, 21713, 21713, 21727, 21727, + 21727, 21727, 21727, 21727, 21727, 21727, 21727, 21727, + 21727, 21727, 21737, 21737, 21737, 21737, 21737, 21737, + 21737, 21737, 21737, 21739, 21739, 21751, 21751, 21751, + 21751, 21751, 21751, 21751, 21751, 21751, 21751, 21751, + 21757, 21757, 21757, 21757, 21757, 21767, 21767, 21767, + 21767, 21767, 21767, 21767, 21767, 21767, 21773, 21773, + 21773, 21773, 21773, 21787, 21787, 21787, 21787, 21787, + 21787, 21787, 21787, 21787, 21787, 21787, 21787, 21787, + 21799, 21799, 21799, 21799, 21799, 21799, 21799, 21799, + 21799, 21799, 21803, 21803, 21803, 21803, 21817, 21817, + 21817, 21817, 21817, 21817, 21817, 21817, 21817, 21817, + 21817, 21817, 21821, 21821, 21821, 21821, 21839, 21839, + 21839, 21839, 21839, 21839, 21839, 21839, 21839, 21839, + 21839, 21839, 21839, 21839, 21839, 21839, 21841, 21841, + 21851, 21851, 21851, 21851, 21851, 21851, 21851, 21851, + 21859, 21859, 21859, 21859, 21859, 21859, 21859, 21859, + 21863, 21863, 21863, 21871, 21871, 21871, 21871, 21871, + 21871, 21871, 21881, 21881, 21881, 21881, 21881, 21881, + 21881, 21881, 21881, 21893, 21893, 21893, 21893, 21893, + 21893, 21893, 21893, 21893, 21893, 21893, 21911, 21911, + 21911, 21911, 21911, 21911, 21911, 21911, 21911, 21911, + 21911, 21911, 21911, 21911, 21911, 21911, 21929, 21929, + 21929, 21929, 21929, 21929, 21929, 21929, 21929, 21929, + 21929, 21929, 21929, 21929, 21929, 21929, 21937, 21937, + 21937, 21937, 21937, 21937, 21937, 21943, 21943, 21943, + 21943, 21943, 21961, 21961, 21961, 21961, 21961, 21961, + 21961, 21961, 21961, 21961, 21961, 21961, 21961, 21961, + 21961, 21961, 21977, 21977, 21977, 21977, 21977, 21977, + 21977, 21977, 21977, 21977, 21977, 21977, 21977, 21977, + 21991, 21991, 21991, 21991, 21991, 21991, 21991, 21991, + 21991, 21991, 21991, 21991, 21991, 21997, 21997, 21997, + 21997, 21997, 22003, 22003, 22003, 22003, 22003, 22003, + 22013, 22013, 22013, 22013, 22013, 22013, 22013, 22013, + 22027, 22027, 22027, 22027, 22027, 22027, 22027, 22027, + 22027, 22027, 22027, 22027, 22027, 22031, 22031, 22031, + 22037, 22037, 22037, 22037, 22037, 22037, 22039, 22039, + 22051, 22051, 22051, 22051, 22051, 22051, 22051, 22051, + 22051, 22051, 22063, 22063, 22063, 22063, 22063, 22063, + 22063, 22063, 22063, 22063, 22063, 22067, 22067, 22067, + 22073, 22073, 22073, 22073, 22073, 22073, 22079, 22079, + 22079, 22079, 22079, 22091, 22091, 22091, 22091, 22091, + 22091, 22091, 22091, 22091, 22091, 22091, 22093, 22093, + 22109, 22109, 22109, 22109, 22109, 22109, 22109, 22109, + 22109, 22109, 22109, 22109, 22109, 22109, 22111, 22111, + 22123, 22123, 22123, 22123, 22123, 22123, 22123, 22123, + 22123, 22123, 22129, 22129, 22129, 22129, 22129, 22129, + 22133, 22133, 22133, 22147, 22147, 22147, 22147, 22147, + 22147, 22147, 22147, 22147, 22147, 22147, 22147, 22147, + 22153, 22153, 22153, 22153, 22153, 22157, 22157, 22157, + 22159, 22159, 22171, 22171, 22171, 22171, 22171, 22171, + 22171, 22171, 22171, 22171, 22171, 22189, 22189, 22189, + 22189, 22189, 22189, 22189, 22189, 22189, 22189, 22189, + 22189, 22189, 22189, 22189, 22189, 22193, 22193, 22193, + 22229, 22229, 22229, 22229, 22229, 22229, 22229, 22229, + 22229, 22229, 22229, 22229, 22229, 22229, 22229, 22229, + 22229, 22229, 22229, 22229, 22229, 22229, 22229, 22229, + 22229, 22229, 22229, 22229, 22229, 22229, 22229, 22229, + 22247, 22247, 22247, 22247, 22247, 22247, 22247, 22247, + 22247, 22247, 22247, 22247, 22247, 22247, 22247, 22247, + 22259, 22259, 22259, 22259, 22259, 22259, 22259, 22259, + 22259, 22259, 22259, 22271, 22271, 22271, 22271, 22271, + 22271, 22271, 22271, 22271, 22271, 22271, 22273, 22273, + 22277, 22277, 22277, 22279, 22279, 22283, 22283, 22283, + 22291, 22291, 22291, 22291, 22291, 22291, 22291, 22291, + 22303, 22303, 22303, 22303, 22303, 22303, 22303, 22303, + 22303, 22303, 22307, 22307, 22307, 22307, 22343, 22343, + 22343, 22343, 22343, 22343, 22343, 22343, 22343, 22343, + 22343, 22343, 22343, 22343, 22343, 22343, 22343, 22343, + 22343, 22343, 22343, 22343, 22343, 22343, 22343, 22343, + 22343, 22343, 22343, 22343, 22343, 22343, 22349, 22349, + 22349, 22349, 22349, 22367, 22367, 22367, 22367, 22367, + 22367, 22367, 22367, 22367, 22367, 22367, 22367, 22367, + 22367, 22367, 22367, 22369, 22369, 22381, 22381, 22381, + 22381, 22381, 22381, 22381, 22381, 22381, 22381, 22381, + 22391, 22391, 22391, 22391, 22391, 22391, 22391, 22391, + 22397, 22397, 22397, 22397, 22397, 22397, 22409, 22409, + 22409, 22409, 22409, 22409, 22409, 22409, 22409, 22409, + 22433, 22433, 22433, 22433, 22433, 22433, 22433, 22433, + 22433, 22433, 22433, 22433, 22433, 22433, 22433, 22433, + 22433, 22433, 22433, 22433, 22433, 22433, 22441, 22441, + 22441, 22441, 22441, 22441, 22441, 22447, 22447, 22447, + 22447, 22447, 22453, 22453, 22453, 22453, 22453, 22453, + 22469, 22469, 22469, 22469, 22469, 22469, 22469, 22469, + 22469, 22469, 22469, 22469, 22469, 22469, 22481, 22481, + 22481, 22481, 22481, 22481, 22481, 22481, 22481, 22481, + 22483, 22483, 22501, 22501, 22501, 22501, 22501, 22501, + 22501, 22501, 22501, 22501, 22501, 22501, 22501, 22501, + 22501, 22501, 22511, 22511, 22511, 22511, 22511, 22511, + 22511, 22511, 22511, 22531, 22531, 22531, 22531, 22531, + 22531, 22531, 22531, 22531, 22531, 22531, 22531, 22531, + 22531, 22531, 22531, 22531, 22531, 22541, 22541, 22541, + 22541, 22541, 22541, 22541, 22541, 22541, 22543, 22543, + 22549, 22549, 22549, 22549, 22549, 22567, 22567, 22567, + 22567, 22567, 22567, 22567, 22567, 22567, 22567, 22567, + 22567, 22567, 22567, 22567, 22567, 22571, 22571, 22571, + 22573, 22573, 22613, 22613, 22613, 22613, 22613, 22613, + 22613, 22613, 22613, 22613, 22613, 22613, 22613, 22613, + 22613, 22613, 22613, 22613, 22613, 22613, 22613, 22613, + 22613, 22613, 22613, 22613, 22613, 22613, 22613, 22613, + 22613, 22613, 22613, 22613, 22613, 22613, 22619, 22619, + 22619, 22619, 22619, 22621, 22621, 22637, 22637, 22637, + 22637, 22637, 22637, 22637, 22637, 22637, 22637, 22637, + 22637, 22637, 22637, 22639, 22639, 22643, 22643, 22643, + 22651, 22651, 22651, 22651, 22651, 22651, 22651, 22651, + 22669, 22669, 22669, 22669, 22669, 22669, 22669, 22669, + 22669, 22669, 22669, 22669, 22669, 22669, 22669, 22669, + 22679, 22679, 22679, 22679, 22679, 22679, 22679, 22679, + 22691, 22691, 22691, 22691, 22691, 22691, 22691, 22691, + 22691, 22691, 22691, 22697, 22697, 22697, 22697, 22697, + 22699, 22699, 22709, 22709, 22709, 22709, 22709, 22709, + 22709, 22709, 22709, 22717, 22717, 22717, 22717, 22717, + 22717, 22717, 22721, 22721, 22721, 22721, 22727, 22727, + 22727, 22727, 22727, 22739, 22739, 22739, 22739, 22739, + 22739, 22739, 22739, 22739, 22739, 22739, 22741, 22741, + 22751, 22751, 22751, 22751, 22751, 22751, 22751, 22751, + 22769, 22769, 22769, 22769, 22769, 22769, 22769, 22769, + 22769, 22769, 22769, 22769, 22769, 22769, 22769, 22769, + 22777, 22777, 22777, 22777, 22777, 22777, 22777, 22777, + 22783, 22783, 22783, 22783, 22783, 22787, 22787, 22787, + 22807, 22807, 22807, 22807, 22807, 22807, 22807, 22807, + 22807, 22807, 22807, 22807, 22807, 22807, 22807, 22807, + 22807, 22807, 22811, 22811, 22811, 22811, 22817, 22817, + 22817, 22817, 22817, 22853, 22853, 22853, 22853, 22853, + 22853, 22853, 22853, 22853, 22853, 22853, 22853, 22853, + 22853, 22853, 22853, 22853, 22853, 22853, 22853, 22853, + 22853, 22853, 22853, 22853, 22853, 22853, 22853, 22853, + 22853, 22853, 22853, 22859, 22859, 22859, 22859, 22859, + 22861, 22861, 22871, 22871, 22871, 22871, 22871, 22871, + 22871, 22871, 22871, 22877, 22877, 22877, 22877, 22877, + 22901, 22901, 22901, 22901, 22901, 22901, 22901, 22901, + 22901, 22901, 22901, 22901, 22901, 22901, 22901, 22901, + 22901, 22901, 22901, 22901, 22901, 22901, 22907, 22907, + 22907, 22907, 22907, 22921, 22921, 22921, 22921, 22921, + 22921, 22921, 22921, 22921, 22921, 22921, 22921, 22921, + 22937, 22937, 22937, 22937, 22937, 22937, 22937, 22937, + 22937, 22937, 22937, 22937, 22937, 22937, 22943, 22943, + 22943, 22943, 22943, 22961, 22961, 22961, 22961, 22961, + 22961, 22961, 22961, 22961, 22961, 22961, 22961, 22961, + 22961, 22961, 22961, 22963, 22963, 22973, 22973, 22973, + 22973, 22973, 22973, 22973, 22973, 22973, 22993, 22993, + 22993, 22993, 22993, 22993, 22993, 22993, 22993, 22993, + 22993, 22993, 22993, 22993, 22993, 22993, 22993, 22993, + 23003, 23003, 23003, 23003, 23003, 23003, 23003, 23003, + 23011, 23011, 23011, 23011, 23011, 23011, 23011, 23011, + 23017, 23017, 23017, 23017, 23017, 23021, 23021, 23021, + 23027, 23027, 23027, 23027, 23027, 23027, 23029, 23029, + 23039, 23039, 23039, 23039, 23039, 23039, 23039, 23039, + 23041, 23041, 23053, 23053, 23053, 23053, 23053, 23053, + 23053, 23053, 23053, 23053, 23053, 23057, 23057, 23057, + 23059, 23059, 23063, 23063, 23063, 23063, 23071, 23071, + 23071, 23071, 23071, 23071, 23071, 23081, 23081, 23081, + 23081, 23081, 23081, 23081, 23081, 23081, 23087, 23087, + 23087, 23087, 23087, 23099, 23099, 23099, 23099, 23099, + 23099, 23099, 23099, 23099, 23099, 23099, 23117, 23117, + 23117, 23117, 23117, 23117, 23117, 23117, 23117, 23117, + 23117, 23117, 23117, 23117, 23117, 23117, 23131, 23131, + 23131, 23131, 23131, 23131, 23131, 23131, 23131, 23131, + 23131, 23131, 23143, 23143, 23143, 23143, 23143, 23143, + 23143, 23143, 23143, 23143, 23143, 23159, 23159, 23159, + 23159, 23159, 23159, 23159, 23159, 23159, 23159, 23159, + 23159, 23159, 23159, 23167, 23167, 23167, 23167, 23167, + 23167, 23167, 23173, 23173, 23173, 23173, 23173, 23173, + 23189, 23189, 23189, 23189, 23189, 23189, 23189, 23189, + 23189, 23189, 23189, 23189, 23189, 23189, 23197, 23197, + 23197, 23197, 23197, 23197, 23197, 23201, 23201, 23201, + 23203, 23203, 23209, 23209, 23209, 23209, 23209, 23209, + 23227, 23227, 23227, 23227, 23227, 23227, 23227, 23227, + 23227, 23227, 23227, 23227, 23227, 23227, 23227, 23227, + 23251, 23251, 23251, 23251, 23251, 23251, 23251, 23251, + 23251, 23251, 23251, 23251, 23251, 23251, 23251, 23251, + 23251, 23251, 23251, 23251, 23251, 23269, 23269, 23269, + 23269, 23269, 23269, 23269, 23269, 23269, 23269, 23269, + 23269, 23269, 23269, 23269, 23269, 23279, 23279, 23279, + 23279, 23279, 23279, 23279, 23279, 23279, 23291, 23291, + 23291, 23291, 23291, 23291, 23291, 23291, 23291, 23291, + 23293, 23293, 23297, 23297, 23297, 23297, 23311, 23311, + 23311, 23311, 23311, 23311, 23311, 23311, 23311, 23311, + 23311, 23311, 23321, 23321, 23321, 23321, 23321, 23321, + 23321, 23321, 23321, 23327, 23327, 23327, 23327, 23327, + 23333, 23333, 23333, 23333, 23333, 23333, 23339, 23339, + 23339, 23339, 23339, 23357, 23357, 23357, 23357, 23357, + 23357, 23357, 23357, 23357, 23357, 23357, 23357, 23357, + 23357, 23357, 23357, 23369, 23369, 23369, 23369, 23369, + 23369, 23369, 23369, 23369, 23369, 23369, 23371, 23371, + 23399, 23399, 23399, 23399, 23399, 23399, 23399, 23399, + 23399, 23399, 23399, 23399, 23399, 23399, 23399, 23399, + 23399, 23399, 23399, 23399, 23399, 23399, 23399, 23399, + 23417, 23417, 23417, 23417, 23417, 23417, 23417, 23417, + 23417, 23417, 23417, 23417, 23417, 23417, 23417, 23417, + 23431, 23431, 23431, 23431, 23431, 23431, 23431, 23431, + 23431, 23431, 23431, 23431, 23431, 23447, 23447, 23447, + 23447, 23447, 23447, 23447, 23447, 23447, 23447, 23447, + 23447, 23447, 23447, 23459, 23459, 23459, 23459, 23459, + 23459, 23459, 23459, 23459, 23459, 23459, 23473, 23473, + 23473, 23473, 23473, 23473, 23473, 23473, 23473, 23473, + 23473, 23473, 23497, 23497, 23497, 23497, 23497, 23497, + 23497, 23497, 23497, 23497, 23497, 23497, 23497, 23497, + 23497, 23497, 23497, 23497, 23497, 23497, 23497, 23497, + 23509, 23509, 23509, 23509, 23509, 23509, 23509, 23509, + 23509, 23509, 23531, 23531, 23531, 23531, 23531, 23531, + 23531, 23531, 23531, 23531, 23531, 23531, 23531, 23531, + 23531, 23531, 23531, 23531, 23531, 23531, 23537, 23537, + 23537, 23537, 23537, 23539, 23539, 23549, 23549, 23549, + 23549, 23549, 23549, 23549, 23549, 23549, 23557, 23557, + 23557, 23557, 23557, 23557, 23557, 23561, 23561, 23561, + 23563, 23563, 23567, 23567, 23567, 23567, 23581, 23581, + 23581, 23581, 23581, 23581, 23581, 23581, 23581, 23581, + 23581, 23581, 23593, 23593, 23593, 23593, 23593, 23593, + 23593, 23593, 23593, 23593, 23593, 23599, 23599, 23599, + 23599, 23599, 23603, 23603, 23603, 23603, 23609, 23609, + 23609, 23609, 23609, 23623, 23623, 23623, 23623, 23623, + 23623, 23623, 23623, 23623, 23623, 23623, 23623, 23623, + 23627, 23627, 23627, 23629, 23629, 23633, 23633, 23633, + 23663, 23663, 23663, 23663, 23663, 23663, 23663, 23663, + 23663, 23663, 23663, 23663, 23663, 23663, 23663, 23663, + 23663, 23663, 23663, 23663, 23663, 23663, 23663, 23663, + 23663, 23663, 23663, 23669, 23669, 23669, 23669, 23669, + 23671, 23671, 23677, 23677, 23677, 23677, 23677, 23677, + 23687, 23687, 23687, 23687, 23687, 23687, 23687, 23687, + 23689, 23689, 23719, 23719, 23719, 23719, 23719, 23719, + 23719, 23719, 23719, 23719, 23719, 23719, 23719, 23719, + 23719, 23719, 23719, 23719, 23719, 23719, 23719, 23719, + 23719, 23719, 23719, 23719, 23719, 23741, 23741, 23741, + 23741, 23741, 23741, 23741, 23741, 23741, 23741, 23741, + 23741, 23741, 23741, 23741, 23741, 23741, 23741, 23741, + 23743, 23743, 23747, 23747, 23747, 23747, 23753, 23753, + 23753, 23753, 23753, 23761, 23761, 23761, 23761, 23761, + 23761, 23761, 23767, 23767, 23767, 23767, 23767, 23767, + 23773, 23773, 23773, 23773, 23773, 23789, 23789, 23789, + 23789, 23789, 23789, 23789, 23789, 23789, 23789, 23789, + 23789, 23789, 23789, 23801, 23801, 23801, 23801, 23801, + 23801, 23801, 23801, 23801, 23801, 23801, 23813, 23813, + 23813, 23813, 23813, 23813, 23813, 23813, 23813, 23813, + 23819, 23819, 23819, 23819, 23819, 23819, 23827, 23827, + 23827, 23827, 23827, 23827, 23827, 23831, 23831, 23831, + 23833, 23833, 23857, 23857, 23857, 23857, 23857, 23857, + 23857, 23857, 23857, 23857, 23857, 23857, 23857, 23857, + 23857, 23857, 23857, 23857, 23857, 23857, 23857, 23857, + 23869, 23869, 23869, 23869, 23869, 23869, 23869, 23869, + 23869, 23869, 23873, 23873, 23873, 23873, 23879, 23879, + 23879, 23879, 23879, 23887, 23887, 23887, 23887, 23887, + 23887, 23887, 23893, 23893, 23893, 23893, 23893, 23893, + 23899, 23899, 23899, 23899, 23899, 23909, 23909, 23909, + 23909, 23909, 23909, 23909, 23909, 23909, 23911, 23911, + 23917, 23917, 23917, 23917, 23917, 23929, 23929, 23929, + 23929, 23929, 23929, 23929, 23929, 23929, 23929, 23929, + 23957, 23957, 23957, 23957, 23957, 23957, 23957, 23957, + 23957, 23957, 23957, 23957, 23957, 23957, 23957, 23957, + 23957, 23957, 23957, 23957, 23957, 23957, 23957, 23957, + 23971, 23971, 23971, 23971, 23971, 23971, 23971, 23971, + 23971, 23971, 23971, 23971, 23971, 23977, 23977, 23977, + 23977, 23977, 23981, 23981, 23981, 23981, 23993, 23993, + 23993, 23993, 23993, 23993, 23993, 23993, 23993, 23993, + 24001, 24001, 24001, 24001, 24001, 24001, 24001, 24001, + 24007, 24007, 24007, 24007, 24007, 24019, 24019, 24019, + 24019, 24019, 24019, 24019, 24019, 24019, 24019, 24019, + 24023, 24023, 24023, 24029, 24029, 24029, 24029, 24029, + 24043, 24043, 24043, 24043, 24043, 24043, 24043, 24043, + 24043, 24043, 24043, 24043, 24043, 24049, 24049, 24049, + 24049, 24049, 24061, 24061, 24061, 24061, 24061, 24061, + 24061, 24061, 24061, 24061, 24061, 24071, 24071, 24071, + 24071, 24071, 24071, 24071, 24071, 24071, 24077, 24077, + 24077, 24077, 24077, 24083, 24083, 24083, 24083, 24083, + 24091, 24091, 24091, 24091, 24091, 24091, 24091, 24091, + 24097, 24097, 24097, 24097, 24097, 24103, 24103, 24103, + 24103, 24103, 24107, 24107, 24107, 24107, 24109, 24109, + 24113, 24113, 24113, 24121, 24121, 24121, 24121, 24121, + 24121, 24121, 24133, 24133, 24133, 24133, 24133, 24133, + 24133, 24133, 24133, 24133, 24133, 24137, 24137, 24137, + 24151, 24151, 24151, 24151, 24151, 24151, 24151, 24151, + 24151, 24151, 24151, 24151, 24151, 24169, 24169, 24169, + 24169, 24169, 24169, 24169, 24169, 24169, 24169, 24169, + 24169, 24169, 24169, 24169, 24169, 24179, 24179, 24179, + 24179, 24179, 24179, 24179, 24179, 24179, 24181, 24181, + 24197, 24197, 24197, 24197, 24197, 24197, 24197, 24197, + 24197, 24197, 24197, 24197, 24197, 24197, 24203, 24203, + 24203, 24203, 24203, 24223, 24223, 24223, 24223, 24223, + 24223, 24223, 24223, 24223, 24223, 24223, 24223, 24223, + 24223, 24223, 24223, 24223, 24223, 24229, 24229, 24229, + 24229, 24229, 24239, 24239, 24239, 24239, 24239, 24239, + 24239, 24239, 24239, 24247, 24247, 24247, 24247, 24247, + 24247, 24247, 24251, 24251, 24251, 24251, 24281, 24281, + 24281, 24281, 24281, 24281, 24281, 24281, 24281, 24281, + 24281, 24281, 24281, 24281, 24281, 24281, 24281, 24281, + 24281, 24281, 24281, 24281, 24281, 24281, 24281, 24281, + 24317, 24317, 24317, 24317, 24317, 24317, 24317, 24317, + 24317, 24317, 24317, 24317, 24317, 24317, 24317, 24317, + 24317, 24317, 24317, 24317, 24317, 24317, 24317, 24317, + 24317, 24317, 24317, 24317, 24317, 24317, 24317, 24317, + 24329, 24329, 24329, 24329, 24329, 24329, 24329, 24329, + 24329, 24329, 24329, 24337, 24337, 24337, 24337, 24337, + 24337, 24337, 24359, 24359, 24359, 24359, 24359, 24359, + 24359, 24359, 24359, 24359, 24359, 24359, 24359, 24359, + 24359, 24359, 24359, 24359, 24359, 24359, 24371, 24371, + 24371, 24371, 24371, 24371, 24371, 24371, 24371, 24371, + 24373, 24373, 24379, 24379, 24379, 24379, 24379, 24379, + 24391, 24391, 24391, 24391, 24391, 24391, 24391, 24391, + 24391, 24391, 24407, 24407, 24407, 24407, 24407, 24407, + 24407, 24407, 24407, 24407, 24407, 24407, 24407, 24407, + 24413, 24413, 24413, 24413, 24413, 24413, 24419, 24419, + 24419, 24419, 24419, 24421, 24421, 24439, 24439, 24439, + 24439, 24439, 24439, 24439, 24439, 24439, 24439, 24439, + 24439, 24439, 24439, 24439, 24439, 24443, 24443, 24443, + 24469, 24469, 24469, 24469, 24469, 24469, 24469, 24469, + 24469, 24469, 24469, 24469, 24469, 24469, 24469, 24469, + 24469, 24469, 24469, 24469, 24469, 24469, 24469, 24469, + 24473, 24473, 24473, 24481, 24481, 24481, 24481, 24481, + 24481, 24481, 24499, 24499, 24499, 24499, 24499, 24499, + 24499, 24499, 24499, 24499, 24499, 24499, 24499, 24499, + 24499, 24499, 24509, 24509, 24509, 24509, 24509, 24509, + 24509, 24509, 24509, 24517, 24517, 24517, 24517, 24517, + 24517, 24517, 24527, 24527, 24527, 24527, 24527, 24527, + 24527, 24527, 24527, 24533, 24533, 24533, 24533, 24533, + 24547, 24547, 24547, 24547, 24547, 24547, 24547, 24547, + 24547, 24547, 24547, 24547, 24547, 24551, 24551, 24551, + 24571, 24571, 24571, 24571, 24571, 24571, 24571, 24571, + 24571, 24571, 24571, 24571, 24571, 24571, 24571, 24571, + 24571, 24571, 24593, 24593, 24593, 24593, 24593, 24593, + 24593, 24593, 24593, 24593, 24593, 24593, 24593, 24593, + 24593, 24593, 24593, 24593, 24593, 24593, 24611, 24611, + 24611, 24611, 24611, 24611, 24611, 24611, 24611, 24611, + 24611, 24611, 24611, 24611, 24611, 24611, 24623, 24623, + 24623, 24623, 24623, 24623, 24623, 24623, 24623, 24623, + 24631, 24631, 24631, 24631, 24631, 24631, 24631, 24631, + 24659, 24659, 24659, 24659, 24659, 24659, 24659, 24659, + 24659, 24659, 24659, 24659, 24659, 24659, 24659, 24659, + 24659, 24659, 24659, 24659, 24659, 24659, 24659, 24659, + 24671, 24671, 24671, 24671, 24671, 24671, 24671, 24671, + 24671, 24671, 24671, 24677, 24677, 24677, 24677, 24677, + 24683, 24683, 24683, 24683, 24683, 24683, 24691, 24691, + 24691, 24691, 24691, 24691, 24691, 24697, 24697, 24697, + 24697, 24697, 24709, 24709, 24709, 24709, 24709, 24709, + 24709, 24709, 24709, 24709, 24709, 24733, 24733, 24733, + 24733, 24733, 24733, 24733, 24733, 24733, 24733, 24733, + 24733, 24733, 24733, 24733, 24733, 24733, 24733, 24733, + 24733, 24733, 24749, 24749, 24749, 24749, 24749, 24749, + 24749, 24749, 24749, 24749, 24749, 24749, 24749, 24749, + 24763, 24763, 24763, 24763, 24763, 24763, 24763, 24763, + 24763, 24763, 24763, 24763, 24763, 24767, 24767, 24767, + 24781, 24781, 24781, 24781, 24781, 24781, 24781, 24781, + 24781, 24781, 24781, 24781, 24781, 24793, 24793, 24793, + 24793, 24793, 24793, 24793, 24793, 24793, 24793, 24793, + 24799, 24799, 24799, 24799, 24799, 24809, 24809, 24809, + 24809, 24809, 24809, 24809, 24809, 24809, 24821, 24821, + 24821, 24821, 24821, 24821, 24821, 24821, 24821, 24821, + 24841, 24841, 24841, 24841, 24841, 24841, 24841, 24841, + 24841, 24841, 24841, 24841, 24841, 24841, 24841, 24841, + 24841, 24841, 24847, 24847, 24847, 24847, 24847, 24847, + 24851, 24851, 24851, 24859, 24859, 24859, 24859, 24859, + 24859, 24859, 24877, 24877, 24877, 24877, 24877, 24877, + 24877, 24877, 24877, 24877, 24877, 24877, 24877, 24877, + 24877, 24877, 24889, 24889, 24889, 24889, 24889, 24889, + 24889, 24889, 24889, 24889, 24889, 24907, 24907, 24907, + 24907, 24907, 24907, 24907, 24907, 24907, 24907, 24907, + 24907, 24907, 24907, 24907, 24907, 24917, 24917, 24917, + 24917, 24917, 24917, 24917, 24917, 24917, 24919, 24919, + 24923, 24923, 24923, 24943, 24943, 24943, 24943, 24943, + 24943, 24943, 24943, 24943, 24943, 24943, 24943, 24943, + 24943, 24943, 24943, 24943, 24943, 24953, 24953, 24953, + 24953, 24953, 24953, 24953, 24953, 24953, 24967, 24967, + 24967, 24967, 24967, 24967, 24967, 24967, 24967, 24967, + 24967, 24967, 24971, 24971, 24971, 24971, 24977, 24977, + 24977, 24977, 24977, 24979, 24979, 24989, 24989, 24989, + 24989, 24989, 24989, 24989, 24989, 24989, 25013, 25013, + 25013, 25013, 25013, 25013, 25013, 25013, 25013, 25013, + 25013, 25013, 25013, 25013, 25013, 25013, 25013, 25013, + 25013, 25013, 25013, 25031, 25031, 25031, 25031, 25031, + 25031, 25031, 25031, 25031, 25031, 25031, 25031, 25031, + 25031, 25031, 25031, 25033, 25033, 25037, 25037, 25037, + 25057, 25057, 25057, 25057, 25057, 25057, 25057, 25057, + 25057, 25057, 25057, 25057, 25057, 25057, 25057, 25057, + 25057, 25057, 25073, 25073, 25073, 25073, 25073, 25073, + 25073, 25073, 25073, 25073, 25073, 25073, 25073, 25073, + 25087, 25087, 25087, 25087, 25087, 25087, 25087, 25087, + 25087, 25087, 25087, 25087, 25087, 25097, 25097, 25097, + 25097, 25097, 25097, 25097, 25097, 25097, 25111, 25111, + 25111, 25111, 25111, 25111, 25111, 25111, 25111, 25111, + 25111, 25111, 25117, 25117, 25117, 25117, 25117, 25117, + 25121, 25121, 25121, 25127, 25127, 25127, 25127, 25127, + 25147, 25147, 25147, 25147, 25147, 25147, 25147, 25147, + 25147, 25147, 25147, 25147, 25147, 25147, 25147, 25147, + 25147, 25147, 25153, 25153, 25153, 25153, 25153, 25153, + 25163, 25163, 25163, 25163, 25163, 25163, 25163, 25163, + 25169, 25169, 25169, 25169, 25169, 25169, 25171, 25171, + 25183, 25183, 25183, 25183, 25183, 25183, 25183, 25183, + 25183, 25183, 25189, 25189, 25189, 25189, 25189, 25189, + 25219, 25219, 25219, 25219, 25219, 25219, 25219, 25219, + 25219, 25219, 25219, 25219, 25219, 25219, 25219, 25219, + 25219, 25219, 25219, 25219, 25219, 25219, 25219, 25219, + 25219, 25219, 25229, 25229, 25229, 25229, 25229, 25229, + 25229, 25229, 25229, 25237, 25237, 25237, 25237, 25237, + 25237, 25237, 25243, 25243, 25243, 25243, 25243, 25243, + 25247, 25247, 25247, 25253, 25253, 25253, 25253, 25253, + 25261, 25261, 25261, 25261, 25261, 25261, 25261, 25261, + 25301, 25301, 25301, 25301, 25301, 25301, 25301, 25301, + 25301, 25301, 25301, 25301, 25301, 25301, 25301, 25301, + 25301, 25301, 25301, 25301, 25301, 25301, 25301, 25301, + 25301, 25301, 25301, 25301, 25301, 25301, 25301, 25301, + 25301, 25301, 25301, 25303, 25303, 25307, 25307, 25307, + 25309, 25309, 25321, 25321, 25321, 25321, 25321, 25321, + 25321, 25321, 25321, 25321, 25321, 25339, 25339, 25339, + 25339, 25339, 25339, 25339, 25339, 25339, 25339, 25339, + 25339, 25339, 25339, 25339, 25339, 25343, 25343, 25343, + 25349, 25349, 25349, 25349, 25349, 25349, 25357, 25357, + 25357, 25357, 25357, 25357, 25357, 25367, 25367, 25367, + 25367, 25367, 25367, 25367, 25367, 25367, 25373, 25373, + 25373, 25373, 25373, 25391, 25391, 25391, 25391, 25391, + 25391, 25391, 25391, 25391, 25391, 25391, 25391, 25391, + 25391, 25391, 25391, 25409, 25409, 25409, 25409, 25409, + 25409, 25409, 25409, 25409, 25409, 25409, 25409, 25409, + 25409, 25409, 25409, 25411, 25411, 25423, 25423, 25423, + 25423, 25423, 25423, 25423, 25423, 25423, 25423, 25423, + 25439, 25439, 25439, 25439, 25439, 25439, 25439, 25439, + 25439, 25439, 25439, 25439, 25439, 25439, 25447, 25447, + 25447, 25447, 25447, 25447, 25447, 25453, 25453, 25453, + 25453, 25453, 25457, 25457, 25457, 25457, 25463, 25463, + 25463, 25463, 25463, 25469, 25469, 25469, 25469, 25469, + 25471, 25471, 25523, 25523, 25523, 25523, 25523, 25523, + 25523, 25523, 25523, 25523, 25523, 25523, 25523, 25523, + 25523, 25523, 25523, 25523, 25523, 25523, 25523, 25523, + 25523, 25523, 25523, 25523, 25523, 25523, 25523, 25523, + 25523, 25523, 25523, 25523, 25523, 25523, 25523, 25523, + 25523, 25523, 25523, 25523, 25523, 25523, 25523, 25523, + 25537, 25537, 25537, 25537, 25537, 25537, 25537, 25537, + 25537, 25537, 25537, 25537, 25537, 25541, 25541, 25541, + 25561, 25561, 25561, 25561, 25561, 25561, 25561, 25561, + 25561, 25561, 25561, 25561, 25561, 25561, 25561, 25561, + 25561, 25561, 25577, 25577, 25577, 25577, 25577, 25577, + 25577, 25577, 25577, 25577, 25577, 25577, 25577, 25577, + 25579, 25579, 25583, 25583, 25583, 25583, 25589, 25589, + 25589, 25589, 25589, 25601, 25601, 25601, 25601, 25601, + 25601, 25601, 25601, 25601, 25601, 25601, 25603, 25603, + 25609, 25609, 25609, 25609, 25609, 25621, 25621, 25621, + 25621, 25621, 25621, 25621, 25621, 25621, 25621, 25621, + 25633, 25633, 25633, 25633, 25633, 25633, 25633, 25633, + 25633, 25633, 25639, 25639, 25639, 25639, 25639, 25639, + 25643, 25643, 25643, 25657, 25657, 25657, 25657, 25657, + 25657, 25657, 25657, 25657, 25657, 25657, 25657, 25657, + 25667, 25667, 25667, 25667, 25667, 25667, 25667, 25667, + 25673, 25673, 25673, 25673, 25673, 25673, 25679, 25679, + 25679, 25679, 25679, 25693, 25693, 25693, 25693, 25693, + 25693, 25693, 25693, 25693, 25693, 25693, 25693, 25693, + 25703, 25703, 25703, 25703, 25703, 25703, 25703, 25703, + 25717, 25717, 25717, 25717, 25717, 25717, 25717, 25717, + 25717, 25717, 25717, 25717, 25717, 25733, 25733, 25733, + 25733, 25733, 25733, 25733, 25733, 25733, 25733, 25733, + 25733, 25733, 25733, 25741, 25741, 25741, 25741, 25741, + 25741, 25741, 25747, 25747, 25747, 25747, 25747, 25747, + 25759, 25759, 25759, 25759, 25759, 25759, 25759, 25759, + 25759, 25759, 25763, 25763, 25763, 25763, 25771, 25771, + 25771, 25771, 25771, 25771, 25771, 25793, 25793, 25793, + 25793, 25793, 25793, 25793, 25793, 25793, 25793, 25793, + 25793, 25793, 25793, 25793, 25793, 25793, 25793, 25793, + 25799, 25799, 25799, 25799, 25799, 25799, 25801, 25801, + 25819, 25819, 25819, 25819, 25819, 25819, 25819, 25819, + 25819, 25819, 25819, 25819, 25819, 25819, 25819, 25819, + 25841, 25841, 25841, 25841, 25841, 25841, 25841, 25841, + 25841, 25841, 25841, 25841, 25841, 25841, 25841, 25841, + 25841, 25841, 25841, 25847, 25847, 25847, 25847, 25847, + 25849, 25849, 25867, 25867, 25867, 25867, 25867, 25867, + 25867, 25867, 25867, 25867, 25867, 25867, 25867, 25867, + 25867, 25867, 25873, 25873, 25873, 25873, 25873, 25873, + 25889, 25889, 25889, 25889, 25889, 25889, 25889, 25889, + 25889, 25889, 25889, 25889, 25889, 25889, 25903, 25903, + 25903, 25903, 25903, 25903, 25903, 25903, 25903, 25903, + 25903, 25903, 25913, 25913, 25913, 25913, 25913, 25913, + 25913, 25913, 25913, 25919, 25919, 25919, 25919, 25919, + 25931, 25931, 25931, 25931, 25931, 25931, 25931, 25931, + 25931, 25931, 25931, 25933, 25933, 25939, 25939, 25939, + 25939, 25939, 25943, 25943, 25943, 25943, 25951, 25951, + 25951, 25951, 25951, 25951, 25951, 25969, 25969, 25969, + 25969, 25969, 25969, 25969, 25969, 25969, 25969, 25969, + 25969, 25969, 25969, 25969, 25969, 25981, 25981, 25981, + 25981, 25981, 25981, 25981, 25981, 25981, 25981, 25981, + 25997, 25997, 25997, 25997, 25997, 25997, 25997, 25997, + 25997, 25997, 25997, 25997, 25997, 25997, 25999, 25999, + 26003, 26003, 26003, 26017, 26017, 26017, 26017, 26017, + 26017, 26017, 26017, 26017, 26017, 26017, 26017, 26017, + 26021, 26021, 26021, 26029, 26029, 26029, 26029, 26029, + 26029, 26029, 26041, 26041, 26041, 26041, 26041, 26041, + 26041, 26041, 26041, 26041, 26041, 26053, 26053, 26053, + 26053, 26053, 26053, 26053, 26053, 26053, 26053, 26053, + 26083, 26083, 26083, 26083, 26083, 26083, 26083, 26083, + 26083, 26083, 26083, 26083, 26083, 26083, 26083, 26083, + 26083, 26083, 26083, 26083, 26083, 26083, 26083, 26083, + 26083, 26083, 26099, 26099, 26099, 26099, 26099, 26099, + 26099, 26099, 26099, 26099, 26099, 26099, 26099, 26099, + 26107, 26107, 26107, 26107, 26107, 26107, 26107, 26107, + 26111, 26111, 26111, 26113, 26113, 26119, 26119, 26119, + 26119, 26119, 26141, 26141, 26141, 26141, 26141, 26141, + 26141, 26141, 26141, 26141, 26141, 26141, 26141, 26141, + 26141, 26141, 26141, 26141, 26141, 26141, 26153, 26153, + 26153, 26153, 26153, 26153, 26153, 26153, 26153, 26153, + 26161, 26161, 26161, 26161, 26161, 26161, 26161, 26161, + 26171, 26171, 26171, 26171, 26171, 26171, 26171, 26171, + 26177, 26177, 26177, 26177, 26177, 26177, 26183, 26183, + 26183, 26183, 26183, 26189, 26189, 26189, 26189, 26189, + 26203, 26203, 26203, 26203, 26203, 26203, 26203, 26203, + 26203, 26203, 26203, 26203, 26203, 26209, 26209, 26209, + 26209, 26209, 26227, 26227, 26227, 26227, 26227, 26227, + 26227, 26227, 26227, 26227, 26227, 26227, 26227, 26227, + 26227, 26227, 26237, 26237, 26237, 26237, 26237, 26237, + 26237, 26237, 26237, 26249, 26249, 26249, 26249, 26249, + 26249, 26249, 26249, 26249, 26249, 26249, 26251, 26251, + 26261, 26261, 26261, 26261, 26261, 26261, 26261, 26261, + 26263, 26263, 26267, 26267, 26267, 26267, 26293, 26293, + 26293, 26293, 26293, 26293, 26293, 26293, 26293, 26293, + 26293, 26293, 26293, 26293, 26293, 26293, 26293, 26293, + 26293, 26293, 26293, 26293, 26293, 26297, 26297, 26297, + 26309, 26309, 26309, 26309, 26309, 26309, 26309, 26309, + 26309, 26309, 26309, 26317, 26317, 26317, 26317, 26317, + 26317, 26317, 26321, 26321, 26321, 26321, 26339, 26339, + 26339, 26339, 26339, 26339, 26339, 26339, 26339, 26339, + 26339, 26339, 26339, 26339, 26339, 26339, 26347, 26347, + 26347, 26347, 26347, 26347, 26347, 26357, 26357, 26357, + 26357, 26357, 26357, 26357, 26357, 26357, 26371, 26371, + 26371, 26371, 26371, 26371, 26371, 26371, 26371, 26371, + 26371, 26371, 26387, 26387, 26387, 26387, 26387, 26387, + 26387, 26387, 26387, 26387, 26387, 26387, 26387, 26387, + 26393, 26393, 26393, 26393, 26393, 26393, 26399, 26399, + 26399, 26399, 26399, 26407, 26407, 26407, 26407, 26407, + 26407, 26407, 26417, 26417, 26417, 26417, 26417, 26417, + 26417, 26417, 26417, 26423, 26423, 26423, 26423, 26423, + 26431, 26431, 26431, 26431, 26431, 26431, 26431, 26431, + 26437, 26437, 26437, 26437, 26437, 26449, 26449, 26449, + 26449, 26449, 26449, 26449, 26449, 26449, 26449, 26449, + 26459, 26459, 26459, 26459, 26459, 26459, 26459, 26459, + 26479, 26479, 26479, 26479, 26479, 26479, 26479, 26479, + 26479, 26479, 26479, 26479, 26479, 26479, 26479, 26479, + 26479, 26479, 26489, 26489, 26489, 26489, 26489, 26489, + 26489, 26489, 26489, 26497, 26497, 26497, 26497, 26497, + 26497, 26497, 26501, 26501, 26501, 26501, 26513, 26513, + 26513, 26513, 26513, 26513, 26513, 26513, 26513, 26513, + 26539, 26539, 26539, 26539, 26539, 26539, 26539, 26539, + 26539, 26539, 26539, 26539, 26539, 26539, 26539, 26539, + 26539, 26539, 26539, 26539, 26539, 26539, 26539, 26539, + 26557, 26557, 26557, 26557, 26557, 26557, 26557, 26557, + 26557, 26557, 26557, 26557, 26557, 26557, 26557, 26557, + 26561, 26561, 26561, 26573, 26573, 26573, 26573, 26573, + 26573, 26573, 26573, 26573, 26573, 26573, 26591, 26591, + 26591, 26591, 26591, 26591, 26591, 26591, 26591, 26591, + 26591, 26591, 26591, 26591, 26591, 26591, 26597, 26597, + 26597, 26597, 26597, 26627, 26627, 26627, 26627, 26627, + 26627, 26627, 26627, 26627, 26627, 26627, 26627, 26627, + 26627, 26627, 26627, 26627, 26627, 26627, 26627, 26627, + 26627, 26627, 26627, 26627, 26627, 26627, 26633, 26633, + 26633, 26633, 26633, 26641, 26641, 26641, 26641, 26641, + 26641, 26641, 26647, 26647, 26647, 26647, 26647, 26647, + 26669, 26669, 26669, 26669, 26669, 26669, 26669, 26669, + 26669, 26669, 26669, 26669, 26669, 26669, 26669, 26669, + 26669, 26669, 26669, 26681, 26681, 26681, 26681, 26681, + 26681, 26681, 26681, 26681, 26681, 26681, 26683, 26683, + 26687, 26687, 26687, 26693, 26693, 26693, 26693, 26693, + 26699, 26699, 26699, 26699, 26699, 26699, 26701, 26701, + 26711, 26711, 26711, 26711, 26711, 26711, 26711, 26711, + 26713, 26713, 26717, 26717, 26717, 26717, 26723, 26723, + 26723, 26723, 26723, 26729, 26729, 26729, 26729, 26729, + 26731, 26731, 26737, 26737, 26737, 26737, 26737, 26737, + 26759, 26759, 26759, 26759, 26759, 26759, 26759, 26759, + 26759, 26759, 26759, 26759, 26759, 26759, 26759, 26759, + 26759, 26759, 26759, 26777, 26777, 26777, 26777, 26777, + 26777, 26777, 26777, 26777, 26777, 26777, 26777, 26777, + 26777, 26777, 26777, 26783, 26783, 26783, 26783, 26783, + 26801, 26801, 26801, 26801, 26801, 26801, 26801, 26801, + 26801, 26801, 26801, 26801, 26801, 26801, 26801, 26801, + 26813, 26813, 26813, 26813, 26813, 26813, 26813, 26813, + 26813, 26813, 26813, 26821, 26821, 26821, 26821, 26821, + 26821, 26821, 26833, 26833, 26833, 26833, 26833, 26833, + 26833, 26833, 26833, 26833, 26833, 26839, 26839, 26839, + 26839, 26839, 26849, 26849, 26849, 26849, 26849, 26849, + 26849, 26849, 26849, 26861, 26861, 26861, 26861, 26861, + 26861, 26861, 26861, 26861, 26861, 26861, 26863, 26863, + 26879, 26879, 26879, 26879, 26879, 26879, 26879, 26879, + 26879, 26879, 26879, 26879, 26879, 26879, 26881, 26881, + 26891, 26891, 26891, 26891, 26891, 26891, 26891, 26891, + 26893, 26893, 26903, 26903, 26903, 26903, 26903, 26903, + 26903, 26903, 26903, 26921, 26921, 26921, 26921, 26921, + 26921, 26921, 26921, 26921, 26921, 26921, 26921, 26921, + 26921, 26921, 26921, 26927, 26927, 26927, 26927, 26927, + 26947, 26947, 26947, 26947, 26947, 26947, 26947, 26947, + 26947, 26947, 26947, 26947, 26947, 26947, 26947, 26947, + 26947, 26947, 26951, 26951, 26951, 26951, 26953, 26953, + 26959, 26959, 26959, 26959, 26959, 26981, 26981, 26981, + 26981, 26981, 26981, 26981, 26981, 26981, 26981, 26981, + 26981, 26981, 26981, 26981, 26981, 26981, 26981, 26981, + 26987, 26987, 26987, 26987, 26987, 26987, 26993, 26993, + 26993, 26993, 26993, 27011, 27011, 27011, 27011, 27011, + 27011, 27011, 27011, 27011, 27011, 27011, 27011, 27011, + 27011, 27011, 27011, 27017, 27017, 27017, 27017, 27017, + 27031, 27031, 27031, 27031, 27031, 27031, 27031, 27031, + 27031, 27031, 27031, 27031, 27031, 27043, 27043, 27043, + 27043, 27043, 27043, 27043, 27043, 27043, 27043, 27043, + 27059, 27059, 27059, 27059, 27059, 27059, 27059, 27059, + 27059, 27059, 27059, 27059, 27059, 27059, 27061, 27061, + 27067, 27067, 27067, 27067, 27067, 27073, 27073, 27073, + 27073, 27073, 27077, 27077, 27077, 27077, 27091, 27091, + 27091, 27091, 27091, 27091, 27091, 27091, 27091, 27091, + 27091, 27091, 27103, 27103, 27103, 27103, 27103, 27103, + 27103, 27103, 27103, 27103, 27103, 27107, 27107, 27107, + 27109, 27109, 27127, 27127, 27127, 27127, 27127, 27127, + 27127, 27127, 27127, 27127, 27127, 27127, 27127, 27127, + 27127, 27127, 27143, 27143, 27143, 27143, 27143, 27143, + 27143, 27143, 27143, 27143, 27143, 27143, 27143, 27143, + 27179, 27179, 27179, 27179, 27179, 27179, 27179, 27179, + 27179, 27179, 27179, 27179, 27179, 27179, 27179, 27179, + 27179, 27179, 27179, 27179, 27179, 27179, 27179, 27179, + 27179, 27179, 27179, 27179, 27179, 27179, 27179, 27179, + 27191, 27191, 27191, 27191, 27191, 27191, 27191, 27191, + 27191, 27191, 27191, 27197, 27197, 27197, 27197, 27197, + 27211, 27211, 27211, 27211, 27211, 27211, 27211, 27211, + 27211, 27211, 27211, 27211, 27211, 27239, 27239, 27239, + 27239, 27239, 27239, 27239, 27239, 27239, 27239, 27239, + 27239, 27239, 27239, 27239, 27239, 27239, 27239, 27239, + 27239, 27239, 27239, 27239, 27239, 27239, 27241, 27241, + 27253, 27253, 27253, 27253, 27253, 27253, 27253, 27253, + 27253, 27253, 27259, 27259, 27259, 27259, 27259, 27259, + 27271, 27271, 27271, 27271, 27271, 27271, 27271, 27271, + 27271, 27271, 27277, 27277, 27277, 27277, 27277, 27277, + 27281, 27281, 27281, 27283, 27283, 27299, 27299, 27299, + 27299, 27299, 27299, 27299, 27299, 27299, 27299, 27299, + 27299, 27299, 27299, 27329, 27329, 27329, 27329, 27329, + 27329, 27329, 27329, 27329, 27329, 27329, 27329, 27329, + 27329, 27329, 27329, 27329, 27329, 27329, 27329, 27329, + 27329, 27329, 27329, 27329, 27329, 27329, 27337, 27337, + 27337, 27337, 27337, 27337, 27337, 27361, 27361, 27361, + 27361, 27361, 27361, 27361, 27361, 27361, 27361, 27361, + 27361, 27361, 27361, 27361, 27361, 27361, 27361, 27361, + 27361, 27361, 27367, 27367, 27367, 27367, 27367, 27367, + 27397, 27397, 27397, 27397, 27397, 27397, 27397, 27397, + 27397, 27397, 27397, 27397, 27397, 27397, 27397, 27397, + 27397, 27397, 27397, 27397, 27397, 27397, 27397, 27397, + 27397, 27397, 27407, 27407, 27407, 27407, 27407, 27407, + 27407, 27407, 27407, 27409, 27409, 27427, 27427, 27427, + 27427, 27427, 27427, 27427, 27427, 27427, 27427, 27427, + 27427, 27427, 27427, 27427, 27427, 27431, 27431, 27431, + 27437, 27437, 27437, 27437, 27437, 27437, 27449, 27449, + 27449, 27449, 27449, 27449, 27449, 27449, 27449, 27449, + 27457, 27457, 27457, 27457, 27457, 27457, 27457, 27457, + 27479, 27479, 27479, 27479, 27479, 27479, 27479, 27479, + 27479, 27479, 27479, 27479, 27479, 27479, 27479, 27479, + 27479, 27479, 27479, 27481, 27481, 27487, 27487, 27487, + 27487, 27487, 27509, 27509, 27509, 27509, 27509, 27509, + 27509, 27509, 27509, 27509, 27509, 27509, 27509, 27509, + 27509, 27509, 27509, 27509, 27509, 27509, 27527, 27527, + 27527, 27527, 27527, 27527, 27527, 27527, 27527, 27527, + 27527, 27527, 27527, 27527, 27527, 27527, 27529, 27529, + 27539, 27539, 27539, 27539, 27539, 27539, 27539, 27539, + 27541, 27541, 27551, 27551, 27551, 27551, 27551, 27551, + 27551, 27551, 27551, 27581, 27581, 27581, 27581, 27581, + 27581, 27581, 27581, 27581, 27581, 27581, 27581, 27581, + 27581, 27581, 27581, 27581, 27581, 27581, 27581, 27581, + 27581, 27581, 27581, 27581, 27581, 27581, 27583, 27583, + 27611, 27611, 27611, 27611, 27611, 27611, 27611, 27611, + 27611, 27611, 27611, 27611, 27611, 27611, 27611, 27611, + 27611, 27611, 27611, 27611, 27611, 27611, 27611, 27611, + 27617, 27617, 27617, 27617, 27617, 27617, 27631, 27631, + 27631, 27631, 27631, 27631, 27631, 27631, 27631, 27631, + 27631, 27631, 27647, 27647, 27647, 27647, 27647, 27647, + 27647, 27647, 27647, 27647, 27647, 27647, 27647, 27647, + 27653, 27653, 27653, 27653, 27653, 27653, 27673, 27673, + 27673, 27673, 27673, 27673, 27673, 27673, 27673, 27673, + 27673, 27673, 27673, 27673, 27673, 27673, 27673, 27673, + 27689, 27689, 27689, 27689, 27689, 27689, 27689, 27689, + 27689, 27689, 27689, 27689, 27689, 27689, 27691, 27691, + 27697, 27697, 27697, 27697, 27697, 27701, 27701, 27701, + 27733, 27733, 27733, 27733, 27733, 27733, 27733, 27733, + 27733, 27733, 27733, 27733, 27733, 27733, 27733, 27733, + 27733, 27733, 27733, 27733, 27733, 27733, 27733, 27733, + 27733, 27733, 27733, 27733, 27733, 27737, 27737, 27737, + 27739, 27739, 27743, 27743, 27743, 27743, 27749, 27749, + 27749, 27749, 27749, 27751, 27751, 27763, 27763, 27763, + 27763, 27763, 27763, 27763, 27763, 27763, 27763, 27763, + 27767, 27767, 27767, 27773, 27773, 27773, 27773, 27773, + 27779, 27779, 27779, 27779, 27779, 27779, 27791, 27791, + 27791, 27791, 27791, 27791, 27791, 27791, 27791, 27791, + 27793, 27793, 27799, 27799, 27799, 27799, 27799, 27799, + 27803, 27803, 27803, 27809, 27809, 27809, 27809, 27809, + 27817, 27817, 27817, 27817, 27817, 27817, 27817, 27817, + 27823, 27823, 27823, 27823, 27823, 27827, 27827, 27827, + 27847, 27847, 27847, 27847, 27847, 27847, 27847, 27847, + 27847, 27847, 27847, 27847, 27847, 27847, 27847, 27847, + 27847, 27847, 27851, 27851, 27851, 27851, 27883, 27883, + 27883, 27883, 27883, 27883, 27883, 27883, 27883, 27883, + 27883, 27883, 27883, 27883, 27883, 27883, 27883, 27883, + 27883, 27883, 27883, 27883, 27883, 27883, 27883, 27883, + 27883, 27883, 27893, 27893, 27893, 27893, 27893, 27893, + 27893, 27893, 27893, 27901, 27901, 27901, 27901, 27901, + 27901, 27901, 27917, 27917, 27917, 27917, 27917, 27917, + 27917, 27917, 27917, 27917, 27917, 27917, 27917, 27917, + 27919, 27919, 27941, 27941, 27941, 27941, 27941, 27941, + 27941, 27941, 27941, 27941, 27941, 27941, 27941, 27941, + 27941, 27941, 27941, 27941, 27941, 27941, 27943, 27943, + 27947, 27947, 27947, 27953, 27953, 27953, 27953, 27953, + 27961, 27961, 27961, 27961, 27961, 27961, 27961, 27961, + 27967, 27967, 27967, 27967, 27967, 27983, 27983, 27983, + 27983, 27983, 27983, 27983, 27983, 27983, 27983, 27983, + 27983, 27983, 27983, 27997, 27997, 27997, 27997, 27997, + 27997, 27997, 27997, 27997, 27997, 27997, 27997, 27997, + 28001, 28001, 28001, 28019, 28019, 28019, 28019, 28019, + 28019, 28019, 28019, 28019, 28019, 28019, 28019, 28019, + 28019, 28019, 28019, 28027, 28027, 28027, 28027, 28027, + 28027, 28027, 28031, 28031, 28031, 28031, 28051, 28051, + 28051, 28051, 28051, 28051, 28051, 28051, 28051, 28051, + 28051, 28051, 28051, 28051, 28051, 28051, 28051, 28051, + 28057, 28057, 28057, 28057, 28057, 28069, 28069, 28069, + 28069, 28069, 28069, 28069, 28069, 28069, 28069, 28069, + 28081, 28081, 28081, 28081, 28081, 28081, 28081, 28081, + 28081, 28081, 28087, 28087, 28087, 28087, 28087, 28087, + 28097, 28097, 28097, 28097, 28097, 28097, 28097, 28097, + 28099, 28099, 28109, 28109, 28109, 28109, 28109, 28109, + 28109, 28109, 28109, 28111, 28111, 28123, 28123, 28123, + 28123, 28123, 28123, 28123, 28123, 28123, 28123, 28123, + 28151, 28151, 28151, 28151, 28151, 28151, 28151, 28151, + 28151, 28151, 28151, 28151, 28151, 28151, 28151, 28151, + 28151, 28151, 28151, 28151, 28151, 28151, 28151, 28151, + 28163, 28163, 28163, 28163, 28163, 28163, 28163, 28163, + 28163, 28163, 28163, 28181, 28181, 28181, 28181, 28181, + 28181, 28181, 28181, 28181, 28181, 28181, 28181, 28181, + 28181, 28181, 28181, 28183, 28183, 28201, 28201, 28201, + 28201, 28201, 28201, 28201, 28201, 28201, 28201, 28201, + 28201, 28201, 28201, 28201, 28201, 28211, 28211, 28211, + 28211, 28211, 28211, 28211, 28211, 28211, 28219, 28219, + 28219, 28219, 28219, 28219, 28219, 28229, 28229, 28229, + 28229, 28229, 28229, 28229, 28229, 28229, 28277, 28277, + 28277, 28277, 28277, 28277, 28277, 28277, 28277, 28277, + 28277, 28277, 28277, 28277, 28277, 28277, 28277, 28277, + 28277, 28277, 28277, 28277, 28277, 28277, 28277, 28277, + 28277, 28277, 28277, 28277, 28277, 28277, 28277, 28277, + 28277, 28277, 28277, 28277, 28277, 28277, 28277, 28277, + 28279, 28279, 28283, 28283, 28283, 28283, 28289, 28289, + 28289, 28289, 28289, 28297, 28297, 28297, 28297, 28297, + 28297, 28297, 28307, 28307, 28307, 28307, 28307, 28307, + 28307, 28307, 28307, 28309, 28309, 28319, 28319, 28319, + 28319, 28319, 28319, 28319, 28319, 28319, 28349, 28349, + 28349, 28349, 28349, 28349, 28349, 28349, 28349, 28349, + 28349, 28349, 28349, 28349, 28349, 28349, 28349, 28349, + 28349, 28349, 28349, 28349, 28349, 28349, 28349, 28349, + 28351, 28351, 28387, 28387, 28387, 28387, 28387, 28387, + 28387, 28387, 28387, 28387, 28387, 28387, 28387, 28387, + 28387, 28387, 28387, 28387, 28387, 28387, 28387, 28387, + 28387, 28387, 28387, 28387, 28387, 28387, 28387, 28387, + 28387, 28387, 28393, 28393, 28393, 28393, 28393, 28393, + 28403, 28403, 28403, 28403, 28403, 28403, 28403, 28403, + 28409, 28409, 28409, 28409, 28409, 28409, 28411, 28411, + 28429, 28429, 28429, 28429, 28429, 28429, 28429, 28429, + 28429, 28429, 28429, 28429, 28429, 28429, 28429, 28429, + 28433, 28433, 28433, 28439, 28439, 28439, 28439, 28439, + 28447, 28447, 28447, 28447, 28447, 28447, 28447, 28447, + 28463, 28463, 28463, 28463, 28463, 28463, 28463, 28463, + 28463, 28463, 28463, 28463, 28463, 28463, 28477, 28477, + 28477, 28477, 28477, 28477, 28477, 28477, 28477, 28477, + 28477, 28477, 28493, 28493, 28493, 28493, 28493, 28493, + 28493, 28493, 28493, 28493, 28493, 28493, 28493, 28493, + 28499, 28499, 28499, 28499, 28499, 28499, 28513, 28513, + 28513, 28513, 28513, 28513, 28513, 28513, 28513, 28513, + 28513, 28513, 28517, 28517, 28517, 28517, 28537, 28537, + 28537, 28537, 28537, 28537, 28537, 28537, 28537, 28537, + 28537, 28537, 28537, 28537, 28537, 28537, 28537, 28537, + 28541, 28541, 28541, 28547, 28547, 28547, 28547, 28547, + 28549, 28549, 28559, 28559, 28559, 28559, 28559, 28559, + 28559, 28559, 28559, 28571, 28571, 28571, 28571, 28571, + 28571, 28571, 28571, 28571, 28571, 28571, 28573, 28573, + 28579, 28579, 28579, 28579, 28579, 28591, 28591, 28591, + 28591, 28591, 28591, 28591, 28591, 28591, 28591, 28591, + 28597, 28597, 28597, 28597, 28597, 28603, 28603, 28603, + 28603, 28603, 28607, 28607, 28607, 28607, 28619, 28619, + 28619, 28619, 28619, 28619, 28619, 28619, 28619, 28619, + 28621, 28621, 28627, 28627, 28627, 28627, 28627, 28627, + 28631, 28631, 28631, 28643, 28643, 28643, 28643, 28643, + 28643, 28643, 28643, 28643, 28643, 28643, 28649, 28649, + 28649, 28649, 28649, 28657, 28657, 28657, 28657, 28657, + 28657, 28657, 28661, 28661, 28661, 28661, 28663, 28663, + 28669, 28669, 28669, 28669, 28669, 28687, 28687, 28687, + 28687, 28687, 28687, 28687, 28687, 28687, 28687, 28687, + 28687, 28687, 28687, 28687, 28687, 28697, 28697, 28697, + 28697, 28697, 28697, 28697, 28697, 28697, 28703, 28703, + 28703, 28703, 28703, 28711, 28711, 28711, 28711, 28711, + 28711, 28711, 28723, 28723, 28723, 28723, 28723, 28723, + 28723, 28723, 28723, 28723, 28723, 28729, 28729, 28729, + 28729, 28729, 28751, 28751, 28751, 28751, 28751, 28751, + 28751, 28751, 28751, 28751, 28751, 28751, 28751, 28751, + 28751, 28751, 28751, 28751, 28751, 28751, 28753, 28753, + 28759, 28759, 28759, 28759, 28759, 28771, 28771, 28771, + 28771, 28771, 28771, 28771, 28771, 28771, 28771, 28771, + 28789, 28789, 28789, 28789, 28789, 28789, 28789, 28789, + 28789, 28789, 28789, 28789, 28789, 28789, 28789, 28789, + 28793, 28793, 28793, 28807, 28807, 28807, 28807, 28807, + 28807, 28807, 28807, 28807, 28807, 28807, 28807, 28807, + 28813, 28813, 28813, 28813, 28813, 28817, 28817, 28817, + 28837, 28837, 28837, 28837, 28837, 28837, 28837, 28837, + 28837, 28837, 28837, 28837, 28837, 28837, 28837, 28837, + 28837, 28837, 28843, 28843, 28843, 28843, 28843, 28843, + 28859, 28859, 28859, 28859, 28859, 28859, 28859, 28859, + 28859, 28859, 28859, 28859, 28859, 28859, 28867, 28867, + 28867, 28867, 28867, 28867, 28867, 28871, 28871, 28871, + 28879, 28879, 28879, 28879, 28879, 28879, 28879, 28879, + 28901, 28901, 28901, 28901, 28901, 28901, 28901, 28901, + 28901, 28901, 28901, 28901, 28901, 28901, 28901, 28901, + 28901, 28901, 28901, 28909, 28909, 28909, 28909, 28909, + 28909, 28909, 28921, 28921, 28921, 28921, 28921, 28921, + 28921, 28921, 28921, 28921, 28921, 28927, 28927, 28927, + 28927, 28927, 28933, 28933, 28933, 28933, 28933, 28933, + 28949, 28949, 28949, 28949, 28949, 28949, 28949, 28949, + 28949, 28949, 28949, 28949, 28949, 28949, 28961, 28961, + 28961, 28961, 28961, 28961, 28961, 28961, 28961, 28961, + 28979, 28979, 28979, 28979, 28979, 28979, 28979, 28979, + 28979, 28979, 28979, 28979, 28979, 28979, 28979, 28979, + 29009, 29009, 29009, 29009, 29009, 29009, 29009, 29009, + 29009, 29009, 29009, 29009, 29009, 29009, 29009, 29009, + 29009, 29009, 29009, 29009, 29009, 29009, 29009, 29009, + 29009, 29009, 29009, 29017, 29017, 29017, 29017, 29017, + 29017, 29017, 29021, 29021, 29021, 29021, 29023, 29023, + 29027, 29027, 29027, 29033, 29033, 29033, 29033, 29033, + 29059, 29059, 29059, 29059, 29059, 29059, 29059, 29059, + 29059, 29059, 29059, 29059, 29059, 29059, 29059, 29059, + 29059, 29059, 29059, 29059, 29059, 29059, 29059, 29059, + 29063, 29063, 29063, 29077, 29077, 29077, 29077, 29077, + 29077, 29077, 29077, 29077, 29077, 29077, 29077, 29077, + 29101, 29101, 29101, 29101, 29101, 29101, 29101, 29101, + 29101, 29101, 29101, 29101, 29101, 29101, 29101, 29101, + 29101, 29101, 29101, 29101, 29101, 29123, 29123, 29123, + 29123, 29123, 29123, 29123, 29123, 29123, 29123, 29123, + 29123, 29123, 29123, 29123, 29123, 29123, 29123, 29123, + 29129, 29129, 29129, 29129, 29129, 29129, 29131, 29131, + 29137, 29137, 29137, 29137, 29137, 29147, 29147, 29147, + 29147, 29147, 29147, 29147, 29147, 29147, 29153, 29153, + 29153, 29153, 29153, 29167, 29167, 29167, 29167, 29167, + 29167, 29167, 29167, 29167, 29167, 29167, 29167, 29167, + 29173, 29173, 29173, 29173, 29173, 29179, 29179, 29179, + 29179, 29179, 29191, 29191, 29191, 29191, 29191, 29191, + 29191, 29191, 29191, 29191, 29191, 29201, 29201, 29201, + 29201, 29201, 29201, 29201, 29201, 29201, 29207, 29207, + 29207, 29207, 29207, 29209, 29209, 29221, 29221, 29221, + 29221, 29221, 29221, 29221, 29221, 29221, 29221, 29221, + 29231, 29231, 29231, 29231, 29231, 29231, 29231, 29231, + 29243, 29243, 29243, 29243, 29243, 29243, 29243, 29243, + 29243, 29243, 29243, 29251, 29251, 29251, 29251, 29251, + 29251, 29251, 29269, 29269, 29269, 29269, 29269, 29269, + 29269, 29269, 29269, 29269, 29269, 29269, 29269, 29269, + 29269, 29269, 29287, 29287, 29287, 29287, 29287, 29287, + 29287, 29287, 29287, 29287, 29287, 29287, 29287, 29287, + 29287, 29287, 29297, 29297, 29297, 29297, 29297, 29297, + 29297, 29297, 29297, 29303, 29303, 29303, 29303, 29303, + 29311, 29311, 29311, 29311, 29311, 29311, 29311, 29311, + 29327, 29327, 29327, 29327, 29327, 29327, 29327, 29327, + 29327, 29327, 29327, 29327, 29327, 29327, 29333, 29333, + 29333, 29333, 29333, 29339, 29339, 29339, 29339, 29339, + 29347, 29347, 29347, 29347, 29347, 29347, 29347, 29347, + 29363, 29363, 29363, 29363, 29363, 29363, 29363, 29363, + 29363, 29363, 29363, 29363, 29363, 29363, 29383, 29383, + 29383, 29383, 29383, 29383, 29383, 29383, 29383, 29383, + 29383, 29383, 29383, 29383, 29383, 29383, 29383, 29383, + 29387, 29387, 29387, 29389, 29389, 29399, 29399, 29399, + 29399, 29399, 29399, 29399, 29399, 29399, 29401, 29401, + 29411, 29411, 29411, 29411, 29411, 29411, 29411, 29411, + 29423, 29423, 29423, 29423, 29423, 29423, 29423, 29423, + 29423, 29423, 29423, 29429, 29429, 29429, 29429, 29429, + 29437, 29437, 29437, 29437, 29437, 29437, 29437, 29437, + 29443, 29443, 29443, 29443, 29443, 29453, 29453, 29453, + 29453, 29453, 29453, 29453, 29453, 29453, 29473, 29473, + 29473, 29473, 29473, 29473, 29473, 29473, 29473, 29473, + 29473, 29473, 29473, 29473, 29473, 29473, 29473, 29473, + 29483, 29483, 29483, 29483, 29483, 29483, 29483, 29483, + 29501, 29501, 29501, 29501, 29501, 29501, 29501, 29501, + 29501, 29501, 29501, 29501, 29501, 29501, 29501, 29501, + 29527, 29527, 29527, 29527, 29527, 29527, 29527, 29527, + 29527, 29527, 29527, 29527, 29527, 29527, 29527, 29527, + 29527, 29527, 29527, 29527, 29527, 29527, 29527, 29527, + 29531, 29531, 29531, 29537, 29537, 29537, 29537, 29537, + 29567, 29567, 29567, 29567, 29567, 29567, 29567, 29567, + 29567, 29567, 29567, 29567, 29567, 29567, 29567, 29567, + 29567, 29567, 29567, 29567, 29567, 29567, 29567, 29567, + 29567, 29567, 29567, 29569, 29569, 29573, 29573, 29573, + 29581, 29581, 29581, 29581, 29581, 29581, 29581, 29581, + 29587, 29587, 29587, 29587, 29587, 29599, 29599, 29599, + 29599, 29599, 29599, 29599, 29599, 29599, 29599, 29599, + 29611, 29611, 29611, 29611, 29611, 29611, 29611, 29611, + 29611, 29611, 29629, 29629, 29629, 29629, 29629, 29629, + 29629, 29629, 29629, 29629, 29629, 29629, 29629, 29629, + 29629, 29629, 29633, 29633, 29633, 29633, 29641, 29641, + 29641, 29641, 29641, 29641, 29641, 29663, 29663, 29663, + 29663, 29663, 29663, 29663, 29663, 29663, 29663, 29663, + 29663, 29663, 29663, 29663, 29663, 29663, 29663, 29663, + 29669, 29669, 29669, 29669, 29669, 29669, 29671, 29671, + 29683, 29683, 29683, 29683, 29683, 29683, 29683, 29683, + 29683, 29683, 29717, 29717, 29717, 29717, 29717, 29717, + 29717, 29717, 29717, 29717, 29717, 29717, 29717, 29717, + 29717, 29717, 29717, 29717, 29717, 29717, 29717, 29717, + 29717, 29717, 29717, 29717, 29717, 29717, 29717, 29717, + 29723, 29723, 29723, 29723, 29723, 29723, 29741, 29741, + 29741, 29741, 29741, 29741, 29741, 29741, 29741, 29741, + 29741, 29741, 29741, 29741, 29741, 29741, 29753, 29753, + 29753, 29753, 29753, 29753, 29753, 29753, 29753, 29753, + 29759, 29759, 29759, 29759, 29759, 29759, 29761, 29761, + 29789, 29789, 29789, 29789, 29789, 29789, 29789, 29789, + 29789, 29789, 29789, 29789, 29789, 29789, 29789, 29789, + 29789, 29789, 29789, 29789, 29789, 29789, 29789, 29789, + 29803, 29803, 29803, 29803, 29803, 29803, 29803, 29803, + 29803, 29803, 29803, 29803, 29803, 29819, 29819, 29819, + 29819, 29819, 29819, 29819, 29819, 29819, 29819, 29819, + 29819, 29819, 29819, 29833, 29833, 29833, 29833, 29833, + 29833, 29833, 29833, 29833, 29833, 29833, 29833, 29833, + 29837, 29837, 29837, 29851, 29851, 29851, 29851, 29851, + 29851, 29851, 29851, 29851, 29851, 29851, 29851, 29851, + 29863, 29863, 29863, 29863, 29863, 29863, 29863, 29863, + 29863, 29863, 29867, 29867, 29867, 29867, 29873, 29873, + 29873, 29873, 29873, 29879, 29879, 29879, 29879, 29879, + 29881, 29881, 29917, 29917, 29917, 29917, 29917, 29917, + 29917, 29917, 29917, 29917, 29917, 29917, 29917, 29917, + 29917, 29917, 29917, 29917, 29917, 29917, 29917, 29917, + 29917, 29917, 29917, 29917, 29917, 29917, 29917, 29917, + 29917, 29917, 29921, 29921, 29921, 29921, 29927, 29927, + 29927, 29927, 29927, 29947, 29947, 29947, 29947, 29947, + 29947, 29947, 29947, 29947, 29947, 29947, 29947, 29947, + 29947, 29947, 29947, 29947, 29947, 29959, 29959, 29959, + 29959, 29959, 29959, 29959, 29959, 29959, 29959, 29959, + 29983, 29983, 29983, 29983, 29983, 29983, 29983, 29983, + 29983, 29983, 29983, 29983, 29983, 29983, 29983, 29983, + 29983, 29983, 29983, 29983, 29983, 29989, 29989, 29989, + 29989, 29989, 30011, 30011, 30011, 30011, 30011, 30011, + 30011, 30011, 30011, 30011, 30011, 30011, 30011, 30011, + 30011, 30011, 30011, 30011, 30011, 30011, 30013, 30013, + 30029, 30029, 30029, 30029, 30029, 30029, 30029, 30029, + 30029, 30029, 30029, 30029, 30029, 30029, 30047, 30047, + 30047, 30047, 30047, 30047, 30047, 30047, 30047, 30047, + 30047, 30047, 30047, 30047, 30047, 30047, 30059, 30059, + 30059, 30059, 30059, 30059, 30059, 30059, 30059, 30059, + 30071, 30071, 30071, 30071, 30071, 30071, 30071, 30071, + 30071, 30071, 30071, 30089, 30089, 30089, 30089, 30089, + 30089, 30089, 30089, 30089, 30089, 30089, 30089, 30089, + 30089, 30089, 30089, 30091, 30091, 30097, 30097, 30097, + 30097, 30097, 30103, 30103, 30103, 30103, 30103, 30103, + 30109, 30109, 30109, 30109, 30109, 30113, 30113, 30113, + 30119, 30119, 30119, 30119, 30119, 30119, 30133, 30133, + 30133, 30133, 30133, 30133, 30133, 30133, 30133, 30133, + 30133, 30133, 30137, 30137, 30137, 30137, 30139, 30139, + 30161, 30161, 30161, 30161, 30161, 30161, 30161, 30161, + 30161, 30161, 30161, 30161, 30161, 30161, 30161, 30161, + 30161, 30161, 30161, 30169, 30169, 30169, 30169, 30169, + 30169, 30169, 30181, 30181, 30181, 30181, 30181, 30181, + 30181, 30181, 30181, 30181, 30181, 30187, 30187, 30187, + 30187, 30187, 30197, 30197, 30197, 30197, 30197, 30197, + 30197, 30197, 30197, 30203, 30203, 30203, 30203, 30203, + 30211, 30211, 30211, 30211, 30211, 30211, 30211, 30211, + 30223, 30223, 30223, 30223, 30223, 30223, 30223, 30223, + 30223, 30223, 30241, 30241, 30241, 30241, 30241, 30241, + 30241, 30241, 30241, 30241, 30241, 30241, 30241, 30241, + 30241, 30241, 30253, 30253, 30253, 30253, 30253, 30253, + 30253, 30253, 30253, 30253, 30253, 30259, 30259, 30259, + 30259, 30259, 30269, 30269, 30269, 30269, 30269, 30269, + 30269, 30269, 30269, 30271, 30271, 30293, 30293, 30293, + 30293, 30293, 30293, 30293, 30293, 30293, 30293, 30293, + 30293, 30293, 30293, 30293, 30293, 30293, 30293, 30293, + 30307, 30307, 30307, 30307, 30307, 30307, 30307, 30307, + 30307, 30307, 30307, 30307, 30307, 30313, 30313, 30313, + 30313, 30313, 30319, 30319, 30319, 30319, 30319, 30319, + 30323, 30323, 30323, 30341, 30341, 30341, 30341, 30341, + 30341, 30341, 30341, 30341, 30341, 30341, 30341, 30341, + 30341, 30341, 30341, 30347, 30347, 30347, 30347, 30347, + 30367, 30367, 30367, 30367, 30367, 30367, 30367, 30367, + 30367, 30367, 30367, 30367, 30367, 30367, 30367, 30367, + 30367, 30367, 30389, 30389, 30389, 30389, 30389, 30389, + 30389, 30389, 30389, 30389, 30389, 30389, 30389, 30389, + 30389, 30389, 30389, 30389, 30389, 30389, 30391, 30391, + 30403, 30403, 30403, 30403, 30403, 30403, 30403, 30403, + 30403, 30403, 30427, 30427, 30427, 30427, 30427, 30427, + 30427, 30427, 30427, 30427, 30427, 30427, 30427, 30427, + 30427, 30427, 30427, 30427, 30427, 30427, 30427, 30427, + 30431, 30431, 30431, 30449, 30449, 30449, 30449, 30449, + 30449, 30449, 30449, 30449, 30449, 30449, 30449, 30449, + 30449, 30449, 30449, 30467, 30467, 30467, 30467, 30467, + 30467, 30467, 30467, 30467, 30467, 30467, 30467, 30467, + 30467, 30467, 30467, 30469, 30469, 30491, 30491, 30491, + 30491, 30491, 30491, 30491, 30491, 30491, 30491, 30491, + 30491, 30491, 30491, 30491, 30491, 30491, 30491, 30491, + 30493, 30493, 30497, 30497, 30497, 30497, 30509, 30509, + 30509, 30509, 30509, 30509, 30509, 30509, 30509, 30509, + 30517, 30517, 30517, 30517, 30517, 30517, 30517, 30517, + 30529, 30529, 30529, 30529, 30529, 30529, 30529, 30529, + 30529, 30529, 30539, 30539, 30539, 30539, 30539, 30539, + 30539, 30539, 30539, 30553, 30553, 30553, 30553, 30553, + 30553, 30553, 30553, 30553, 30553, 30553, 30553, 30553, + 30557, 30557, 30557, 30559, 30559, 30577, 30577, 30577, + 30577, 30577, 30577, 30577, 30577, 30577, 30577, 30577, + 30577, 30577, 30577, 30577, 30577, 30593, 30593, 30593, + 30593, 30593, 30593, 30593, 30593, 30593, 30593, 30593, + 30593, 30593, 30593, 30631, 30631, 30631, 30631, 30631, + 30631, 30631, 30631, 30631, 30631, 30631, 30631, 30631, + 30631, 30631, 30631, 30631, 30631, 30631, 30631, 30631, + 30631, 30631, 30631, 30631, 30631, 30631, 30631, 30631, + 30631, 30631, 30631, 30631, 30631, 30637, 30637, 30637, + 30637, 30637, 30643, 30643, 30643, 30643, 30643, 30643, + 30649, 30649, 30649, 30649, 30649, 30661, 30661, 30661, + 30661, 30661, 30661, 30661, 30661, 30661, 30661, 30661, + 30671, 30671, 30671, 30671, 30671, 30671, 30671, 30671, + 30677, 30677, 30677, 30677, 30677, 30677, 30689, 30689, + 30689, 30689, 30689, 30689, 30689, 30689, 30689, 30689, + 30697, 30697, 30697, 30697, 30697, 30697, 30697, 30697, + 30703, 30703, 30703, 30703, 30703, 30707, 30707, 30707, + 30713, 30713, 30713, 30713, 30713, 30713, 30727, 30727, + 30727, 30727, 30727, 30727, 30727, 30727, 30727, 30727, + 30727, 30727, 30757, 30757, 30757, 30757, 30757, 30757, + 30757, 30757, 30757, 30757, 30757, 30757, 30757, 30757, + 30757, 30757, 30757, 30757, 30757, 30757, 30757, 30757, + 30757, 30757, 30757, 30757, 30757, 30763, 30763, 30763, + 30763, 30763, 30773, 30773, 30773, 30773, 30773, 30773, + 30773, 30773, 30773, 30781, 30781, 30781, 30781, 30781, + 30781, 30781, 30803, 30803, 30803, 30803, 30803, 30803, + 30803, 30803, 30803, 30803, 30803, 30803, 30803, 30803, + 30803, 30803, 30803, 30803, 30803, 30803, 30809, 30809, + 30809, 30809, 30809, 30817, 30817, 30817, 30817, 30817, + 30817, 30817, 30829, 30829, 30829, 30829, 30829, 30829, + 30829, 30829, 30829, 30829, 30829, 30839, 30839, 30839, + 30839, 30839, 30839, 30839, 30839, 30839, 30841, 30841, + 30851, 30851, 30851, 30851, 30851, 30851, 30851, 30851, + 30853, 30853, 30859, 30859, 30859, 30859, 30859, 30859, + 30869, 30869, 30869, 30869, 30869, 30869, 30869, 30869, + 30871, 30871, 30881, 30881, 30881, 30881, 30881, 30881, + 30881, 30881, 30881, 30893, 30893, 30893, 30893, 30893, + 30893, 30893, 30893, 30893, 30893, 30893, 30911, 30911, + 30911, 30911, 30911, 30911, 30911, 30911, 30911, 30911, + 30911, 30911, 30911, 30911, 30911, 30911, 30931, 30931, + 30931, 30931, 30931, 30931, 30931, 30931, 30931, 30931, + 30931, 30931, 30931, 30931, 30931, 30931, 30931, 30931, + 30937, 30937, 30937, 30937, 30937, 30941, 30941, 30941, + 30949, 30949, 30949, 30949, 30949, 30949, 30949, 30949, + 30971, 30971, 30971, 30971, 30971, 30971, 30971, 30971, + 30971, 30971, 30971, 30971, 30971, 30971, 30971, 30971, + 30971, 30971, 30971, 30977, 30977, 30977, 30977, 30977, + 30983, 30983, 30983, 30983, 30983, 30983, 31013, 31013, + 31013, 31013, 31013, 31013, 31013, 31013, 31013, 31013, + 31013, 31013, 31013, 31013, 31013, 31013, 31013, 31013, + 31013, 31013, 31013, 31013, 31013, 31013, 31013, 31013, + 31019, 31019, 31019, 31019, 31019, 31019, 31033, 31033, + 31033, 31033, 31033, 31033, 31033, 31033, 31033, 31033, + 31033, 31033, 31039, 31039, 31039, 31039, 31039, 31039, + 31051, 31051, 31051, 31051, 31051, 31051, 31051, 31051, + 31051, 31051, 31063, 31063, 31063, 31063, 31063, 31063, + 31063, 31063, 31063, 31063, 31063, 31069, 31069, 31069, + 31069, 31069, 31079, 31079, 31079, 31079, 31079, 31079, + 31079, 31079, 31079, 31081, 31081, 31091, 31091, 31091, + 31091, 31091, 31091, 31091, 31091, 31091, 31121, 31121, + 31121, 31121, 31121, 31121, 31121, 31121, 31121, 31121, + 31121, 31121, 31121, 31121, 31121, 31121, 31121, 31121, + 31121, 31121, 31121, 31121, 31121, 31121, 31121, 31121, + 31123, 31123, 31139, 31139, 31139, 31139, 31139, 31139, + 31139, 31139, 31139, 31139, 31139, 31139, 31139, 31139, + 31147, 31147, 31147, 31147, 31147, 31147, 31147, 31147, + 31151, 31151, 31151, 31153, 31153, 31159, 31159, 31159, + 31159, 31159, 31177, 31177, 31177, 31177, 31177, 31177, + 31177, 31177, 31177, 31177, 31177, 31177, 31177, 31177, + 31177, 31177, 31181, 31181, 31181, 31181, 31183, 31183, + 31189, 31189, 31189, 31189, 31189, 31193, 31193, 31193, + 31219, 31219, 31219, 31219, 31219, 31219, 31219, 31219, + 31219, 31219, 31219, 31219, 31219, 31219, 31219, 31219, + 31219, 31219, 31219, 31219, 31219, 31219, 31219, 31219, + 31223, 31223, 31223, 31231, 31231, 31231, 31231, 31231, + 31231, 31231, 31237, 31237, 31237, 31237, 31237, 31237, + 31247, 31247, 31247, 31247, 31247, 31247, 31247, 31247, + 31249, 31249, 31253, 31253, 31253, 31253, 31259, 31259, + 31259, 31259, 31259, 31267, 31267, 31267, 31267, 31267, + 31267, 31267, 31271, 31271, 31271, 31271, 31277, 31277, + 31277, 31277, 31277, 31307, 31307, 31307, 31307, 31307, + 31307, 31307, 31307, 31307, 31307, 31307, 31307, 31307, + 31307, 31307, 31307, 31307, 31307, 31307, 31307, 31307, + 31307, 31307, 31307, 31307, 31307, 31307, 31319, 31319, + 31319, 31319, 31319, 31319, 31319, 31319, 31319, 31319, + 31321, 31321, 31327, 31327, 31327, 31327, 31327, 31327, + 31333, 31333, 31333, 31333, 31333, 31337, 31337, 31337, + 31357, 31357, 31357, 31357, 31357, 31357, 31357, 31357, + 31357, 31357, 31357, 31357, 31357, 31357, 31357, 31357, + 31357, 31357, 31379, 31379, 31379, 31379, 31379, 31379, + 31379, 31379, 31379, 31379, 31379, 31379, 31379, 31379, + 31379, 31379, 31379, 31379, 31379, 31379, 31387, 31387, + 31387, 31387, 31387, 31387, 31387, 31391, 31391, 31391, + 31393, 31393, 31397, 31397, 31397, 31397, 31469, 31469, + 31469, 31469, 31469, 31469, 31469, 31469, 31469, 31469, + 31469, 31469, 31469, 31469, 31469, 31469, 31469, 31469, + 31469, 31469, 31469, 31469, 31469, 31469, 31469, 31469, + 31469, 31469, 31469, 31469, 31469, 31469, 31469, 31469, + 31469, 31469, 31469, 31469, 31469, 31469, 31469, 31469, + 31469, 31469, 31469, 31469, 31469, 31469, 31469, 31469, + 31469, 31469, 31469, 31469, 31469, 31469, 31469, 31469, + 31469, 31469, 31469, 31469, 31469, 31469, 31477, 31477, + 31477, 31477, 31477, 31477, 31477, 31481, 31481, 31481, + 31489, 31489, 31489, 31489, 31489, 31489, 31489, 31489, + 31511, 31511, 31511, 31511, 31511, 31511, 31511, 31511, + 31511, 31511, 31511, 31511, 31511, 31511, 31511, 31511, + 31511, 31511, 31511, 31513, 31513, 31517, 31517, 31517, + 31531, 31531, 31531, 31531, 31531, 31531, 31531, 31531, + 31531, 31531, 31531, 31531, 31531, 31541, 31541, 31541, + 31541, 31541, 31541, 31541, 31541, 31541, 31543, 31543, + 31547, 31547, 31547, 31567, 31567, 31567, 31567, 31567, + 31567, 31567, 31567, 31567, 31567, 31567, 31567, 31567, + 31567, 31567, 31567, 31567, 31567, 31573, 31573, 31573, + 31573, 31573, 31583, 31583, 31583, 31583, 31583, 31583, + 31583, 31583, 31583, 31601, 31601, 31601, 31601, 31601, + 31601, 31601, 31601, 31601, 31601, 31601, 31601, 31601, + 31601, 31601, 31601, 31607, 31607, 31607, 31607, 31607, + 31627, 31627, 31627, 31627, 31627, 31627, 31627, 31627, + 31627, 31627, 31627, 31627, 31627, 31627, 31627, 31627, + 31627, 31627, 31643, 31643, 31643, 31643, 31643, 31643, + 31643, 31643, 31643, 31643, 31643, 31643, 31643, 31643, + 31649, 31649, 31649, 31649, 31649, 31649, 31657, 31657, + 31657, 31657, 31657, 31657, 31657, 31663, 31663, 31663, + 31663, 31663, 31667, 31667, 31667, 31667, 31687, 31687, + 31687, 31687, 31687, 31687, 31687, 31687, 31687, 31687, + 31687, 31687, 31687, 31687, 31687, 31687, 31687, 31687, + 31699, 31699, 31699, 31699, 31699, 31699, 31699, 31699, + 31699, 31699, 31721, 31721, 31721, 31721, 31721, 31721, + 31721, 31721, 31721, 31721, 31721, 31721, 31721, 31721, + 31721, 31721, 31721, 31721, 31721, 31721, 31723, 31723, + 31727, 31727, 31727, 31729, 31729, 31741, 31741, 31741, + 31741, 31741, 31741, 31741, 31741, 31741, 31741, 31741, + 31751, 31751, 31751, 31751, 31751, 31751, 31751, 31751, + 31769, 31769, 31769, 31769, 31769, 31769, 31769, 31769, + 31769, 31769, 31769, 31769, 31769, 31769, 31769, 31769, + 31771, 31771, 31793, 31793, 31793, 31793, 31793, 31793, + 31793, 31793, 31793, 31793, 31793, 31793, 31793, 31793, + 31793, 31793, 31793, 31793, 31793, 31793, 31799, 31799, + 31799, 31799, 31799, 31817, 31817, 31817, 31817, 31817, + 31817, 31817, 31817, 31817, 31817, 31817, 31817, 31817, + 31817, 31817, 31817, 31847, 31847, 31847, 31847, 31847, + 31847, 31847, 31847, 31847, 31847, 31847, 31847, 31847, + 31847, 31847, 31847, 31847, 31847, 31847, 31847, 31847, + 31847, 31847, 31847, 31847, 31847, 31847, 31849, 31849, + 31859, 31859, 31859, 31859, 31859, 31859, 31859, 31859, + 31873, 31873, 31873, 31873, 31873, 31873, 31873, 31873, + 31873, 31873, 31873, 31873, 31873, 31883, 31883, 31883, + 31883, 31883, 31883, 31883, 31883, 31883, 31891, 31891, + 31891, 31891, 31891, 31891, 31891, 31907, 31907, 31907, + 31907, 31907, 31907, 31907, 31907, 31907, 31907, 31907, + 31907, 31907, 31907, 31957, 31957, 31957, 31957, 31957, + 31957, 31957, 31957, 31957, 31957, 31957, 31957, 31957, + 31957, 31957, 31957, 31957, 31957, 31957, 31957, 31957, + 31957, 31957, 31957, 31957, 31957, 31957, 31957, 31957, + 31957, 31957, 31957, 31957, 31957, 31957, 31957, 31957, + 31957, 31957, 31957, 31957, 31957, 31957, 31957, 31957, + 31963, 31963, 31963, 31963, 31963, 31973, 31973, 31973, + 31973, 31973, 31973, 31973, 31973, 31973, 31981, 31981, + 31981, 31981, 31981, 31981, 31981, 31991, 31991, 31991, + 31991, 31991, 31991, 31991, 31991, 31991, 32003, 32003, + 32003, 32003, 32003, 32003, 32003, 32003, 32003, 32003, + 32009, 32009, 32009, 32009, 32009, 32009, 32027, 32027, + 32027, 32027, 32027, 32027, 32027, 32027, 32027, 32027, + 32027, 32027, 32027, 32027, 32027, 32027, 32029, 32029, + 32051, 32051, 32051, 32051, 32051, 32051, 32051, 32051, + 32051, 32051, 32051, 32051, 32051, 32051, 32051, 32051, + 32051, 32051, 32051, 32057, 32057, 32057, 32057, 32057, + 32059, 32059, 32063, 32063, 32063, 32063, 32069, 32069, + 32069, 32069, 32069, 32077, 32077, 32077, 32077, 32077, + 32077, 32077, 32083, 32083, 32083, 32083, 32083, 32083, + 32089, 32089, 32089, 32089, 32089, 32099, 32099, 32099, + 32099, 32099, 32099, 32099, 32099, 32099, 32117, 32117, + 32117, 32117, 32117, 32117, 32117, 32117, 32117, 32117, + 32117, 32117, 32117, 32117, 32117, 32117, 32119, 32119, + 32141, 32141, 32141, 32141, 32141, 32141, 32141, 32141, + 32141, 32141, 32141, 32141, 32141, 32141, 32141, 32141, + 32141, 32141, 32141, 32143, 32143, 32159, 32159, 32159, + 32159, 32159, 32159, 32159, 32159, 32159, 32159, 32159, + 32159, 32159, 32159, 32173, 32173, 32173, 32173, 32173, + 32173, 32173, 32173, 32173, 32173, 32173, 32173, 32173, + 32183, 32183, 32183, 32183, 32183, 32183, 32183, 32183, + 32189, 32189, 32189, 32189, 32189, 32189, 32191, 32191, + 32203, 32203, 32203, 32203, 32203, 32203, 32203, 32203, + 32203, 32203, 32213, 32213, 32213, 32213, 32213, 32213, + 32213, 32213, 32213, 32233, 32233, 32233, 32233, 32233, + 32233, 32233, 32233, 32233, 32233, 32233, 32233, 32233, + 32233, 32233, 32233, 32233, 32233, 32237, 32237, 32237, + 32251, 32251, 32251, 32251, 32251, 32251, 32251, 32251, + 32251, 32251, 32251, 32251, 32251, 32257, 32257, 32257, + 32257, 32257, 32261, 32261, 32261, 32261, 32297, 32297, + 32297, 32297, 32297, 32297, 32297, 32297, 32297, 32297, + 32297, 32297, 32297, 32297, 32297, 32297, 32297, 32297, + 32297, 32297, 32297, 32297, 32297, 32297, 32297, 32297, + 32297, 32297, 32297, 32297, 32297, 32297, 32299, 32299, + 32303, 32303, 32303, 32309, 32309, 32309, 32309, 32309, + 32321, 32321, 32321, 32321, 32321, 32321, 32321, 32321, + 32321, 32321, 32321, 32323, 32323, 32327, 32327, 32327, + 32341, 32341, 32341, 32341, 32341, 32341, 32341, 32341, + 32341, 32341, 32341, 32341, 32341, 32353, 32353, 32353, + 32353, 32353, 32353, 32353, 32353, 32353, 32353, 32353, + 32359, 32359, 32359, 32359, 32359, 32363, 32363, 32363, + 32369, 32369, 32369, 32369, 32369, 32369, 32371, 32371, + 32377, 32377, 32377, 32377, 32377, 32381, 32381, 32381, + 32401, 32401, 32401, 32401, 32401, 32401, 32401, 32401, + 32401, 32401, 32401, 32401, 32401, 32401, 32401, 32401, + 32401, 32401, 32411, 32411, 32411, 32411, 32411, 32411, + 32411, 32411, 32411, 32413, 32413, 32423, 32423, 32423, + 32423, 32423, 32423, 32423, 32423, 32423, 32429, 32429, + 32429, 32429, 32429, 32441, 32441, 32441, 32441, 32441, + 32441, 32441, 32441, 32441, 32441, 32441, 32443, 32443, + 32467, 32467, 32467, 32467, 32467, 32467, 32467, 32467, + 32467, 32467, 32467, 32467, 32467, 32467, 32467, 32467, + 32467, 32467, 32467, 32467, 32467, 32479, 32479, 32479, + 32479, 32479, 32479, 32479, 32479, 32479, 32479, 32479, + 32491, 32491, 32491, 32491, 32491, 32491, 32491, 32491, + 32491, 32491, 32497, 32497, 32497, 32497, 32497, 32497, + 32503, 32503, 32503, 32503, 32503, 32507, 32507, 32507, + 32531, 32531, 32531, 32531, 32531, 32531, 32531, 32531, + 32531, 32531, 32531, 32531, 32531, 32531, 32531, 32531, + 32531, 32531, 32531, 32531, 32531, 32531, 32533, 32533, + 32537, 32537, 32537, 32561, 32561, 32561, 32561, 32561, + 32561, 32561, 32561, 32561, 32561, 32561, 32561, 32561, + 32561, 32561, 32561, 32561, 32561, 32561, 32561, 32561, + 32563, 32563, 32569, 32569, 32569, 32569, 32569, 32569, + 32573, 32573, 32573, 32579, 32579, 32579, 32579, 32579, + 32587, 32587, 32587, 32587, 32587, 32587, 32587, 32587, + 32603, 32603, 32603, 32603, 32603, 32603, 32603, 32603, + 32603, 32603, 32603, 32603, 32603, 32603, 32609, 32609, + 32609, 32609, 32609, 32611, 32611, 32621, 32621, 32621, + 32621, 32621, 32621, 32621, 32621, 32621, 32633, 32633, + 32633, 32633, 32633, 32633, 32633, 32633, 32633, 32633, + 32647, 32647, 32647, 32647, 32647, 32647, 32647, 32647, + 32647, 32647, 32647, 32647, 32647, 32653, 32653, 32653, + 32653, 32653, 32687, 32687, 32687, 32687, 32687, 32687, + 32687, 32687, 32687, 32687, 32687, 32687, 32687, 32687, + 32687, 32687, 32687, 32687, 32687, 32687, 32687, 32687, + 32687, 32687, 32687, 32687, 32687, 32687, 32687, 32687, + 32693, 32693, 32693, 32693, 32693, 32693, 32707, 32707, + 32707, 32707, 32707, 32707, 32707, 32707, 32707, 32707, + 32707, 32707, 32713, 32713, 32713, 32713, 32713, 32713, + 32717, 32717, 32717, 32719, 32719, 32749, 32749, 32749, + 32749, 32749, 32749, 32749, 32749, 32749, 32749, 32749, + 32749, 32749, 32749, 32749, 32749, 32749, 32749, 32749, + 32749, 32749, 32749, 32749, 32749, 32749, 32749, 32749, + 32771, 32771, 32771, 32771, 32771, 32771, 32771, 32771, + 32771, 32771, 32771, 32771, 32771, 32771, 32771, 32771, + 32771, 32771, 32771, 32779, 32779, 32779, 32779, 32779, + 32779, 32779, 32783, 32783, 32783, 32783, 32789, 32789, + 32789, 32789, 32789, 32797, 32797, 32797, 32797, 32797, + 32797, 32797, 32801, 32801, 32801, 32801, 32803, 32803, + 32831, 32831, 32831, 32831, 32831, 32831, 32831, 32831, + 32831, 32831, 32831, 32831, 32831, 32831, 32831, 32831, + 32831, 32831, 32831, 32831, 32831, 32831, 32831, 32831, + 32833, 32833, 32839, 32839, 32839, 32839, 32839, 32839, + 32843, 32843, 32843, 32869, 32869, 32869, 32869, 32869, + 32869, 32869, 32869, 32869, 32869, 32869, 32869, 32869, + 32869, 32869, 32869, 32869, 32869, 32869, 32869, 32869, + 32869, 32869, 32887, 32887, 32887, 32887, 32887, 32887, + 32887, 32887, 32887, 32887, 32887, 32887, 32887, 32887, + 32887, 32887, 32909, 32909, 32909, 32909, 32909, 32909, + 32909, 32909, 32909, 32909, 32909, 32909, 32909, 32909, + 32909, 32909, 32909, 32909, 32909, 32909, 32911, 32911, + 32917, 32917, 32917, 32917, 32917, 32933, 32933, 32933, + 32933, 32933, 32933, 32933, 32933, 32933, 32933, 32933, + 32933, 32933, 32933, 32939, 32939, 32939, 32939, 32939, + 32941, 32941, 32957, 32957, 32957, 32957, 32957, 32957, + 32957, 32957, 32957, 32957, 32957, 32957, 32957, 32957, + 32969, 32969, 32969, 32969, 32969, 32969, 32969, 32969, + 32969, 32969, 32969, 32971, 32971, 32983, 32983, 32983, + 32983, 32983, 32983, 32983, 32983, 32983, 32983, 32983, + 32987, 32987, 32987, 32993, 32993, 32993, 32993, 32993, + 32999, 32999, 32999, 32999, 32999, 32999, 33013, 33013, + 33013, 33013, 33013, 33013, 33013, 33013, 33013, 33013, + 33013, 33013, 33023, 33023, 33023, 33023, 33023, 33023, + 33023, 33023, 33023, 33029, 33029, 33029, 33029, 33029, + 33037, 33037, 33037, 33037, 33037, 33037, 33037, 33037, + 33049, 33049, 33049, 33049, 33049, 33049, 33049, 33049, + 33049, 33049, 33053, 33053, 33053, 33053, 33071, 33071, + 33071, 33071, 33071, 33071, 33071, 33071, 33071, 33071, + 33071, 33071, 33071, 33071, 33071, 33071, 33073, 33073, + 33083, 33083, 33083, 33083, 33083, 33083, 33083, 33083, + 33091, 33091, 33091, 33091, 33091, 33091, 33091, 33091, + 33107, 33107, 33107, 33107, 33107, 33107, 33107, 33107, + 33107, 33107, 33107, 33107, 33107, 33107, 33113, 33113, + 33113, 33113, 33113, 33119, 33119, 33119, 33119, 33119, + 33149, 33149, 33149, 33149, 33149, 33149, 33149, 33149, + 33149, 33149, 33149, 33149, 33149, 33149, 33149, 33149, + 33149, 33149, 33149, 33149, 33149, 33149, 33149, 33149, + 33149, 33149, 33149, 33151, 33151, 33161, 33161, 33161, + 33161, 33161, 33161, 33161, 33161, 33161, 33179, 33179, + 33179, 33179, 33179, 33179, 33179, 33179, 33179, 33179, + 33179, 33179, 33179, 33179, 33179, 33179, 33181, 33181, + 33191, 33191, 33191, 33191, 33191, 33191, 33191, 33191, + 33199, 33199, 33199, 33199, 33199, 33199, 33199, 33199, + 33203, 33203, 33203, 33211, 33211, 33211, 33211, 33211, + 33211, 33211, 33223, 33223, 33223, 33223, 33223, 33223, + 33223, 33223, 33223, 33223, 33223, 33247, 33247, 33247, + 33247, 33247, 33247, 33247, 33247, 33247, 33247, 33247, + 33247, 33247, 33247, 33247, 33247, 33247, 33247, 33247, + 33247, 33247, 33287, 33287, 33287, 33287, 33287, 33287, + 33287, 33287, 33287, 33287, 33287, 33287, 33287, 33287, + 33287, 33287, 33287, 33287, 33287, 33287, 33287, 33287, + 33287, 33287, 33287, 33287, 33287, 33287, 33287, 33287, + 33287, 33287, 33287, 33287, 33287, 33287, 33289, 33289, + 33301, 33301, 33301, 33301, 33301, 33301, 33301, 33301, + 33301, 33301, 33311, 33311, 33311, 33311, 33311, 33311, + 33311, 33311, 33311, 33317, 33317, 33317, 33317, 33317, + 33329, 33329, 33329, 33329, 33329, 33329, 33329, 33329, + 33329, 33329, 33329, 33331, 33331, 33343, 33343, 33343, + 33343, 33343, 33343, 33343, 33343, 33343, 33343, 33343, + 33347, 33347, 33347, 33349, 33349, 33353, 33353, 33353, + 33359, 33359, 33359, 33359, 33359, 33359, 33377, 33377, + 33377, 33377, 33377, 33377, 33377, 33377, 33377, 33377, + 33377, 33377, 33377, 33377, 33377, 33377, 33391, 33391, + 33391, 33391, 33391, 33391, 33391, 33391, 33391, 33391, + 33391, 33391, 33403, 33403, 33403, 33403, 33403, 33403, + 33403, 33403, 33403, 33403, 33403, 33409, 33409, 33409, + 33409, 33409, 33413, 33413, 33413, 33413, 33427, 33427, + 33427, 33427, 33427, 33427, 33427, 33427, 33427, 33427, + 33427, 33427, 33457, 33457, 33457, 33457, 33457, 33457, + 33457, 33457, 33457, 33457, 33457, 33457, 33457, 33457, + 33457, 33457, 33457, 33457, 33457, 33457, 33457, 33457, + 33457, 33457, 33457, 33457, 33457, 33461, 33461, 33461, + 33469, 33469, 33469, 33469, 33469, 33469, 33469, 33469, + 33479, 33479, 33479, 33479, 33479, 33479, 33479, 33479, + 33487, 33487, 33487, 33487, 33487, 33487, 33487, 33487, + 33493, 33493, 33493, 33493, 33493, 33503, 33503, 33503, + 33503, 33503, 33503, 33503, 33503, 33503, 33521, 33521, + 33521, 33521, 33521, 33521, 33521, 33521, 33521, 33521, + 33521, 33521, 33521, 33521, 33521, 33521, 33529, 33529, + 33529, 33529, 33529, 33529, 33529, 33533, 33533, 33533, + 33547, 33547, 33547, 33547, 33547, 33547, 33547, 33547, + 33547, 33547, 33547, 33547, 33547, 33563, 33563, 33563, + 33563, 33563, 33563, 33563, 33563, 33563, 33563, 33563, + 33563, 33563, 33563, 33569, 33569, 33569, 33569, 33569, + 33577, 33577, 33577, 33577, 33577, 33577, 33577, 33577, + 33581, 33581, 33581, 33587, 33587, 33587, 33587, 33587, + 33589, 33589, 33599, 33599, 33599, 33599, 33599, 33599, + 33599, 33599, 33599, 33601, 33601, 33613, 33613, 33613, + 33613, 33613, 33613, 33613, 33613, 33613, 33613, 33613, + 33617, 33617, 33617, 33619, 33619, 33623, 33623, 33623, + 33629, 33629, 33629, 33629, 33629, 33629, 33637, 33637, + 33637, 33637, 33637, 33637, 33637, 33641, 33641, 33641, + 33647, 33647, 33647, 33647, 33647, 33647, 33679, 33679, + 33679, 33679, 33679, 33679, 33679, 33679, 33679, 33679, + 33679, 33679, 33679, 33679, 33679, 33679, 33679, 33679, + 33679, 33679, 33679, 33679, 33679, 33679, 33679, 33679, + 33679, 33679, 33703, 33703, 33703, 33703, 33703, 33703, + 33703, 33703, 33703, 33703, 33703, 33703, 33703, 33703, + 33703, 33703, 33703, 33703, 33703, 33703, 33703, 33703, + 33713, 33713, 33713, 33713, 33713, 33713, 33713, 33713, + 33721, 33721, 33721, 33721, 33721, 33721, 33721, 33721, + 33739, 33739, 33739, 33739, 33739, 33739, 33739, 33739, + 33739, 33739, 33739, 33739, 33739, 33739, 33739, 33739, + 33749, 33749, 33749, 33749, 33749, 33749, 33749, 33749, + 33751, 33751, 33757, 33757, 33757, 33757, 33757, 33757, + 33767, 33767, 33767, 33767, 33767, 33767, 33767, 33767, + 33769, 33769, 33773, 33773, 33773, 33773, 33791, 33791, + 33791, 33791, 33791, 33791, 33791, 33791, 33791, 33791, + 33791, 33791, 33791, 33791, 33791, 33791, 33797, 33797, + 33797, 33797, 33797, 33809, 33809, 33809, 33809, 33809, + 33809, 33809, 33809, 33809, 33809, 33809, 33811, 33811, + 33827, 33827, 33827, 33827, 33827, 33827, 33827, 33827, + 33827, 33827, 33827, 33827, 33827, 33827, 33829, 33829, + 33851, 33851, 33851, 33851, 33851, 33851, 33851, 33851, + 33851, 33851, 33851, 33851, 33851, 33851, 33851, 33851, + 33851, 33851, 33851, 33857, 33857, 33857, 33857, 33857, + 33863, 33863, 33863, 33863, 33863, 33863, 33871, 33871, + 33871, 33871, 33871, 33871, 33871, 33889, 33889, 33889, + 33889, 33889, 33889, 33889, 33889, 33889, 33889, 33889, + 33889, 33889, 33889, 33889, 33889, 33893, 33893, 33893, + 33911, 33911, 33911, 33911, 33911, 33911, 33911, 33911, + 33911, 33911, 33911, 33911, 33911, 33911, 33911, 33911, + 33923, 33923, 33923, 33923, 33923, 33923, 33923, 33923, + 33923, 33923, 33923, 33931, 33931, 33931, 33931, 33931, + 33931, 33931, 33937, 33937, 33937, 33937, 33937, 33937, + 33941, 33941, 33941, 33961, 33961, 33961, 33961, 33961, + 33961, 33961, 33961, 33961, 33961, 33961, 33961, 33961, + 33961, 33961, 33961, 33961, 33961, 33967, 33967, 33967, + 33967, 33967, 33997, 33997, 33997, 33997, 33997, 33997, + 33997, 33997, 33997, 33997, 33997, 33997, 33997, 33997, + 33997, 33997, 33997, 33997, 33997, 33997, 33997, 33997, + 33997, 33997, 33997, 33997, 33997, 34019, 34019, 34019, + 34019, 34019, 34019, 34019, 34019, 34019, 34019, 34019, + 34019, 34019, 34019, 34019, 34019, 34019, 34019, 34019, + 34031, 34031, 34031, 34031, 34031, 34031, 34031, 34031, + 34031, 34031, 34031, 34033, 34033, 34039, 34039, 34039, + 34039, 34039, 34057, 34057, 34057, 34057, 34057, 34057, + 34057, 34057, 34057, 34057, 34057, 34057, 34057, 34057, + 34057, 34057, 34061, 34061, 34061, 34061, 34123, 34123, + 34123, 34123, 34123, 34123, 34123, 34123, 34123, 34123, + 34123, 34123, 34123, 34123, 34123, 34123, 34123, 34123, + 34123, 34123, 34123, 34123, 34123, 34123, 34123, 34123, + 34123, 34123, 34123, 34123, 34123, 34123, 34123, 34123, + 34123, 34123, 34123, 34123, 34123, 34123, 34123, 34123, + 34123, 34123, 34123, 34123, 34123, 34123, 34123, 34123, + 34123, 34123, 34123, 34123, 34123, 34127, 34127, 34127, + 34129, 34129, 34141, 34141, 34141, 34141, 34141, 34141, + 34141, 34141, 34141, 34141, 34141, 34147, 34147, 34147, + 34147, 34147, 34157, 34157, 34157, 34157, 34157, 34157, + 34157, 34157, 34157, 34159, 34159, 34171, 34171, 34171, + 34171, 34171, 34171, 34171, 34171, 34171, 34171, 34171, + 34183, 34183, 34183, 34183, 34183, 34183, 34183, 34183, + 34183, 34183, 34211, 34211, 34211, 34211, 34211, 34211, + 34211, 34211, 34211, 34211, 34211, 34211, 34211, 34211, + 34211, 34211, 34211, 34211, 34211, 34211, 34211, 34211, + 34211, 34211, 34211, 34213, 34213, 34217, 34217, 34217, + 34231, 34231, 34231, 34231, 34231, 34231, 34231, 34231, + 34231, 34231, 34231, 34231, 34231, 34253, 34253, 34253, + 34253, 34253, 34253, 34253, 34253, 34253, 34253, 34253, + 34253, 34253, 34253, 34253, 34253, 34253, 34253, 34253, + 34259, 34259, 34259, 34259, 34259, 34259, 34261, 34261, + 34267, 34267, 34267, 34267, 34267, 34273, 34273, 34273, + 34273, 34273, 34283, 34283, 34283, 34283, 34283, 34283, + 34283, 34283, 34283, 34297, 34297, 34297, 34297, 34297, + 34297, 34297, 34297, 34297, 34297, 34297, 34297, 34297, + 34301, 34301, 34301, 34303, 34303, 34313, 34313, 34313, + 34313, 34313, 34313, 34313, 34313, 34313, 34319, 34319, + 34319, 34319, 34319, 34327, 34327, 34327, 34327, 34327, + 34327, 34327, 34337, 34337, 34337, 34337, 34337, 34337, + 34337, 34337, 34337, 34351, 34351, 34351, 34351, 34351, + 34351, 34351, 34351, 34351, 34351, 34351, 34351, 34351, + 34361, 34361, 34361, 34361, 34361, 34361, 34361, 34361, + 34367, 34367, 34367, 34367, 34367, 34367, 34369, 34369, + 34381, 34381, 34381, 34381, 34381, 34381, 34381, 34381, + 34381, 34381, 34403, 34403, 34403, 34403, 34403, 34403, + 34403, 34403, 34403, 34403, 34403, 34403, 34403, 34403, + 34403, 34403, 34403, 34403, 34403, 34403, 34421, 34421, + 34421, 34421, 34421, 34421, 34421, 34421, 34421, 34421, + 34421, 34421, 34421, 34421, 34421, 34421, 34429, 34429, + 34429, 34429, 34429, 34429, 34429, 34439, 34439, 34439, + 34439, 34439, 34439, 34439, 34439, 34439, 34457, 34457, + 34457, 34457, 34457, 34457, 34457, 34457, 34457, 34457, + 34457, 34457, 34457, 34457, 34457, 34457, 34469, 34469, + 34469, 34469, 34469, 34469, 34469, 34469, 34469, 34469, + 34471, 34471, 34483, 34483, 34483, 34483, 34483, 34483, + 34483, 34483, 34483, 34483, 34483, 34487, 34487, 34487, + 34499, 34499, 34499, 34499, 34499, 34499, 34499, 34499, + 34499, 34499, 34499, 34501, 34501, 34511, 34511, 34511, + 34511, 34511, 34511, 34511, 34511, 34511, 34513, 34513, + 34519, 34519, 34519, 34519, 34519, 34537, 34537, 34537, + 34537, 34537, 34537, 34537, 34537, 34537, 34537, 34537, + 34537, 34537, 34537, 34537, 34537, 34543, 34543, 34543, + 34543, 34543, 34549, 34549, 34549, 34549, 34549, 34549, + 34583, 34583, 34583, 34583, 34583, 34583, 34583, 34583, + 34583, 34583, 34583, 34583, 34583, 34583, 34583, 34583, + 34583, 34583, 34583, 34583, 34583, 34583, 34583, 34583, + 34583, 34583, 34583, 34583, 34583, 34583, 34589, 34589, + 34589, 34589, 34589, 34591, 34591, 34603, 34603, 34603, + 34603, 34603, 34603, 34603, 34603, 34603, 34603, 34603, + 34607, 34607, 34607, 34613, 34613, 34613, 34613, 34613, + 34631, 34631, 34631, 34631, 34631, 34631, 34631, 34631, + 34631, 34631, 34631, 34631, 34631, 34631, 34631, 34631, + 34649, 34649, 34649, 34649, 34649, 34649, 34649, 34649, + 34649, 34649, 34649, 34649, 34649, 34649, 34649, 34649, + 34651, 34651, 34667, 34667, 34667, 34667, 34667, 34667, + 34667, 34667, 34667, 34667, 34667, 34667, 34667, 34667, + 34673, 34673, 34673, 34673, 34673, 34673, 34679, 34679, + 34679, 34679, 34679, 34687, 34687, 34687, 34687, 34687, + 34687, 34687, 34693, 34693, 34693, 34693, 34693, 34693, + 34703, 34703, 34703, 34703, 34703, 34703, 34703, 34703, + 34721, 34721, 34721, 34721, 34721, 34721, 34721, 34721, + 34721, 34721, 34721, 34721, 34721, 34721, 34721, 34721, + 34729, 34729, 34729, 34729, 34729, 34729, 34729, 34729, + 34739, 34739, 34739, 34739, 34739, 34739, 34739, 34739, + 34747, 34747, 34747, 34747, 34747, 34747, 34747, 34747, + 34757, 34757, 34757, 34757, 34757, 34757, 34757, 34757, + 34759, 34759, 34763, 34763, 34763, 34763, 34781, 34781, + 34781, 34781, 34781, 34781, 34781, 34781, 34781, 34781, + 34781, 34781, 34781, 34781, 34781, 34781, 34807, 34807, + 34807, 34807, 34807, 34807, 34807, 34807, 34807, 34807, + 34807, 34807, 34807, 34807, 34807, 34807, 34807, 34807, + 34807, 34807, 34807, 34807, 34807, 34819, 34819, 34819, + 34819, 34819, 34819, 34819, 34819, 34819, 34819, 34819, + 34841, 34841, 34841, 34841, 34841, 34841, 34841, 34841, + 34841, 34841, 34841, 34841, 34841, 34841, 34841, 34841, + 34841, 34841, 34841, 34843, 34843, 34847, 34847, 34847, + 34849, 34849, 34871, 34871, 34871, 34871, 34871, 34871, + 34871, 34871, 34871, 34871, 34871, 34871, 34871, 34871, + 34871, 34871, 34871, 34871, 34871, 34871, 34877, 34877, + 34877, 34877, 34877, 34883, 34883, 34883, 34883, 34883, + 34897, 34897, 34897, 34897, 34897, 34897, 34897, 34897, + 34897, 34897, 34897, 34897, 34897, 34913, 34913, 34913, + 34913, 34913, 34913, 34913, 34913, 34913, 34913, 34913, + 34913, 34913, 34913, 34919, 34919, 34919, 34919, 34919, + 34939, 34939, 34939, 34939, 34939, 34939, 34939, 34939, + 34939, 34939, 34939, 34939, 34939, 34939, 34939, 34939, + 34939, 34939, 34949, 34949, 34949, 34949, 34949, 34949, + 34949, 34949, 34949, 34961, 34961, 34961, 34961, 34961, + 34961, 34961, 34961, 34961, 34961, 34961, 34963, 34963, + 34981, 34981, 34981, 34981, 34981, 34981, 34981, 34981, + 34981, 34981, 34981, 34981, 34981, 34981, 34981, 34981, + 35023, 35023, 35023, 35023, 35023, 35023, 35023, 35023, + 35023, 35023, 35023, 35023, 35023, 35023, 35023, 35023, + 35023, 35023, 35023, 35023, 35023, 35023, 35023, 35023, + 35023, 35023, 35023, 35023, 35023, 35023, 35023, 35023, + 35023, 35023, 35023, 35023, 35023, 35027, 35027, 35027, + 35051, 35051, 35051, 35051, 35051, 35051, 35051, 35051, + 35051, 35051, 35051, 35051, 35051, 35051, 35051, 35051, + 35051, 35051, 35051, 35051, 35051, 35051, 35053, 35053, + 35059, 35059, 35059, 35059, 35059, 35069, 35069, 35069, + 35069, 35069, 35069, 35069, 35069, 35069, 35081, 35081, + 35081, 35081, 35081, 35081, 35081, 35081, 35081, 35081, + 35083, 35083, 35089, 35089, 35089, 35089, 35089, 35089, + 35099, 35099, 35099, 35099, 35099, 35099, 35099, 35099, + 35107, 35107, 35107, 35107, 35107, 35107, 35107, 35107, + 35111, 35111, 35111, 35117, 35117, 35117, 35117, 35117, + 35129, 35129, 35129, 35129, 35129, 35129, 35129, 35129, + 35129, 35129, 35129, 35141, 35141, 35141, 35141, 35141, + 35141, 35141, 35141, 35141, 35141, 35141, 35149, 35149, + 35149, 35149, 35149, 35149, 35149, 35153, 35153, 35153, + 35159, 35159, 35159, 35159, 35159, 35159, 35171, 35171, + 35171, 35171, 35171, 35171, 35171, 35171, 35171, 35171, + 35201, 35201, 35201, 35201, 35201, 35201, 35201, 35201, + 35201, 35201, 35201, 35201, 35201, 35201, 35201, 35201, + 35201, 35201, 35201, 35201, 35201, 35201, 35201, 35201, + 35201, 35201, 35201, 35221, 35221, 35221, 35221, 35221, + 35221, 35221, 35221, 35221, 35221, 35221, 35221, 35221, + 35221, 35221, 35221, 35221, 35221, 35227, 35227, 35227, + 35227, 35227, 35251, 35251, 35251, 35251, 35251, 35251, + 35251, 35251, 35251, 35251, 35251, 35251, 35251, 35251, + 35251, 35251, 35251, 35251, 35251, 35251, 35251, 35251, + 35257, 35257, 35257, 35257, 35257, 35267, 35267, 35267, + 35267, 35267, 35267, 35267, 35267, 35267, 35279, 35279, + 35279, 35279, 35279, 35279, 35279, 35279, 35279, 35279, + 35281, 35281, 35291, 35291, 35291, 35291, 35291, 35291, + 35291, 35291, 35291, 35311, 35311, 35311, 35311, 35311, + 35311, 35311, 35311, 35311, 35311, 35311, 35311, 35311, + 35311, 35311, 35311, 35311, 35311, 35317, 35317, 35317, + 35317, 35317, 35323, 35323, 35323, 35323, 35323, 35323, + 35327, 35327, 35327, 35339, 35339, 35339, 35339, 35339, + 35339, 35339, 35339, 35339, 35339, 35339, 35353, 35353, + 35353, 35353, 35353, 35353, 35353, 35353, 35353, 35353, + 35353, 35353, 35363, 35363, 35363, 35363, 35363, 35363, + 35363, 35363, 35363, 35381, 35381, 35381, 35381, 35381, + 35381, 35381, 35381, 35381, 35381, 35381, 35381, 35381, + 35381, 35381, 35381, 35393, 35393, 35393, 35393, 35393, + 35393, 35393, 35393, 35393, 35393, 35393, 35401, 35401, + 35401, 35401, 35401, 35401, 35401, 35407, 35407, 35407, + 35407, 35407, 35419, 35419, 35419, 35419, 35419, 35419, + 35419, 35419, 35419, 35419, 35419, 35423, 35423, 35423, + 35437, 35437, 35437, 35437, 35437, 35437, 35437, 35437, + 35437, 35437, 35437, 35437, 35437, 35447, 35447, 35447, + 35447, 35447, 35447, 35447, 35447, 35447, 35449, 35449, + 35461, 35461, 35461, 35461, 35461, 35461, 35461, 35461, + 35461, 35461, 35491, 35491, 35491, 35491, 35491, 35491, + 35491, 35491, 35491, 35491, 35491, 35491, 35491, 35491, + 35491, 35491, 35491, 35491, 35491, 35491, 35491, 35491, + 35491, 35491, 35491, 35491, 35491, 35507, 35507, 35507, + 35507, 35507, 35507, 35507, 35507, 35507, 35507, 35507, + 35507, 35507, 35507, 35509, 35509, 35521, 35521, 35521, + 35521, 35521, 35521, 35521, 35521, 35521, 35521, 35521, + 35527, 35527, 35527, 35527, 35527, 35531, 35531, 35531, + 35533, 35533, 35537, 35537, 35537, 35537, 35543, 35543, + 35543, 35543, 35543, 35569, 35569, 35569, 35569, 35569, + 35569, 35569, 35569, 35569, 35569, 35569, 35569, 35569, + 35569, 35569, 35569, 35569, 35569, 35569, 35569, 35569, + 35569, 35569, 35573, 35573, 35573, 35573, 35591, 35591, + 35591, 35591, 35591, 35591, 35591, 35591, 35591, 35591, + 35591, 35591, 35591, 35591, 35591, 35591, 35593, 35593, + 35597, 35597, 35597, 35603, 35603, 35603, 35603, 35603, + 35617, 35617, 35617, 35617, 35617, 35617, 35617, 35617, + 35617, 35617, 35617, 35617, 35617, 35671, 35671, 35671, + 35671, 35671, 35671, 35671, 35671, 35671, 35671, 35671, + 35671, 35671, 35671, 35671, 35671, 35671, 35671, 35671, + 35671, 35671, 35671, 35671, 35671, 35671, 35671, 35671, + 35671, 35671, 35671, 35671, 35671, 35671, 35671, 35671, + 35671, 35671, 35671, 35671, 35671, 35671, 35671, 35671, + 35671, 35671, 35671, 35671, 35671, 35677, 35677, 35677, + 35677, 35677, 35729, 35729, 35729, 35729, 35729, 35729, + 35729, 35729, 35729, 35729, 35729, 35729, 35729, 35729, + 35729, 35729, 35729, 35729, 35729, 35729, 35729, 35729, + 35729, 35729, 35729, 35729, 35729, 35729, 35729, 35729, + 35729, 35729, 35729, 35729, 35729, 35729, 35729, 35729, + 35729, 35729, 35729, 35729, 35729, 35729, 35729, 35729, + 35731, 35731, 35747, 35747, 35747, 35747, 35747, 35747, + 35747, 35747, 35747, 35747, 35747, 35747, 35747, 35747, + 35753, 35753, 35753, 35753, 35753, 35753, 35759, 35759, + 35759, 35759, 35759, 35771, 35771, 35771, 35771, 35771, + 35771, 35771, 35771, 35771, 35771, 35771, 35797, 35797, + 35797, 35797, 35797, 35797, 35797, 35797, 35797, 35797, + 35797, 35797, 35797, 35797, 35797, 35797, 35797, 35797, + 35797, 35797, 35797, 35797, 35797, 35801, 35801, 35801, + 35803, 35803, 35809, 35809, 35809, 35809, 35809, 35809, + 35831, 35831, 35831, 35831, 35831, 35831, 35831, 35831, + 35831, 35831, 35831, 35831, 35831, 35831, 35831, 35831, + 35831, 35831, 35831, 35837, 35837, 35837, 35837, 35837, + 35839, 35839, 35851, 35851, 35851, 35851, 35851, 35851, + 35851, 35851, 35851, 35851, 35851, 35863, 35863, 35863, + 35863, 35863, 35863, 35863, 35863, 35863, 35863, 35863, + 35869, 35869, 35869, 35869, 35869, 35879, 35879, 35879, + 35879, 35879, 35879, 35879, 35879, 35879, 35897, 35897, + 35897, 35897, 35897, 35897, 35897, 35897, 35897, 35897, + 35897, 35897, 35897, 35897, 35897, 35897, 35899, 35899, + 35911, 35911, 35911, 35911, 35911, 35911, 35911, 35911, + 35911, 35911, 35923, 35923, 35923, 35923, 35923, 35923, + 35923, 35923, 35923, 35923, 35923, 35933, 35933, 35933, + 35933, 35933, 35933, 35933, 35933, 35933, 35951, 35951, + 35951, 35951, 35951, 35951, 35951, 35951, 35951, 35951, + 35951, 35951, 35951, 35951, 35951, 35951, 35963, 35963, + 35963, 35963, 35963, 35963, 35963, 35963, 35963, 35963, + 35969, 35969, 35969, 35969, 35969, 35969, 35977, 35977, + 35977, 35977, 35977, 35977, 35977, 35983, 35983, 35983, + 35983, 35983, 35993, 35993, 35993, 35993, 35993, 35993, + 35993, 35993, 35993, 35999, 35999, 35999, 35999, 35999, + 36007, 36007, 36007, 36007, 36007, 36007, 36007, 36007, + 36011, 36011, 36011, 36013, 36013, 36017, 36017, 36017, + 36037, 36037, 36037, 36037, 36037, 36037, 36037, 36037, + 36037, 36037, 36037, 36037, 36037, 36037, 36037, 36037, + 36037, 36037, 36061, 36061, 36061, 36061, 36061, 36061, + 36061, 36061, 36061, 36061, 36061, 36061, 36061, 36061, + 36061, 36061, 36061, 36061, 36061, 36061, 36061, 36061, + 36067, 36067, 36067, 36067, 36067, 36073, 36073, 36073, + 36073, 36073, 36083, 36083, 36083, 36083, 36083, 36083, + 36083, 36083, 36083, 36097, 36097, 36097, 36097, 36097, + 36097, 36097, 36097, 36097, 36097, 36097, 36097, 36097, + 36107, 36107, 36107, 36107, 36107, 36107, 36107, 36107, + 36109, 36109, 36131, 36131, 36131, 36131, 36131, 36131, + 36131, 36131, 36131, 36131, 36131, 36131, 36131, 36131, + 36131, 36131, 36131, 36131, 36131, 36131, 36137, 36137, + 36137, 36137, 36137, 36151, 36151, 36151, 36151, 36151, + 36151, 36151, 36151, 36151, 36151, 36151, 36151, 36151, + 36161, 36161, 36161, 36161, 36161, 36161, 36161, 36161, + 36187, 36187, 36187, 36187, 36187, 36187, 36187, 36187, + 36187, 36187, 36187, 36187, 36187, 36187, 36187, 36187, + 36187, 36187, 36187, 36187, 36187, 36187, 36187, 36187, + 36191, 36191, 36191, 36209, 36209, 36209, 36209, 36209, + 36209, 36209, 36209, 36209, 36209, 36209, 36209, 36209, + 36209, 36209, 36209, 36217, 36217, 36217, 36217, 36217, + 36217, 36217, 36229, 36229, 36229, 36229, 36229, 36229, + 36229, 36229, 36229, 36229, 36229, 36241, 36241, 36241, + 36241, 36241, 36241, 36241, 36241, 36241, 36241, 36241, + 36251, 36251, 36251, 36251, 36251, 36251, 36251, 36251, + 36263, 36263, 36263, 36263, 36263, 36263, 36263, 36263, + 36263, 36263, 36263, 36269, 36269, 36269, 36269, 36269, + 36277, 36277, 36277, 36277, 36277, 36277, 36277, 36277, + 36293, 36293, 36293, 36293, 36293, 36293, 36293, 36293, + 36293, 36293, 36293, 36293, 36293, 36293, 36299, 36299, + 36299, 36299, 36299, 36307, 36307, 36307, 36307, 36307, + 36307, 36307, 36313, 36313, 36313, 36313, 36313, 36313, + 36319, 36319, 36319, 36319, 36319, 36341, 36341, 36341, + 36341, 36341, 36341, 36341, 36341, 36341, 36341, 36341, + 36341, 36341, 36341, 36341, 36341, 36341, 36341, 36341, + 36343, 36343, 36353, 36353, 36353, 36353, 36353, 36353, + 36353, 36353, 36353, 36373, 36373, 36373, 36373, 36373, + 36373, 36373, 36373, 36373, 36373, 36373, 36373, 36373, + 36373, 36373, 36373, 36373, 36373, 36383, 36383, 36383, + 36383, 36383, 36383, 36383, 36383, 36383, 36389, 36389, + 36389, 36389, 36389, 36433, 36433, 36433, 36433, 36433, + 36433, 36433, 36433, 36433, 36433, 36433, 36433, 36433, + 36433, 36433, 36433, 36433, 36433, 36433, 36433, 36433, + 36433, 36433, 36433, 36433, 36433, 36433, 36433, 36433, + 36433, 36433, 36433, 36433, 36433, 36433, 36433, 36433, + 36433, 36433, 36451, 36451, 36451, 36451, 36451, 36451, + 36451, 36451, 36451, 36451, 36451, 36451, 36451, 36451, + 36451, 36451, 36457, 36457, 36457, 36457, 36457, 36457, + 36467, 36467, 36467, 36467, 36467, 36467, 36467, 36467, + 36469, 36469, 36473, 36473, 36473, 36473, 36479, 36479, + 36479, 36479, 36479, 36493, 36493, 36493, 36493, 36493, + 36493, 36493, 36493, 36493, 36493, 36493, 36493, 36493, + 36497, 36497, 36497, 36523, 36523, 36523, 36523, 36523, + 36523, 36523, 36523, 36523, 36523, 36523, 36523, 36523, + 36523, 36523, 36523, 36523, 36523, 36523, 36523, 36523, + 36523, 36523, 36527, 36527, 36527, 36527, 36529, 36529, + 36541, 36541, 36541, 36541, 36541, 36541, 36541, 36541, + 36541, 36541, 36551, 36551, 36551, 36551, 36551, 36551, + 36551, 36551, 36551, 36559, 36559, 36559, 36559, 36559, + 36559, 36559, 36563, 36563, 36563, 36563, 36571, 36571, + 36571, 36571, 36571, 36571, 36571, 36583, 36583, 36583, + 36583, 36583, 36583, 36583, 36583, 36583, 36583, 36583, + 36587, 36587, 36587, 36599, 36599, 36599, 36599, 36599, + 36599, 36599, 36599, 36599, 36599, 36599, 36607, 36607, + 36607, 36607, 36607, 36607, 36607, 36629, 36629, 36629, + 36629, 36629, 36629, 36629, 36629, 36629, 36629, 36629, + 36629, 36629, 36629, 36629, 36629, 36629, 36629, 36629, + 36637, 36637, 36637, 36637, 36637, 36637, 36637, 36637, + 36643, 36643, 36643, 36643, 36643, 36653, 36653, 36653, + 36653, 36653, 36653, 36653, 36653, 36653, 36671, 36671, + 36671, 36671, 36671, 36671, 36671, 36671, 36671, 36671, + 36671, 36671, 36671, 36671, 36671, 36671, 36677, 36677, + 36677, 36677, 36677, 36683, 36683, 36683, 36683, 36683, + 36691, 36691, 36691, 36691, 36691, 36691, 36691, 36691, + 36697, 36697, 36697, 36697, 36697, 36709, 36709, 36709, + 36709, 36709, 36709, 36709, 36709, 36709, 36709, 36709, + 36713, 36713, 36713, 36721, 36721, 36721, 36721, 36721, + 36721, 36721, 36739, 36739, 36739, 36739, 36739, 36739, + 36739, 36739, 36739, 36739, 36739, 36739, 36739, 36739, + 36739, 36739, 36749, 36749, 36749, 36749, 36749, 36749, + 36749, 36749, 36749, 36761, 36761, 36761, 36761, 36761, + 36761, 36761, 36761, 36761, 36761, 36761, 36767, 36767, + 36767, 36767, 36767, 36779, 36779, 36779, 36779, 36779, + 36779, 36779, 36779, 36779, 36779, 36779, 36781, 36781, + 36787, 36787, 36787, 36787, 36787, 36791, 36791, 36791, + 36793, 36793, 36809, 36809, 36809, 36809, 36809, 36809, + 36809, 36809, 36809, 36809, 36809, 36809, 36809, 36809, + 36821, 36821, 36821, 36821, 36821, 36821, 36821, 36821, + 36821, 36821, 36821, 36833, 36833, 36833, 36833, 36833, + 36833, 36833, 36833, 36833, 36833, 36833, 36847, 36847, + 36847, 36847, 36847, 36847, 36847, 36847, 36847, 36847, + 36847, 36847, 36857, 36857, 36857, 36857, 36857, 36857, + 36857, 36857, 36857, 36871, 36871, 36871, 36871, 36871, + 36871, 36871, 36871, 36871, 36871, 36871, 36871, 36871, + 36877, 36877, 36877, 36877, 36877, 36887, 36887, 36887, + 36887, 36887, 36887, 36887, 36887, 36887, 36899, 36899, + 36899, 36899, 36899, 36899, 36899, 36899, 36899, 36899, + 36901, 36901, 36913, 36913, 36913, 36913, 36913, 36913, + 36913, 36913, 36913, 36913, 36913, 36919, 36919, 36919, + 36919, 36919, 36923, 36923, 36923, 36923, 36929, 36929, + 36929, 36929, 36929, 36931, 36931, 36943, 36943, 36943, + 36943, 36943, 36943, 36943, 36943, 36943, 36943, 36943, + 36947, 36947, 36947, 36973, 36973, 36973, 36973, 36973, + 36973, 36973, 36973, 36973, 36973, 36973, 36973, 36973, + 36973, 36973, 36973, 36973, 36973, 36973, 36973, 36973, + 36973, 36973, 36979, 36979, 36979, 36979, 36979, 36979, + 36997, 36997, 36997, 36997, 36997, 36997, 36997, 36997, + 36997, 36997, 36997, 36997, 36997, 36997, 36997, 36997, + 37003, 37003, 37003, 37003, 37003, 37013, 37013, 37013, + 37013, 37013, 37013, 37013, 37013, 37013, 37019, 37019, + 37019, 37019, 37019, 37021, 37021, 37039, 37039, 37039, + 37039, 37039, 37039, 37039, 37039, 37039, 37039, 37039, + 37039, 37039, 37039, 37039, 37039, 37049, 37049, 37049, + 37049, 37049, 37049, 37049, 37049, 37049, 37057, 37057, + 37057, 37057, 37057, 37057, 37057, 37061, 37061, 37061, + 37087, 37087, 37087, 37087, 37087, 37087, 37087, 37087, + 37087, 37087, 37087, 37087, 37087, 37087, 37087, 37087, + 37087, 37087, 37087, 37087, 37087, 37087, 37087, 37087, + 37097, 37097, 37097, 37097, 37097, 37097, 37097, 37097, + 37117, 37117, 37117, 37117, 37117, 37117, 37117, 37117, + 37117, 37117, 37117, 37117, 37117, 37117, 37117, 37117, + 37117, 37117, 37123, 37123, 37123, 37123, 37123, 37123, + 37139, 37139, 37139, 37139, 37139, 37139, 37139, 37139, + 37139, 37139, 37139, 37139, 37139, 37139, 37159, 37159, + 37159, 37159, 37159, 37159, 37159, 37159, 37159, 37159, + 37159, 37159, 37159, 37159, 37159, 37159, 37159, 37159, + 37171, 37171, 37171, 37171, 37171, 37171, 37171, 37171, + 37171, 37171, 37181, 37181, 37181, 37181, 37181, 37181, + 37181, 37181, 37181, 37189, 37189, 37189, 37189, 37189, + 37189, 37189, 37199, 37199, 37199, 37199, 37199, 37199, + 37199, 37199, 37199, 37201, 37201, 37217, 37217, 37217, + 37217, 37217, 37217, 37217, 37217, 37217, 37217, 37217, + 37217, 37217, 37217, 37223, 37223, 37223, 37223, 37223, + 37243, 37243, 37243, 37243, 37243, 37243, 37243, 37243, + 37243, 37243, 37243, 37243, 37243, 37243, 37243, 37243, + 37243, 37243, 37253, 37253, 37253, 37253, 37253, 37253, + 37253, 37253, 37253, 37273, 37273, 37273, 37273, 37273, + 37273, 37273, 37273, 37273, 37273, 37273, 37273, 37273, + 37273, 37273, 37273, 37273, 37273, 37277, 37277, 37277, + 37307, 37307, 37307, 37307, 37307, 37307, 37307, 37307, + 37307, 37307, 37307, 37307, 37307, 37307, 37307, 37307, + 37307, 37307, 37307, 37307, 37307, 37307, 37307, 37307, + 37307, 37307, 37307, 37309, 37309, 37313, 37313, 37313, + 37321, 37321, 37321, 37321, 37321, 37321, 37321, 37321, + 37337, 37337, 37337, 37337, 37337, 37337, 37337, 37337, + 37337, 37337, 37337, 37337, 37337, 37337, 37339, 37339, + 37357, 37357, 37357, 37357, 37357, 37357, 37357, 37357, + 37357, 37357, 37357, 37357, 37357, 37357, 37357, 37357, + 37361, 37361, 37361, 37363, 37363, 37369, 37369, 37369, + 37369, 37369, 37379, 37379, 37379, 37379, 37379, 37379, + 37379, 37379, 37379, 37397, 37397, 37397, 37397, 37397, + 37397, 37397, 37397, 37397, 37397, 37397, 37397, 37397, + 37397, 37397, 37397, 37409, 37409, 37409, 37409, 37409, + 37409, 37409, 37409, 37409, 37409, 37409, 37423, 37423, + 37423, 37423, 37423, 37423, 37423, 37423, 37423, 37423, + 37423, 37423, 37441, 37441, 37441, 37441, 37441, 37441, + 37441, 37441, 37441, 37441, 37441, 37441, 37441, 37441, + 37441, 37441, 37447, 37447, 37447, 37447, 37447, 37447, + 37463, 37463, 37463, 37463, 37463, 37463, 37463, 37463, + 37463, 37463, 37463, 37463, 37463, 37463, 37483, 37483, + 37483, 37483, 37483, 37483, 37483, 37483, 37483, 37483, + 37483, 37483, 37483, 37483, 37483, 37483, 37483, 37483, + 37489, 37489, 37489, 37489, 37489, 37493, 37493, 37493, + 37501, 37501, 37501, 37501, 37501, 37501, 37501, 37501, + 37507, 37507, 37507, 37507, 37507, 37511, 37511, 37511, + 37517, 37517, 37517, 37517, 37517, 37517, 37529, 37529, + 37529, 37529, 37529, 37529, 37529, 37529, 37529, 37529, + 37537, 37537, 37537, 37537, 37537, 37537, 37537, 37537, + 37547, 37547, 37547, 37547, 37547, 37547, 37547, 37547, + 37549, 37549, 37561, 37561, 37561, 37561, 37561, 37561, + 37561, 37561, 37561, 37561, 37561, 37567, 37567, 37567, + 37567, 37567, 37571, 37571, 37571, 37571, 37573, 37573, + 37579, 37579, 37579, 37579, 37579, 37589, 37589, 37589, + 37589, 37589, 37589, 37589, 37589, 37589, 37591, 37591, + 37607, 37607, 37607, 37607, 37607, 37607, 37607, 37607, + 37607, 37607, 37607, 37607, 37607, 37607, 37619, 37619, + 37619, 37619, 37619, 37619, 37619, 37619, 37619, 37619, + 37633, 37633, 37633, 37633, 37633, 37633, 37633, 37633, + 37633, 37633, 37633, 37633, 37633, 37643, 37643, 37643, + 37643, 37643, 37643, 37643, 37643, 37643, 37649, 37649, + 37649, 37649, 37649, 37657, 37657, 37657, 37657, 37657, + 37657, 37657, 37663, 37663, 37663, 37663, 37663, 37663, + 37691, 37691, 37691, 37691, 37691, 37691, 37691, 37691, + 37691, 37691, 37691, 37691, 37691, 37691, 37691, 37691, + 37691, 37691, 37691, 37691, 37691, 37691, 37691, 37691, + 37693, 37693, 37699, 37699, 37699, 37699, 37699, 37699, + 37717, 37717, 37717, 37717, 37717, 37717, 37717, 37717, + 37717, 37717, 37717, 37717, 37717, 37717, 37717, 37717, + 37747, 37747, 37747, 37747, 37747, 37747, 37747, 37747, + 37747, 37747, 37747, 37747, 37747, 37747, 37747, 37747, + 37747, 37747, 37747, 37747, 37747, 37747, 37747, 37747, + 37747, 37747, 37781, 37781, 37781, 37781, 37781, 37781, + 37781, 37781, 37781, 37781, 37781, 37781, 37781, 37781, + 37781, 37781, 37781, 37781, 37781, 37781, 37781, 37781, + 37781, 37781, 37781, 37781, 37781, 37781, 37781, 37781, + 37783, 37783, 37799, 37799, 37799, 37799, 37799, 37799, + 37799, 37799, 37799, 37799, 37799, 37799, 37799, 37799, + 37811, 37811, 37811, 37811, 37811, 37811, 37811, 37811, + 37811, 37811, 37811, 37813, 37813, 37831, 37831, 37831, + 37831, 37831, 37831, 37831, 37831, 37831, 37831, 37831, + 37831, 37831, 37831, 37831, 37831, 37847, 37847, 37847, + 37847, 37847, 37847, 37847, 37847, 37847, 37847, 37847, + 37847, 37847, 37847, 37853, 37853, 37853, 37853, 37853, + 37861, 37861, 37861, 37861, 37861, 37861, 37861, 37861, + 37871, 37871, 37871, 37871, 37871, 37871, 37871, 37871, + 37879, 37879, 37879, 37879, 37879, 37879, 37879, 37879, + 37889, 37889, 37889, 37889, 37889, 37889, 37889, 37889, + 37897, 37897, 37897, 37897, 37897, 37897, 37897, 37897, + 37907, 37907, 37907, 37907, 37907, 37907, 37907, 37907, + 37951, 37951, 37951, 37951, 37951, 37951, 37951, 37951, + 37951, 37951, 37951, 37951, 37951, 37951, 37951, 37951, + 37951, 37951, 37951, 37951, 37951, 37951, 37951, 37951, + 37951, 37951, 37951, 37951, 37951, 37951, 37951, 37951, + 37951, 37951, 37951, 37951, 37951, 37951, 37951, 37951, + 37957, 37957, 37957, 37957, 37957, 37963, 37963, 37963, + 37963, 37963, 37967, 37967, 37967, 37967, 37987, 37987, + 37987, 37987, 37987, 37987, 37987, 37987, 37987, 37987, + 37987, 37987, 37987, 37987, 37987, 37987, 37987, 37987, + 37991, 37991, 37991, 37993, 37993, 37997, 37997, 37997, + 38011, 38011, 38011, 38011, 38011, 38011, 38011, 38011, + 38011, 38011, 38011, 38011, 38011, 38039, 38039, 38039, + 38039, 38039, 38039, 38039, 38039, 38039, 38039, 38039, + 38039, 38039, 38039, 38039, 38039, 38039, 38039, 38039, + 38039, 38039, 38039, 38039, 38039, 38039, 38047, 38047, + 38047, 38047, 38047, 38047, 38047, 38053, 38053, 38053, + 38053, 38053, 38069, 38069, 38069, 38069, 38069, 38069, + 38069, 38069, 38069, 38069, 38069, 38069, 38069, 38069, + 38083, 38083, 38083, 38083, 38083, 38083, 38083, 38083, + 38083, 38083, 38083, 38083, 38083, 38113, 38113, 38113, + 38113, 38113, 38113, 38113, 38113, 38113, 38113, 38113, + 38113, 38113, 38113, 38113, 38113, 38113, 38113, 38113, + 38113, 38113, 38113, 38113, 38113, 38113, 38113, 38113, + 38119, 38119, 38119, 38119, 38119, 38149, 38149, 38149, + 38149, 38149, 38149, 38149, 38149, 38149, 38149, 38149, + 38149, 38149, 38149, 38149, 38149, 38149, 38149, 38149, + 38149, 38149, 38149, 38149, 38149, 38149, 38149, 38149, + 38153, 38153, 38153, 38167, 38167, 38167, 38167, 38167, + 38167, 38167, 38167, 38167, 38167, 38167, 38167, 38167, + 38177, 38177, 38177, 38177, 38177, 38177, 38177, 38177, + 38183, 38183, 38183, 38183, 38183, 38183, 38189, 38189, + 38189, 38189, 38189, 38197, 38197, 38197, 38197, 38197, + 38197, 38197, 38201, 38201, 38201, 38201, 38219, 38219, + 38219, 38219, 38219, 38219, 38219, 38219, 38219, 38219, + 38219, 38219, 38219, 38219, 38219, 38219, 38231, 38231, + 38231, 38231, 38231, 38231, 38231, 38231, 38231, 38231, + 38237, 38237, 38237, 38237, 38237, 38237, 38239, 38239, + 38261, 38261, 38261, 38261, 38261, 38261, 38261, 38261, + 38261, 38261, 38261, 38261, 38261, 38261, 38261, 38261, + 38261, 38261, 38261, 38273, 38273, 38273, 38273, 38273, + 38273, 38273, 38273, 38273, 38273, 38273, 38281, 38281, + 38281, 38281, 38281, 38281, 38281, 38287, 38287, 38287, + 38287, 38287, 38299, 38299, 38299, 38299, 38299, 38299, + 38299, 38299, 38299, 38299, 38299, 38303, 38303, 38303, + 38317, 38317, 38317, 38317, 38317, 38317, 38317, 38317, + 38317, 38317, 38317, 38317, 38317, 38321, 38321, 38321, + 38327, 38327, 38327, 38327, 38327, 38327, 38329, 38329, + 38333, 38333, 38333, 38351, 38351, 38351, 38351, 38351, + 38351, 38351, 38351, 38351, 38351, 38351, 38351, 38351, + 38351, 38351, 38351, 38371, 38371, 38371, 38371, 38371, + 38371, 38371, 38371, 38371, 38371, 38371, 38371, 38371, + 38371, 38371, 38371, 38371, 38371, 38377, 38377, 38377, + 38377, 38377, 38393, 38393, 38393, 38393, 38393, 38393, + 38393, 38393, 38393, 38393, 38393, 38393, 38393, 38393, + 38431, 38431, 38431, 38431, 38431, 38431, 38431, 38431, + 38431, 38431, 38431, 38431, 38431, 38431, 38431, 38431, + 38431, 38431, 38431, 38431, 38431, 38431, 38431, 38431, + 38431, 38431, 38431, 38431, 38431, 38431, 38431, 38431, + 38431, 38431, 38447, 38447, 38447, 38447, 38447, 38447, + 38447, 38447, 38447, 38447, 38447, 38447, 38447, 38447, + 38449, 38449, 38453, 38453, 38453, 38453, 38459, 38459, + 38459, 38459, 38459, 38461, 38461, 38501, 38501, 38501, + 38501, 38501, 38501, 38501, 38501, 38501, 38501, 38501, + 38501, 38501, 38501, 38501, 38501, 38501, 38501, 38501, + 38501, 38501, 38501, 38501, 38501, 38501, 38501, 38501, + 38501, 38501, 38501, 38501, 38501, 38501, 38501, 38501, + 38543, 38543, 38543, 38543, 38543, 38543, 38543, 38543, + 38543, 38543, 38543, 38543, 38543, 38543, 38543, 38543, + 38543, 38543, 38543, 38543, 38543, 38543, 38543, 38543, + 38543, 38543, 38543, 38543, 38543, 38543, 38543, 38543, + 38543, 38543, 38543, 38543, 38543, 38543, 38557, 38557, + 38557, 38557, 38557, 38557, 38557, 38557, 38557, 38557, + 38557, 38557, 38561, 38561, 38561, 38561, 38567, 38567, + 38567, 38567, 38567, 38569, 38569, 38593, 38593, 38593, + 38593, 38593, 38593, 38593, 38593, 38593, 38593, 38593, + 38593, 38593, 38593, 38593, 38593, 38593, 38593, 38593, + 38593, 38593, 38603, 38603, 38603, 38603, 38603, 38603, + 38603, 38603, 38603, 38609, 38609, 38609, 38609, 38609, + 38611, 38611, 38629, 38629, 38629, 38629, 38629, 38629, + 38629, 38629, 38629, 38629, 38629, 38629, 38629, 38629, + 38629, 38629, 38639, 38639, 38639, 38639, 38639, 38639, + 38639, 38639, 38639, 38651, 38651, 38651, 38651, 38651, + 38651, 38651, 38651, 38651, 38651, 38651, 38653, 38653, + 38669, 38669, 38669, 38669, 38669, 38669, 38669, 38669, + 38669, 38669, 38669, 38669, 38669, 38669, 38671, 38671, + 38677, 38677, 38677, 38677, 38677, 38693, 38693, 38693, + 38693, 38693, 38693, 38693, 38693, 38693, 38693, 38693, + 38693, 38693, 38693, 38699, 38699, 38699, 38699, 38699, + 38707, 38707, 38707, 38707, 38707, 38707, 38707, 38707, + 38711, 38711, 38711, 38713, 38713, 38723, 38723, 38723, + 38723, 38723, 38723, 38723, 38723, 38723, 38729, 38729, + 38729, 38729, 38729, 38737, 38737, 38737, 38737, 38737, + 38737, 38737, 38747, 38747, 38747, 38747, 38747, 38747, + 38747, 38747, 38747, 38749, 38749, 38767, 38767, 38767, + 38767, 38767, 38767, 38767, 38767, 38767, 38767, 38767, + 38767, 38767, 38767, 38767, 38767, 38783, 38783, 38783, + 38783, 38783, 38783, 38783, 38783, 38783, 38783, 38783, + 38783, 38783, 38783, 38791, 38791, 38791, 38791, 38791, + 38791, 38791, 38803, 38803, 38803, 38803, 38803, 38803, + 38803, 38803, 38803, 38803, 38803, 38821, 38821, 38821, + 38821, 38821, 38821, 38821, 38821, 38821, 38821, 38821, + 38821, 38821, 38821, 38821, 38821, 38833, 38833, 38833, + 38833, 38833, 38833, 38833, 38833, 38833, 38833, 38833, + 38839, 38839, 38839, 38839, 38839, 38851, 38851, 38851, + 38851, 38851, 38851, 38851, 38851, 38851, 38851, 38851, + 38861, 38861, 38861, 38861, 38861, 38861, 38861, 38861, + 38867, 38867, 38867, 38867, 38867, 38867, 38873, 38873, + 38873, 38873, 38873, 38891, 38891, 38891, 38891, 38891, + 38891, 38891, 38891, 38891, 38891, 38891, 38891, 38891, + 38891, 38891, 38891, 38903, 38903, 38903, 38903, 38903, + 38903, 38903, 38903, 38903, 38903, 38903, 38917, 38917, + 38917, 38917, 38917, 38917, 38917, 38917, 38917, 38917, + 38917, 38917, 38921, 38921, 38921, 38921, 38923, 38923, + 38933, 38933, 38933, 38933, 38933, 38933, 38933, 38933, + 38953, 38953, 38953, 38953, 38953, 38953, 38953, 38953, + 38953, 38953, 38953, 38953, 38953, 38953, 38953, 38953, + 38953, 38953, 38959, 38959, 38959, 38959, 38959, 38959, + 38971, 38971, 38971, 38971, 38971, 38971, 38971, 38971, + 38971, 38971, 38977, 38977, 38977, 38977, 38977, 38977, + 38993, 38993, 38993, 38993, 38993, 38993, 38993, 38993, + 38993, 38993, 38993, 38993, 38993, 38993, 39019, 39019, + 39019, 39019, 39019, 39019, 39019, 39019, 39019, 39019, + 39019, 39019, 39019, 39019, 39019, 39019, 39019, 39019, + 39019, 39019, 39019, 39019, 39019, 39023, 39023, 39023, + 39041, 39041, 39041, 39041, 39041, 39041, 39041, 39041, + 39041, 39041, 39041, 39041, 39041, 39041, 39041, 39041, + 39043, 39043, 39047, 39047, 39047, 39047, 39079, 39079, + 39079, 39079, 39079, 39079, 39079, 39079, 39079, 39079, + 39079, 39079, 39079, 39079, 39079, 39079, 39079, 39079, + 39079, 39079, 39079, 39079, 39079, 39079, 39079, 39079, + 39079, 39079, 39089, 39089, 39089, 39089, 39089, 39089, + 39089, 39089, 39089, 39097, 39097, 39097, 39097, 39097, + 39097, 39097, 39103, 39103, 39103, 39103, 39103, 39103, + 39107, 39107, 39107, 39113, 39113, 39113, 39113, 39113, + 39119, 39119, 39119, 39119, 39119, 39119, 39133, 39133, + 39133, 39133, 39133, 39133, 39133, 39133, 39133, 39133, + 39133, 39133, 39139, 39139, 39139, 39139, 39139, 39139, + 39157, 39157, 39157, 39157, 39157, 39157, 39157, 39157, + 39157, 39157, 39157, 39157, 39157, 39157, 39157, 39157, + 39161, 39161, 39161, 39163, 39163, 39181, 39181, 39181, + 39181, 39181, 39181, 39181, 39181, 39181, 39181, 39181, + 39181, 39181, 39181, 39181, 39181, 39191, 39191, 39191, + 39191, 39191, 39191, 39191, 39191, 39191, 39199, 39199, + 39199, 39199, 39199, 39199, 39199, 39209, 39209, 39209, + 39209, 39209, 39209, 39209, 39209, 39209, 39217, 39217, + 39217, 39217, 39217, 39217, 39217, 39227, 39227, 39227, + 39227, 39227, 39227, 39227, 39227, 39227, 39229, 39229, + 39233, 39233, 39233, 39239, 39239, 39239, 39239, 39239, + 39241, 39241, 39251, 39251, 39251, 39251, 39251, 39251, + 39251, 39251, 39251, 39293, 39293, 39293, 39293, 39293, + 39293, 39293, 39293, 39293, 39293, 39293, 39293, 39293, + 39293, 39293, 39293, 39293, 39293, 39293, 39293, 39293, + 39293, 39293, 39293, 39293, 39293, 39293, 39293, 39293, + 39293, 39293, 39293, 39293, 39293, 39293, 39293, 39293, + 39301, 39301, 39301, 39301, 39301, 39301, 39301, 39301, + 39313, 39313, 39313, 39313, 39313, 39313, 39313, 39313, + 39313, 39313, 39317, 39317, 39317, 39317, 39323, 39323, + 39323, 39323, 39323, 39341, 39341, 39341, 39341, 39341, + 39341, 39341, 39341, 39341, 39341, 39341, 39341, 39341, + 39341, 39341, 39341, 39343, 39343, 39359, 39359, 39359, + 39359, 39359, 39359, 39359, 39359, 39359, 39359, 39359, + 39359, 39359, 39359, 39367, 39367, 39367, 39367, 39367, + 39367, 39367, 39371, 39371, 39371, 39371, 39373, 39373, + 39383, 39383, 39383, 39383, 39383, 39383, 39383, 39383, + 39397, 39397, 39397, 39397, 39397, 39397, 39397, 39397, + 39397, 39397, 39397, 39397, 39397, 39409, 39409, 39409, + 39409, 39409, 39409, 39409, 39409, 39409, 39409, 39409, + 39419, 39419, 39419, 39419, 39419, 39419, 39419, 39419, + 39439, 39439, 39439, 39439, 39439, 39439, 39439, 39439, + 39439, 39439, 39439, 39439, 39439, 39439, 39439, 39439, + 39439, 39439, 39443, 39443, 39443, 39443, 39451, 39451, + 39451, 39451, 39451, 39451, 39451, 39461, 39461, 39461, + 39461, 39461, 39461, 39461, 39461, 39461, 39499, 39499, + 39499, 39499, 39499, 39499, 39499, 39499, 39499, 39499, + 39499, 39499, 39499, 39499, 39499, 39499, 39499, 39499, + 39499, 39499, 39499, 39499, 39499, 39499, 39499, 39499, + 39499, 39499, 39499, 39499, 39499, 39499, 39499, 39499, + 39503, 39503, 39503, 39509, 39509, 39509, 39509, 39509, + 39511, 39511, 39521, 39521, 39521, 39521, 39521, 39521, + 39521, 39521, 39521, 39541, 39541, 39541, 39541, 39541, + 39541, 39541, 39541, 39541, 39541, 39541, 39541, 39541, + 39541, 39541, 39541, 39541, 39541, 39551, 39551, 39551, + 39551, 39551, 39551, 39551, 39551, 39551, 39563, 39563, + 39563, 39563, 39563, 39563, 39563, 39563, 39563, 39563, + 39569, 39569, 39569, 39569, 39569, 39569, 39581, 39581, + 39581, 39581, 39581, 39581, 39581, 39581, 39581, 39581, + 39607, 39607, 39607, 39607, 39607, 39607, 39607, 39607, + 39607, 39607, 39607, 39607, 39607, 39607, 39607, 39607, + 39607, 39607, 39607, 39607, 39607, 39607, 39607, 39607, + 39619, 39619, 39619, 39619, 39619, 39619, 39619, 39619, + 39619, 39619, 39623, 39623, 39623, 39623, 39631, 39631, + 39631, 39631, 39631, 39631, 39631, 39659, 39659, 39659, + 39659, 39659, 39659, 39659, 39659, 39659, 39659, 39659, + 39659, 39659, 39659, 39659, 39659, 39659, 39659, 39659, + 39659, 39659, 39659, 39659, 39659, 39659, 39667, 39667, + 39667, 39667, 39667, 39667, 39667, 39671, 39671, 39671, + 39679, 39679, 39679, 39679, 39679, 39679, 39679, 39679, + 39703, 39703, 39703, 39703, 39703, 39703, 39703, 39703, + 39703, 39703, 39703, 39703, 39703, 39703, 39703, 39703, + 39703, 39703, 39703, 39703, 39703, 39709, 39709, 39709, + 39709, 39709, 39719, 39719, 39719, 39719, 39719, 39719, + 39719, 39719, 39719, 39727, 39727, 39727, 39727, 39727, + 39727, 39727, 39733, 39733, 39733, 39733, 39733, 39733, + 39749, 39749, 39749, 39749, 39749, 39749, 39749, 39749, + 39749, 39749, 39749, 39749, 39749, 39749, 39761, 39761, + 39761, 39761, 39761, 39761, 39761, 39761, 39761, 39761, + 39769, 39769, 39769, 39769, 39769, 39769, 39769, 39769, + 39779, 39779, 39779, 39779, 39779, 39779, 39779, 39779, + 39791, 39791, 39791, 39791, 39791, 39791, 39791, 39791, + 39791, 39791, 39791, 39799, 39799, 39799, 39799, 39799, + 39799, 39799, 39821, 39821, 39821, 39821, 39821, 39821, + 39821, 39821, 39821, 39821, 39821, 39821, 39821, 39821, + 39821, 39821, 39821, 39821, 39821, 39821, 39827, 39827, + 39827, 39827, 39827, 39829, 39829, 39839, 39839, 39839, + 39839, 39839, 39839, 39839, 39839, 39839, 39841, 39841, + 39847, 39847, 39847, 39847, 39847, 39857, 39857, 39857, + 39857, 39857, 39857, 39857, 39857, 39857, 39863, 39863, + 39863, 39863, 39863, 39869, 39869, 39869, 39869, 39869, + 39877, 39877, 39877, 39877, 39877, 39877, 39877, 39877, + 39883, 39883, 39883, 39883, 39883, 39887, 39887, 39887, + 39901, 39901, 39901, 39901, 39901, 39901, 39901, 39901, + 39901, 39901, 39901, 39901, 39901, 39929, 39929, 39929, + 39929, 39929, 39929, 39929, 39929, 39929, 39929, 39929, + 39929, 39929, 39929, 39929, 39929, 39929, 39929, 39929, + 39929, 39929, 39929, 39929, 39929, 39929, 39937, 39937, + 39937, 39937, 39937, 39937, 39937, 39953, 39953, 39953, + 39953, 39953, 39953, 39953, 39953, 39953, 39953, 39953, + 39953, 39953, 39953, 39971, 39971, 39971, 39971, 39971, + 39971, 39971, 39971, 39971, 39971, 39971, 39971, 39971, + 39971, 39971, 39971, 39979, 39979, 39979, 39979, 39979, + 39979, 39979, 39983, 39983, 39983, 39983, 39989, 39989, + 39989, 39989, 39989, 40009, 40009, 40009, 40009, 40009, + 40009, 40009, 40009, 40009, 40009, 40009, 40009, 40009, + 40009, 40009, 40009, 40009, 40009, 40013, 40013, 40013, + 40031, 40031, 40031, 40031, 40031, 40031, 40031, 40031, + 40031, 40031, 40031, 40031, 40031, 40031, 40031, 40031, + 40037, 40037, 40037, 40037, 40037, 40037, 40039, 40039, + 40063, 40063, 40063, 40063, 40063, 40063, 40063, 40063, + 40063, 40063, 40063, 40063, 40063, 40063, 40063, 40063, + 40063, 40063, 40063, 40063, 40063, 40087, 40087, 40087, + 40087, 40087, 40087, 40087, 40087, 40087, 40087, 40087, + 40087, 40087, 40087, 40087, 40087, 40087, 40087, 40087, + 40087, 40087, 40093, 40093, 40093, 40093, 40093, 40093, + 40099, 40099, 40099, 40099, 40099, 40111, 40111, 40111, + 40111, 40111, 40111, 40111, 40111, 40111, 40111, 40111, + 40123, 40123, 40123, 40123, 40123, 40123, 40123, 40123, + 40123, 40123, 40127, 40127, 40127, 40127, 40129, 40129, + 40151, 40151, 40151, 40151, 40151, 40151, 40151, 40151, + 40151, 40151, 40151, 40151, 40151, 40151, 40151, 40151, + 40151, 40151, 40151, 40153, 40153, 40163, 40163, 40163, + 40163, 40163, 40163, 40163, 40163, 40163, 40169, 40169, + 40169, 40169, 40169, 40177, 40177, 40177, 40177, 40177, + 40177, 40177, 40189, 40189, 40189, 40189, 40189, 40189, + 40189, 40189, 40189, 40189, 40189, 40193, 40193, 40193, + 40213, 40213, 40213, 40213, 40213, 40213, 40213, 40213, + 40213, 40213, 40213, 40213, 40213, 40213, 40213, 40213, + 40213, 40213, 40231, 40231, 40231, 40231, 40231, 40231, + 40231, 40231, 40231, 40231, 40231, 40231, 40231, 40231, + 40231, 40231, 40237, 40237, 40237, 40237, 40237, 40237, + 40241, 40241, 40241, 40253, 40253, 40253, 40253, 40253, + 40253, 40253, 40253, 40253, 40253, 40253, 40277, 40277, + 40277, 40277, 40277, 40277, 40277, 40277, 40277, 40277, + 40277, 40277, 40277, 40277, 40277, 40277, 40277, 40277, + 40277, 40277, 40277, 40283, 40283, 40283, 40283, 40283, + 40289, 40289, 40289, 40289, 40289, 40289, 40343, 40343, + 40343, 40343, 40343, 40343, 40343, 40343, 40343, 40343, + 40343, 40343, 40343, 40343, 40343, 40343, 40343, 40343, + 40343, 40343, 40343, 40343, 40343, 40343, 40343, 40343, + 40343, 40343, 40343, 40343, 40343, 40343, 40343, 40343, + 40343, 40343, 40343, 40343, 40343, 40343, 40343, 40343, + 40343, 40343, 40343, 40343, 40343, 40343, 40351, 40351, + 40351, 40351, 40351, 40351, 40351, 40357, 40357, 40357, + 40357, 40357, 40361, 40361, 40361, 40361, 40387, 40387, + 40387, 40387, 40387, 40387, 40387, 40387, 40387, 40387, + 40387, 40387, 40387, 40387, 40387, 40387, 40387, 40387, + 40387, 40387, 40387, 40387, 40387, 40423, 40423, 40423, + 40423, 40423, 40423, 40423, 40423, 40423, 40423, 40423, + 40423, 40423, 40423, 40423, 40423, 40423, 40423, 40423, + 40423, 40423, 40423, 40423, 40423, 40423, 40423, 40423, + 40423, 40423, 40423, 40423, 40423, 40427, 40427, 40427, + 40429, 40429, 40433, 40433, 40433, 40433, 40459, 40459, + 40459, 40459, 40459, 40459, 40459, 40459, 40459, 40459, + 40459, 40459, 40459, 40459, 40459, 40459, 40459, 40459, + 40459, 40459, 40459, 40459, 40459, 40471, 40471, 40471, + 40471, 40471, 40471, 40471, 40471, 40471, 40471, 40471, + 40483, 40483, 40483, 40483, 40483, 40483, 40483, 40483, + 40483, 40483, 40487, 40487, 40487, 40487, 40493, 40493, + 40493, 40493, 40493, 40499, 40499, 40499, 40499, 40499, + 40507, 40507, 40507, 40507, 40507, 40507, 40507, 40507, + 40519, 40519, 40519, 40519, 40519, 40519, 40519, 40519, + 40519, 40519, 40529, 40529, 40529, 40529, 40529, 40529, + 40529, 40529, 40529, 40531, 40531, 40543, 40543, 40543, + 40543, 40543, 40543, 40543, 40543, 40543, 40543, 40543, + 40559, 40559, 40559, 40559, 40559, 40559, 40559, 40559, + 40559, 40559, 40559, 40559, 40559, 40559, 40577, 40577, + 40577, 40577, 40577, 40577, 40577, 40577, 40577, 40577, + 40577, 40577, 40577, 40577, 40577, 40577, 40583, 40583, + 40583, 40583, 40583, 40591, 40591, 40591, 40591, 40591, + 40591, 40591, 40597, 40597, 40597, 40597, 40597, 40597, + 40609, 40609, 40609, 40609, 40609, 40609, 40609, 40609, + 40609, 40609, 40627, 40627, 40627, 40627, 40627, 40627, + 40627, 40627, 40627, 40627, 40627, 40627, 40627, 40627, + 40627, 40627, 40637, 40637, 40637, 40637, 40637, 40637, + 40637, 40637, 40637, 40639, 40639, 40693, 40693, 40693, + 40693, 40693, 40693, 40693, 40693, 40693, 40693, 40693, + 40693, 40693, 40693, 40693, 40693, 40693, 40693, 40693, + 40693, 40693, 40693, 40693, 40693, 40693, 40693, 40693, + 40693, 40693, 40693, 40693, 40693, 40693, 40693, 40693, + 40693, 40693, 40693, 40693, 40693, 40693, 40693, 40693, + 40693, 40693, 40693, 40693, 40693, 40697, 40697, 40697, + 40699, 40699, 40709, 40709, 40709, 40709, 40709, 40709, + 40709, 40709, 40709, 40739, 40739, 40739, 40739, 40739, + 40739, 40739, 40739, 40739, 40739, 40739, 40739, 40739, + 40739, 40739, 40739, 40739, 40739, 40739, 40739, 40739, + 40739, 40739, 40739, 40739, 40739, 40739, 40751, 40751, + 40751, 40751, 40751, 40751, 40751, 40751, 40751, 40751, + 40759, 40759, 40759, 40759, 40759, 40759, 40759, 40759, + 40763, 40763, 40763, 40771, 40771, 40771, 40771, 40771, + 40771, 40771, 40787, 40787, 40787, 40787, 40787, 40787, + 40787, 40787, 40787, 40787, 40787, 40787, 40787, 40787, + 40801, 40801, 40801, 40801, 40801, 40801, 40801, 40801, + 40801, 40801, 40801, 40801, 40801, 40813, 40813, 40813, + 40813, 40813, 40813, 40813, 40813, 40813, 40813, 40813, + 40819, 40819, 40819, 40819, 40819, 40823, 40823, 40823, + 40829, 40829, 40829, 40829, 40829, 40829, 40841, 40841, + 40841, 40841, 40841, 40841, 40841, 40841, 40841, 40841, + 40847, 40847, 40847, 40847, 40847, 40847, 40849, 40849, + 40853, 40853, 40853, 40867, 40867, 40867, 40867, 40867, + 40867, 40867, 40867, 40867, 40867, 40867, 40867, 40867, + 40879, 40879, 40879, 40879, 40879, 40879, 40879, 40879, + 40879, 40879, 40883, 40883, 40883, 40883, 40897, 40897, + 40897, 40897, 40897, 40897, 40897, 40897, 40897, 40897, + 40897, 40897, 40903, 40903, 40903, 40903, 40903, 40903, + 40927, 40927, 40927, 40927, 40927, 40927, 40927, 40927, + 40927, 40927, 40927, 40927, 40927, 40927, 40927, 40927, + 40927, 40927, 40927, 40927, 40927, 40933, 40933, 40933, + 40933, 40933, 40939, 40939, 40939, 40939, 40939, 40939, + 40949, 40949, 40949, 40949, 40949, 40949, 40949, 40949, + 40961, 40961, 40961, 40961, 40961, 40961, 40961, 40961, + 40961, 40961, 40961, 40973, 40973, 40973, 40973, 40973, + 40973, 40973, 40973, 40973, 40973, 40973, 40993, 40993, + 40993, 40993, 40993, 40993, 40993, 40993, 40993, 40993, + 40993, 40993, 40993, 40993, 40993, 40993, 40993, 40993, + 41011, 41011, 41011, 41011, 41011, 41011, 41011, 41011, + 41011, 41011, 41011, 41011, 41011, 41011, 41011, 41011, + 41017, 41017, 41017, 41017, 41017, 41023, 41023, 41023, + 41023, 41023, 41039, 41039, 41039, 41039, 41039, 41039, + 41039, 41039, 41039, 41039, 41039, 41039, 41039, 41039, + 41047, 41047, 41047, 41047, 41047, 41047, 41047, 41047, + 41051, 41051, 41051, 41057, 41057, 41057, 41057, 41057, + 41077, 41077, 41077, 41077, 41077, 41077, 41077, 41077, + 41077, 41077, 41077, 41077, 41077, 41077, 41077, 41077, + 41077, 41077, 41081, 41081, 41081, 41081, 41113, 41113, + 41113, 41113, 41113, 41113, 41113, 41113, 41113, 41113, + 41113, 41113, 41113, 41113, 41113, 41113, 41113, 41113, + 41113, 41113, 41113, 41113, 41113, 41113, 41113, 41113, + 41113, 41113, 41117, 41117, 41117, 41117, 41131, 41131, + 41131, 41131, 41131, 41131, 41131, 41131, 41131, 41131, + 41131, 41131, 41141, 41141, 41141, 41141, 41141, 41141, + 41141, 41141, 41141, 41143, 41143, 41149, 41149, 41149, + 41149, 41149, 41161, 41161, 41161, 41161, 41161, 41161, + 41161, 41161, 41161, 41161, 41161, 41177, 41177, 41177, + 41177, 41177, 41177, 41177, 41177, 41177, 41177, 41177, + 41177, 41177, 41177, 41179, 41179, 41183, 41183, 41183, + 41189, 41189, 41189, 41189, 41189, 41189, 41201, 41201, + 41201, 41201, 41201, 41201, 41201, 41201, 41201, 41201, + 41203, 41203, 41213, 41213, 41213, 41213, 41213, 41213, + 41213, 41213, 41213, 41221, 41221, 41221, 41221, 41221, + 41221, 41221, 41227, 41227, 41227, 41227, 41227, 41227, + 41231, 41231, 41231, 41233, 41233, 41243, 41243, 41243, + 41243, 41243, 41243, 41243, 41243, 41243, 41257, 41257, + 41257, 41257, 41257, 41257, 41257, 41257, 41257, 41257, + 41257, 41257, 41263, 41263, 41263, 41263, 41263, 41263, + 41269, 41269, 41269, 41269, 41269, 41281, 41281, 41281, + 41281, 41281, 41281, 41281, 41281, 41281, 41281, 41281, + 41299, 41299, 41299, 41299, 41299, 41299, 41299, 41299, + 41299, 41299, 41299, 41299, 41299, 41299, 41299, 41299, + 41333, 41333, 41333, 41333, 41333, 41333, 41333, 41333, + 41333, 41333, 41333, 41333, 41333, 41333, 41333, 41333, + 41333, 41333, 41333, 41333, 41333, 41333, 41333, 41333, + 41333, 41333, 41333, 41333, 41333, 41333, 41341, 41341, + 41341, 41341, 41341, 41341, 41341, 41351, 41351, 41351, + 41351, 41351, 41351, 41351, 41351, 41351, 41357, 41357, + 41357, 41357, 41357, 41381, 41381, 41381, 41381, 41381, + 41381, 41381, 41381, 41381, 41381, 41381, 41381, 41381, + 41381, 41381, 41381, 41381, 41381, 41381, 41381, 41381, + 41387, 41387, 41387, 41387, 41387, 41387, 41389, 41389, + 41399, 41399, 41399, 41399, 41399, 41399, 41399, 41399, + 41411, 41411, 41411, 41411, 41411, 41411, 41411, 41411, + 41411, 41411, 41411, 41413, 41413, 41443, 41443, 41443, + 41443, 41443, 41443, 41443, 41443, 41443, 41443, 41443, + 41443, 41443, 41443, 41443, 41443, 41443, 41443, 41443, + 41443, 41443, 41443, 41443, 41443, 41443, 41443, 41443, + 41453, 41453, 41453, 41453, 41453, 41453, 41453, 41453, + 41467, 41467, 41467, 41467, 41467, 41467, 41467, 41467, + 41467, 41467, 41467, 41467, 41467, 41479, 41479, 41479, + 41479, 41479, 41479, 41479, 41479, 41479, 41479, 41479, + 41491, 41491, 41491, 41491, 41491, 41491, 41491, 41491, + 41491, 41491, 41507, 41507, 41507, 41507, 41507, 41507, + 41507, 41507, 41507, 41507, 41507, 41507, 41507, 41507, + 41513, 41513, 41513, 41513, 41513, 41513, 41519, 41519, + 41519, 41519, 41519, 41521, 41521, 41539, 41539, 41539, + 41539, 41539, 41539, 41539, 41539, 41539, 41539, 41539, + 41539, 41539, 41539, 41539, 41539, 41543, 41543, 41543, + 41549, 41549, 41549, 41549, 41549, 41549, 41579, 41579, + 41579, 41579, 41579, 41579, 41579, 41579, 41579, 41579, + 41579, 41579, 41579, 41579, 41579, 41579, 41579, 41579, + 41579, 41579, 41579, 41579, 41579, 41579, 41579, 41579, + 41593, 41593, 41593, 41593, 41593, 41593, 41593, 41593, + 41593, 41593, 41593, 41593, 41593, 41597, 41597, 41597, + 41603, 41603, 41603, 41603, 41603, 41603, 41609, 41609, + 41609, 41609, 41609, 41611, 41611, 41617, 41617, 41617, + 41617, 41617, 41621, 41621, 41621, 41621, 41627, 41627, + 41627, 41627, 41627, 41641, 41641, 41641, 41641, 41641, + 41641, 41641, 41641, 41641, 41641, 41641, 41641, 41641, + 41647, 41647, 41647, 41647, 41647, 41651, 41651, 41651, + 41659, 41659, 41659, 41659, 41659, 41659, 41659, 41659, + 41669, 41669, 41669, 41669, 41669, 41669, 41669, 41669, + 41681, 41681, 41681, 41681, 41681, 41681, 41681, 41681, + 41681, 41681, 41681, 41687, 41687, 41687, 41687, 41687, + 41719, 41719, 41719, 41719, 41719, 41719, 41719, 41719, + 41719, 41719, 41719, 41719, 41719, 41719, 41719, 41719, + 41719, 41719, 41719, 41719, 41719, 41719, 41719, 41719, + 41719, 41719, 41719, 41719, 41719, 41729, 41729, 41729, + 41729, 41729, 41729, 41729, 41729, 41729, 41737, 41737, + 41737, 41737, 41737, 41737, 41737, 41759, 41759, 41759, + 41759, 41759, 41759, 41759, 41759, 41759, 41759, 41759, + 41759, 41759, 41759, 41759, 41759, 41759, 41759, 41759, + 41761, 41761, 41771, 41771, 41771, 41771, 41771, 41771, + 41771, 41771, 41771, 41777, 41777, 41777, 41777, 41777, + 41801, 41801, 41801, 41801, 41801, 41801, 41801, 41801, + 41801, 41801, 41801, 41801, 41801, 41801, 41801, 41801, + 41801, 41801, 41801, 41801, 41801, 41801, 41809, 41809, + 41809, 41809, 41809, 41809, 41809, 41813, 41813, 41813, + 41843, 41843, 41843, 41843, 41843, 41843, 41843, 41843, + 41843, 41843, 41843, 41843, 41843, 41843, 41843, 41843, + 41843, 41843, 41843, 41843, 41843, 41843, 41843, 41843, + 41843, 41843, 41843, 41849, 41849, 41849, 41849, 41849, + 41851, 41851, 41863, 41863, 41863, 41863, 41863, 41863, + 41863, 41863, 41863, 41863, 41863, 41879, 41879, 41879, + 41879, 41879, 41879, 41879, 41879, 41879, 41879, 41879, + 41879, 41879, 41879, 41887, 41887, 41887, 41887, 41887, + 41887, 41887, 41893, 41893, 41893, 41893, 41893, 41893, + 41897, 41897, 41897, 41903, 41903, 41903, 41903, 41903, + 41911, 41911, 41911, 41911, 41911, 41911, 41911, 41911, + 41927, 41927, 41927, 41927, 41927, 41927, 41927, 41927, + 41927, 41927, 41927, 41927, 41927, 41927, 41941, 41941, + 41941, 41941, 41941, 41941, 41941, 41941, 41941, 41941, + 41941, 41941, 41947, 41947, 41947, 41947, 41947, 41947, + 41953, 41953, 41953, 41953, 41953, 41957, 41957, 41957, + 41959, 41959, 41969, 41969, 41969, 41969, 41969, 41969, + 41969, 41969, 41969, 41981, 41981, 41981, 41981, 41981, + 41981, 41981, 41981, 41981, 41981, 41981, 41983, 41983, + 41999, 41999, 41999, 41999, 41999, 41999, 41999, 41999, + 41999, 41999, 41999, 41999, 41999, 41999, 42013, 42013, + 42013, 42013, 42013, 42013, 42013, 42013, 42013, 42013, + 42013, 42013, 42017, 42017, 42017, 42017, 42019, 42019, + 42023, 42023, 42023, 42043, 42043, 42043, 42043, 42043, + 42043, 42043, 42043, 42043, 42043, 42043, 42043, 42043, + 42043, 42043, 42043, 42043, 42043, 42061, 42061, 42061, + 42061, 42061, 42061, 42061, 42061, 42061, 42061, 42061, + 42061, 42061, 42061, 42061, 42061, 42071, 42071, 42071, + 42071, 42071, 42071, 42071, 42071, 42071, 42073, 42073, + 42083, 42083, 42083, 42083, 42083, 42083, 42083, 42083, + 42089, 42089, 42089, 42089, 42089, 42089, 42101, 42101, + 42101, 42101, 42101, 42101, 42101, 42101, 42101, 42101, + 42131, 42131, 42131, 42131, 42131, 42131, 42131, 42131, + 42131, 42131, 42131, 42131, 42131, 42131, 42131, 42131, + 42131, 42131, 42131, 42131, 42131, 42131, 42131, 42131, + 42131, 42131, 42131, 42139, 42139, 42139, 42139, 42139, + 42139, 42139, 42157, 42157, 42157, 42157, 42157, 42157, + 42157, 42157, 42157, 42157, 42157, 42157, 42157, 42157, + 42157, 42157, 42169, 42169, 42169, 42169, 42169, 42169, + 42169, 42169, 42169, 42169, 42169, 42179, 42179, 42179, + 42179, 42179, 42179, 42179, 42179, 42179, 42181, 42181, + 42187, 42187, 42187, 42187, 42187, 42193, 42193, 42193, + 42193, 42193, 42197, 42197, 42197, 42197, 42209, 42209, + 42209, 42209, 42209, 42209, 42209, 42209, 42209, 42209, + 42221, 42221, 42221, 42221, 42221, 42221, 42221, 42221, + 42221, 42221, 42221, 42223, 42223, 42227, 42227, 42227, + 42239, 42239, 42239, 42239, 42239, 42239, 42239, 42239, + 42239, 42239, 42239, 42257, 42257, 42257, 42257, 42257, + 42257, 42257, 42257, 42257, 42257, 42257, 42257, 42257, + 42257, 42257, 42257, 42281, 42281, 42281, 42281, 42281, + 42281, 42281, 42281, 42281, 42281, 42281, 42281, 42281, + 42281, 42281, 42281, 42281, 42281, 42281, 42281, 42281, + 42283, 42283, 42293, 42293, 42293, 42293, 42293, 42293, + 42293, 42293, 42293, 42299, 42299, 42299, 42299, 42299, + 42307, 42307, 42307, 42307, 42307, 42307, 42307, 42307, + 42323, 42323, 42323, 42323, 42323, 42323, 42323, 42323, + 42323, 42323, 42323, 42323, 42323, 42323, 42331, 42331, + 42331, 42331, 42331, 42331, 42331, 42337, 42337, 42337, + 42337, 42337, 42349, 42349, 42349, 42349, 42349, 42349, + 42349, 42349, 42349, 42349, 42349, 42359, 42359, 42359, + 42359, 42359, 42359, 42359, 42359, 42359, 42373, 42373, + 42373, 42373, 42373, 42373, 42373, 42373, 42373, 42373, + 42373, 42373, 42379, 42379, 42379, 42379, 42379, 42379, + 42391, 42391, 42391, 42391, 42391, 42391, 42391, 42391, + 42391, 42391, 42397, 42397, 42397, 42397, 42397, 42397, + 42403, 42403, 42403, 42403, 42403, 42407, 42407, 42407, + 42409, 42409, 42433, 42433, 42433, 42433, 42433, 42433, + 42433, 42433, 42433, 42433, 42433, 42433, 42433, 42433, + 42433, 42433, 42433, 42433, 42433, 42433, 42433, 42433, + 42437, 42437, 42437, 42443, 42443, 42443, 42443, 42443, + 42451, 42451, 42451, 42451, 42451, 42451, 42451, 42451, + 42457, 42457, 42457, 42457, 42457, 42461, 42461, 42461, + 42463, 42463, 42467, 42467, 42467, 42467, 42473, 42473, + 42473, 42473, 42473, 42487, 42487, 42487, 42487, 42487, + 42487, 42487, 42487, 42487, 42487, 42487, 42487, 42487, + 42491, 42491, 42491, 42499, 42499, 42499, 42499, 42499, + 42499, 42499, 42509, 42509, 42509, 42509, 42509, 42509, + 42509, 42509, 42509, 42533, 42533, 42533, 42533, 42533, + 42533, 42533, 42533, 42533, 42533, 42533, 42533, 42533, + 42533, 42533, 42533, 42533, 42533, 42533, 42533, 42533, + 42557, 42557, 42557, 42557, 42557, 42557, 42557, 42557, + 42557, 42557, 42557, 42557, 42557, 42557, 42557, 42557, + 42557, 42557, 42557, 42557, 42557, 42557, 42569, 42569, + 42569, 42569, 42569, 42569, 42569, 42569, 42569, 42569, + 42571, 42571, 42577, 42577, 42577, 42577, 42577, 42577, + 42589, 42589, 42589, 42589, 42589, 42589, 42589, 42589, + 42589, 42589, 42611, 42611, 42611, 42611, 42611, 42611, + 42611, 42611, 42611, 42611, 42611, 42611, 42611, 42611, + 42611, 42611, 42611, 42611, 42611, 42611, 42641, 42641, + 42641, 42641, 42641, 42641, 42641, 42641, 42641, 42641, + 42641, 42641, 42641, 42641, 42641, 42641, 42641, 42641, + 42641, 42641, 42641, 42641, 42641, 42641, 42641, 42641, + 42643, 42643, 42649, 42649, 42649, 42649, 42649, 42649, + 42667, 42667, 42667, 42667, 42667, 42667, 42667, 42667, + 42667, 42667, 42667, 42667, 42667, 42667, 42667, 42667, + 42677, 42677, 42677, 42677, 42677, 42677, 42677, 42677, + 42683, 42683, 42683, 42683, 42683, 42683, 42689, 42689, + 42689, 42689, 42689, 42697, 42697, 42697, 42697, 42697, + 42697, 42697, 42701, 42701, 42701, 42701, 42703, 42703, + 42709, 42709, 42709, 42709, 42709, 42719, 42719, 42719, + 42719, 42719, 42719, 42719, 42719, 42719, 42727, 42727, + 42727, 42727, 42727, 42727, 42727, 42737, 42737, 42737, + 42737, 42737, 42737, 42737, 42737, 42737, 42743, 42743, + 42743, 42743, 42743, 42751, 42751, 42751, 42751, 42751, + 42751, 42751, 42767, 42767, 42767, 42767, 42767, 42767, + 42767, 42767, 42767, 42767, 42767, 42767, 42767, 42767, + 42773, 42773, 42773, 42773, 42773, 42773, 42787, 42787, + 42787, 42787, 42787, 42787, 42787, 42787, 42787, 42787, + 42787, 42787, 42793, 42793, 42793, 42793, 42793, 42793, + 42797, 42797, 42797, 42821, 42821, 42821, 42821, 42821, + 42821, 42821, 42821, 42821, 42821, 42821, 42821, 42821, + 42821, 42821, 42821, 42821, 42821, 42821, 42821, 42821, + 42829, 42829, 42829, 42829, 42829, 42829, 42829, 42829, + 42839, 42839, 42839, 42839, 42839, 42839, 42839, 42839, + 42841, 42841, 42853, 42853, 42853, 42853, 42853, 42853, + 42853, 42853, 42853, 42853, 42853, 42859, 42859, 42859, + 42859, 42859, 42863, 42863, 42863, 42863, 42899, 42899, + 42899, 42899, 42899, 42899, 42899, 42899, 42899, 42899, + 42899, 42899, 42899, 42899, 42899, 42899, 42899, 42899, + 42899, 42899, 42899, 42899, 42899, 42899, 42899, 42899, + 42899, 42899, 42899, 42899, 42899, 42899, 42901, 42901, + 42923, 42923, 42923, 42923, 42923, 42923, 42923, 42923, + 42923, 42923, 42923, 42923, 42923, 42923, 42923, 42923, + 42923, 42923, 42923, 42929, 42929, 42929, 42929, 42929, + 42937, 42937, 42937, 42937, 42937, 42937, 42937, 42937, + 42943, 42943, 42943, 42943, 42943, 42953, 42953, 42953, + 42953, 42953, 42953, 42953, 42953, 42953, 42961, 42961, + 42961, 42961, 42961, 42961, 42961, 42967, 42967, 42967, + 42967, 42967, 42979, 42979, 42979, 42979, 42979, 42979, + 42979, 42979, 42979, 42979, 42979, 42989, 42989, 42989, + 42989, 42989, 42989, 42989, 42989, 42989, 43003, 43003, + 43003, 43003, 43003, 43003, 43003, 43003, 43003, 43003, + 43003, 43003, 43013, 43013, 43013, 43013, 43013, 43013, + 43013, 43013, 43013, 43019, 43019, 43019, 43019, 43019, + 43037, 43037, 43037, 43037, 43037, 43037, 43037, 43037, + 43037, 43037, 43037, 43037, 43037, 43037, 43037, 43037, + 43049, 43049, 43049, 43049, 43049, 43049, 43049, 43049, + 43049, 43049, 43049, 43051, 43051, 43063, 43063, 43063, + 43063, 43063, 43063, 43063, 43063, 43063, 43063, 43063, + 43067, 43067, 43067, 43093, 43093, 43093, 43093, 43093, + 43093, 43093, 43093, 43093, 43093, 43093, 43093, 43093, + 43093, 43093, 43093, 43093, 43093, 43093, 43093, 43093, + 43093, 43093, 43103, 43103, 43103, 43103, 43103, 43103, + 43103, 43103, 43103, 43117, 43117, 43117, 43117, 43117, + 43117, 43117, 43117, 43117, 43117, 43117, 43117, 43117, + 43133, 43133, 43133, 43133, 43133, 43133, 43133, 43133, + 43133, 43133, 43133, 43133, 43133, 43133, 43151, 43151, + 43151, 43151, 43151, 43151, 43151, 43151, 43151, 43151, + 43151, 43151, 43151, 43151, 43151, 43151, 43159, 43159, + 43159, 43159, 43159, 43159, 43159, 43177, 43177, 43177, + 43177, 43177, 43177, 43177, 43177, 43177, 43177, 43177, + 43177, 43177, 43177, 43177, 43177, 43189, 43189, 43189, + 43189, 43189, 43189, 43189, 43189, 43189, 43189, 43189, + 43201, 43201, 43201, 43201, 43201, 43201, 43201, 43201, + 43201, 43201, 43207, 43207, 43207, 43207, 43207, 43207, + 43223, 43223, 43223, 43223, 43223, 43223, 43223, 43223, + 43223, 43223, 43223, 43223, 43223, 43223, 43237, 43237, + 43237, 43237, 43237, 43237, 43237, 43237, 43237, 43237, + 43237, 43237, 43261, 43261, 43261, 43261, 43261, 43261, + 43261, 43261, 43261, 43261, 43261, 43261, 43261, 43261, + 43261, 43261, 43261, 43261, 43261, 43261, 43261, 43261, + 43271, 43271, 43271, 43271, 43271, 43271, 43271, 43271, + 43283, 43283, 43283, 43283, 43283, 43283, 43283, 43283, + 43283, 43283, 43283, 43291, 43291, 43291, 43291, 43291, + 43291, 43291, 43313, 43313, 43313, 43313, 43313, 43313, + 43313, 43313, 43313, 43313, 43313, 43313, 43313, 43313, + 43313, 43313, 43313, 43313, 43313, 43313, 43319, 43319, + 43319, 43319, 43319, 43321, 43321, 43331, 43331, 43331, + 43331, 43331, 43331, 43331, 43331, 43331, 43391, 43391, + 43391, 43391, 43391, 43391, 43391, 43391, 43391, 43391, + 43391, 43391, 43391, 43391, 43391, 43391, 43391, 43391, + 43391, 43391, 43391, 43391, 43391, 43391, 43391, 43391, + 43391, 43391, 43391, 43391, 43391, 43391, 43391, 43391, + 43391, 43391, 43391, 43391, 43391, 43391, 43391, 43391, + 43391, 43391, 43391, 43391, 43391, 43391, 43391, 43391, + 43391, 43391, 43391, 43397, 43397, 43397, 43397, 43397, + 43399, 43399, 43403, 43403, 43403, 43403, 43411, 43411, + 43411, 43411, 43411, 43411, 43411, 43427, 43427, 43427, + 43427, 43427, 43427, 43427, 43427, 43427, 43427, 43427, + 43427, 43427, 43427, 43441, 43441, 43441, 43441, 43441, + 43441, 43441, 43441, 43441, 43441, 43441, 43441, 43441, + 43451, 43451, 43451, 43451, 43451, 43451, 43451, 43451, + 43457, 43457, 43457, 43457, 43457, 43457, 43481, 43481, + 43481, 43481, 43481, 43481, 43481, 43481, 43481, 43481, + 43481, 43481, 43481, 43481, 43481, 43481, 43481, 43481, + 43481, 43481, 43481, 43487, 43487, 43487, 43487, 43487, + 43499, 43499, 43499, 43499, 43499, 43499, 43499, 43499, + 43499, 43499, 43499, 43517, 43517, 43517, 43517, 43517, + 43517, 43517, 43517, 43517, 43517, 43517, 43517, 43517, + 43517, 43517, 43517, 43541, 43541, 43541, 43541, 43541, + 43541, 43541, 43541, 43541, 43541, 43541, 43541, 43541, + 43541, 43541, 43541, 43541, 43541, 43541, 43541, 43541, + 43543, 43543, 43573, 43573, 43573, 43573, 43573, 43573, + 43573, 43573, 43573, 43573, 43573, 43573, 43573, 43573, + 43573, 43573, 43573, 43573, 43573, 43573, 43573, 43573, + 43573, 43573, 43573, 43573, 43573, 43577, 43577, 43577, + 43579, 43579, 43591, 43591, 43591, 43591, 43591, 43591, + 43591, 43591, 43591, 43591, 43591, 43597, 43597, 43597, + 43597, 43597, 43607, 43607, 43607, 43607, 43607, 43607, + 43607, 43607, 43607, 43609, 43609, 43613, 43613, 43613, + 43627, 43627, 43627, 43627, 43627, 43627, 43627, 43627, + 43627, 43627, 43627, 43627, 43627, 43633, 43633, 43633, + 43633, 43633, 43649, 43649, 43649, 43649, 43649, 43649, + 43649, 43649, 43649, 43649, 43649, 43649, 43649, 43649, + 43651, 43651, 43661, 43661, 43661, 43661, 43661, 43661, + 43661, 43661, 43661, 43669, 43669, 43669, 43669, 43669, + 43669, 43669, 43691, 43691, 43691, 43691, 43691, 43691, + 43691, 43691, 43691, 43691, 43691, 43691, 43691, 43691, + 43691, 43691, 43691, 43691, 43691, 43691, 43711, 43711, + 43711, 43711, 43711, 43711, 43711, 43711, 43711, 43711, + 43711, 43711, 43711, 43711, 43711, 43711, 43711, 43711, + 43717, 43717, 43717, 43717, 43717, 43721, 43721, 43721, + 43753, 43753, 43753, 43753, 43753, 43753, 43753, 43753, + 43753, 43753, 43753, 43753, 43753, 43753, 43753, 43753, + 43753, 43753, 43753, 43753, 43753, 43753, 43753, 43753, + 43753, 43753, 43753, 43753, 43753, 43759, 43759, 43759, + 43759, 43759, 43777, 43777, 43777, 43777, 43777, 43777, + 43777, 43777, 43777, 43777, 43777, 43777, 43777, 43777, + 43777, 43777, 43781, 43781, 43781, 43781, 43783, 43783, + 43787, 43787, 43787, 43789, 43789, 43793, 43793, 43793, + 43801, 43801, 43801, 43801, 43801, 43801, 43801, 43801, + 43853, 43853, 43853, 43853, 43853, 43853, 43853, 43853, + 43853, 43853, 43853, 43853, 43853, 43853, 43853, 43853, + 43853, 43853, 43853, 43853, 43853, 43853, 43853, 43853, + 43853, 43853, 43853, 43853, 43853, 43853, 43853, 43853, + 43853, 43853, 43853, 43853, 43853, 43853, 43853, 43853, + 43853, 43853, 43853, 43853, 43853, 43853, 43867, 43867, + 43867, 43867, 43867, 43867, 43867, 43867, 43867, 43867, + 43867, 43867, 43889, 43889, 43889, 43889, 43889, 43889, + 43889, 43889, 43889, 43889, 43889, 43889, 43889, 43889, + 43889, 43889, 43889, 43889, 43889, 43889, 43891, 43891, + 43913, 43913, 43913, 43913, 43913, 43913, 43913, 43913, + 43913, 43913, 43913, 43913, 43913, 43913, 43913, 43913, + 43913, 43913, 43913, 43933, 43933, 43933, 43933, 43933, + 43933, 43933, 43933, 43933, 43933, 43933, 43933, 43933, + 43933, 43933, 43933, 43933, 43933, 43943, 43943, 43943, + 43943, 43943, 43943, 43943, 43943, 43943, 43951, 43951, + 43951, 43951, 43951, 43951, 43951, 43961, 43961, 43961, + 43961, 43961, 43961, 43961, 43961, 43961, 43963, 43963, + 43969, 43969, 43969, 43969, 43969, 43973, 43973, 43973, + 43987, 43987, 43987, 43987, 43987, 43987, 43987, 43987, + 43987, 43987, 43987, 43987, 43987, 43991, 43991, 43991, + 43997, 43997, 43997, 43997, 43997, 43997, 44017, 44017, + 44017, 44017, 44017, 44017, 44017, 44017, 44017, 44017, + 44017, 44017, 44017, 44017, 44017, 44017, 44017, 44017, + 44021, 44021, 44021, 44027, 44027, 44027, 44027, 44027, + 44029, 44029, 44041, 44041, 44041, 44041, 44041, 44041, + 44041, 44041, 44041, 44041, 44041, 44053, 44053, 44053, + 44053, 44053, 44053, 44053, 44053, 44053, 44053, 44053, + 44059, 44059, 44059, 44059, 44059, 44071, 44071, 44071, + 44071, 44071, 44071, 44071, 44071, 44071, 44071, 44071, + 44087, 44087, 44087, 44087, 44087, 44087, 44087, 44087, + 44087, 44087, 44087, 44087, 44087, 44087, 44089, 44089, + 44101, 44101, 44101, 44101, 44101, 44101, 44101, 44101, + 44101, 44101, 44111, 44111, 44111, 44111, 44111, 44111, + 44111, 44111, 44111, 44119, 44119, 44119, 44119, 44119, + 44119, 44119, 44123, 44123, 44123, 44123, 44129, 44129, + 44129, 44129, 44129, 44131, 44131, 44159, 44159, 44159, + 44159, 44159, 44159, 44159, 44159, 44159, 44159, 44159, + 44159, 44159, 44159, 44159, 44159, 44159, 44159, 44159, + 44159, 44159, 44159, 44159, 44159, 44159, 44171, 44171, + 44171, 44171, 44171, 44171, 44171, 44171, 44171, 44171, + 44179, 44179, 44179, 44179, 44179, 44179, 44179, 44179, + 44189, 44189, 44189, 44189, 44189, 44189, 44189, 44189, + 44201, 44201, 44201, 44201, 44201, 44201, 44201, 44201, + 44201, 44201, 44201, 44203, 44203, 44207, 44207, 44207, + 44221, 44221, 44221, 44221, 44221, 44221, 44221, 44221, + 44221, 44221, 44221, 44221, 44221, 44249, 44249, 44249, + 44249, 44249, 44249, 44249, 44249, 44249, 44249, 44249, + 44249, 44249, 44249, 44249, 44249, 44249, 44249, 44249, + 44249, 44249, 44249, 44249, 44249, 44249, 44257, 44257, + 44257, 44257, 44257, 44257, 44257, 44263, 44263, 44263, + 44263, 44263, 44267, 44267, 44267, 44267, 44269, 44269, + 44273, 44273, 44273, 44279, 44279, 44279, 44279, 44279, + 44281, 44281, 44293, 44293, 44293, 44293, 44293, 44293, + 44293, 44293, 44293, 44293, 44293, 44351, 44351, 44351, + 44351, 44351, 44351, 44351, 44351, 44351, 44351, 44351, + 44351, 44351, 44351, 44351, 44351, 44351, 44351, 44351, + 44351, 44351, 44351, 44351, 44351, 44351, 44351, 44351, + 44351, 44351, 44351, 44351, 44351, 44351, 44351, 44351, + 44351, 44351, 44351, 44351, 44351, 44351, 44351, 44351, + 44351, 44351, 44351, 44351, 44351, 44351, 44351, 44351, + 44357, 44357, 44357, 44357, 44357, 44357, 44371, 44371, + 44371, 44371, 44371, 44371, 44371, 44371, 44371, 44371, + 44371, 44371, 44381, 44381, 44381, 44381, 44381, 44381, + 44381, 44381, 44381, 44383, 44383, 44389, 44389, 44389, + 44389, 44389, 44417, 44417, 44417, 44417, 44417, 44417, + 44417, 44417, 44417, 44417, 44417, 44417, 44417, 44417, + 44417, 44417, 44417, 44417, 44417, 44417, 44417, 44417, + 44417, 44417, 44417, 44449, 44449, 44449, 44449, 44449, + 44449, 44449, 44449, 44449, 44449, 44449, 44449, 44449, + 44449, 44449, 44449, 44449, 44449, 44449, 44449, 44449, + 44449, 44449, 44449, 44449, 44449, 44449, 44449, 44449, + 44453, 44453, 44453, 44483, 44483, 44483, 44483, 44483, + 44483, 44483, 44483, 44483, 44483, 44483, 44483, 44483, + 44483, 44483, 44483, 44483, 44483, 44483, 44483, 44483, + 44483, 44483, 44483, 44483, 44483, 44483, 44491, 44491, + 44491, 44491, 44491, 44491, 44491, 44497, 44497, 44497, + 44497, 44497, 44501, 44501, 44501, 44501, 44507, 44507, + 44507, 44507, 44507, 44519, 44519, 44519, 44519, 44519, + 44519, 44519, 44519, 44519, 44519, 44519, 44531, 44531, + 44531, 44531, 44531, 44531, 44531, 44531, 44531, 44531, + 44533, 44533, 44537, 44537, 44537, 44537, 44543, 44543, + 44543, 44543, 44543, 44549, 44549, 44549, 44549, 44549, + 44563, 44563, 44563, 44563, 44563, 44563, 44563, 44563, + 44563, 44563, 44563, 44563, 44563, 44579, 44579, 44579, + 44579, 44579, 44579, 44579, 44579, 44579, 44579, 44579, + 44579, 44579, 44579, 44587, 44587, 44587, 44587, 44587, + 44587, 44587, 44617, 44617, 44617, 44617, 44617, 44617, + 44617, 44617, 44617, 44617, 44617, 44617, 44617, 44617, + 44617, 44617, 44617, 44617, 44617, 44617, 44617, 44617, + 44617, 44617, 44617, 44617, 44617, 44621, 44621, 44621, + 44623, 44623, 44633, 44633, 44633, 44633, 44633, 44633, + 44633, 44633, 44633, 44641, 44641, 44641, 44641, 44641, + 44641, 44641, 44647, 44647, 44647, 44647, 44647, 44647, + 44651, 44651, 44651, 44657, 44657, 44657, 44657, 44657, + 44683, 44683, 44683, 44683, 44683, 44683, 44683, 44683, + 44683, 44683, 44683, 44683, 44683, 44683, 44683, 44683, + 44683, 44683, 44683, 44683, 44683, 44683, 44683, 44683, + 44687, 44687, 44687, 44699, 44699, 44699, 44699, 44699, + 44699, 44699, 44699, 44699, 44699, 44699, 44701, 44701, + 44711, 44711, 44711, 44711, 44711, 44711, 44711, 44711, + 44729, 44729, 44729, 44729, 44729, 44729, 44729, 44729, + 44729, 44729, 44729, 44729, 44729, 44729, 44729, 44729, + 44741, 44741, 44741, 44741, 44741, 44741, 44741, 44741, + 44741, 44741, 44741, 44753, 44753, 44753, 44753, 44753, + 44753, 44753, 44753, 44753, 44753, 44753, 44771, 44771, + 44771, 44771, 44771, 44771, 44771, 44771, 44771, 44771, + 44771, 44771, 44771, 44771, 44771, 44771, 44773, 44773, + 44777, 44777, 44777, 44789, 44789, 44789, 44789, 44789, + 44789, 44789, 44789, 44789, 44789, 44789, 44797, 44797, + 44797, 44797, 44797, 44797, 44797, 44809, 44809, 44809, + 44809, 44809, 44809, 44809, 44809, 44809, 44809, 44809, + 44819, 44819, 44819, 44819, 44819, 44819, 44819, 44819, + 44839, 44839, 44839, 44839, 44839, 44839, 44839, 44839, + 44839, 44839, 44839, 44839, 44839, 44839, 44839, 44839, + 44839, 44839, 44843, 44843, 44843, 44843, 44851, 44851, + 44851, 44851, 44851, 44851, 44851, 44867, 44867, 44867, + 44867, 44867, 44867, 44867, 44867, 44867, 44867, 44867, + 44867, 44867, 44867, 44879, 44879, 44879, 44879, 44879, + 44879, 44879, 44879, 44879, 44879, 44879, 44887, 44887, + 44887, 44887, 44887, 44887, 44887, 44893, 44893, 44893, + 44893, 44893, 44909, 44909, 44909, 44909, 44909, 44909, + 44909, 44909, 44909, 44909, 44909, 44909, 44909, 44909, + 44917, 44917, 44917, 44917, 44917, 44917, 44917, 44917, + 44927, 44927, 44927, 44927, 44927, 44927, 44927, 44927, + 44939, 44939, 44939, 44939, 44939, 44939, 44939, 44939, + 44939, 44939, 44939, 44953, 44953, 44953, 44953, 44953, + 44953, 44953, 44953, 44953, 44953, 44953, 44953, 44953, + 44959, 44959, 44959, 44959, 44959, 44963, 44963, 44963, + 44971, 44971, 44971, 44971, 44971, 44971, 44971, 44971, + 44983, 44983, 44983, 44983, 44983, 44983, 44983, 44983, + 44983, 44983, 44987, 44987, 44987, 44987, 45007, 45007, + 45007, 45007, 45007, 45007, 45007, 45007, 45007, 45007, + 45007, 45007, 45007, 45007, 45007, 45007, 45007, 45007, + 45013, 45013, 45013, 45013, 45013, 45053, 45053, 45053, + 45053, 45053, 45053, 45053, 45053, 45053, 45053, 45053, + 45053, 45053, 45053, 45053, 45053, 45053, 45053, 45053, + 45053, 45053, 45053, 45053, 45053, 45053, 45053, 45053, + 45053, 45053, 45053, 45053, 45053, 45053, 45053, 45053, + 45061, 45061, 45061, 45061, 45061, 45061, 45061, 45061, + 45077, 45077, 45077, 45077, 45077, 45077, 45077, 45077, + 45077, 45077, 45077, 45077, 45077, 45077, 45083, 45083, + 45083, 45083, 45083, 45119, 45119, 45119, 45119, 45119, + 45119, 45119, 45119, 45119, 45119, 45119, 45119, 45119, + 45119, 45119, 45119, 45119, 45119, 45119, 45119, 45119, + 45119, 45119, 45119, 45119, 45119, 45119, 45119, 45119, + 45119, 45119, 45119, 45121, 45121, 45127, 45127, 45127, + 45127, 45127, 45131, 45131, 45131, 45131, 45137, 45137, + 45137, 45137, 45137, 45139, 45139, 45161, 45161, 45161, + 45161, 45161, 45161, 45161, 45161, 45161, 45161, 45161, + 45161, 45161, 45161, 45161, 45161, 45161, 45161, 45161, + 45179, 45179, 45179, 45179, 45179, 45179, 45179, 45179, + 45179, 45179, 45179, 45179, 45179, 45179, 45179, 45179, + 45181, 45181, 45191, 45191, 45191, 45191, 45191, 45191, + 45191, 45191, 45191, 45197, 45197, 45197, 45197, 45197, + 45233, 45233, 45233, 45233, 45233, 45233, 45233, 45233, + 45233, 45233, 45233, 45233, 45233, 45233, 45233, 45233, + 45233, 45233, 45233, 45233, 45233, 45233, 45233, 45233, + 45233, 45233, 45233, 45233, 45233, 45233, 45233, 45233, + 45247, 45247, 45247, 45247, 45247, 45247, 45247, 45247, + 45247, 45247, 45247, 45247, 45247, 45259, 45259, 45259, + 45259, 45259, 45259, 45259, 45259, 45259, 45259, 45259, + 45263, 45263, 45263, 45281, 45281, 45281, 45281, 45281, + 45281, 45281, 45281, 45281, 45281, 45281, 45281, 45281, + 45281, 45281, 45281, 45289, 45289, 45289, 45289, 45289, + 45289, 45289, 45293, 45293, 45293, 45293, 45307, 45307, + 45307, 45307, 45307, 45307, 45307, 45307, 45307, 45307, + 45307, 45307, 45317, 45317, 45317, 45317, 45317, 45317, + 45317, 45317, 45317, 45319, 45319, 45329, 45329, 45329, + 45329, 45329, 45329, 45329, 45329, 45329, 45337, 45337, + 45337, 45337, 45337, 45337, 45337, 45341, 45341, 45341, + 45343, 45343, 45361, 45361, 45361, 45361, 45361, 45361, + 45361, 45361, 45361, 45361, 45361, 45361, 45361, 45361, + 45361, 45361, 45377, 45377, 45377, 45377, 45377, 45377, + 45377, 45377, 45377, 45377, 45377, 45377, 45377, 45377, + 45389, 45389, 45389, 45389, 45389, 45389, 45389, 45389, + 45389, 45389, 45389, 45403, 45403, 45403, 45403, 45403, + 45403, 45403, 45403, 45403, 45403, 45403, 45403, 45403, + 45413, 45413, 45413, 45413, 45413, 45413, 45413, 45413, + 45427, 45427, 45427, 45427, 45427, 45427, 45427, 45427, + 45427, 45427, 45427, 45427, 45427, 45433, 45433, 45433, + 45433, 45433, 45439, 45439, 45439, 45439, 45439, 45439, + 45481, 45481, 45481, 45481, 45481, 45481, 45481, 45481, + 45481, 45481, 45481, 45481, 45481, 45481, 45481, 45481, + 45481, 45481, 45481, 45481, 45481, 45481, 45481, 45481, + 45481, 45481, 45481, 45481, 45481, 45481, 45481, 45481, + 45481, 45481, 45481, 45481, 45481, 45491, 45491, 45491, + 45491, 45491, 45491, 45491, 45491, 45491, 45497, 45497, + 45497, 45497, 45497, 45503, 45503, 45503, 45503, 45503, + 45523, 45523, 45523, 45523, 45523, 45523, 45523, 45523, + 45523, 45523, 45523, 45523, 45523, 45523, 45523, 45523, + 45523, 45523, 45533, 45533, 45533, 45533, 45533, 45533, + 45533, 45533, 45533, 45541, 45541, 45541, 45541, 45541, + 45541, 45541, 45553, 45553, 45553, 45553, 45553, 45553, + 45553, 45553, 45553, 45553, 45553, 45557, 45557, 45557, + 45569, 45569, 45569, 45569, 45569, 45569, 45569, 45569, + 45569, 45569, 45569, 45587, 45587, 45587, 45587, 45587, + 45587, 45587, 45587, 45587, 45587, 45587, 45587, 45587, + 45587, 45587, 45587, 45589, 45589, 45599, 45599, 45599, + 45599, 45599, 45599, 45599, 45599, 45599, 45613, 45613, + 45613, 45613, 45613, 45613, 45613, 45613, 45613, 45613, + 45613, 45613, 45631, 45631, 45631, 45631, 45631, 45631, + 45631, 45631, 45631, 45631, 45631, 45631, 45631, 45631, + 45631, 45631, 45641, 45641, 45641, 45641, 45641, 45641, + 45641, 45641, 45641, 45659, 45659, 45659, 45659, 45659, + 45659, 45659, 45659, 45659, 45659, 45659, 45659, 45659, + 45659, 45659, 45659, 45667, 45667, 45667, 45667, 45667, + 45667, 45667, 45673, 45673, 45673, 45673, 45673, 45673, + 45677, 45677, 45677, 45691, 45691, 45691, 45691, 45691, + 45691, 45691, 45691, 45691, 45691, 45691, 45691, 45691, + 45697, 45697, 45697, 45697, 45697, 45707, 45707, 45707, + 45707, 45707, 45707, 45707, 45707, 45707, 45737, 45737, + 45737, 45737, 45737, 45737, 45737, 45737, 45737, 45737, + 45737, 45737, 45737, 45737, 45737, 45737, 45737, 45737, + 45737, 45737, 45737, 45737, 45737, 45737, 45737, 45737, + 45751, 45751, 45751, 45751, 45751, 45751, 45751, 45751, + 45751, 45751, 45751, 45751, 45751, 45757, 45757, 45757, + 45757, 45757, 45763, 45763, 45763, 45763, 45763, 45763, + 45767, 45767, 45767, 45779, 45779, 45779, 45779, 45779, + 45779, 45779, 45779, 45779, 45779, 45779, 45817, 45817, + 45817, 45817, 45817, 45817, 45817, 45817, 45817, 45817, + 45817, 45817, 45817, 45817, 45817, 45817, 45817, 45817, + 45817, 45817, 45817, 45817, 45817, 45817, 45817, 45817, + 45817, 45817, 45817, 45817, 45817, 45817, 45817, 45817, + 45821, 45821, 45821, 45823, 45823, 45827, 45827, 45827, + 45833, 45833, 45833, 45833, 45833, 45833, 45841, 45841, + 45841, 45841, 45841, 45841, 45841, 45853, 45853, 45853, + 45853, 45853, 45853, 45853, 45853, 45853, 45853, 45853, + 45863, 45863, 45863, 45863, 45863, 45863, 45863, 45863, + 45869, 45869, 45869, 45869, 45869, 45869, 45887, 45887, + 45887, 45887, 45887, 45887, 45887, 45887, 45887, 45887, + 45887, 45887, 45887, 45887, 45887, 45887, 45893, 45893, + 45893, 45893, 45893, 45943, 45943, 45943, 45943, 45943, + 45943, 45943, 45943, 45943, 45943, 45943, 45943, 45943, + 45943, 45943, 45943, 45943, 45943, 45943, 45943, 45943, + 45943, 45943, 45943, 45943, 45943, 45943, 45943, 45943, + 45943, 45943, 45943, 45943, 45943, 45943, 45943, 45943, + 45943, 45943, 45943, 45943, 45943, 45943, 45943, 45943, + 45949, 45949, 45949, 45949, 45949, 45953, 45953, 45953, + 45959, 45959, 45959, 45959, 45959, 45959, 45971, 45971, + 45971, 45971, 45971, 45971, 45971, 45971, 45971, 45971, + 45979, 45979, 45979, 45979, 45979, 45979, 45979, 45979, + 45989, 45989, 45989, 45989, 45989, 45989, 45989, 45989, + 46021, 46021, 46021, 46021, 46021, 46021, 46021, 46021, + 46021, 46021, 46021, 46021, 46021, 46021, 46021, 46021, + 46021, 46021, 46021, 46021, 46021, 46021, 46021, 46021, + 46021, 46021, 46021, 46021, 46021, 46027, 46027, 46027, + 46027, 46027, 46049, 46049, 46049, 46049, 46049, 46049, + 46049, 46049, 46049, 46049, 46049, 46049, 46049, 46049, + 46049, 46049, 46049, 46049, 46049, 46049, 46051, 46051, + 46061, 46061, 46061, 46061, 46061, 46061, 46061, 46061, + 46073, 46073, 46073, 46073, 46073, 46073, 46073, 46073, + 46073, 46073, 46073, 46091, 46091, 46091, 46091, 46091, + 46091, 46091, 46091, 46091, 46091, 46091, 46091, 46091, + 46091, 46091, 46091, 46093, 46093, 46099, 46099, 46099, + 46099, 46099, 46103, 46103, 46103, 46103, 46133, 46133, + 46133, 46133, 46133, 46133, 46133, 46133, 46133, 46133, + 46133, 46133, 46133, 46133, 46133, 46133, 46133, 46133, + 46133, 46133, 46133, 46133, 46133, 46133, 46133, 46133, + 46141, 46141, 46141, 46141, 46141, 46141, 46141, 46141, + 46147, 46147, 46147, 46147, 46147, 46153, 46153, 46153, + 46153, 46153, 46171, 46171, 46171, 46171, 46171, 46171, + 46171, 46171, 46171, 46171, 46171, 46171, 46171, 46171, + 46171, 46171, 46181, 46181, 46181, 46181, 46181, 46181, + 46181, 46181, 46181, 46183, 46183, 46187, 46187, 46187, + 46199, 46199, 46199, 46199, 46199, 46199, 46199, 46199, + 46199, 46199, 46199, 46219, 46219, 46219, 46219, 46219, + 46219, 46219, 46219, 46219, 46219, 46219, 46219, 46219, + 46219, 46219, 46219, 46219, 46219, 46229, 46229, 46229, + 46229, 46229, 46229, 46229, 46229, 46229, 46237, 46237, + 46237, 46237, 46237, 46237, 46237, 46261, 46261, 46261, + 46261, 46261, 46261, 46261, 46261, 46261, 46261, 46261, + 46261, 46261, 46261, 46261, 46261, 46261, 46261, 46261, + 46261, 46261, 46271, 46271, 46271, 46271, 46271, 46271, + 46271, 46271, 46271, 46273, 46273, 46279, 46279, 46279, + 46279, 46279, 46301, 46301, 46301, 46301, 46301, 46301, + 46301, 46301, 46301, 46301, 46301, 46301, 46301, 46301, + 46301, 46301, 46301, 46301, 46301, 46301, 46307, 46307, + 46307, 46307, 46307, 46309, 46309, 46327, 46327, 46327, + 46327, 46327, 46327, 46327, 46327, 46327, 46327, 46327, + 46327, 46327, 46327, 46327, 46327, 46337, 46337, 46337, + 46337, 46337, 46337, 46337, 46337, 46337, 46349, 46349, + 46349, 46349, 46349, 46349, 46349, 46349, 46349, 46349, + 46351, 46351, 46381, 46381, 46381, 46381, 46381, 46381, + 46381, 46381, 46381, 46381, 46381, 46381, 46381, 46381, + 46381, 46381, 46381, 46381, 46381, 46381, 46381, 46381, + 46381, 46381, 46381, 46381, 46381, 46399, 46399, 46399, + 46399, 46399, 46399, 46399, 46399, 46399, 46399, 46399, + 46399, 46399, 46399, 46399, 46399, 46411, 46411, 46411, + 46411, 46411, 46411, 46411, 46411, 46411, 46411, 46411, + 46439, 46439, 46439, 46439, 46439, 46439, 46439, 46439, + 46439, 46439, 46439, 46439, 46439, 46439, 46439, 46439, + 46439, 46439, 46439, 46439, 46439, 46439, 46439, 46439, + 46441, 46441, 46447, 46447, 46447, 46447, 46447, 46447, + 46451, 46451, 46451, 46457, 46457, 46457, 46457, 46457, + 46471, 46471, 46471, 46471, 46471, 46471, 46471, 46471, + 46471, 46471, 46471, 46471, 46471, 46477, 46477, 46477, + 46477, 46477, 46489, 46489, 46489, 46489, 46489, 46489, + 46489, 46489, 46489, 46489, 46489, 46499, 46499, 46499, + 46499, 46499, 46499, 46499, 46499, 46499, 46507, 46507, + 46507, 46507, 46507, 46507, 46507, 46511, 46511, 46511, + 46523, 46523, 46523, 46523, 46523, 46523, 46523, 46523, + 46523, 46523, 46523, 46549, 46549, 46549, 46549, 46549, + 46549, 46549, 46549, 46549, 46549, 46549, 46549, 46549, + 46549, 46549, 46549, 46549, 46549, 46549, 46549, 46549, + 46549, 46549, 46559, 46559, 46559, 46559, 46559, 46559, + 46559, 46559, 46559, 46567, 46567, 46567, 46567, 46567, + 46567, 46567, 46573, 46573, 46573, 46573, 46573, 46573, + 46589, 46589, 46589, 46589, 46589, 46589, 46589, 46589, + 46589, 46589, 46589, 46589, 46589, 46589, 46591, 46591, + 46601, 46601, 46601, 46601, 46601, 46601, 46601, 46601, + 46619, 46619, 46619, 46619, 46619, 46619, 46619, 46619, + 46619, 46619, 46619, 46619, 46619, 46619, 46619, 46619, + 46633, 46633, 46633, 46633, 46633, 46633, 46633, 46633, + 46633, 46633, 46633, 46633, 46633, 46639, 46639, 46639, + 46639, 46639, 46643, 46643, 46643, 46643, 46649, 46649, + 46649, 46649, 46649, 46663, 46663, 46663, 46663, 46663, + 46663, 46663, 46663, 46663, 46663, 46663, 46663, 46663, + 46679, 46679, 46679, 46679, 46679, 46679, 46679, 46679, + 46679, 46679, 46679, 46679, 46679, 46679, 46681, 46681, + 46687, 46687, 46687, 46687, 46687, 46691, 46691, 46691, + 46703, 46703, 46703, 46703, 46703, 46703, 46703, 46703, + 46703, 46703, 46703, 46723, 46723, 46723, 46723, 46723, + 46723, 46723, 46723, 46723, 46723, 46723, 46723, 46723, + 46723, 46723, 46723, 46723, 46723, 46727, 46727, 46727, + 46747, 46747, 46747, 46747, 46747, 46747, 46747, 46747, + 46747, 46747, 46747, 46747, 46747, 46747, 46747, 46747, + 46747, 46747, 46751, 46751, 46751, 46751, 46757, 46757, + 46757, 46757, 46757, 46769, 46769, 46769, 46769, 46769, + 46769, 46769, 46769, 46769, 46769, 46769, 46771, 46771, + 46807, 46807, 46807, 46807, 46807, 46807, 46807, 46807, + 46807, 46807, 46807, 46807, 46807, 46807, 46807, 46807, + 46807, 46807, 46807, 46807, 46807, 46807, 46807, 46807, + 46807, 46807, 46807, 46807, 46807, 46807, 46807, 46807, + 46811, 46811, 46811, 46817, 46817, 46817, 46817, 46817, + 46819, 46819, 46829, 46829, 46829, 46829, 46829, 46829, + 46829, 46829, 46829, 46831, 46831, 46853, 46853, 46853, + 46853, 46853, 46853, 46853, 46853, 46853, 46853, 46853, + 46853, 46853, 46853, 46853, 46853, 46853, 46853, 46853, + 46861, 46861, 46861, 46861, 46861, 46861, 46861, 46861, + 46867, 46867, 46867, 46867, 46867, 46877, 46877, 46877, + 46877, 46877, 46877, 46877, 46877, 46877, 46889, 46889, + 46889, 46889, 46889, 46889, 46889, 46889, 46889, 46889, + 46901, 46901, 46901, 46901, 46901, 46901, 46901, 46901, + 46901, 46901, 46901, 46919, 46919, 46919, 46919, 46919, + 46919, 46919, 46919, 46919, 46919, 46919, 46919, 46919, + 46919, 46919, 46919, 46933, 46933, 46933, 46933, 46933, + 46933, 46933, 46933, 46933, 46933, 46933, 46933, 46933, + 46957, 46957, 46957, 46957, 46957, 46957, 46957, 46957, + 46957, 46957, 46957, 46957, 46957, 46957, 46957, 46957, + 46957, 46957, 46957, 46957, 46957, 46993, 46993, 46993, + 46993, 46993, 46993, 46993, 46993, 46993, 46993, 46993, + 46993, 46993, 46993, 46993, 46993, 46993, 46993, 46993, + 46993, 46993, 46993, 46993, 46993, 46993, 46993, 46993, + 46993, 46993, 46993, 46993, 46993, 46997, 46997, 46997, + 47017, 47017, 47017, 47017, 47017, 47017, 47017, 47017, + 47017, 47017, 47017, 47017, 47017, 47017, 47017, 47017, + 47017, 47017, 47041, 47041, 47041, 47041, 47041, 47041, + 47041, 47041, 47041, 47041, 47041, 47041, 47041, 47041, + 47041, 47041, 47041, 47041, 47041, 47041, 47041, 47041, + 47051, 47051, 47051, 47051, 47051, 47051, 47051, 47051, + 47057, 47057, 47057, 47057, 47057, 47057, 47059, 47059, + 47087, 47087, 47087, 47087, 47087, 47087, 47087, 47087, + 47087, 47087, 47087, 47087, 47087, 47087, 47087, 47087, + 47087, 47087, 47087, 47087, 47087, 47087, 47087, 47087, + 47093, 47093, 47093, 47093, 47093, 47093, 47111, 47111, + 47111, 47111, 47111, 47111, 47111, 47111, 47111, 47111, + 47111, 47111, 47111, 47111, 47111, 47111, 47119, 47119, + 47119, 47119, 47119, 47119, 47119, 47123, 47123, 47123, + 47129, 47129, 47129, 47129, 47129, 47129, 47137, 47137, + 47137, 47137, 47137, 47137, 47137, 47143, 47143, 47143, + 47143, 47143, 47147, 47147, 47147, 47147, 47149, 47149, + 47161, 47161, 47161, 47161, 47161, 47161, 47161, 47161, + 47161, 47161, 47189, 47189, 47189, 47189, 47189, 47189, + 47189, 47189, 47189, 47189, 47189, 47189, 47189, 47189, + 47189, 47189, 47189, 47189, 47189, 47189, 47189, 47189, + 47189, 47189, 47189, 47207, 47207, 47207, 47207, 47207, + 47207, 47207, 47207, 47207, 47207, 47207, 47207, 47207, + 47207, 47207, 47207, 47221, 47221, 47221, 47221, 47221, + 47221, 47221, 47221, 47221, 47221, 47221, 47221, 47221, + 47237, 47237, 47237, 47237, 47237, 47237, 47237, 47237, + 47237, 47237, 47237, 47237, 47237, 47237, 47251, 47251, + 47251, 47251, 47251, 47251, 47251, 47251, 47251, 47251, + 47251, 47251, 47269, 47269, 47269, 47269, 47269, 47269, + 47269, 47269, 47269, 47269, 47269, 47269, 47269, 47269, + 47269, 47269, 47279, 47279, 47279, 47279, 47279, 47279, + 47279, 47279, 47279, 47287, 47287, 47287, 47287, 47287, + 47287, 47287, 47293, 47293, 47293, 47293, 47293, 47293, + 47297, 47297, 47297, 47303, 47303, 47303, 47303, 47303, + 47309, 47309, 47309, 47309, 47309, 47309, 47317, 47317, + 47317, 47317, 47317, 47317, 47317, 47339, 47339, 47339, + 47339, 47339, 47339, 47339, 47339, 47339, 47339, 47339, + 47339, 47339, 47339, 47339, 47339, 47339, 47339, 47339, + 47351, 47351, 47351, 47351, 47351, 47351, 47351, 47351, + 47351, 47351, 47351, 47353, 47353, 47363, 47363, 47363, + 47363, 47363, 47363, 47363, 47363, 47363, 47381, 47381, + 47381, 47381, 47381, 47381, 47381, 47381, 47381, 47381, + 47381, 47381, 47381, 47381, 47381, 47381, 47387, 47387, + 47387, 47387, 47387, 47389, 47389, 47407, 47407, 47407, + 47407, 47407, 47407, 47407, 47407, 47407, 47407, 47407, + 47407, 47407, 47407, 47407, 47407, 47417, 47417, 47417, + 47417, 47417, 47417, 47417, 47417, 47417, 47419, 47419, + 47431, 47431, 47431, 47431, 47431, 47431, 47431, 47431, + 47431, 47431, 47441, 47441, 47441, 47441, 47441, 47441, + 47441, 47441, 47441, 47459, 47459, 47459, 47459, 47459, + 47459, 47459, 47459, 47459, 47459, 47459, 47459, 47459, + 47459, 47459, 47459, 47491, 47491, 47491, 47491, 47491, + 47491, 47491, 47491, 47491, 47491, 47491, 47491, 47491, + 47491, 47491, 47491, 47491, 47491, 47491, 47491, 47491, + 47491, 47491, 47491, 47491, 47491, 47491, 47491, 47491, + 47497, 47497, 47497, 47497, 47497, 47501, 47501, 47501, + 47507, 47507, 47507, 47507, 47507, 47507, 47513, 47513, + 47513, 47513, 47513, 47521, 47521, 47521, 47521, 47521, + 47521, 47521, 47527, 47527, 47527, 47527, 47527, 47527, + 47533, 47533, 47533, 47533, 47533, 47543, 47543, 47543, + 47543, 47543, 47543, 47543, 47543, 47543, 47563, 47563, + 47563, 47563, 47563, 47563, 47563, 47563, 47563, 47563, + 47563, 47563, 47563, 47563, 47563, 47563, 47563, 47563, + 47569, 47569, 47569, 47569, 47569, 47581, 47581, 47581, + 47581, 47581, 47581, 47581, 47581, 47581, 47581, 47581, + 47591, 47591, 47591, 47591, 47591, 47591, 47591, 47591, + 47599, 47599, 47599, 47599, 47599, 47599, 47599, 47599, + 47609, 47609, 47609, 47609, 47609, 47609, 47609, 47609, + 47623, 47623, 47623, 47623, 47623, 47623, 47623, 47623, + 47623, 47623, 47623, 47623, 47623, 47629, 47629, 47629, + 47629, 47629, 47639, 47639, 47639, 47639, 47639, 47639, + 47639, 47639, 47639, 47653, 47653, 47653, 47653, 47653, + 47653, 47653, 47653, 47653, 47653, 47653, 47653, 47653, + 47657, 47657, 47657, 47659, 47659, 47681, 47681, 47681, + 47681, 47681, 47681, 47681, 47681, 47681, 47681, 47681, + 47681, 47681, 47681, 47681, 47681, 47681, 47681, 47681, + 47699, 47699, 47699, 47699, 47699, 47699, 47699, 47699, + 47699, 47699, 47699, 47699, 47699, 47699, 47699, 47699, + 47701, 47701, 47711, 47711, 47711, 47711, 47711, 47711, + 47711, 47711, 47711, 47713, 47713, 47717, 47717, 47717, + 47737, 47737, 47737, 47737, 47737, 47737, 47737, 47737, + 47737, 47737, 47737, 47737, 47737, 47737, 47737, 47737, + 47737, 47737, 47741, 47741, 47741, 47741, 47743, 47743, + 47777, 47777, 47777, 47777, 47777, 47777, 47777, 47777, + 47777, 47777, 47777, 47777, 47777, 47777, 47777, 47777, + 47777, 47777, 47777, 47777, 47777, 47777, 47777, 47777, + 47777, 47777, 47777, 47777, 47777, 47777, 47779, 47779, + 47791, 47791, 47791, 47791, 47791, 47791, 47791, 47791, + 47791, 47791, 47797, 47797, 47797, 47797, 47797, 47797, + 47807, 47807, 47807, 47807, 47807, 47807, 47807, 47807, + 47809, 47809, 47819, 47819, 47819, 47819, 47819, 47819, + 47819, 47819, 47819, 47837, 47837, 47837, 47837, 47837, + 47837, 47837, 47837, 47837, 47837, 47837, 47837, 47837, + 47837, 47837, 47837, 47843, 47843, 47843, 47843, 47843, + 47857, 47857, 47857, 47857, 47857, 47857, 47857, 47857, + 47857, 47857, 47857, 47857, 47857, 47869, 47869, 47869, + 47869, 47869, 47869, 47869, 47869, 47869, 47869, 47869, + 47881, 47881, 47881, 47881, 47881, 47881, 47881, 47881, + 47881, 47881, 47903, 47903, 47903, 47903, 47903, 47903, + 47903, 47903, 47903, 47903, 47903, 47903, 47903, 47903, + 47903, 47903, 47903, 47903, 47903, 47903, 47911, 47911, + 47911, 47911, 47911, 47911, 47911, 47917, 47917, 47917, + 47917, 47917, 47933, 47933, 47933, 47933, 47933, 47933, + 47933, 47933, 47933, 47933, 47933, 47933, 47933, 47933, + 47939, 47939, 47939, 47939, 47939, 47939, 47947, 47947, + 47947, 47947, 47947, 47947, 47947, 47951, 47951, 47951, + 47963, 47963, 47963, 47963, 47963, 47963, 47963, 47963, + 47963, 47963, 47963, 47969, 47969, 47969, 47969, 47969, + 47977, 47977, 47977, 47977, 47977, 47977, 47977, 47977, + 47981, 47981, 47981, 48017, 48017, 48017, 48017, 48017, + 48017, 48017, 48017, 48017, 48017, 48017, 48017, 48017, + 48017, 48017, 48017, 48017, 48017, 48017, 48017, 48017, + 48017, 48017, 48017, 48017, 48017, 48017, 48017, 48017, + 48017, 48017, 48017, 48023, 48023, 48023, 48023, 48023, + 48029, 48029, 48029, 48029, 48029, 48029, 48049, 48049, + 48049, 48049, 48049, 48049, 48049, 48049, 48049, 48049, + 48049, 48049, 48049, 48049, 48049, 48049, 48049, 48049, + 48073, 48073, 48073, 48073, 48073, 48073, 48073, 48073, + 48073, 48073, 48073, 48073, 48073, 48073, 48073, 48073, + 48073, 48073, 48073, 48073, 48073, 48079, 48079, 48079, + 48079, 48079, 48091, 48091, 48091, 48091, 48091, 48091, + 48091, 48091, 48091, 48091, 48091, 48109, 48109, 48109, + 48109, 48109, 48109, 48109, 48109, 48109, 48109, 48109, + 48109, 48109, 48109, 48109, 48109, 48119, 48119, 48119, + 48119, 48119, 48119, 48119, 48119, 48119, 48121, 48121, + 48131, 48131, 48131, 48131, 48131, 48131, 48131, 48131, + 48157, 48157, 48157, 48157, 48157, 48157, 48157, 48157, + 48157, 48157, 48157, 48157, 48157, 48157, 48157, 48157, + 48157, 48157, 48157, 48157, 48157, 48157, 48157, 48157, + 48163, 48163, 48163, 48163, 48163, 48179, 48179, 48179, + 48179, 48179, 48179, 48179, 48179, 48179, 48179, 48179, + 48179, 48179, 48179, 48187, 48187, 48187, 48187, 48187, + 48187, 48187, 48193, 48193, 48193, 48193, 48193, 48193, + 48197, 48197, 48197, 48221, 48221, 48221, 48221, 48221, + 48221, 48221, 48221, 48221, 48221, 48221, 48221, 48221, + 48221, 48221, 48221, 48221, 48221, 48221, 48221, 48221, + 48239, 48239, 48239, 48239, 48239, 48239, 48239, 48239, + 48239, 48239, 48239, 48239, 48239, 48239, 48239, 48239, + 48247, 48247, 48247, 48247, 48247, 48247, 48247, 48247, + 48259, 48259, 48259, 48259, 48259, 48259, 48259, 48259, + 48259, 48259, 48271, 48271, 48271, 48271, 48271, 48271, + 48271, 48271, 48271, 48271, 48271, 48281, 48281, 48281, + 48281, 48281, 48281, 48281, 48281, 48281, 48299, 48299, + 48299, 48299, 48299, 48299, 48299, 48299, 48299, 48299, + 48299, 48299, 48299, 48299, 48299, 48299, 48311, 48311, + 48311, 48311, 48311, 48311, 48311, 48311, 48311, 48311, + 48313, 48313, 48337, 48337, 48337, 48337, 48337, 48337, + 48337, 48337, 48337, 48337, 48337, 48337, 48337, 48337, + 48337, 48337, 48337, 48337, 48337, 48337, 48337, 48337, + 48341, 48341, 48341, 48353, 48353, 48353, 48353, 48353, + 48353, 48353, 48353, 48353, 48353, 48353, 48371, 48371, + 48371, 48371, 48371, 48371, 48371, 48371, 48371, 48371, + 48371, 48371, 48371, 48371, 48371, 48371, 48383, 48383, + 48383, 48383, 48383, 48383, 48383, 48383, 48383, 48383, + 48397, 48397, 48397, 48397, 48397, 48397, 48397, 48397, + 48397, 48397, 48397, 48397, 48397, 48407, 48407, 48407, + 48407, 48407, 48407, 48407, 48407, 48407, 48409, 48409, + 48413, 48413, 48413, 48437, 48437, 48437, 48437, 48437, + 48437, 48437, 48437, 48437, 48437, 48437, 48437, 48437, + 48437, 48437, 48437, 48437, 48437, 48437, 48437, 48437, + 48449, 48449, 48449, 48449, 48449, 48449, 48449, 48449, + 48449, 48449, 48449, 48463, 48463, 48463, 48463, 48463, + 48463, 48463, 48463, 48463, 48463, 48463, 48463, 48463, + 48473, 48473, 48473, 48473, 48473, 48473, 48473, 48473, + 48479, 48479, 48479, 48479, 48479, 48479, 48481, 48481, + 48487, 48487, 48487, 48487, 48487, 48491, 48491, 48491, + 48497, 48497, 48497, 48497, 48497, 48497, 48523, 48523, + 48523, 48523, 48523, 48523, 48523, 48523, 48523, 48523, + 48523, 48523, 48523, 48523, 48523, 48523, 48523, 48523, + 48523, 48523, 48523, 48523, 48523, 48527, 48527, 48527, + 48533, 48533, 48533, 48533, 48533, 48533, 48539, 48539, + 48539, 48539, 48539, 48541, 48541, 48563, 48563, 48563, + 48563, 48563, 48563, 48563, 48563, 48563, 48563, 48563, + 48563, 48563, 48563, 48563, 48563, 48563, 48563, 48563, + 48571, 48571, 48571, 48571, 48571, 48571, 48571, 48571, + 48589, 48589, 48589, 48589, 48589, 48589, 48589, 48589, + 48589, 48589, 48589, 48589, 48589, 48589, 48589, 48589, + 48593, 48593, 48593, 48611, 48611, 48611, 48611, 48611, + 48611, 48611, 48611, 48611, 48611, 48611, 48611, 48611, + 48611, 48611, 48611, 48619, 48619, 48619, 48619, 48619, + 48619, 48619, 48623, 48623, 48623, 48623, 48647, 48647, + 48647, 48647, 48647, 48647, 48647, 48647, 48647, 48647, + 48647, 48647, 48647, 48647, 48647, 48647, 48647, 48647, + 48647, 48647, 48647, 48649, 48649, 48661, 48661, 48661, + 48661, 48661, 48661, 48661, 48661, 48661, 48661, 48661, + 48673, 48673, 48673, 48673, 48673, 48673, 48673, 48673, + 48673, 48673, 48677, 48677, 48677, 48677, 48679, 48679, + 48731, 48731, 48731, 48731, 48731, 48731, 48731, 48731, + 48731, 48731, 48731, 48731, 48731, 48731, 48731, 48731, + 48731, 48731, 48731, 48731, 48731, 48731, 48731, 48731, + 48731, 48731, 48731, 48731, 48731, 48731, 48731, 48731, + 48731, 48731, 48731, 48731, 48731, 48731, 48731, 48731, + 48731, 48731, 48731, 48731, 48731, 48731, 48733, 48733, + 48751, 48751, 48751, 48751, 48751, 48751, 48751, 48751, + 48751, 48751, 48751, 48751, 48751, 48751, 48751, 48751, + 48757, 48757, 48757, 48757, 48757, 48761, 48761, 48761, + 48767, 48767, 48767, 48767, 48767, 48767, 48779, 48779, + 48779, 48779, 48779, 48779, 48779, 48779, 48779, 48779, + 48781, 48781, 48787, 48787, 48787, 48787, 48787, 48787, + 48799, 48799, 48799, 48799, 48799, 48799, 48799, 48799, + 48799, 48799, 48809, 48809, 48809, 48809, 48809, 48809, + 48809, 48809, 48809, 48817, 48817, 48817, 48817, 48817, + 48817, 48817, 48821, 48821, 48821, 48821, 48823, 48823, + 48847, 48847, 48847, 48847, 48847, 48847, 48847, 48847, + 48847, 48847, 48847, 48847, 48847, 48847, 48847, 48847, + 48847, 48847, 48847, 48847, 48847, 48857, 48857, 48857, + 48857, 48857, 48857, 48857, 48857, 48857, 48859, 48859, + 48869, 48869, 48869, 48869, 48869, 48869, 48869, 48869, + 48871, 48871, 48883, 48883, 48883, 48883, 48883, 48883, + 48883, 48883, 48883, 48883, 48883, 48889, 48889, 48889, + 48889, 48889, 48907, 48907, 48907, 48907, 48907, 48907, + 48907, 48907, 48907, 48907, 48907, 48907, 48907, 48907, + 48907, 48907, 48947, 48947, 48947, 48947, 48947, 48947, + 48947, 48947, 48947, 48947, 48947, 48947, 48947, 48947, + 48947, 48947, 48947, 48947, 48947, 48947, 48947, 48947, + 48947, 48947, 48947, 48947, 48947, 48947, 48947, 48947, + 48947, 48947, 48947, 48947, 48947, 48947, 48953, 48953, + 48953, 48953, 48953, 48973, 48973, 48973, 48973, 48973, + 48973, 48973, 48973, 48973, 48973, 48973, 48973, 48973, + 48973, 48973, 48973, 48973, 48973, 48989, 48989, 48989, + 48989, 48989, 48989, 48989, 48989, 48989, 48989, 48989, + 48989, 48989, 48989, 48991, 48991, 49003, 49003, 49003, + 49003, 49003, 49003, 49003, 49003, 49003, 49003, 49003, + 49009, 49009, 49009, 49009, 49009, 49019, 49019, 49019, + 49019, 49019, 49019, 49019, 49019, 49019, 49031, 49031, + 49031, 49031, 49031, 49031, 49031, 49031, 49031, 49031, + 49033, 49033, 49037, 49037, 49037, 49037, 49043, 49043, + 49043, 49043, 49043, 49057, 49057, 49057, 49057, 49057, + 49057, 49057, 49057, 49057, 49057, 49057, 49057, 49057, + 49069, 49069, 49069, 49069, 49069, 49069, 49069, 49069, + 49069, 49069, 49081, 49081, 49081, 49081, 49081, 49081, + 49081, 49081, 49081, 49081, 49081, 49103, 49103, 49103, + 49103, 49103, 49103, 49103, 49103, 49103, 49103, 49103, + 49103, 49103, 49103, 49103, 49103, 49103, 49103, 49103, + 49109, 49109, 49109, 49109, 49109, 49109, 49117, 49117, + 49117, 49117, 49117, 49117, 49117, 49121, 49121, 49121, + 49123, 49123, 49139, 49139, 49139, 49139, 49139, 49139, + 49139, 49139, 49139, 49139, 49139, 49139, 49139, 49139, + 49157, 49157, 49157, 49157, 49157, 49157, 49157, 49157, + 49157, 49157, 49157, 49157, 49157, 49157, 49157, 49157, + 49169, 49169, 49169, 49169, 49169, 49169, 49169, 49169, + 49169, 49169, 49169, 49171, 49171, 49177, 49177, 49177, + 49177, 49177, 49193, 49193, 49193, 49193, 49193, 49193, + 49193, 49193, 49193, 49193, 49193, 49193, 49193, 49193, + 49199, 49199, 49199, 49199, 49199, 49199, 49201, 49201, + 49207, 49207, 49207, 49207, 49207, 49211, 49211, 49211, + 49223, 49223, 49223, 49223, 49223, 49223, 49223, 49223, + 49223, 49223, 49223, 49253, 49253, 49253, 49253, 49253, + 49253, 49253, 49253, 49253, 49253, 49253, 49253, 49253, + 49253, 49253, 49253, 49253, 49253, 49253, 49253, 49253, + 49253, 49253, 49253, 49253, 49253, 49253, 49261, 49261, + 49261, 49261, 49261, 49261, 49261, 49277, 49277, 49277, + 49277, 49277, 49277, 49277, 49277, 49277, 49277, 49277, + 49277, 49277, 49277, 49279, 49279, 49297, 49297, 49297, + 49297, 49297, 49297, 49297, 49297, 49297, 49297, 49297, + 49297, 49297, 49297, 49297, 49297, 49307, 49307, 49307, + 49307, 49307, 49307, 49307, 49307, 49307, 49331, 49331, + 49331, 49331, 49331, 49331, 49331, 49331, 49331, 49331, + 49331, 49331, 49331, 49331, 49331, 49331, 49331, 49331, + 49331, 49331, 49331, 49333, 49333, 49339, 49339, 49339, + 49339, 49339, 49363, 49363, 49363, 49363, 49363, 49363, + 49363, 49363, 49363, 49363, 49363, 49363, 49363, 49363, + 49363, 49363, 49363, 49363, 49363, 49363, 49363, 49363, + 49367, 49367, 49367, 49369, 49369, 49391, 49391, 49391, + 49391, 49391, 49391, 49391, 49391, 49391, 49391, 49391, + 49391, 49391, 49391, 49391, 49391, 49391, 49391, 49391, + 49393, 49393, 49409, 49409, 49409, 49409, 49409, 49409, + 49409, 49409, 49409, 49409, 49409, 49409, 49409, 49409, + 49411, 49411, 49417, 49417, 49417, 49417, 49417, 49417, + 49429, 49429, 49429, 49429, 49429, 49429, 49429, 49429, + 49429, 49429, 49433, 49433, 49433, 49433, 49451, 49451, + 49451, 49451, 49451, 49451, 49451, 49451, 49451, 49451, + 49451, 49451, 49451, 49451, 49451, 49451, 49459, 49459, + 49459, 49459, 49459, 49459, 49459, 49463, 49463, 49463, + 49477, 49477, 49477, 49477, 49477, 49477, 49477, 49477, + 49477, 49477, 49477, 49477, 49477, 49481, 49481, 49481, + 49499, 49499, 49499, 49499, 49499, 49499, 49499, 49499, + 49499, 49499, 49499, 49499, 49499, 49499, 49499, 49499, + 49523, 49523, 49523, 49523, 49523, 49523, 49523, 49523, + 49523, 49523, 49523, 49523, 49523, 49523, 49523, 49523, + 49523, 49523, 49523, 49523, 49523, 49523, 49529, 49529, + 49529, 49529, 49529, 49531, 49531, 49537, 49537, 49537, + 49537, 49537, 49547, 49547, 49547, 49547, 49547, 49547, + 49547, 49547, 49547, 49549, 49549, 49559, 49559, 49559, + 49559, 49559, 49559, 49559, 49559, 49559, 49597, 49597, + 49597, 49597, 49597, 49597, 49597, 49597, 49597, 49597, + 49597, 49597, 49597, 49597, 49597, 49597, 49597, 49597, + 49597, 49597, 49597, 49597, 49597, 49597, 49597, 49597, + 49597, 49597, 49597, 49597, 49597, 49597, 49597, 49597, + 49603, 49603, 49603, 49603, 49603, 49613, 49613, 49613, + 49613, 49613, 49613, 49613, 49613, 49613, 49627, 49627, + 49627, 49627, 49627, 49627, 49627, 49627, 49627, 49627, + 49627, 49627, 49633, 49633, 49633, 49633, 49633, 49633, + 49639, 49639, 49639, 49639, 49639, 49663, 49663, 49663, + 49663, 49663, 49663, 49663, 49663, 49663, 49663, 49663, + 49663, 49663, 49663, 49663, 49663, 49663, 49663, 49663, + 49663, 49663, 49667, 49667, 49667, 49667, 49669, 49669, + 49681, 49681, 49681, 49681, 49681, 49681, 49681, 49681, + 49681, 49681, 49697, 49697, 49697, 49697, 49697, 49697, + 49697, 49697, 49697, 49697, 49697, 49697, 49697, 49697, + 49711, 49711, 49711, 49711, 49711, 49711, 49711, 49711, + 49711, 49711, 49711, 49711, 49711, 49727, 49727, 49727, + 49727, 49727, 49727, 49727, 49727, 49727, 49727, 49727, + 49727, 49727, 49727, 49739, 49739, 49739, 49739, 49739, + 49739, 49739, 49739, 49739, 49739, 49739, 49741, 49741, + 49747, 49747, 49747, 49747, 49747, 49757, 49757, 49757, + 49757, 49757, 49757, 49757, 49757, 49757, 49783, 49783, + 49783, 49783, 49783, 49783, 49783, 49783, 49783, 49783, + 49783, 49783, 49783, 49783, 49783, 49783, 49783, 49783, + 49783, 49783, 49783, 49783, 49783, 49787, 49787, 49787, + 49789, 49789, 49801, 49801, 49801, 49801, 49801, 49801, + 49801, 49801, 49801, 49801, 49801, 49807, 49807, 49807, + 49807, 49807, 49811, 49811, 49811, 49811, 49823, 49823, + 49823, 49823, 49823, 49823, 49823, 49823, 49823, 49823, + 49831, 49831, 49831, 49831, 49831, 49831, 49831, 49831, + 49843, 49843, 49843, 49843, 49843, 49843, 49843, 49843, + 49843, 49843, 49853, 49853, 49853, 49853, 49853, 49853, + 49853, 49853, 49853, 49871, 49871, 49871, 49871, 49871, + 49871, 49871, 49871, 49871, 49871, 49871, 49871, 49871, + 49871, 49871, 49871, 49877, 49877, 49877, 49877, 49877, + 49891, 49891, 49891, 49891, 49891, 49891, 49891, 49891, + 49891, 49891, 49891, 49891, 49891, 49919, 49919, 49919, + 49919, 49919, 49919, 49919, 49919, 49919, 49919, 49919, + 49919, 49919, 49919, 49919, 49919, 49919, 49919, 49919, + 49919, 49919, 49919, 49919, 49919, 49919, 49921, 49921, + 49927, 49927, 49927, 49927, 49927, 49937, 49937, 49937, + 49937, 49937, 49937, 49937, 49937, 49937, 49939, 49939, + 49943, 49943, 49943, 49957, 49957, 49957, 49957, 49957, + 49957, 49957, 49957, 49957, 49957, 49957, 49957, 49957, + 49991, 49991, 49991, 49991, 49991, 49991, 49991, 49991, + 49991, 49991, 49991, 49991, 49991, 49991, 49991, 49991, + 49991, 49991, 49991, 49991, 49991, 49991, 49991, 49991, + 49991, 49991, 49991, 49991, 49991, 49991, 49993, 49993, + 49999, 49999, 49999, 49999, 49999, 50021, 50021, 50021, + 50021, 50021, 50021, 50021, 50021, 50021, 50021, 50021, + 50021, 50021, 50021, 50021, 50021, 50021, 50021, 50021, + 50023, 50023, 50033, 50033, 50033, 50033, 50033, 50033, + 50033, 50033, 50033, 50047, 50047, 50047, 50047, 50047, + 50047, 50047, 50047, 50047, 50047, 50047, 50047, 50047, + 50051, 50051, 50051, 50053, 50053, 50069, 50069, 50069, + 50069, 50069, 50069, 50069, 50069, 50069, 50069, 50069, + 50069, 50069, 50069, 50077, 50077, 50077, 50077, 50077, + 50077, 50077, 50087, 50087, 50087, 50087, 50087, 50087, + 50087, 50087, 50087, 50093, 50093, 50093, 50093, 50093, + 50101, 50101, 50101, 50101, 50101, 50101, 50101, 50101, + 50111, 50111, 50111, 50111, 50111, 50111, 50111, 50111, + 50119, 50119, 50119, 50119, 50119, 50119, 50119, 50119, + 50123, 50123, 50123, 50129, 50129, 50129, 50129, 50129, + 50131, 50131, 50147, 50147, 50147, 50147, 50147, 50147, + 50147, 50147, 50147, 50147, 50147, 50147, 50147, 50147, + 50153, 50153, 50153, 50153, 50153, 50153, 50159, 50159, + 50159, 50159, 50159, 50177, 50177, 50177, 50177, 50177, + 50177, 50177, 50177, 50177, 50177, 50177, 50177, 50177, + 50177, 50177, 50177, 50207, 50207, 50207, 50207, 50207, + 50207, 50207, 50207, 50207, 50207, 50207, 50207, 50207, + 50207, 50207, 50207, 50207, 50207, 50207, 50207, 50207, + 50207, 50207, 50207, 50207, 50207, 50207, 50221, 50221, + 50221, 50221, 50221, 50221, 50221, 50221, 50221, 50221, + 50221, 50221, 50227, 50227, 50227, 50227, 50227, 50227, + 50231, 50231, 50231, 50261, 50261, 50261, 50261, 50261, + 50261, 50261, 50261, 50261, 50261, 50261, 50261, 50261, + 50261, 50261, 50261, 50261, 50261, 50261, 50261, 50261, + 50261, 50261, 50261, 50261, 50261, 50261, 50263, 50263, + 50273, 50273, 50273, 50273, 50273, 50273, 50273, 50273, + 50287, 50287, 50287, 50287, 50287, 50287, 50287, 50287, + 50287, 50287, 50287, 50287, 50287, 50291, 50291, 50291, + 50311, 50311, 50311, 50311, 50311, 50311, 50311, 50311, + 50311, 50311, 50311, 50311, 50311, 50311, 50311, 50311, + 50311, 50311, 50321, 50321, 50321, 50321, 50321, 50321, + 50321, 50321, 50321, 50329, 50329, 50329, 50329, 50329, + 50329, 50329, 50333, 50333, 50333, 50333, 50341, 50341, + 50341, 50341, 50341, 50341, 50341, 50359, 50359, 50359, + 50359, 50359, 50359, 50359, 50359, 50359, 50359, 50359, + 50359, 50359, 50359, 50359, 50359, 50363, 50363, 50363, + 50377, 50377, 50377, 50377, 50377, 50377, 50377, 50377, + 50377, 50377, 50377, 50377, 50377, 50383, 50383, 50383, + 50383, 50383, 50387, 50387, 50387, 50387, 50411, 50411, + 50411, 50411, 50411, 50411, 50411, 50411, 50411, 50411, + 50411, 50411, 50411, 50411, 50411, 50411, 50411, 50411, + 50411, 50411, 50411, 50417, 50417, 50417, 50417, 50417, + 50423, 50423, 50423, 50423, 50423, 50423, 50441, 50441, + 50441, 50441, 50441, 50441, 50441, 50441, 50441, 50441, + 50441, 50441, 50441, 50441, 50441, 50441, 50459, 50459, + 50459, 50459, 50459, 50459, 50459, 50459, 50459, 50459, + 50459, 50459, 50459, 50459, 50459, 50459, 50461, 50461, + 50497, 50497, 50497, 50497, 50497, 50497, 50497, 50497, + 50497, 50497, 50497, 50497, 50497, 50497, 50497, 50497, + 50497, 50497, 50497, 50497, 50497, 50497, 50497, 50497, + 50497, 50497, 50497, 50497, 50497, 50497, 50497, 50497, + 50503, 50503, 50503, 50503, 50503, 50513, 50513, 50513, + 50513, 50513, 50513, 50513, 50513, 50513, 50527, 50527, + 50527, 50527, 50527, 50527, 50527, 50527, 50527, 50527, + 50527, 50527, 50539, 50539, 50539, 50539, 50539, 50539, + 50539, 50539, 50539, 50539, 50539, 50543, 50543, 50543, + 50549, 50549, 50549, 50549, 50549, 50549, 50551, 50551, + 50581, 50581, 50581, 50581, 50581, 50581, 50581, 50581, + 50581, 50581, 50581, 50581, 50581, 50581, 50581, 50581, + 50581, 50581, 50581, 50581, 50581, 50581, 50581, 50581, + 50581, 50581, 50587, 50587, 50587, 50587, 50587, 50587, + 50591, 50591, 50591, 50593, 50593, 50599, 50599, 50599, + 50599, 50599, 50627, 50627, 50627, 50627, 50627, 50627, + 50627, 50627, 50627, 50627, 50627, 50627, 50627, 50627, + 50627, 50627, 50627, 50627, 50627, 50627, 50627, 50627, + 50627, 50627, 50627, 50647, 50647, 50647, 50647, 50647, + 50647, 50647, 50647, 50647, 50647, 50647, 50647, 50647, + 50647, 50647, 50647, 50647, 50647, 50651, 50651, 50651, + 50671, 50671, 50671, 50671, 50671, 50671, 50671, 50671, + 50671, 50671, 50671, 50671, 50671, 50671, 50671, 50671, + 50671, 50671, 50683, 50683, 50683, 50683, 50683, 50683, + 50683, 50683, 50683, 50683, 50683, 50707, 50707, 50707, + 50707, 50707, 50707, 50707, 50707, 50707, 50707, 50707, + 50707, 50707, 50707, 50707, 50707, 50707, 50707, 50707, + 50707, 50707, 50723, 50723, 50723, 50723, 50723, 50723, + 50723, 50723, 50723, 50723, 50723, 50723, 50723, 50723, + 50741, 50741, 50741, 50741, 50741, 50741, 50741, 50741, + 50741, 50741, 50741, 50741, 50741, 50741, 50741, 50741, + 50753, 50753, 50753, 50753, 50753, 50753, 50753, 50753, + 50753, 50753, 50753, 50767, 50767, 50767, 50767, 50767, + 50767, 50767, 50767, 50767, 50767, 50767, 50767, 50767, + 50773, 50773, 50773, 50773, 50773, 50777, 50777, 50777, + 50789, 50789, 50789, 50789, 50789, 50789, 50789, 50789, + 50789, 50789, 50789, 50821, 50821, 50821, 50821, 50821, + 50821, 50821, 50821, 50821, 50821, 50821, 50821, 50821, + 50821, 50821, 50821, 50821, 50821, 50821, 50821, 50821, + 50821, 50821, 50821, 50821, 50821, 50821, 50821, 50821, + 50833, 50833, 50833, 50833, 50833, 50833, 50833, 50833, + 50833, 50833, 50839, 50839, 50839, 50839, 50839, 50839, + 50849, 50849, 50849, 50849, 50849, 50849, 50849, 50849, + 50857, 50857, 50857, 50857, 50857, 50857, 50857, 50857, + 50867, 50867, 50867, 50867, 50867, 50867, 50867, 50867, + 50873, 50873, 50873, 50873, 50873, 50873, 50891, 50891, + 50891, 50891, 50891, 50891, 50891, 50891, 50891, 50891, + 50891, 50891, 50891, 50891, 50891, 50891, 50893, 50893, + 50909, 50909, 50909, 50909, 50909, 50909, 50909, 50909, + 50909, 50909, 50909, 50909, 50909, 50909, 50923, 50923, + 50923, 50923, 50923, 50923, 50923, 50923, 50923, 50923, + 50923, 50923, 50929, 50929, 50929, 50929, 50929, 50929, + 50951, 50951, 50951, 50951, 50951, 50951, 50951, 50951, + 50951, 50951, 50951, 50951, 50951, 50951, 50951, 50951, + 50951, 50951, 50951, 50957, 50957, 50957, 50957, 50957, + 50969, 50969, 50969, 50969, 50969, 50969, 50969, 50969, + 50969, 50969, 50969, 50971, 50971, 50989, 50989, 50989, + 50989, 50989, 50989, 50989, 50989, 50989, 50989, 50989, + 50989, 50989, 50989, 50989, 50989, 50993, 50993, 50993, + 51001, 51001, 51001, 51001, 51001, 51001, 51001, 51001, + 51031, 51031, 51031, 51031, 51031, 51031, 51031, 51031, + 51031, 51031, 51031, 51031, 51031, 51031, 51031, 51031, + 51031, 51031, 51031, 51031, 51031, 51031, 51031, 51031, + 51031, 51031, 51043, 51043, 51043, 51043, 51043, 51043, + 51043, 51043, 51043, 51043, 51043, 51047, 51047, 51047, + 51059, 51059, 51059, 51059, 51059, 51059, 51059, 51059, + 51059, 51059, 51059, 51061, 51061, 51071, 51071, 51071, + 51071, 51071, 51071, 51071, 51071, 51071, 51109, 51109, + 51109, 51109, 51109, 51109, 51109, 51109, 51109, 51109, + 51109, 51109, 51109, 51109, 51109, 51109, 51109, 51109, + 51109, 51109, 51109, 51109, 51109, 51109, 51109, 51109, + 51109, 51109, 51109, 51109, 51109, 51109, 51109, 51109, + 51131, 51131, 51131, 51131, 51131, 51131, 51131, 51131, + 51131, 51131, 51131, 51131, 51131, 51131, 51131, 51131, + 51131, 51131, 51131, 51133, 51133, 51137, 51137, 51137, + 51151, 51151, 51151, 51151, 51151, 51151, 51151, 51151, + 51151, 51151, 51151, 51151, 51151, 51157, 51157, 51157, + 51157, 51157, 51169, 51169, 51169, 51169, 51169, 51169, + 51169, 51169, 51169, 51169, 51169, 51193, 51193, 51193, + 51193, 51193, 51193, 51193, 51193, 51193, 51193, 51193, + 51193, 51193, 51193, 51193, 51193, 51193, 51193, 51193, + 51193, 51193, 51197, 51197, 51197, 51197, 51199, 51199, + 51203, 51203, 51203, 51217, 51217, 51217, 51217, 51217, + 51217, 51217, 51217, 51217, 51217, 51217, 51217, 51217, + 51229, 51229, 51229, 51229, 51229, 51229, 51229, 51229, + 51229, 51229, 51239, 51239, 51239, 51239, 51239, 51239, + 51239, 51239, 51239, 51241, 51241, 51257, 51257, 51257, + 51257, 51257, 51257, 51257, 51257, 51257, 51257, 51257, + 51257, 51257, 51257, 51263, 51263, 51263, 51263, 51263, + 51283, 51283, 51283, 51283, 51283, 51283, 51283, 51283, + 51283, 51283, 51283, 51283, 51283, 51283, 51283, 51283, + 51283, 51283, 51287, 51287, 51287, 51287, 51307, 51307, + 51307, 51307, 51307, 51307, 51307, 51307, 51307, 51307, + 51307, 51307, 51307, 51307, 51307, 51307, 51307, 51307, + 51329, 51329, 51329, 51329, 51329, 51329, 51329, 51329, + 51329, 51329, 51329, 51329, 51329, 51329, 51329, 51329, + 51329, 51329, 51329, 51341, 51341, 51341, 51341, 51341, + 51341, 51341, 51341, 51341, 51341, 51341, 51343, 51343, + 51347, 51347, 51347, 51349, 51349, 51361, 51361, 51361, + 51361, 51361, 51361, 51361, 51361, 51361, 51361, 51361, + 51383, 51383, 51383, 51383, 51383, 51383, 51383, 51383, + 51383, 51383, 51383, 51383, 51383, 51383, 51383, 51383, + 51383, 51383, 51383, 51407, 51407, 51407, 51407, 51407, + 51407, 51407, 51407, 51407, 51407, 51407, 51407, 51407, + 51407, 51407, 51407, 51407, 51407, 51407, 51407, 51407, + 51413, 51413, 51413, 51413, 51413, 51413, 51419, 51419, + 51419, 51419, 51419, 51421, 51421, 51427, 51427, 51427, + 51427, 51427, 51431, 51431, 51431, 51431, 51437, 51437, + 51437, 51437, 51437, 51439, 51439, 51449, 51449, 51449, + 51449, 51449, 51449, 51449, 51449, 51449, 51461, 51461, + 51461, 51461, 51461, 51461, 51461, 51461, 51461, 51461, + 51473, 51473, 51473, 51473, 51473, 51473, 51473, 51473, + 51473, 51473, 51473, 51479, 51479, 51479, 51479, 51479, + 51481, 51481, 51487, 51487, 51487, 51487, 51487, 51487, + 51503, 51503, 51503, 51503, 51503, 51503, 51503, 51503, + 51503, 51503, 51503, 51503, 51503, 51503, 51511, 51511, + 51511, 51511, 51511, 51511, 51511, 51517, 51517, 51517, + 51517, 51517, 51521, 51521, 51521, 51521, 51539, 51539, + 51539, 51539, 51539, 51539, 51539, 51539, 51539, 51539, + 51539, 51539, 51539, 51539, 51539, 51539, 51551, 51551, + 51551, 51551, 51551, 51551, 51551, 51551, 51551, 51551, + 51563, 51563, 51563, 51563, 51563, 51563, 51563, 51563, + 51563, 51563, 51563, 51577, 51577, 51577, 51577, 51577, + 51577, 51577, 51577, 51577, 51577, 51577, 51577, 51577, + 51581, 51581, 51581, 51593, 51593, 51593, 51593, 51593, + 51593, 51593, 51593, 51593, 51593, 51593, 51599, 51599, + 51599, 51599, 51599, 51607, 51607, 51607, 51607, 51607, + 51607, 51607, 51613, 51613, 51613, 51613, 51613, 51613, + 51631, 51631, 51631, 51631, 51631, 51631, 51631, 51631, + 51631, 51631, 51631, 51631, 51631, 51631, 51631, 51631, + 51637, 51637, 51637, 51637, 51637, 51647, 51647, 51647, + 51647, 51647, 51647, 51647, 51647, 51647, 51659, 51659, + 51659, 51659, 51659, 51659, 51659, 51659, 51659, 51659, + 51673, 51673, 51673, 51673, 51673, 51673, 51673, 51673, + 51673, 51673, 51673, 51673, 51673, 51679, 51679, 51679, + 51679, 51679, 51683, 51683, 51683, 51683, 51691, 51691, + 51691, 51691, 51691, 51691, 51691, 51713, 51713, 51713, + 51713, 51713, 51713, 51713, 51713, 51713, 51713, 51713, + 51713, 51713, 51713, 51713, 51713, 51713, 51713, 51713, + 51719, 51719, 51719, 51719, 51719, 51719, 51721, 51721, + 51749, 51749, 51749, 51749, 51749, 51749, 51749, 51749, + 51749, 51749, 51749, 51749, 51749, 51749, 51749, 51749, + 51749, 51749, 51749, 51749, 51749, 51749, 51749, 51749, + 51767, 51767, 51767, 51767, 51767, 51767, 51767, 51767, + 51767, 51767, 51767, 51767, 51767, 51767, 51767, 51767, + 51769, 51769, 51787, 51787, 51787, 51787, 51787, 51787, + 51787, 51787, 51787, 51787, 51787, 51787, 51787, 51787, + 51787, 51787, 51797, 51797, 51797, 51797, 51797, 51797, + 51797, 51797, 51797, 51803, 51803, 51803, 51803, 51803, + 51817, 51817, 51817, 51817, 51817, 51817, 51817, 51817, + 51817, 51817, 51817, 51817, 51817, 51827, 51827, 51827, + 51827, 51827, 51827, 51827, 51827, 51827, 51829, 51829, + 51839, 51839, 51839, 51839, 51839, 51839, 51839, 51839, + 51853, 51853, 51853, 51853, 51853, 51853, 51853, 51853, + 51853, 51853, 51853, 51853, 51853, 51859, 51859, 51859, + 51859, 51859, 51869, 51869, 51869, 51869, 51869, 51869, + 51869, 51869, 51869, 51871, 51871, 51893, 51893, 51893, + 51893, 51893, 51893, 51893, 51893, 51893, 51893, 51893, + 51893, 51893, 51893, 51893, 51893, 51893, 51893, 51893, + 51899, 51899, 51899, 51899, 51899, 51899, 51907, 51907, + 51907, 51907, 51907, 51907, 51907, 51913, 51913, 51913, + 51913, 51913, 51929, 51929, 51929, 51929, 51929, 51929, + 51929, 51929, 51929, 51929, 51929, 51929, 51929, 51929, + 51941, 51941, 51941, 51941, 51941, 51941, 51941, 51941, + 51941, 51941, 51941, 51949, 51949, 51949, 51949, 51949, + 51949, 51949, 51971, 51971, 51971, 51971, 51971, 51971, + 51971, 51971, 51971, 51971, 51971, 51971, 51971, 51971, + 51971, 51971, 51971, 51971, 51971, 51971, 51973, 51973, + 51977, 51977, 51977, 51991, 51991, 51991, 51991, 51991, + 51991, 51991, 51991, 51991, 51991, 51991, 51991, 51991, + 52009, 52009, 52009, 52009, 52009, 52009, 52009, 52009, + 52009, 52009, 52009, 52009, 52009, 52009, 52009, 52009, + 52021, 52021, 52021, 52021, 52021, 52021, 52021, 52021, + 52021, 52021, 52027, 52027, 52027, 52027, 52027, 52027, + 52051, 52051, 52051, 52051, 52051, 52051, 52051, 52051, + 52051, 52051, 52051, 52051, 52051, 52051, 52051, 52051, + 52051, 52051, 52051, 52051, 52051, 52057, 52057, 52057, + 52057, 52057, 52067, 52067, 52067, 52067, 52067, 52067, + 52067, 52067, 52067, 52069, 52069, 52081, 52081, 52081, + 52081, 52081, 52081, 52081, 52081, 52081, 52081, 52081, + 52103, 52103, 52103, 52103, 52103, 52103, 52103, 52103, + 52103, 52103, 52103, 52103, 52103, 52103, 52103, 52103, + 52103, 52103, 52103, 52121, 52121, 52121, 52121, 52121, + 52121, 52121, 52121, 52121, 52121, 52121, 52121, 52121, + 52121, 52121, 52121, 52127, 52127, 52127, 52127, 52127, + 52147, 52147, 52147, 52147, 52147, 52147, 52147, 52147, + 52147, 52147, 52147, 52147, 52147, 52147, 52147, 52147, + 52147, 52147, 52153, 52153, 52153, 52153, 52153, 52153, + 52163, 52163, 52163, 52163, 52163, 52163, 52163, 52163, + 52177, 52177, 52177, 52177, 52177, 52177, 52177, 52177, + 52177, 52177, 52177, 52177, 52177, 52181, 52181, 52181, + 52183, 52183, 52189, 52189, 52189, 52189, 52189, 52189, + 52201, 52201, 52201, 52201, 52201, 52201, 52201, 52201, + 52201, 52201, 52223, 52223, 52223, 52223, 52223, 52223, + 52223, 52223, 52223, 52223, 52223, 52223, 52223, 52223, + 52223, 52223, 52223, 52223, 52223, 52223, 52237, 52237, + 52237, 52237, 52237, 52237, 52237, 52237, 52237, 52237, + 52237, 52237, 52249, 52249, 52249, 52249, 52249, 52249, + 52249, 52249, 52249, 52249, 52249, 52253, 52253, 52253, + 52259, 52259, 52259, 52259, 52259, 52259, 52267, 52267, + 52267, 52267, 52267, 52267, 52267, 52289, 52289, 52289, + 52289, 52289, 52289, 52289, 52289, 52289, 52289, 52289, + 52289, 52289, 52289, 52289, 52289, 52289, 52289, 52289, + 52291, 52291, 52301, 52301, 52301, 52301, 52301, 52301, + 52301, 52301, 52301, 52313, 52313, 52313, 52313, 52313, + 52313, 52313, 52313, 52313, 52313, 52313, 52321, 52321, + 52321, 52321, 52321, 52321, 52321, 52361, 52361, 52361, + 52361, 52361, 52361, 52361, 52361, 52361, 52361, 52361, + 52361, 52361, 52361, 52361, 52361, 52361, 52361, 52361, + 52361, 52361, 52361, 52361, 52361, 52361, 52361, 52361, + 52361, 52361, 52361, 52361, 52361, 52361, 52361, 52361, + 52363, 52363, 52369, 52369, 52369, 52369, 52369, 52369, + 52379, 52379, 52379, 52379, 52379, 52379, 52379, 52379, + 52387, 52387, 52387, 52387, 52387, 52387, 52387, 52387, + 52391, 52391, 52391, 52433, 52433, 52433, 52433, 52433, + 52433, 52433, 52433, 52433, 52433, 52433, 52433, 52433, + 52433, 52433, 52433, 52433, 52433, 52433, 52433, 52433, + 52433, 52433, 52433, 52433, 52433, 52433, 52433, 52433, + 52433, 52433, 52433, 52433, 52433, 52433, 52433, 52433, + 52453, 52453, 52453, 52453, 52453, 52453, 52453, 52453, + 52453, 52453, 52453, 52453, 52453, 52453, 52453, 52453, + 52453, 52453, 52457, 52457, 52457, 52457, 52489, 52489, + 52489, 52489, 52489, 52489, 52489, 52489, 52489, 52489, + 52489, 52489, 52489, 52489, 52489, 52489, 52489, 52489, + 52489, 52489, 52489, 52489, 52489, 52489, 52489, 52489, + 52489, 52489, 52501, 52501, 52501, 52501, 52501, 52501, + 52501, 52501, 52501, 52501, 52501, 52511, 52511, 52511, + 52511, 52511, 52511, 52511, 52511, 52511, 52517, 52517, + 52517, 52517, 52517, 52529, 52529, 52529, 52529, 52529, + 52529, 52529, 52529, 52529, 52529, 52529, 52541, 52541, + 52541, 52541, 52541, 52541, 52541, 52541, 52541, 52541, + 52543, 52543, 52553, 52553, 52553, 52553, 52553, 52553, + 52553, 52553, 52553, 52561, 52561, 52561, 52561, 52561, + 52561, 52561, 52567, 52567, 52567, 52567, 52567, 52567, + 52571, 52571, 52571, 52579, 52579, 52579, 52579, 52579, + 52579, 52579, 52583, 52583, 52583, 52583, 52609, 52609, + 52609, 52609, 52609, 52609, 52609, 52609, 52609, 52609, + 52609, 52609, 52609, 52609, 52609, 52609, 52609, 52609, + 52609, 52609, 52609, 52609, 52609, 52627, 52627, 52627, + 52627, 52627, 52627, 52627, 52627, 52627, 52627, 52627, + 52627, 52627, 52627, 52627, 52627, 52631, 52631, 52631, + 52639, 52639, 52639, 52639, 52639, 52639, 52639, 52639, + 52667, 52667, 52667, 52667, 52667, 52667, 52667, 52667, + 52667, 52667, 52667, 52667, 52667, 52667, 52667, 52667, + 52667, 52667, 52667, 52667, 52667, 52667, 52667, 52667, + 52673, 52673, 52673, 52673, 52673, 52673, 52691, 52691, + 52691, 52691, 52691, 52691, 52691, 52691, 52691, 52691, + 52691, 52691, 52691, 52691, 52691, 52691, 52697, 52697, + 52697, 52697, 52697, 52709, 52709, 52709, 52709, 52709, + 52709, 52709, 52709, 52709, 52709, 52709, 52711, 52711, + 52721, 52721, 52721, 52721, 52721, 52721, 52721, 52721, + 52727, 52727, 52727, 52727, 52727, 52727, 52733, 52733, + 52733, 52733, 52733, 52747, 52747, 52747, 52747, 52747, + 52747, 52747, 52747, 52747, 52747, 52747, 52747, 52747, + 52757, 52757, 52757, 52757, 52757, 52757, 52757, 52757, + 52769, 52769, 52769, 52769, 52769, 52769, 52769, 52769, + 52769, 52769, 52769, 52783, 52783, 52783, 52783, 52783, + 52783, 52783, 52783, 52783, 52783, 52783, 52783, 52783, + 52807, 52807, 52807, 52807, 52807, 52807, 52807, 52807, + 52807, 52807, 52807, 52807, 52807, 52807, 52807, 52807, + 52807, 52807, 52807, 52807, 52807, 52813, 52813, 52813, + 52813, 52813, 52817, 52817, 52817, 52817, 52837, 52837, + 52837, 52837, 52837, 52837, 52837, 52837, 52837, 52837, + 52837, 52837, 52837, 52837, 52837, 52837, 52837, 52837, + 52859, 52859, 52859, 52859, 52859, 52859, 52859, 52859, + 52859, 52859, 52859, 52859, 52859, 52859, 52859, 52859, + 52859, 52859, 52859, 52861, 52861, 52879, 52879, 52879, + 52879, 52879, 52879, 52879, 52879, 52879, 52879, 52879, + 52879, 52879, 52879, 52879, 52879, 52883, 52883, 52883, + 52889, 52889, 52889, 52889, 52889, 52889, 52901, 52901, + 52901, 52901, 52901, 52901, 52901, 52901, 52901, 52901, + 52903, 52903, 52919, 52919, 52919, 52919, 52919, 52919, + 52919, 52919, 52919, 52919, 52919, 52919, 52919, 52919, + 52937, 52937, 52937, 52937, 52937, 52937, 52937, 52937, + 52937, 52937, 52937, 52937, 52937, 52937, 52937, 52937, + 52951, 52951, 52951, 52951, 52951, 52951, 52951, 52951, + 52951, 52951, 52951, 52951, 52951, 52957, 52957, 52957, + 52957, 52957, 52963, 52963, 52963, 52963, 52963, 52963, + 52967, 52967, 52967, 52973, 52973, 52973, 52973, 52973, + 52981, 52981, 52981, 52981, 52981, 52981, 52981, 52981, + 52999, 52999, 52999, 52999, 52999, 52999, 52999, 52999, + 52999, 52999, 52999, 52999, 52999, 52999, 52999, 52999, + 53003, 53003, 53003, 53017, 53017, 53017, 53017, 53017, + 53017, 53017, 53017, 53017, 53017, 53017, 53017, 53017, + 53047, 53047, 53047, 53047, 53047, 53047, 53047, 53047, + 53047, 53047, 53047, 53047, 53047, 53047, 53047, 53047, + 53047, 53047, 53047, 53047, 53047, 53047, 53047, 53047, + 53047, 53047, 53051, 53051, 53051, 53051, 53069, 53069, + 53069, 53069, 53069, 53069, 53069, 53069, 53069, 53069, + 53069, 53069, 53069, 53069, 53069, 53069, 53077, 53077, + 53077, 53077, 53077, 53077, 53077, 53087, 53087, 53087, + 53087, 53087, 53087, 53087, 53087, 53087, 53089, 53089, + 53093, 53093, 53093, 53101, 53101, 53101, 53101, 53101, + 53101, 53101, 53113, 53113, 53113, 53113, 53113, 53113, + 53113, 53113, 53113, 53113, 53113, 53117, 53117, 53117, + 53129, 53129, 53129, 53129, 53129, 53129, 53129, 53129, + 53129, 53129, 53129, 53147, 53147, 53147, 53147, 53147, + 53147, 53147, 53147, 53147, 53147, 53147, 53147, 53147, + 53147, 53147, 53147, 53149, 53149, 53161, 53161, 53161, + 53161, 53161, 53161, 53161, 53161, 53161, 53161, 53161, + 53171, 53171, 53171, 53171, 53171, 53171, 53171, 53171, + 53173, 53173, 53189, 53189, 53189, 53189, 53189, 53189, + 53189, 53189, 53189, 53189, 53189, 53189, 53189, 53189, + 53197, 53197, 53197, 53197, 53197, 53197, 53197, 53197, + 53201, 53201, 53201, 53231, 53231, 53231, 53231, 53231, + 53231, 53231, 53231, 53231, 53231, 53231, 53231, 53231, + 53231, 53231, 53231, 53231, 53231, 53231, 53231, 53231, + 53231, 53231, 53231, 53231, 53231, 53231, 53233, 53233, + 53239, 53239, 53239, 53239, 53239, 53267, 53267, 53267, + 53267, 53267, 53267, 53267, 53267, 53267, 53267, 53267, + 53267, 53267, 53267, 53267, 53267, 53267, 53267, 53267, + 53267, 53267, 53267, 53267, 53267, 53267, 53269, 53269, + 53279, 53279, 53279, 53279, 53279, 53279, 53279, 53279, + 53281, 53281, 53299, 53299, 53299, 53299, 53299, 53299, + 53299, 53299, 53299, 53299, 53299, 53299, 53299, 53299, + 53299, 53299, 53309, 53309, 53309, 53309, 53309, 53309, + 53309, 53309, 53309, 53323, 53323, 53323, 53323, 53323, + 53323, 53323, 53323, 53323, 53323, 53323, 53323, 53323, + 53327, 53327, 53327, 53353, 53353, 53353, 53353, 53353, + 53353, 53353, 53353, 53353, 53353, 53353, 53353, 53353, + 53353, 53353, 53353, 53353, 53353, 53353, 53353, 53353, + 53353, 53353, 53359, 53359, 53359, 53359, 53359, 53359, + 53377, 53377, 53377, 53377, 53377, 53377, 53377, 53377, + 53377, 53377, 53377, 53377, 53377, 53377, 53377, 53377, + 53381, 53381, 53381, 53401, 53401, 53401, 53401, 53401, + 53401, 53401, 53401, 53401, 53401, 53401, 53401, 53401, + 53401, 53401, 53401, 53401, 53401, 53407, 53407, 53407, + 53407, 53407, 53411, 53411, 53411, 53411, 53419, 53419, + 53419, 53419, 53419, 53419, 53419, 53437, 53437, 53437, + 53437, 53437, 53437, 53437, 53437, 53437, 53437, 53437, + 53437, 53437, 53437, 53437, 53437, 53441, 53441, 53441, + 53453, 53453, 53453, 53453, 53453, 53453, 53453, 53453, + 53453, 53453, 53453, 53479, 53479, 53479, 53479, 53479, + 53479, 53479, 53479, 53479, 53479, 53479, 53479, 53479, + 53479, 53479, 53479, 53479, 53479, 53479, 53479, 53479, + 53479, 53479, 53503, 53503, 53503, 53503, 53503, 53503, + 53503, 53503, 53503, 53503, 53503, 53503, 53503, 53503, + 53503, 53503, 53503, 53503, 53503, 53503, 53503, 53503, + 53507, 53507, 53507, 53527, 53527, 53527, 53527, 53527, + 53527, 53527, 53527, 53527, 53527, 53527, 53527, 53527, + 53527, 53527, 53527, 53527, 53527, 53549, 53549, 53549, + 53549, 53549, 53549, 53549, 53549, 53549, 53549, 53549, + 53549, 53549, 53549, 53549, 53549, 53549, 53549, 53549, + 53551, 53551, 53569, 53569, 53569, 53569, 53569, 53569, + 53569, 53569, 53569, 53569, 53569, 53569, 53569, 53569, + 53569, 53569, 53591, 53591, 53591, 53591, 53591, 53591, + 53591, 53591, 53591, 53591, 53591, 53591, 53591, 53591, + 53591, 53591, 53591, 53591, 53591, 53591, 53593, 53593, + 53597, 53597, 53597, 53609, 53609, 53609, 53609, 53609, + 53609, 53609, 53609, 53609, 53609, 53609, 53611, 53611, + 53617, 53617, 53617, 53617, 53617, 53623, 53623, 53623, + 53623, 53623, 53629, 53629, 53629, 53629, 53629, 53629, + 53633, 53633, 53633, 53639, 53639, 53639, 53639, 53639, + 53653, 53653, 53653, 53653, 53653, 53653, 53653, 53653, + 53653, 53653, 53653, 53653, 53653, 53657, 53657, 53657, + 53681, 53681, 53681, 53681, 53681, 53681, 53681, 53681, + 53681, 53681, 53681, 53681, 53681, 53681, 53681, 53681, + 53681, 53681, 53681, 53681, 53681, 53681, 53693, 53693, + 53693, 53693, 53693, 53693, 53693, 53693, 53693, 53693, + 53699, 53699, 53699, 53699, 53699, 53699, 53717, 53717, + 53717, 53717, 53717, 53717, 53717, 53717, 53717, 53717, + 53717, 53717, 53717, 53717, 53717, 53717, 53719, 53719, + 53731, 53731, 53731, 53731, 53731, 53731, 53731, 53731, + 53731, 53731, 53759, 53759, 53759, 53759, 53759, 53759, + 53759, 53759, 53759, 53759, 53759, 53759, 53759, 53759, + 53759, 53759, 53759, 53759, 53759, 53759, 53759, 53759, + 53759, 53759, 53759, 53773, 53773, 53773, 53773, 53773, + 53773, 53773, 53773, 53773, 53773, 53773, 53773, 53773, + 53777, 53777, 53777, 53783, 53783, 53783, 53783, 53783, + 53791, 53791, 53791, 53791, 53791, 53791, 53791, 53791, + 53813, 53813, 53813, 53813, 53813, 53813, 53813, 53813, + 53813, 53813, 53813, 53813, 53813, 53813, 53813, 53813, + 53813, 53813, 53813, 53819, 53819, 53819, 53819, 53819, + 53831, 53831, 53831, 53831, 53831, 53831, 53831, 53831, + 53831, 53831, 53831, 53849, 53849, 53849, 53849, 53849, + 53849, 53849, 53849, 53849, 53849, 53849, 53849, 53849, + 53849, 53849, 53849, 53857, 53857, 53857, 53857, 53857, + 53857, 53857, 53861, 53861, 53861, 53861, 53881, 53881, + 53881, 53881, 53881, 53881, 53881, 53881, 53881, 53881, + 53881, 53881, 53881, 53881, 53881, 53881, 53881, 53881, + 53887, 53887, 53887, 53887, 53887, 53891, 53891, 53891, + 53897, 53897, 53897, 53897, 53897, 53897, 53899, 53899, + 53917, 53917, 53917, 53917, 53917, 53917, 53917, 53917, + 53917, 53917, 53917, 53917, 53917, 53917, 53917, 53917, + 53923, 53923, 53923, 53923, 53923, 53927, 53927, 53927, + 53939, 53939, 53939, 53939, 53939, 53939, 53939, 53939, + 53939, 53939, 53939, 53951, 53951, 53951, 53951, 53951, + 53951, 53951, 53951, 53951, 53951, 53951, 53959, 53959, + 53959, 53959, 53959, 53959, 53959, 53987, 53987, 53987, + 53987, 53987, 53987, 53987, 53987, 53987, 53987, 53987, + 53987, 53987, 53987, 53987, 53987, 53987, 53987, 53987, + 53987, 53987, 53987, 53987, 53987, 53987, 53993, 53993, + 53993, 53993, 53993, 54001, 54001, 54001, 54001, 54001, + 54001, 54001, 54011, 54011, 54011, 54011, 54011, 54011, + 54011, 54011, 54011, 54013, 54013, 54037, 54037, 54037, + 54037, 54037, 54037, 54037, 54037, 54037, 54037, 54037, + 54037, 54037, 54037, 54037, 54037, 54037, 54037, 54037, + 54037, 54037, 54049, 54049, 54049, 54049, 54049, 54049, + 54049, 54049, 54049, 54049, 54049, 54059, 54059, 54059, + 54059, 54059, 54059, 54059, 54059, 54059, 54083, 54083, + 54083, 54083, 54083, 54083, 54083, 54083, 54083, 54083, + 54083, 54083, 54083, 54083, 54083, 54083, 54083, 54083, + 54083, 54083, 54083, 54091, 54091, 54091, 54091, 54091, + 54091, 54091, 54101, 54101, 54101, 54101, 54101, 54101, + 54101, 54101, 54101, 54121, 54121, 54121, 54121, 54121, + 54121, 54121, 54121, 54121, 54121, 54121, 54121, 54121, + 54121, 54121, 54121, 54121, 54121, 54133, 54133, 54133, + 54133, 54133, 54133, 54133, 54133, 54133, 54133, 54133, + 54139, 54139, 54139, 54139, 54139, 54151, 54151, 54151, + 54151, 54151, 54151, 54151, 54151, 54151, 54151, 54151, + 54163, 54163, 54163, 54163, 54163, 54163, 54163, 54163, + 54163, 54163, 54167, 54167, 54167, 54167, 54181, 54181, + 54181, 54181, 54181, 54181, 54181, 54181, 54181, 54181, + 54181, 54181, 54193, 54193, 54193, 54193, 54193, 54193, + 54193, 54193, 54193, 54193, 54193, 54217, 54217, 54217, + 54217, 54217, 54217, 54217, 54217, 54217, 54217, 54217, + 54217, 54217, 54217, 54217, 54217, 54217, 54217, 54217, + 54217, 54217, 54251, 54251, 54251, 54251, 54251, 54251, + 54251, 54251, 54251, 54251, 54251, 54251, 54251, 54251, + 54251, 54251, 54251, 54251, 54251, 54251, 54251, 54251, + 54251, 54251, 54251, 54251, 54251, 54251, 54251, 54251, + 54269, 54269, 54269, 54269, 54269, 54269, 54269, 54269, + 54269, 54269, 54269, 54269, 54269, 54269, 54269, 54269, + 54277, 54277, 54277, 54277, 54277, 54277, 54277, 54277, + 54287, 54287, 54287, 54287, 54287, 54287, 54287, 54287, + 54293, 54293, 54293, 54293, 54293, 54293, 54311, 54311, + 54311, 54311, 54311, 54311, 54311, 54311, 54311, 54311, + 54311, 54311, 54311, 54311, 54311, 54311, 54319, 54319, + 54319, 54319, 54319, 54319, 54319, 54323, 54323, 54323, + 54331, 54331, 54331, 54331, 54331, 54331, 54331, 54331, + 54347, 54347, 54347, 54347, 54347, 54347, 54347, 54347, + 54347, 54347, 54347, 54347, 54347, 54347, 54361, 54361, + 54361, 54361, 54361, 54361, 54361, 54361, 54361, 54361, + 54361, 54361, 54367, 54367, 54367, 54367, 54367, 54367, + 54371, 54371, 54371, 54377, 54377, 54377, 54377, 54377, + 54401, 54401, 54401, 54401, 54401, 54401, 54401, 54401, + 54401, 54401, 54401, 54401, 54401, 54401, 54401, 54401, + 54401, 54401, 54401, 54401, 54401, 54401, 54403, 54403, + 54409, 54409, 54409, 54409, 54409, 54413, 54413, 54413, + 54419, 54419, 54419, 54419, 54419, 54419, 54421, 54421, + 54437, 54437, 54437, 54437, 54437, 54437, 54437, 54437, + 54437, 54437, 54437, 54437, 54437, 54437, 54443, 54443, + 54443, 54443, 54443, 54449, 54449, 54449, 54449, 54449, + 54469, 54469, 54469, 54469, 54469, 54469, 54469, 54469, + 54469, 54469, 54469, 54469, 54469, 54469, 54469, 54469, + 54469, 54469, 54493, 54493, 54493, 54493, 54493, 54493, + 54493, 54493, 54493, 54493, 54493, 54493, 54493, 54493, + 54493, 54493, 54493, 54493, 54493, 54493, 54493, 54493, + 54497, 54497, 54497, 54499, 54499, 54503, 54503, 54503, + 54517, 54517, 54517, 54517, 54517, 54517, 54517, 54517, + 54517, 54517, 54517, 54517, 54517, 54521, 54521, 54521, + 54539, 54539, 54539, 54539, 54539, 54539, 54539, 54539, + 54539, 54539, 54539, 54539, 54539, 54539, 54539, 54539, + 54541, 54541, 54547, 54547, 54547, 54547, 54547, 54547, + 54559, 54559, 54559, 54559, 54559, 54559, 54559, 54559, + 54559, 54559, 54563, 54563, 54563, 54563, 54577, 54577, + 54577, 54577, 54577, 54577, 54577, 54577, 54577, 54577, + 54577, 54577, 54581, 54581, 54581, 54581, 54583, 54583, + 54601, 54601, 54601, 54601, 54601, 54601, 54601, 54601, + 54601, 54601, 54601, 54601, 54601, 54601, 54601, 54601, + 54617, 54617, 54617, 54617, 54617, 54617, 54617, 54617, + 54617, 54617, 54617, 54617, 54617, 54617, 54623, 54623, + 54623, 54623, 54623, 54629, 54629, 54629, 54629, 54629, + 54631, 54631, 54647, 54647, 54647, 54647, 54647, 54647, + 54647, 54647, 54647, 54647, 54647, 54647, 54647, 54647, + 54667, 54667, 54667, 54667, 54667, 54667, 54667, 54667, + 54667, 54667, 54667, 54667, 54667, 54667, 54667, 54667, + 54667, 54667, 54673, 54673, 54673, 54673, 54673, 54673, + 54679, 54679, 54679, 54679, 54679, 54709, 54709, 54709, + 54709, 54709, 54709, 54709, 54709, 54709, 54709, 54709, + 54709, 54709, 54709, 54709, 54709, 54709, 54709, 54709, + 54709, 54709, 54709, 54709, 54709, 54709, 54709, 54709, + 54713, 54713, 54713, 54721, 54721, 54721, 54721, 54721, + 54721, 54721, 54727, 54727, 54727, 54727, 54727, 54727, + 54751, 54751, 54751, 54751, 54751, 54751, 54751, 54751, + 54751, 54751, 54751, 54751, 54751, 54751, 54751, 54751, + 54751, 54751, 54751, 54751, 54751, 54767, 54767, 54767, + 54767, 54767, 54767, 54767, 54767, 54767, 54767, 54767, + 54767, 54767, 54767, 54773, 54773, 54773, 54773, 54773, + 54779, 54779, 54779, 54779, 54779, 54779, 54787, 54787, + 54787, 54787, 54787, 54787, 54787, 54799, 54799, 54799, + 54799, 54799, 54799, 54799, 54799, 54799, 54799, 54799, + 54829, 54829, 54829, 54829, 54829, 54829, 54829, 54829, + 54829, 54829, 54829, 54829, 54829, 54829, 54829, 54829, + 54829, 54829, 54829, 54829, 54829, 54829, 54829, 54829, + 54829, 54829, 54833, 54833, 54833, 54833, 54851, 54851, + 54851, 54851, 54851, 54851, 54851, 54851, 54851, 54851, + 54851, 54851, 54851, 54851, 54851, 54851, 54869, 54869, + 54869, 54869, 54869, 54869, 54869, 54869, 54869, 54869, + 54869, 54869, 54869, 54869, 54869, 54869, 54877, 54877, + 54877, 54877, 54877, 54877, 54877, 54881, 54881, 54881, + 54907, 54907, 54907, 54907, 54907, 54907, 54907, 54907, + 54907, 54907, 54907, 54907, 54907, 54907, 54907, 54907, + 54907, 54907, 54907, 54907, 54907, 54907, 54907, 54907, + 54917, 54917, 54917, 54917, 54917, 54917, 54917, 54917, + 54919, 54919, 54941, 54941, 54941, 54941, 54941, 54941, + 54941, 54941, 54941, 54941, 54941, 54941, 54941, 54941, + 54941, 54941, 54941, 54941, 54941, 54941, 54949, 54949, + 54949, 54949, 54949, 54949, 54949, 54959, 54959, 54959, + 54959, 54959, 54959, 54959, 54959, 54959, 54973, 54973, + 54973, 54973, 54973, 54973, 54973, 54973, 54973, 54973, + 54973, 54973, 54979, 54979, 54979, 54979, 54979, 54979, + 54983, 54983, 54983, 55001, 55001, 55001, 55001, 55001, + 55001, 55001, 55001, 55001, 55001, 55001, 55001, 55001, + 55001, 55001, 55001, 55009, 55009, 55009, 55009, 55009, + 55009, 55009, 55021, 55021, 55021, 55021, 55021, 55021, + 55021, 55021, 55021, 55021, 55021, 55049, 55049, 55049, + 55049, 55049, 55049, 55049, 55049, 55049, 55049, 55049, + 55049, 55049, 55049, 55049, 55049, 55049, 55049, 55049, + 55049, 55049, 55049, 55049, 55049, 55049, 55051, 55051, + 55057, 55057, 55057, 55057, 55057, 55061, 55061, 55061, + 55073, 55073, 55073, 55073, 55073, 55073, 55073, 55073, + 55073, 55073, 55073, 55079, 55079, 55079, 55079, 55079, + 55103, 55103, 55103, 55103, 55103, 55103, 55103, 55103, + 55103, 55103, 55103, 55103, 55103, 55103, 55103, 55103, + 55103, 55103, 55103, 55103, 55103, 55103, 55109, 55109, + 55109, 55109, 55109, 55117, 55117, 55117, 55117, 55117, + 55117, 55117, 55127, 55127, 55127, 55127, 55127, 55127, + 55127, 55127, 55127, 55147, 55147, 55147, 55147, 55147, + 55147, 55147, 55147, 55147, 55147, 55147, 55147, 55147, + 55147, 55147, 55147, 55147, 55147, 55163, 55163, 55163, + 55163, 55163, 55163, 55163, 55163, 55163, 55163, 55163, + 55163, 55163, 55163, 55171, 55171, 55171, 55171, 55171, + 55171, 55171, 55201, 55201, 55201, 55201, 55201, 55201, + 55201, 55201, 55201, 55201, 55201, 55201, 55201, 55201, + 55201, 55201, 55201, 55201, 55201, 55201, 55201, 55201, + 55201, 55201, 55201, 55201, 55201, 55207, 55207, 55207, + 55207, 55207, 55213, 55213, 55213, 55213, 55213, 55213, + 55217, 55217, 55217, 55219, 55219, 55229, 55229, 55229, + 55229, 55229, 55229, 55229, 55229, 55229, 55243, 55243, + 55243, 55243, 55243, 55243, 55243, 55243, 55243, 55243, + 55243, 55243, 55249, 55249, 55249, 55249, 55249, 55249, + 55259, 55259, 55259, 55259, 55259, 55259, 55259, 55259, + 55291, 55291, 55291, 55291, 55291, 55291, 55291, 55291, + 55291, 55291, 55291, 55291, 55291, 55291, 55291, 55291, + 55291, 55291, 55291, 55291, 55291, 55291, 55291, 55291, + 55291, 55291, 55291, 55291, 55291, 55313, 55313, 55313, + 55313, 55313, 55313, 55313, 55313, 55313, 55313, 55313, + 55313, 55313, 55313, 55313, 55313, 55313, 55313, 55313, + 55331, 55331, 55331, 55331, 55331, 55331, 55331, 55331, + 55331, 55331, 55331, 55331, 55331, 55331, 55331, 55331, + 55333, 55333, 55337, 55337, 55337, 55337, 55339, 55339, + 55343, 55343, 55343, 55351, 55351, 55351, 55351, 55351, + 55351, 55351, 55373, 55373, 55373, 55373, 55373, 55373, + 55373, 55373, 55373, 55373, 55373, 55373, 55373, 55373, + 55373, 55373, 55373, 55373, 55373, 55373, 55381, 55381, + 55381, 55381, 55381, 55381, 55381, 55399, 55399, 55399, + 55399, 55399, 55399, 55399, 55399, 55399, 55399, 55399, + 55399, 55399, 55399, 55399, 55399, 55411, 55411, 55411, + 55411, 55411, 55411, 55411, 55411, 55411, 55411, 55411, + 55439, 55439, 55439, 55439, 55439, 55439, 55439, 55439, + 55439, 55439, 55439, 55439, 55439, 55439, 55439, 55439, + 55439, 55439, 55439, 55439, 55439, 55439, 55439, 55439, + 55441, 55441, 55457, 55457, 55457, 55457, 55457, 55457, + 55457, 55457, 55457, 55457, 55457, 55457, 55457, 55457, + 55469, 55469, 55469, 55469, 55469, 55469, 55469, 55469, + 55469, 55469, 55469, 55487, 55487, 55487, 55487, 55487, + 55487, 55487, 55487, 55487, 55487, 55487, 55487, 55487, + 55487, 55487, 55487, 55501, 55501, 55501, 55501, 55501, + 55501, 55501, 55501, 55501, 55501, 55501, 55501, 55501, + 55511, 55511, 55511, 55511, 55511, 55511, 55511, 55511, + 55529, 55529, 55529, 55529, 55529, 55529, 55529, 55529, + 55529, 55529, 55529, 55529, 55529, 55529, 55529, 55529, + 55541, 55541, 55541, 55541, 55541, 55541, 55541, 55541, + 55541, 55541, 55541, 55547, 55547, 55547, 55547, 55547, + 55579, 55579, 55579, 55579, 55579, 55579, 55579, 55579, + 55579, 55579, 55579, 55579, 55579, 55579, 55579, 55579, + 55579, 55579, 55579, 55579, 55579, 55579, 55579, 55579, + 55579, 55579, 55579, 55579, 55579, 55589, 55589, 55589, + 55589, 55589, 55589, 55589, 55589, 55589, 55603, 55603, + 55603, 55603, 55603, 55603, 55603, 55603, 55603, 55603, + 55603, 55603, 55609, 55609, 55609, 55609, 55609, 55609, + 55619, 55619, 55619, 55619, 55619, 55619, 55619, 55619, + 55621, 55621, 55631, 55631, 55631, 55631, 55631, 55631, + 55631, 55631, 55631, 55633, 55633, 55639, 55639, 55639, + 55639, 55639, 55661, 55661, 55661, 55661, 55661, 55661, + 55661, 55661, 55661, 55661, 55661, 55661, 55661, 55661, + 55661, 55661, 55661, 55661, 55661, 55661, 55663, 55663, + 55667, 55667, 55667, 55673, 55673, 55673, 55673, 55673, + 55681, 55681, 55681, 55681, 55681, 55681, 55681, 55681, + 55691, 55691, 55691, 55691, 55691, 55691, 55691, 55691, + 55697, 55697, 55697, 55697, 55697, 55697, 55711, 55711, + 55711, 55711, 55711, 55711, 55711, 55711, 55711, 55711, + 55711, 55711, 55717, 55717, 55717, 55717, 55717, 55717, + 55721, 55721, 55721, 55733, 55733, 55733, 55733, 55733, + 55733, 55733, 55733, 55733, 55733, 55733, 55763, 55763, + 55763, 55763, 55763, 55763, 55763, 55763, 55763, 55763, + 55763, 55763, 55763, 55763, 55763, 55763, 55763, 55763, + 55763, 55763, 55763, 55763, 55763, 55763, 55763, 55763, + 55787, 55787, 55787, 55787, 55787, 55787, 55787, 55787, + 55787, 55787, 55787, 55787, 55787, 55787, 55787, 55787, + 55787, 55787, 55787, 55787, 55787, 55787, 55793, 55793, + 55793, 55793, 55793, 55799, 55799, 55799, 55799, 55799, + 55807, 55807, 55807, 55807, 55807, 55807, 55807, 55807, + 55813, 55813, 55813, 55813, 55813, 55817, 55817, 55817, + 55819, 55819, 55823, 55823, 55823, 55823, 55829, 55829, + 55829, 55829, 55829, 55837, 55837, 55837, 55837, 55837, + 55837, 55837, 55843, 55843, 55843, 55843, 55843, 55843, + 55849, 55849, 55849, 55849, 55849, 55871, 55871, 55871, + 55871, 55871, 55871, 55871, 55871, 55871, 55871, 55871, + 55871, 55871, 55871, 55871, 55871, 55871, 55871, 55871, + 55889, 55889, 55889, 55889, 55889, 55889, 55889, 55889, + 55889, 55889, 55889, 55889, 55889, 55889, 55889, 55889, + 55897, 55897, 55897, 55897, 55897, 55897, 55897, 55897, + 55901, 55901, 55901, 55903, 55903, 55921, 55921, 55921, + 55921, 55921, 55921, 55921, 55921, 55921, 55921, 55921, + 55921, 55921, 55921, 55921, 55921, 55927, 55927, 55927, + 55927, 55927, 55931, 55931, 55931, 55931, 55933, 55933, + 55949, 55949, 55949, 55949, 55949, 55949, 55949, 55949, + 55949, 55949, 55949, 55949, 55949, 55949, 55967, 55967, + 55967, 55967, 55967, 55967, 55967, 55967, 55967, 55967, + 55967, 55967, 55967, 55967, 55967, 55967, 55987, 55987, + 55987, 55987, 55987, 55987, 55987, 55987, 55987, 55987, + 55987, 55987, 55987, 55987, 55987, 55987, 55987, 55987, + 55997, 55997, 55997, 55997, 55997, 55997, 55997, 55997, + 56003, 56003, 56003, 56003, 56003, 56003, 56009, 56009, + 56009, 56009, 56009, 56039, 56039, 56039, 56039, 56039, + 56039, 56039, 56039, 56039, 56039, 56039, 56039, 56039, + 56039, 56039, 56039, 56039, 56039, 56039, 56039, 56039, + 56039, 56039, 56039, 56039, 56039, 56039, 56041, 56041, + 56053, 56053, 56053, 56053, 56053, 56053, 56053, 56053, + 56053, 56053, 56081, 56081, 56081, 56081, 56081, 56081, + 56081, 56081, 56081, 56081, 56081, 56081, 56081, 56081, + 56081, 56081, 56081, 56081, 56081, 56081, 56081, 56081, + 56081, 56081, 56081, 56087, 56087, 56087, 56087, 56087, + 56093, 56093, 56093, 56093, 56093, 56093, 56099, 56099, + 56099, 56099, 56099, 56101, 56101, 56113, 56113, 56113, + 56113, 56113, 56113, 56113, 56113, 56113, 56113, 56113, + 56123, 56123, 56123, 56123, 56123, 56123, 56123, 56123, + 56131, 56131, 56131, 56131, 56131, 56131, 56131, 56131, + 56149, 56149, 56149, 56149, 56149, 56149, 56149, 56149, + 56149, 56149, 56149, 56149, 56149, 56149, 56149, 56149, + 56167, 56167, 56167, 56167, 56167, 56167, 56167, 56167, + 56167, 56167, 56167, 56167, 56167, 56167, 56167, 56167, + 56171, 56171, 56171, 56179, 56179, 56179, 56179, 56179, + 56179, 56179, 56197, 56197, 56197, 56197, 56197, 56197, + 56197, 56197, 56197, 56197, 56197, 56197, 56197, 56197, + 56197, 56197, 56207, 56207, 56207, 56207, 56207, 56207, + 56207, 56207, 56207, 56209, 56209, 56237, 56237, 56237, + 56237, 56237, 56237, 56237, 56237, 56237, 56237, 56237, + 56237, 56237, 56237, 56237, 56237, 56237, 56237, 56237, + 56237, 56237, 56237, 56237, 56237, 56237, 56239, 56239, + 56249, 56249, 56249, 56249, 56249, 56249, 56249, 56249, + 56263, 56263, 56263, 56263, 56263, 56263, 56263, 56263, + 56263, 56263, 56263, 56263, 56263, 56267, 56267, 56267, + 56269, 56269, 56299, 56299, 56299, 56299, 56299, 56299, + 56299, 56299, 56299, 56299, 56299, 56299, 56299, 56299, + 56299, 56299, 56299, 56299, 56299, 56299, 56299, 56299, + 56299, 56299, 56299, 56299, 56299, 56311, 56311, 56311, + 56311, 56311, 56311, 56311, 56311, 56311, 56311, 56311, + 56333, 56333, 56333, 56333, 56333, 56333, 56333, 56333, + 56333, 56333, 56333, 56333, 56333, 56333, 56333, 56333, + 56333, 56333, 56333, 56359, 56359, 56359, 56359, 56359, + 56359, 56359, 56359, 56359, 56359, 56359, 56359, 56359, + 56359, 56359, 56359, 56359, 56359, 56359, 56359, 56359, + 56359, 56359, 56369, 56369, 56369, 56369, 56369, 56369, + 56369, 56369, 56369, 56377, 56377, 56377, 56377, 56377, + 56377, 56377, 56383, 56383, 56383, 56383, 56383, 56383, + 56393, 56393, 56393, 56393, 56393, 56393, 56393, 56393, + 56401, 56401, 56401, 56401, 56401, 56401, 56401, 56401, + 56417, 56417, 56417, 56417, 56417, 56417, 56417, 56417, + 56417, 56417, 56417, 56417, 56417, 56417, 56431, 56431, + 56431, 56431, 56431, 56431, 56431, 56431, 56431, 56431, + 56431, 56431, 56437, 56437, 56437, 56437, 56437, 56437, + 56443, 56443, 56443, 56443, 56443, 56453, 56453, 56453, + 56453, 56453, 56453, 56453, 56453, 56453, 56467, 56467, + 56467, 56467, 56467, 56467, 56467, 56467, 56467, 56467, + 56467, 56467, 56473, 56473, 56473, 56473, 56473, 56473, + 56477, 56477, 56477, 56479, 56479, 56489, 56489, 56489, + 56489, 56489, 56489, 56489, 56489, 56489, 56501, 56501, + 56501, 56501, 56501, 56501, 56501, 56501, 56501, 56501, + 56503, 56503, 56509, 56509, 56509, 56509, 56509, 56509, + 56519, 56519, 56519, 56519, 56519, 56519, 56519, 56519, + 56527, 56527, 56527, 56527, 56527, 56527, 56527, 56527, + 56531, 56531, 56531, 56533, 56533, 56543, 56543, 56543, + 56543, 56543, 56543, 56543, 56543, 56543, 56569, 56569, + 56569, 56569, 56569, 56569, 56569, 56569, 56569, 56569, + 56569, 56569, 56569, 56569, 56569, 56569, 56569, 56569, + 56569, 56569, 56569, 56569, 56569, 56591, 56591, 56591, + 56591, 56591, 56591, 56591, 56591, 56591, 56591, 56591, + 56591, 56591, 56591, 56591, 56591, 56591, 56591, 56591, + 56597, 56597, 56597, 56597, 56597, 56597, 56599, 56599, + 56611, 56611, 56611, 56611, 56611, 56611, 56611, 56611, + 56611, 56611, 56629, 56629, 56629, 56629, 56629, 56629, + 56629, 56629, 56629, 56629, 56629, 56629, 56629, 56629, + 56629, 56629, 56633, 56633, 56633, 56633, 56659, 56659, + 56659, 56659, 56659, 56659, 56659, 56659, 56659, 56659, + 56659, 56659, 56659, 56659, 56659, 56659, 56659, 56659, + 56659, 56659, 56659, 56659, 56659, 56663, 56663, 56663, + 56671, 56671, 56671, 56671, 56671, 56671, 56671, 56671, + 56681, 56681, 56681, 56681, 56681, 56681, 56681, 56681, + 56687, 56687, 56687, 56687, 56687, 56687, 56701, 56701, + 56701, 56701, 56701, 56701, 56701, 56701, 56701, 56701, + 56701, 56701, 56711, 56711, 56711, 56711, 56711, 56711, + 56711, 56711, 56711, 56713, 56713, 56731, 56731, 56731, + 56731, 56731, 56731, 56731, 56731, 56731, 56731, 56731, + 56731, 56731, 56731, 56731, 56731, 56737, 56737, 56737, + 56737, 56737, 56747, 56747, 56747, 56747, 56747, 56747, + 56747, 56747, 56747, 56767, 56767, 56767, 56767, 56767, + 56767, 56767, 56767, 56767, 56767, 56767, 56767, 56767, + 56767, 56767, 56767, 56767, 56767, 56773, 56773, 56773, + 56773, 56773, 56779, 56779, 56779, 56779, 56779, 56779, + 56783, 56783, 56783, 56807, 56807, 56807, 56807, 56807, + 56807, 56807, 56807, 56807, 56807, 56807, 56807, 56807, + 56807, 56807, 56807, 56807, 56807, 56807, 56807, 56807, + 56809, 56809, 56813, 56813, 56813, 56813, 56821, 56821, + 56821, 56821, 56821, 56821, 56821, 56827, 56827, 56827, + 56827, 56827, 56843, 56843, 56843, 56843, 56843, 56843, + 56843, 56843, 56843, 56843, 56843, 56843, 56843, 56843, + 56857, 56857, 56857, 56857, 56857, 56857, 56857, 56857, + 56857, 56857, 56857, 56857, 56857, 56873, 56873, 56873, + 56873, 56873, 56873, 56873, 56873, 56873, 56873, 56873, + 56873, 56873, 56873, 56891, 56891, 56891, 56891, 56891, + 56891, 56891, 56891, 56891, 56891, 56891, 56891, 56891, + 56891, 56891, 56891, 56893, 56893, 56897, 56897, 56897, + 56909, 56909, 56909, 56909, 56909, 56909, 56909, 56909, + 56909, 56909, 56909, 56911, 56911, 56921, 56921, 56921, + 56921, 56921, 56921, 56921, 56921, 56921, 56923, 56923, + 56929, 56929, 56929, 56929, 56929, 56941, 56941, 56941, + 56941, 56941, 56941, 56941, 56941, 56941, 56941, 56941, + 56951, 56951, 56951, 56951, 56951, 56951, 56951, 56951, + 56957, 56957, 56957, 56957, 56957, 56957, 56963, 56963, + 56963, 56963, 56963, 56983, 56983, 56983, 56983, 56983, + 56983, 56983, 56983, 56983, 56983, 56983, 56983, 56983, + 56983, 56983, 56983, 56983, 56983, 56989, 56989, 56989, + 56989, 56989, 56993, 56993, 56993, 56993, 56999, 56999, + 56999, 56999, 56999, 57037, 57037, 57037, 57037, 57037, + 57037, 57037, 57037, 57037, 57037, 57037, 57037, 57037, + 57037, 57037, 57037, 57037, 57037, 57037, 57037, 57037, + 57037, 57037, 57037, 57037, 57037, 57037, 57037, 57037, + 57037, 57037, 57037, 57037, 57037, 57041, 57041, 57041, + 57047, 57047, 57047, 57047, 57047, 57047, 57059, 57059, + 57059, 57059, 57059, 57059, 57059, 57059, 57059, 57059, + 57073, 57073, 57073, 57073, 57073, 57073, 57073, 57073, + 57073, 57073, 57073, 57073, 57073, 57077, 57077, 57077, + 57089, 57089, 57089, 57089, 57089, 57089, 57089, 57089, + 57089, 57089, 57089, 57097, 57097, 57097, 57097, 57097, + 57097, 57097, 57107, 57107, 57107, 57107, 57107, 57107, + 57107, 57107, 57107, 57119, 57119, 57119, 57119, 57119, + 57119, 57119, 57119, 57119, 57119, 57119, 57131, 57131, + 57131, 57131, 57131, 57131, 57131, 57131, 57131, 57131, + 57139, 57139, 57139, 57139, 57139, 57139, 57139, 57139, + 57143, 57143, 57143, 57149, 57149, 57149, 57149, 57149, + 57163, 57163, 57163, 57163, 57163, 57163, 57163, 57163, + 57163, 57163, 57163, 57163, 57163, 57173, 57173, 57173, + 57173, 57173, 57173, 57173, 57173, 57173, 57179, 57179, + 57179, 57179, 57179, 57191, 57191, 57191, 57191, 57191, + 57191, 57191, 57191, 57191, 57191, 57191, 57193, 57193, + 57203, 57203, 57203, 57203, 57203, 57203, 57203, 57203, + 57221, 57221, 57221, 57221, 57221, 57221, 57221, 57221, + 57221, 57221, 57221, 57221, 57221, 57221, 57221, 57221, + 57223, 57223, 57241, 57241, 57241, 57241, 57241, 57241, + 57241, 57241, 57241, 57241, 57241, 57241, 57241, 57241, + 57241, 57241, 57251, 57251, 57251, 57251, 57251, 57251, + 57251, 57251, 57251, 57259, 57259, 57259, 57259, 57259, + 57259, 57259, 57269, 57269, 57269, 57269, 57269, 57269, + 57269, 57269, 57269, 57271, 57271, 57283, 57283, 57283, + 57283, 57283, 57283, 57283, 57283, 57283, 57283, 57283, + 57287, 57287, 57287, 57301, 57301, 57301, 57301, 57301, + 57301, 57301, 57301, 57301, 57301, 57301, 57301, 57301, + 57329, 57329, 57329, 57329, 57329, 57329, 57329, 57329, + 57329, 57329, 57329, 57329, 57329, 57329, 57329, 57329, + 57329, 57329, 57329, 57329, 57329, 57329, 57329, 57329, + 57331, 57331, 57347, 57347, 57347, 57347, 57347, 57347, + 57347, 57347, 57347, 57347, 57347, 57347, 57347, 57347, + 57349, 57349, 57367, 57367, 57367, 57367, 57367, 57367, + 57367, 57367, 57367, 57367, 57367, 57367, 57367, 57367, + 57367, 57367, 57373, 57373, 57373, 57373, 57373, 57373, + 57383, 57383, 57383, 57383, 57383, 57383, 57383, 57383, + 57389, 57389, 57389, 57389, 57389, 57389, 57397, 57397, + 57397, 57397, 57397, 57397, 57397, 57413, 57413, 57413, + 57413, 57413, 57413, 57413, 57413, 57413, 57413, 57413, + 57413, 57413, 57413, 57427, 57427, 57427, 57427, 57427, + 57427, 57427, 57427, 57427, 57427, 57427, 57427, 57427, + 57457, 57457, 57457, 57457, 57457, 57457, 57457, 57457, + 57457, 57457, 57457, 57457, 57457, 57457, 57457, 57457, + 57457, 57457, 57457, 57457, 57457, 57457, 57457, 57457, + 57457, 57457, 57467, 57467, 57467, 57467, 57467, 57467, + 57467, 57467, 57467, 57487, 57487, 57487, 57487, 57487, + 57487, 57487, 57487, 57487, 57487, 57487, 57487, 57487, + 57487, 57487, 57487, 57487, 57487, 57493, 57493, 57493, + 57493, 57493, 57503, 57503, 57503, 57503, 57503, 57503, + 57503, 57503, 57503, 57527, 57527, 57527, 57527, 57527, + 57527, 57527, 57527, 57527, 57527, 57527, 57527, 57527, + 57527, 57527, 57527, 57527, 57527, 57527, 57527, 57527, + 57529, 57529, 57557, 57557, 57557, 57557, 57557, 57557, + 57557, 57557, 57557, 57557, 57557, 57557, 57557, 57557, + 57557, 57557, 57557, 57557, 57557, 57557, 57557, 57557, + 57557, 57557, 57557, 57559, 57559, 57571, 57571, 57571, + 57571, 57571, 57571, 57571, 57571, 57571, 57571, 57571, + 57587, 57587, 57587, 57587, 57587, 57587, 57587, 57587, + 57587, 57587, 57587, 57587, 57587, 57587, 57593, 57593, + 57593, 57593, 57593, 57601, 57601, 57601, 57601, 57601, + 57601, 57601, 57637, 57637, 57637, 57637, 57637, 57637, + 57637, 57637, 57637, 57637, 57637, 57637, 57637, 57637, + 57637, 57637, 57637, 57637, 57637, 57637, 57637, 57637, + 57637, 57637, 57637, 57637, 57637, 57637, 57637, 57637, + 57637, 57637, 57641, 57641, 57641, 57641, 57649, 57649, + 57649, 57649, 57649, 57649, 57649, 57653, 57653, 57653, + 57667, 57667, 57667, 57667, 57667, 57667, 57667, 57667, + 57667, 57667, 57667, 57667, 57667, 57679, 57679, 57679, + 57679, 57679, 57679, 57679, 57679, 57679, 57679, 57679, + 57689, 57689, 57689, 57689, 57689, 57689, 57689, 57689, + 57697, 57697, 57697, 57697, 57697, 57697, 57697, 57697, + 57709, 57709, 57709, 57709, 57709, 57709, 57709, 57709, + 57709, 57709, 57713, 57713, 57713, 57713, 57719, 57719, + 57719, 57719, 57719, 57727, 57727, 57727, 57727, 57727, + 57727, 57727, 57731, 57731, 57731, 57731, 57737, 57737, + 57737, 57737, 57737, 57751, 57751, 57751, 57751, 57751, + 57751, 57751, 57751, 57751, 57751, 57751, 57751, 57751, + 57773, 57773, 57773, 57773, 57773, 57773, 57773, 57773, + 57773, 57773, 57773, 57773, 57773, 57773, 57773, 57773, + 57773, 57773, 57773, 57781, 57781, 57781, 57781, 57781, + 57781, 57781, 57787, 57787, 57787, 57787, 57787, 57787, + 57791, 57791, 57791, 57793, 57793, 57803, 57803, 57803, + 57803, 57803, 57803, 57803, 57803, 57803, 57809, 57809, + 57809, 57809, 57809, 57829, 57829, 57829, 57829, 57829, + 57829, 57829, 57829, 57829, 57829, 57829, 57829, 57829, + 57829, 57829, 57829, 57829, 57829, 57839, 57839, 57839, + 57839, 57839, 57839, 57839, 57839, 57839, 57847, 57847, + 57847, 57847, 57847, 57847, 57847, 57853, 57853, 57853, + 57853, 57853, 57859, 57859, 57859, 57859, 57859, 57859, + 57881, 57881, 57881, 57881, 57881, 57881, 57881, 57881, + 57881, 57881, 57881, 57881, 57881, 57881, 57881, 57881, + 57881, 57881, 57881, 57899, 57899, 57899, 57899, 57899, + 57899, 57899, 57899, 57899, 57899, 57899, 57899, 57899, + 57899, 57899, 57899, 57901, 57901, 57917, 57917, 57917, + 57917, 57917, 57917, 57917, 57917, 57917, 57917, 57917, + 57917, 57917, 57917, 57923, 57923, 57923, 57923, 57923, + 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, + 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, + 57943, 57943, 57947, 57947, 57947, 57947, 57973, 57973, + 57973, 57973, 57973, 57973, 57973, 57973, 57973, 57973, + 57973, 57973, 57973, 57973, 57973, 57973, 57973, 57973, + 57973, 57973, 57973, 57973, 57973, 57977, 57977, 57977, + 57991, 57991, 57991, 57991, 57991, 57991, 57991, 57991, + 57991, 57991, 57991, 57991, 57991, 58013, 58013, 58013, + 58013, 58013, 58013, 58013, 58013, 58013, 58013, 58013, + 58013, 58013, 58013, 58013, 58013, 58013, 58013, 58013, + 58027, 58027, 58027, 58027, 58027, 58027, 58027, 58027, + 58027, 58027, 58027, 58027, 58027, 58031, 58031, 58031, + 58043, 58043, 58043, 58043, 58043, 58043, 58043, 58043, + 58043, 58043, 58043, 58049, 58049, 58049, 58049, 58049, + 58057, 58057, 58057, 58057, 58057, 58057, 58057, 58057, + 58061, 58061, 58061, 58067, 58067, 58067, 58067, 58067, + 58073, 58073, 58073, 58073, 58073, 58073, 58099, 58099, + 58099, 58099, 58099, 58099, 58099, 58099, 58099, 58099, + 58099, 58099, 58099, 58099, 58099, 58099, 58099, 58099, + 58099, 58099, 58099, 58099, 58099, 58109, 58109, 58109, + 58109, 58109, 58109, 58109, 58109, 58109, 58111, 58111, + 58129, 58129, 58129, 58129, 58129, 58129, 58129, 58129, + 58129, 58129, 58129, 58129, 58129, 58129, 58129, 58129, + 58147, 58147, 58147, 58147, 58147, 58147, 58147, 58147, + 58147, 58147, 58147, 58147, 58147, 58147, 58147, 58147, + 58151, 58151, 58151, 58153, 58153, 58169, 58169, 58169, + 58169, 58169, 58169, 58169, 58169, 58169, 58169, 58169, + 58169, 58169, 58169, 58171, 58171, 58189, 58189, 58189, + 58189, 58189, 58189, 58189, 58189, 58189, 58189, 58189, + 58189, 58189, 58189, 58189, 58189, 58193, 58193, 58193, + 58199, 58199, 58199, 58199, 58199, 58199, 58207, 58207, + 58207, 58207, 58207, 58207, 58207, 58211, 58211, 58211, + 58217, 58217, 58217, 58217, 58217, 58217, 58229, 58229, + 58229, 58229, 58229, 58229, 58229, 58229, 58229, 58229, + 58231, 58231, 58237, 58237, 58237, 58237, 58237, 58237, + 58243, 58243, 58243, 58243, 58243, 58271, 58271, 58271, + 58271, 58271, 58271, 58271, 58271, 58271, 58271, 58271, + 58271, 58271, 58271, 58271, 58271, 58271, 58271, 58271, + 58271, 58271, 58271, 58271, 58271, 58271, 58309, 58309, + 58309, 58309, 58309, 58309, 58309, 58309, 58309, 58309, + 58309, 58309, 58309, 58309, 58309, 58309, 58309, 58309, + 58309, 58309, 58309, 58309, 58309, 58309, 58309, 58309, + 58309, 58309, 58309, 58309, 58309, 58309, 58309, 58309, + 58313, 58313, 58313, 58321, 58321, 58321, 58321, 58321, + 58321, 58321, 58337, 58337, 58337, 58337, 58337, 58337, + 58337, 58337, 58337, 58337, 58337, 58337, 58337, 58337, + 58363, 58363, 58363, 58363, 58363, 58363, 58363, 58363, + 58363, 58363, 58363, 58363, 58363, 58363, 58363, 58363, + 58363, 58363, 58363, 58363, 58363, 58363, 58363, 58363, + 58367, 58367, 58367, 58369, 58369, 58379, 58379, 58379, + 58379, 58379, 58379, 58379, 58379, 58379, 58391, 58391, + 58391, 58391, 58391, 58391, 58391, 58391, 58391, 58391, + 58393, 58393, 58403, 58403, 58403, 58403, 58403, 58403, + 58403, 58403, 58403, 58411, 58411, 58411, 58411, 58411, + 58411, 58411, 58417, 58417, 58417, 58417, 58417, 58417, + 58427, 58427, 58427, 58427, 58427, 58427, 58427, 58427, + 58439, 58439, 58439, 58439, 58439, 58439, 58439, 58439, + 58439, 58439, 58439, 58441, 58441, 58451, 58451, 58451, + 58451, 58451, 58451, 58451, 58451, 58451, 58453, 58453, + 58477, 58477, 58477, 58477, 58477, 58477, 58477, 58477, + 58477, 58477, 58477, 58477, 58477, 58477, 58477, 58477, + 58477, 58477, 58477, 58477, 58477, 58481, 58481, 58481, + 58511, 58511, 58511, 58511, 58511, 58511, 58511, 58511, + 58511, 58511, 58511, 58511, 58511, 58511, 58511, 58511, + 58511, 58511, 58511, 58511, 58511, 58511, 58511, 58511, + 58511, 58511, 58511, 58537, 58537, 58537, 58537, 58537, + 58537, 58537, 58537, 58537, 58537, 58537, 58537, 58537, + 58537, 58537, 58537, 58537, 58537, 58537, 58537, 58537, + 58537, 58537, 58543, 58543, 58543, 58543, 58543, 58543, + 58549, 58549, 58549, 58549, 58549, 58567, 58567, 58567, + 58567, 58567, 58567, 58567, 58567, 58567, 58567, 58567, + 58567, 58567, 58567, 58567, 58567, 58573, 58573, 58573, + 58573, 58573, 58579, 58579, 58579, 58579, 58579, 58579, + 58601, 58601, 58601, 58601, 58601, 58601, 58601, 58601, + 58601, 58601, 58601, 58601, 58601, 58601, 58601, 58601, + 58601, 58601, 58601, 58603, 58603, 58613, 58613, 58613, + 58613, 58613, 58613, 58613, 58613, 58613, 58631, 58631, + 58631, 58631, 58631, 58631, 58631, 58631, 58631, 58631, + 58631, 58631, 58631, 58631, 58631, 58631, 58657, 58657, + 58657, 58657, 58657, 58657, 58657, 58657, 58657, 58657, + 58657, 58657, 58657, 58657, 58657, 58657, 58657, 58657, + 58657, 58657, 58657, 58657, 58657, 58661, 58661, 58661, + 58679, 58679, 58679, 58679, 58679, 58679, 58679, 58679, + 58679, 58679, 58679, 58679, 58679, 58679, 58679, 58679, + 58687, 58687, 58687, 58687, 58687, 58687, 58687, 58687, + 58693, 58693, 58693, 58693, 58693, 58699, 58699, 58699, + 58699, 58699, 58711, 58711, 58711, 58711, 58711, 58711, + 58711, 58711, 58711, 58711, 58711, 58727, 58727, 58727, + 58727, 58727, 58727, 58727, 58727, 58727, 58727, 58727, + 58727, 58727, 58727, 58733, 58733, 58733, 58733, 58733, + 58741, 58741, 58741, 58741, 58741, 58741, 58741, 58741, + 58757, 58757, 58757, 58757, 58757, 58757, 58757, 58757, + 58757, 58757, 58757, 58757, 58757, 58757, 58763, 58763, + 58763, 58763, 58763, 58771, 58771, 58771, 58771, 58771, + 58771, 58771, 58787, 58787, 58787, 58787, 58787, 58787, + 58787, 58787, 58787, 58787, 58787, 58787, 58787, 58787, + 58789, 58789, 58831, 58831, 58831, 58831, 58831, 58831, + 58831, 58831, 58831, 58831, 58831, 58831, 58831, 58831, + 58831, 58831, 58831, 58831, 58831, 58831, 58831, 58831, + 58831, 58831, 58831, 58831, 58831, 58831, 58831, 58831, + 58831, 58831, 58831, 58831, 58831, 58831, 58831, 58831, + 58889, 58889, 58889, 58889, 58889, 58889, 58889, 58889, + 58889, 58889, 58889, 58889, 58889, 58889, 58889, 58889, + 58889, 58889, 58889, 58889, 58889, 58889, 58889, 58889, + 58889, 58889, 58889, 58889, 58889, 58889, 58889, 58889, + 58889, 58889, 58889, 58889, 58889, 58889, 58889, 58889, + 58889, 58889, 58889, 58889, 58889, 58889, 58889, 58889, + 58889, 58889, 58889, 58897, 58897, 58897, 58897, 58897, + 58897, 58897, 58901, 58901, 58901, 58901, 58907, 58907, + 58907, 58907, 58907, 58909, 58909, 58913, 58913, 58913, + 58921, 58921, 58921, 58921, 58921, 58921, 58921, 58921, + 58937, 58937, 58937, 58937, 58937, 58937, 58937, 58937, + 58937, 58937, 58937, 58937, 58937, 58937, 58943, 58943, + 58943, 58943, 58943, 58963, 58963, 58963, 58963, 58963, + 58963, 58963, 58963, 58963, 58963, 58963, 58963, 58963, + 58963, 58963, 58963, 58963, 58963, 58967, 58967, 58967, + 58979, 58979, 58979, 58979, 58979, 58979, 58979, 58979, + 58979, 58979, 58979, 58991, 58991, 58991, 58991, 58991, + 58991, 58991, 58991, 58991, 58991, 58991, 58997, 58997, + 58997, 58997, 58997, 59009, 59009, 59009, 59009, 59009, + 59009, 59009, 59009, 59009, 59009, 59009, 59011, 59011, + 59021, 59021, 59021, 59021, 59021, 59021, 59021, 59021, + 59023, 59023, 59029, 59029, 59029, 59029, 59029, 59029, + 59051, 59051, 59051, 59051, 59051, 59051, 59051, 59051, + 59051, 59051, 59051, 59051, 59051, 59051, 59051, 59051, + 59051, 59051, 59051, 59053, 59053, 59063, 59063, 59063, + 59063, 59063, 59063, 59063, 59063, 59063, 59069, 59069, + 59069, 59069, 59069, 59077, 59077, 59077, 59077, 59077, + 59077, 59077, 59083, 59083, 59083, 59083, 59083, 59083, + 59093, 59093, 59093, 59093, 59093, 59093, 59093, 59093, + 59107, 59107, 59107, 59107, 59107, 59107, 59107, 59107, + 59107, 59107, 59107, 59107, 59107, 59113, 59113, 59113, + 59113, 59113, 59119, 59119, 59119, 59119, 59119, 59119, + 59123, 59123, 59123, 59141, 59141, 59141, 59141, 59141, + 59141, 59141, 59141, 59141, 59141, 59141, 59141, 59141, + 59141, 59141, 59141, 59149, 59149, 59149, 59149, 59149, + 59149, 59149, 59159, 59159, 59159, 59159, 59159, 59159, + 59159, 59159, 59159, 59167, 59167, 59167, 59167, 59167, + 59167, 59167, 59183, 59183, 59183, 59183, 59183, 59183, + 59183, 59183, 59183, 59183, 59183, 59183, 59183, 59183, + 59197, 59197, 59197, 59197, 59197, 59197, 59197, 59197, + 59197, 59197, 59197, 59197, 59197, 59207, 59207, 59207, + 59207, 59207, 59207, 59207, 59207, 59207, 59209, 59209, + 59219, 59219, 59219, 59219, 59219, 59219, 59219, 59219, + 59221, 59221, 59233, 59233, 59233, 59233, 59233, 59233, + 59233, 59233, 59233, 59233, 59233, 59239, 59239, 59239, + 59239, 59239, 59243, 59243, 59243, 59243, 59263, 59263, + 59263, 59263, 59263, 59263, 59263, 59263, 59263, 59263, + 59263, 59263, 59263, 59263, 59263, 59263, 59263, 59263, + 59273, 59273, 59273, 59273, 59273, 59273, 59273, 59273, + 59281, 59281, 59281, 59281, 59281, 59281, 59281, 59281, + 59333, 59333, 59333, 59333, 59333, 59333, 59333, 59333, + 59333, 59333, 59333, 59333, 59333, 59333, 59333, 59333, + 59333, 59333, 59333, 59333, 59333, 59333, 59333, 59333, + 59333, 59333, 59333, 59333, 59333, 59333, 59333, 59333, + 59333, 59333, 59333, 59333, 59333, 59333, 59333, 59333, + 59333, 59333, 59333, 59333, 59333, 59333, 59341, 59341, + 59341, 59341, 59341, 59341, 59341, 59351, 59351, 59351, + 59351, 59351, 59351, 59351, 59351, 59351, 59357, 59357, + 59357, 59357, 59357, 59359, 59359, 59369, 59369, 59369, + 59369, 59369, 59369, 59369, 59369, 59369, 59377, 59377, + 59377, 59377, 59377, 59377, 59377, 59387, 59387, 59387, + 59387, 59387, 59387, 59387, 59387, 59387, 59393, 59393, + 59393, 59393, 59393, 59399, 59399, 59399, 59399, 59399, + 59407, 59407, 59407, 59407, 59407, 59407, 59407, 59407, + 59417, 59417, 59417, 59417, 59417, 59417, 59417, 59417, + 59419, 59419, 59441, 59441, 59441, 59441, 59441, 59441, + 59441, 59441, 59441, 59441, 59441, 59441, 59441, 59441, + 59441, 59441, 59441, 59441, 59441, 59441, 59443, 59443, + 59447, 59447, 59447, 59453, 59453, 59453, 59453, 59453, + 59467, 59467, 59467, 59467, 59467, 59467, 59467, 59467, + 59467, 59467, 59467, 59467, 59467, 59471, 59471, 59471, + 59473, 59473, 59497, 59497, 59497, 59497, 59497, 59497, + 59497, 59497, 59497, 59497, 59497, 59497, 59497, 59497, + 59497, 59497, 59497, 59497, 59497, 59497, 59497, 59497, + 59509, 59509, 59509, 59509, 59509, 59509, 59509, 59509, + 59509, 59509, 59513, 59513, 59513, 59513, 59539, 59539, + 59539, 59539, 59539, 59539, 59539, 59539, 59539, 59539, + 59539, 59539, 59539, 59539, 59539, 59539, 59539, 59539, + 59539, 59539, 59539, 59539, 59539, 59557, 59557, 59557, + 59557, 59557, 59557, 59557, 59557, 59557, 59557, 59557, + 59557, 59557, 59557, 59557, 59557, 59561, 59561, 59561, + 59567, 59567, 59567, 59567, 59567, 59567, 59581, 59581, + 59581, 59581, 59581, 59581, 59581, 59581, 59581, 59581, + 59581, 59581, 59611, 59611, 59611, 59611, 59611, 59611, + 59611, 59611, 59611, 59611, 59611, 59611, 59611, 59611, + 59611, 59611, 59611, 59611, 59611, 59611, 59611, 59611, + 59611, 59611, 59611, 59611, 59611, 59617, 59617, 59617, + 59617, 59617, 59621, 59621, 59621, 59621, 59627, 59627, + 59627, 59627, 59627, 59629, 59629, 59651, 59651, 59651, + 59651, 59651, 59651, 59651, 59651, 59651, 59651, 59651, + 59651, 59651, 59651, 59651, 59651, 59651, 59651, 59651, + 59659, 59659, 59659, 59659, 59659, 59659, 59659, 59659, + 59663, 59663, 59663, 59669, 59669, 59669, 59669, 59669, + 59671, 59671, 59693, 59693, 59693, 59693, 59693, 59693, + 59693, 59693, 59693, 59693, 59693, 59693, 59693, 59693, + 59693, 59693, 59693, 59693, 59693, 59693, 59699, 59699, + 59699, 59699, 59699, 59707, 59707, 59707, 59707, 59707, + 59707, 59707, 59723, 59723, 59723, 59723, 59723, 59723, + 59723, 59723, 59723, 59723, 59723, 59723, 59723, 59723, + 59729, 59729, 59729, 59729, 59729, 59729, 59743, 59743, + 59743, 59743, 59743, 59743, 59743, 59743, 59743, 59743, + 59743, 59743, 59747, 59747, 59747, 59747, 59753, 59753, + 59753, 59753, 59753, 59771, 59771, 59771, 59771, 59771, + 59771, 59771, 59771, 59771, 59771, 59771, 59771, 59771, + 59771, 59771, 59771, 59779, 59779, 59779, 59779, 59779, + 59779, 59779, 59791, 59791, 59791, 59791, 59791, 59791, + 59791, 59791, 59791, 59791, 59791, 59797, 59797, 59797, + 59797, 59797, 59809, 59809, 59809, 59809, 59809, 59809, + 59809, 59809, 59809, 59809, 59809, 59833, 59833, 59833, + 59833, 59833, 59833, 59833, 59833, 59833, 59833, 59833, + 59833, 59833, 59833, 59833, 59833, 59833, 59833, 59833, + 59833, 59833, 59863, 59863, 59863, 59863, 59863, 59863, + 59863, 59863, 59863, 59863, 59863, 59863, 59863, 59863, + 59863, 59863, 59863, 59863, 59863, 59863, 59863, 59863, + 59863, 59863, 59863, 59863, 59863, 59879, 59879, 59879, + 59879, 59879, 59879, 59879, 59879, 59879, 59879, 59879, + 59879, 59879, 59879, 59887, 59887, 59887, 59887, 59887, + 59887, 59887, 59921, 59921, 59921, 59921, 59921, 59921, + 59921, 59921, 59921, 59921, 59921, 59921, 59921, 59921, + 59921, 59921, 59921, 59921, 59921, 59921, 59921, 59921, + 59921, 59921, 59921, 59921, 59921, 59921, 59921, 59921, + 59929, 59929, 59929, 59929, 59929, 59929, 59929, 59929, + 59951, 59951, 59951, 59951, 59951, 59951, 59951, 59951, + 59951, 59951, 59951, 59951, 59951, 59951, 59951, 59951, + 59951, 59951, 59951, 59957, 59957, 59957, 59957, 59957, + 59971, 59971, 59971, 59971, 59971, 59971, 59971, 59971, + 59971, 59971, 59971, 59971, 59971, 59981, 59981, 59981, + 59981, 59981, 59981, 59981, 59981, 59981, 59999, 59999, + 59999, 59999, 59999, 59999, 59999, 59999, 59999, 59999, + 59999, 59999, 59999, 59999, 59999, 59999, 60013, 60013, + 60013, 60013, 60013, 60013, 60013, 60013, 60013, 60013, + 60013, 60013, 60017, 60017, 60017, 60017, 60029, 60029, + 60029, 60029, 60029, 60029, 60029, 60029, 60029, 60029, + 60037, 60037, 60037, 60037, 60037, 60037, 60037, 60037, + 60041, 60041, 60041, 60077, 60077, 60077, 60077, 60077, + 60077, 60077, 60077, 60077, 60077, 60077, 60077, 60077, + 60077, 60077, 60077, 60077, 60077, 60077, 60077, 60077, + 60077, 60077, 60077, 60077, 60077, 60077, 60077, 60077, + 60077, 60077, 60077, 60083, 60083, 60083, 60083, 60083, + 60089, 60089, 60089, 60089, 60089, 60089, 60091, 60091, + 60101, 60101, 60101, 60101, 60101, 60101, 60101, 60101, + 60103, 60103, 60107, 60107, 60107, 60107, 60127, 60127, + 60127, 60127, 60127, 60127, 60127, 60127, 60127, 60127, + 60127, 60127, 60127, 60127, 60127, 60127, 60127, 60127, + 60133, 60133, 60133, 60133, 60133, 60139, 60139, 60139, + 60139, 60139, 60149, 60149, 60149, 60149, 60149, 60149, + 60149, 60149, 60149, 60161, 60161, 60161, 60161, 60161, + 60161, 60161, 60161, 60161, 60161, 60161, 60167, 60167, + 60167, 60167, 60167, 60169, 60169, 60209, 60209, 60209, + 60209, 60209, 60209, 60209, 60209, 60209, 60209, 60209, + 60209, 60209, 60209, 60209, 60209, 60209, 60209, 60209, + 60209, 60209, 60209, 60209, 60209, 60209, 60209, 60209, + 60209, 60209, 60209, 60209, 60209, 60209, 60209, 60209, + 60217, 60217, 60217, 60217, 60217, 60217, 60217, 60217, + 60223, 60223, 60223, 60223, 60223, 60251, 60251, 60251, + 60251, 60251, 60251, 60251, 60251, 60251, 60251, 60251, + 60251, 60251, 60251, 60251, 60251, 60251, 60251, 60251, + 60251, 60251, 60251, 60251, 60251, 60251, 60257, 60257, + 60257, 60257, 60257, 60259, 60259, 60271, 60271, 60271, + 60271, 60271, 60271, 60271, 60271, 60271, 60271, 60271, + 60289, 60289, 60289, 60289, 60289, 60289, 60289, 60289, + 60289, 60289, 60289, 60289, 60289, 60289, 60289, 60289, + 60293, 60293, 60293, 60317, 60317, 60317, 60317, 60317, + 60317, 60317, 60317, 60317, 60317, 60317, 60317, 60317, + 60317, 60317, 60317, 60317, 60317, 60317, 60317, 60317, + 60331, 60331, 60331, 60331, 60331, 60331, 60331, 60331, + 60331, 60331, 60331, 60331, 60331, 60337, 60337, 60337, + 60337, 60337, 60343, 60343, 60343, 60343, 60343, 60343, + 60353, 60353, 60353, 60353, 60353, 60353, 60353, 60353, + 60373, 60373, 60373, 60373, 60373, 60373, 60373, 60373, + 60373, 60373, 60373, 60373, 60373, 60373, 60373, 60373, + 60373, 60373, 60383, 60383, 60383, 60383, 60383, 60383, + 60383, 60383, 60383, 60397, 60397, 60397, 60397, 60397, + 60397, 60397, 60397, 60397, 60397, 60397, 60397, 60397, + 60413, 60413, 60413, 60413, 60413, 60413, 60413, 60413, + 60413, 60413, 60413, 60413, 60413, 60413, 60427, 60427, + 60427, 60427, 60427, 60427, 60427, 60427, 60427, 60427, + 60427, 60427, 60443, 60443, 60443, 60443, 60443, 60443, + 60443, 60443, 60443, 60443, 60443, 60443, 60443, 60443, + 60449, 60449, 60449, 60449, 60449, 60449, 60457, 60457, + 60457, 60457, 60457, 60457, 60457, 60493, 60493, 60493, + 60493, 60493, 60493, 60493, 60493, 60493, 60493, 60493, + 60493, 60493, 60493, 60493, 60493, 60493, 60493, 60493, + 60493, 60493, 60493, 60493, 60493, 60493, 60493, 60493, + 60493, 60493, 60493, 60493, 60493, 60497, 60497, 60497, + 60509, 60509, 60509, 60509, 60509, 60509, 60509, 60509, + 60509, 60509, 60509, 60521, 60521, 60521, 60521, 60521, + 60521, 60521, 60521, 60521, 60521, 60521, 60527, 60527, + 60527, 60527, 60527, 60539, 60539, 60539, 60539, 60539, + 60539, 60539, 60539, 60539, 60539, 60539, 60589, 60589, + 60589, 60589, 60589, 60589, 60589, 60589, 60589, 60589, + 60589, 60589, 60589, 60589, 60589, 60589, 60589, 60589, + 60589, 60589, 60589, 60589, 60589, 60589, 60589, 60589, + 60589, 60589, 60589, 60589, 60589, 60589, 60589, 60589, + 60589, 60589, 60589, 60589, 60589, 60589, 60589, 60589, + 60589, 60589, 60601, 60601, 60601, 60601, 60601, 60601, + 60601, 60601, 60601, 60601, 60601, 60607, 60607, 60607, + 60607, 60607, 60611, 60611, 60611, 60611, 60617, 60617, + 60617, 60617, 60617, 60623, 60623, 60623, 60623, 60623, + 60631, 60631, 60631, 60631, 60631, 60631, 60631, 60631, + 60637, 60637, 60637, 60637, 60637, 60647, 60647, 60647, + 60647, 60647, 60647, 60647, 60647, 60647, 60649, 60649, + 60659, 60659, 60659, 60659, 60659, 60659, 60659, 60659, + 60661, 60661, 60679, 60679, 60679, 60679, 60679, 60679, + 60679, 60679, 60679, 60679, 60679, 60679, 60679, 60679, + 60679, 60679, 60689, 60689, 60689, 60689, 60689, 60689, + 60689, 60689, 60689, 60703, 60703, 60703, 60703, 60703, + 60703, 60703, 60703, 60703, 60703, 60703, 60703, 60703, + 60719, 60719, 60719, 60719, 60719, 60719, 60719, 60719, + 60719, 60719, 60719, 60719, 60719, 60719, 60727, 60727, + 60727, 60727, 60727, 60727, 60727, 60733, 60733, 60733, + 60733, 60733, 60737, 60737, 60737, 60737, 60757, 60757, + 60757, 60757, 60757, 60757, 60757, 60757, 60757, 60757, + 60757, 60757, 60757, 60757, 60757, 60757, 60757, 60757, + 60761, 60761, 60761, 60763, 60763, 60773, 60773, 60773, + 60773, 60773, 60773, 60773, 60773, 60773, 60779, 60779, + 60779, 60779, 60779, 60793, 60793, 60793, 60793, 60793, + 60793, 60793, 60793, 60793, 60793, 60793, 60793, 60793, + 60811, 60811, 60811, 60811, 60811, 60811, 60811, 60811, + 60811, 60811, 60811, 60811, 60811, 60811, 60811, 60811, + 60821, 60821, 60821, 60821, 60821, 60821, 60821, 60821, + 60859, 60859, 60859, 60859, 60859, 60859, 60859, 60859, + 60859, 60859, 60859, 60859, 60859, 60859, 60859, 60859, + 60859, 60859, 60859, 60859, 60859, 60859, 60859, 60859, + 60859, 60859, 60859, 60859, 60859, 60859, 60859, 60859, + 60859, 60859, 60869, 60869, 60869, 60869, 60869, 60869, + 60869, 60869, 60869, 60887, 60887, 60887, 60887, 60887, + 60887, 60887, 60887, 60887, 60887, 60887, 60887, 60887, + 60887, 60887, 60887, 60889, 60889, 60899, 60899, 60899, + 60899, 60899, 60899, 60899, 60899, 60899, 60901, 60901, + 60913, 60913, 60913, 60913, 60913, 60913, 60913, 60913, + 60913, 60913, 60917, 60917, 60917, 60917, 60919, 60919, + 60923, 60923, 60923, 60937, 60937, 60937, 60937, 60937, + 60937, 60937, 60937, 60937, 60937, 60937, 60937, 60937, + 60943, 60943, 60943, 60943, 60943, 60953, 60953, 60953, + 60953, 60953, 60953, 60953, 60953, 60953, 60961, 60961, + 60961, 60961, 60961, 60961, 60961, 61001, 61001, 61001, + 61001, 61001, 61001, 61001, 61001, 61001, 61001, 61001, + 61001, 61001, 61001, 61001, 61001, 61001, 61001, 61001, + 61001, 61001, 61001, 61001, 61001, 61001, 61001, 61001, + 61001, 61001, 61001, 61001, 61001, 61001, 61001, 61001, + 61007, 61007, 61007, 61007, 61007, 61007, 61027, 61027, + 61027, 61027, 61027, 61027, 61027, 61027, 61027, 61027, + 61027, 61027, 61027, 61027, 61027, 61027, 61027, 61027, + 61031, 61031, 61031, 61043, 61043, 61043, 61043, 61043, + 61043, 61043, 61043, 61043, 61043, 61043, 61051, 61051, + 61051, 61051, 61051, 61051, 61051, 61057, 61057, 61057, + 61057, 61057, 61091, 61091, 61091, 61091, 61091, 61091, + 61091, 61091, 61091, 61091, 61091, 61091, 61091, 61091, + 61091, 61091, 61091, 61091, 61091, 61091, 61091, 61091, + 61091, 61091, 61091, 61091, 61091, 61091, 61091, 61091, + 61099, 61099, 61099, 61099, 61099, 61099, 61099, 61099, + 61121, 61121, 61121, 61121, 61121, 61121, 61121, 61121, + 61121, 61121, 61121, 61121, 61121, 61121, 61121, 61121, + 61121, 61121, 61121, 61129, 61129, 61129, 61129, 61129, + 61129, 61129, 61141, 61141, 61141, 61141, 61141, 61141, + 61141, 61141, 61141, 61141, 61141, 61151, 61151, 61151, + 61151, 61151, 61151, 61151, 61151, 61151, 61153, 61153, + 61169, 61169, 61169, 61169, 61169, 61169, 61169, 61169, + 61169, 61169, 61169, 61169, 61169, 61169, 61211, 61211, + 61211, 61211, 61211, 61211, 61211, 61211, 61211, 61211, + 61211, 61211, 61211, 61211, 61211, 61211, 61211, 61211, + 61211, 61211, 61211, 61211, 61211, 61211, 61211, 61211, + 61211, 61211, 61211, 61211, 61211, 61211, 61211, 61211, + 61211, 61211, 61211, 61223, 61223, 61223, 61223, 61223, + 61223, 61223, 61223, 61223, 61223, 61223, 61231, 61231, + 61231, 61231, 61231, 61231, 61231, 61253, 61253, 61253, + 61253, 61253, 61253, 61253, 61253, 61253, 61253, 61253, + 61253, 61253, 61253, 61253, 61253, 61253, 61253, 61253, + 61261, 61261, 61261, 61261, 61261, 61261, 61261, 61261, + 61283, 61283, 61283, 61283, 61283, 61283, 61283, 61283, + 61283, 61283, 61283, 61283, 61283, 61283, 61283, 61283, + 61283, 61283, 61283, 61291, 61291, 61291, 61291, 61291, + 61291, 61291, 61297, 61297, 61297, 61297, 61297, 61297, + 61331, 61331, 61331, 61331, 61331, 61331, 61331, 61331, + 61331, 61331, 61331, 61331, 61331, 61331, 61331, 61331, + 61331, 61331, 61331, 61331, 61331, 61331, 61331, 61331, + 61331, 61331, 61331, 61331, 61331, 61331, 61333, 61333, + 61339, 61339, 61339, 61339, 61339, 61343, 61343, 61343, + 61357, 61357, 61357, 61357, 61357, 61357, 61357, 61357, + 61357, 61357, 61357, 61357, 61357, 61363, 61363, 61363, + 61363, 61363, 61379, 61379, 61379, 61379, 61379, 61379, + 61379, 61379, 61379, 61379, 61379, 61379, 61379, 61379, + 61381, 61381, 61403, 61403, 61403, 61403, 61403, 61403, + 61403, 61403, 61403, 61403, 61403, 61403, 61403, 61403, + 61403, 61403, 61403, 61403, 61403, 61403, 61409, 61409, + 61409, 61409, 61409, 61417, 61417, 61417, 61417, 61417, + 61417, 61417, 61441, 61441, 61441, 61441, 61441, 61441, + 61441, 61441, 61441, 61441, 61441, 61441, 61441, 61441, + 61441, 61441, 61441, 61441, 61441, 61441, 61441, 61441, + 61463, 61463, 61463, 61463, 61463, 61463, 61463, 61463, + 61463, 61463, 61463, 61463, 61463, 61463, 61463, 61463, + 61463, 61463, 61463, 61469, 61469, 61469, 61469, 61469, + 61471, 61471, 61483, 61483, 61483, 61483, 61483, 61483, + 61483, 61483, 61483, 61483, 61483, 61487, 61487, 61487, + 61493, 61493, 61493, 61493, 61493, 61493, 61507, 61507, + 61507, 61507, 61507, 61507, 61507, 61507, 61507, 61507, + 61507, 61507, 61511, 61511, 61511, 61511, 61519, 61519, + 61519, 61519, 61519, 61519, 61519, 61543, 61543, 61543, + 61543, 61543, 61543, 61543, 61543, 61543, 61543, 61543, + 61543, 61543, 61543, 61543, 61543, 61543, 61543, 61543, + 61543, 61543, 61547, 61547, 61547, 61547, 61553, 61553, + 61553, 61553, 61553, 61559, 61559, 61559, 61559, 61559, + 61561, 61561, 61583, 61583, 61583, 61583, 61583, 61583, + 61583, 61583, 61583, 61583, 61583, 61583, 61583, 61583, + 61583, 61583, 61583, 61583, 61583, 61583, 61603, 61603, + 61603, 61603, 61603, 61603, 61603, 61603, 61603, 61603, + 61603, 61603, 61603, 61603, 61603, 61603, 61603, 61603, + 61609, 61609, 61609, 61609, 61609, 61613, 61613, 61613, + 61627, 61627, 61627, 61627, 61627, 61627, 61627, 61627, + 61627, 61627, 61627, 61627, 61627, 61631, 61631, 61631, + 61637, 61637, 61637, 61637, 61637, 61637, 61643, 61643, + 61643, 61643, 61643, 61651, 61651, 61651, 61651, 61651, + 61651, 61651, 61657, 61657, 61657, 61657, 61657, 61657, + 61667, 61667, 61667, 61667, 61667, 61667, 61667, 61667, + 61673, 61673, 61673, 61673, 61673, 61673, 61681, 61681, + 61681, 61681, 61681, 61681, 61681, 61687, 61687, 61687, + 61687, 61687, 61703, 61703, 61703, 61703, 61703, 61703, + 61703, 61703, 61703, 61703, 61703, 61703, 61703, 61703, + 61717, 61717, 61717, 61717, 61717, 61717, 61717, 61717, + 61717, 61717, 61717, 61717, 61717, 61723, 61723, 61723, + 61723, 61723, 61729, 61729, 61729, 61729, 61729, 61729, + 61751, 61751, 61751, 61751, 61751, 61751, 61751, 61751, + 61751, 61751, 61751, 61751, 61751, 61751, 61751, 61751, + 61751, 61751, 61751, 61757, 61757, 61757, 61757, 61757, + 61781, 61781, 61781, 61781, 61781, 61781, 61781, 61781, + 61781, 61781, 61781, 61781, 61781, 61781, 61781, 61781, + 61781, 61781, 61781, 61781, 61781, 61781, 61813, 61813, + 61813, 61813, 61813, 61813, 61813, 61813, 61813, 61813, + 61813, 61813, 61813, 61813, 61813, 61813, 61813, 61813, + 61813, 61813, 61813, 61813, 61813, 61813, 61813, 61813, + 61813, 61813, 61819, 61819, 61819, 61819, 61819, 61819, + 61837, 61837, 61837, 61837, 61837, 61837, 61837, 61837, + 61837, 61837, 61837, 61837, 61837, 61837, 61837, 61837, + 61843, 61843, 61843, 61843, 61843, 61861, 61861, 61861, + 61861, 61861, 61861, 61861, 61861, 61861, 61861, 61861, + 61861, 61861, 61861, 61861, 61861, 61871, 61871, 61871, + 61871, 61871, 61871, 61871, 61871, 61871, 61879, 61879, + 61879, 61879, 61879, 61879, 61879, 61909, 61909, 61909, + 61909, 61909, 61909, 61909, 61909, 61909, 61909, 61909, + 61909, 61909, 61909, 61909, 61909, 61909, 61909, 61909, + 61909, 61909, 61909, 61909, 61909, 61909, 61909, 61909, + 61927, 61927, 61927, 61927, 61927, 61927, 61927, 61927, + 61927, 61927, 61927, 61927, 61927, 61927, 61927, 61927, + 61933, 61933, 61933, 61933, 61933, 61949, 61949, 61949, + 61949, 61949, 61949, 61949, 61949, 61949, 61949, 61949, + 61949, 61949, 61949, 61961, 61961, 61961, 61961, 61961, + 61961, 61961, 61961, 61961, 61961, 61961, 61967, 61967, + 61967, 61967, 61967, 61979, 61979, 61979, 61979, 61979, + 61979, 61979, 61979, 61979, 61979, 61979, 61981, 61981, + 61987, 61987, 61987, 61987, 61987, 61991, 61991, 61991, + 62003, 62003, 62003, 62003, 62003, 62003, 62003, 62003, + 62003, 62003, 62003, 62011, 62011, 62011, 62011, 62011, + 62011, 62011, 62017, 62017, 62017, 62017, 62017, 62017, + 62039, 62039, 62039, 62039, 62039, 62039, 62039, 62039, + 62039, 62039, 62039, 62039, 62039, 62039, 62039, 62039, + 62039, 62039, 62039, 62047, 62047, 62047, 62047, 62047, + 62047, 62047, 62053, 62053, 62053, 62053, 62053, 62053, + 62057, 62057, 62057, 62071, 62071, 62071, 62071, 62071, + 62071, 62071, 62071, 62071, 62071, 62071, 62071, 62071, + 62081, 62081, 62081, 62081, 62081, 62081, 62081, 62081, + 62099, 62099, 62099, 62099, 62099, 62099, 62099, 62099, + 62099, 62099, 62099, 62099, 62099, 62099, 62099, 62099, + 62119, 62119, 62119, 62119, 62119, 62119, 62119, 62119, + 62119, 62119, 62119, 62119, 62119, 62119, 62119, 62119, + 62119, 62119, 62129, 62129, 62129, 62129, 62129, 62129, + 62129, 62129, 62129, 62131, 62131, 62137, 62137, 62137, + 62137, 62137, 62141, 62141, 62141, 62141, 62143, 62143, + 62171, 62171, 62171, 62171, 62171, 62171, 62171, 62171, + 62171, 62171, 62171, 62171, 62171, 62171, 62171, 62171, + 62171, 62171, 62171, 62171, 62171, 62171, 62171, 62171, + 62189, 62189, 62189, 62189, 62189, 62189, 62189, 62189, + 62189, 62189, 62189, 62189, 62189, 62189, 62189, 62189, + 62191, 62191, 62201, 62201, 62201, 62201, 62201, 62201, + 62201, 62201, 62201, 62207, 62207, 62207, 62207, 62207, + 62213, 62213, 62213, 62213, 62213, 62213, 62219, 62219, + 62219, 62219, 62219, 62233, 62233, 62233, 62233, 62233, + 62233, 62233, 62233, 62233, 62233, 62233, 62233, 62233, + 62273, 62273, 62273, 62273, 62273, 62273, 62273, 62273, + 62273, 62273, 62273, 62273, 62273, 62273, 62273, 62273, + 62273, 62273, 62273, 62273, 62273, 62273, 62273, 62273, + 62273, 62273, 62273, 62273, 62273, 62273, 62273, 62273, + 62273, 62273, 62273, 62297, 62297, 62297, 62297, 62297, + 62297, 62297, 62297, 62297, 62297, 62297, 62297, 62297, + 62297, 62297, 62297, 62297, 62297, 62297, 62297, 62297, + 62299, 62299, 62303, 62303, 62303, 62303, 62311, 62311, + 62311, 62311, 62311, 62311, 62311, 62323, 62323, 62323, + 62323, 62323, 62323, 62323, 62323, 62323, 62323, 62323, + 62327, 62327, 62327, 62347, 62347, 62347, 62347, 62347, + 62347, 62347, 62347, 62347, 62347, 62347, 62347, 62347, + 62347, 62347, 62347, 62347, 62347, 62351, 62351, 62351, + 62383, 62383, 62383, 62383, 62383, 62383, 62383, 62383, + 62383, 62383, 62383, 62383, 62383, 62383, 62383, 62383, + 62383, 62383, 62383, 62383, 62383, 62383, 62383, 62383, + 62383, 62383, 62383, 62383, 62383, 62401, 62401, 62401, + 62401, 62401, 62401, 62401, 62401, 62401, 62401, 62401, + 62401, 62401, 62401, 62401, 62401, 62417, 62417, 62417, + 62417, 62417, 62417, 62417, 62417, 62417, 62417, 62417, + 62417, 62417, 62417, 62423, 62423, 62423, 62423, 62423, + 62459, 62459, 62459, 62459, 62459, 62459, 62459, 62459, + 62459, 62459, 62459, 62459, 62459, 62459, 62459, 62459, + 62459, 62459, 62459, 62459, 62459, 62459, 62459, 62459, + 62459, 62459, 62459, 62459, 62459, 62459, 62459, 62459, + 62467, 62467, 62467, 62467, 62467, 62467, 62467, 62467, + 62473, 62473, 62473, 62473, 62473, 62477, 62477, 62477, + 62483, 62483, 62483, 62483, 62483, 62483, 62497, 62497, + 62497, 62497, 62497, 62497, 62497, 62497, 62497, 62497, + 62497, 62497, 62501, 62501, 62501, 62501, 62507, 62507, + 62507, 62507, 62507, 62533, 62533, 62533, 62533, 62533, + 62533, 62533, 62533, 62533, 62533, 62533, 62533, 62533, + 62533, 62533, 62533, 62533, 62533, 62533, 62533, 62533, + 62533, 62533, 62539, 62539, 62539, 62539, 62539, 62539, + 62549, 62549, 62549, 62549, 62549, 62549, 62549, 62549, + 62563, 62563, 62563, 62563, 62563, 62563, 62563, 62563, + 62563, 62563, 62563, 62563, 62563, 62581, 62581, 62581, + 62581, 62581, 62581, 62581, 62581, 62581, 62581, 62581, + 62581, 62581, 62581, 62581, 62581, 62591, 62591, 62591, + 62591, 62591, 62591, 62591, 62591, 62591, 62597, 62597, + 62597, 62597, 62597, 62603, 62603, 62603, 62603, 62603, + 62617, 62617, 62617, 62617, 62617, 62617, 62617, 62617, + 62617, 62617, 62617, 62617, 62617, 62627, 62627, 62627, + 62627, 62627, 62627, 62627, 62627, 62627, 62633, 62633, + 62633, 62633, 62633, 62639, 62639, 62639, 62639, 62639, + 62653, 62653, 62653, 62653, 62653, 62653, 62653, 62653, + 62653, 62653, 62653, 62653, 62653, 62659, 62659, 62659, + 62659, 62659, 62683, 62683, 62683, 62683, 62683, 62683, + 62683, 62683, 62683, 62683, 62683, 62683, 62683, 62683, + 62683, 62683, 62683, 62683, 62683, 62683, 62683, 62683, + 62687, 62687, 62687, 62701, 62701, 62701, 62701, 62701, + 62701, 62701, 62701, 62701, 62701, 62701, 62701, 62701, + 62723, 62723, 62723, 62723, 62723, 62723, 62723, 62723, + 62723, 62723, 62723, 62723, 62723, 62723, 62723, 62723, + 62723, 62723, 62723, 62731, 62731, 62731, 62731, 62731, + 62731, 62731, 62743, 62743, 62743, 62743, 62743, 62743, + 62743, 62743, 62743, 62743, 62743, 62753, 62753, 62753, + 62753, 62753, 62753, 62753, 62753, 62753, 62761, 62761, + 62761, 62761, 62761, 62761, 62761, 62773, 62773, 62773, + 62773, 62773, 62773, 62773, 62773, 62773, 62773, 62773, + 62791, 62791, 62791, 62791, 62791, 62791, 62791, 62791, + 62791, 62791, 62791, 62791, 62791, 62791, 62791, 62791, + 62801, 62801, 62801, 62801, 62801, 62801, 62801, 62801, + 62819, 62819, 62819, 62819, 62819, 62819, 62819, 62819, + 62819, 62819, 62819, 62819, 62819, 62819, 62819, 62819, + 62827, 62827, 62827, 62827, 62827, 62827, 62827, 62827, + 62851, 62851, 62851, 62851, 62851, 62851, 62851, 62851, + 62851, 62851, 62851, 62851, 62851, 62851, 62851, 62851, + 62851, 62851, 62851, 62851, 62851, 62861, 62861, 62861, + 62861, 62861, 62861, 62861, 62861, 62861, 62869, 62869, + 62869, 62869, 62869, 62869, 62869, 62873, 62873, 62873, + 62897, 62897, 62897, 62897, 62897, 62897, 62897, 62897, + 62897, 62897, 62897, 62897, 62897, 62897, 62897, 62897, + 62897, 62897, 62897, 62897, 62897, 62897, 62903, 62903, + 62903, 62903, 62903, 62921, 62921, 62921, 62921, 62921, + 62921, 62921, 62921, 62921, 62921, 62921, 62921, 62921, + 62921, 62921, 62921, 62927, 62927, 62927, 62927, 62927, + 62929, 62929, 62939, 62939, 62939, 62939, 62939, 62939, + 62939, 62939, 62939, 62969, 62969, 62969, 62969, 62969, + 62969, 62969, 62969, 62969, 62969, 62969, 62969, 62969, + 62969, 62969, 62969, 62969, 62969, 62969, 62969, 62969, + 62969, 62969, 62969, 62969, 62969, 62969, 62971, 62971, + 62981, 62981, 62981, 62981, 62981, 62981, 62981, 62981, + 62983, 62983, 62987, 62987, 62987, 62987, 62989, 62989, + 63029, 63029, 63029, 63029, 63029, 63029, 63029, 63029, + 63029, 63029, 63029, 63029, 63029, 63029, 63029, 63029, + 63029, 63029, 63029, 63029, 63029, 63029, 63029, 63029, + 63029, 63029, 63029, 63029, 63029, 63029, 63029, 63029, + 63029, 63029, 63029, 63031, 63031, 63059, 63059, 63059, + 63059, 63059, 63059, 63059, 63059, 63059, 63059, 63059, + 63059, 63059, 63059, 63059, 63059, 63059, 63059, 63059, + 63059, 63059, 63059, 63059, 63059, 63059, 63067, 63067, + 63067, 63067, 63067, 63067, 63067, 63073, 63073, 63073, + 63073, 63073, 63079, 63079, 63079, 63079, 63079, 63079, + 63097, 63097, 63097, 63097, 63097, 63097, 63097, 63097, + 63097, 63097, 63097, 63097, 63097, 63097, 63097, 63097, + 63103, 63103, 63103, 63103, 63103, 63113, 63113, 63113, + 63113, 63113, 63113, 63113, 63113, 63113, 63127, 63127, + 63127, 63127, 63127, 63127, 63127, 63127, 63127, 63127, + 63127, 63127, 63131, 63131, 63131, 63131, 63149, 63149, + 63149, 63149, 63149, 63149, 63149, 63149, 63149, 63149, + 63149, 63149, 63149, 63149, 63149, 63149, 63179, 63179, + 63179, 63179, 63179, 63179, 63179, 63179, 63179, 63179, + 63179, 63179, 63179, 63179, 63179, 63179, 63179, 63179, + 63179, 63179, 63179, 63179, 63179, 63179, 63179, 63179, + 63197, 63197, 63197, 63197, 63197, 63197, 63197, 63197, + 63197, 63197, 63197, 63197, 63197, 63197, 63197, 63197, + 63199, 63199, 63211, 63211, 63211, 63211, 63211, 63211, + 63211, 63211, 63211, 63211, 63211, 63241, 63241, 63241, + 63241, 63241, 63241, 63241, 63241, 63241, 63241, 63241, + 63241, 63241, 63241, 63241, 63241, 63241, 63241, 63241, + 63241, 63241, 63241, 63241, 63241, 63241, 63241, 63241, + 63247, 63247, 63247, 63247, 63247, 63277, 63277, 63277, + 63277, 63277, 63277, 63277, 63277, 63277, 63277, 63277, + 63277, 63277, 63277, 63277, 63277, 63277, 63277, 63277, + 63277, 63277, 63277, 63277, 63277, 63277, 63277, 63277, + 63281, 63281, 63281, 63299, 63299, 63299, 63299, 63299, + 63299, 63299, 63299, 63299, 63299, 63299, 63299, 63299, + 63299, 63299, 63299, 63311, 63311, 63311, 63311, 63311, + 63311, 63311, 63311, 63311, 63311, 63311, 63313, 63313, + 63317, 63317, 63317, 63331, 63331, 63331, 63331, 63331, + 63331, 63331, 63331, 63331, 63331, 63331, 63331, 63331, + 63337, 63337, 63337, 63337, 63337, 63347, 63347, 63347, + 63347, 63347, 63347, 63347, 63347, 63347, 63353, 63353, + 63353, 63353, 63353, 63361, 63361, 63361, 63361, 63361, + 63361, 63361, 63367, 63367, 63367, 63367, 63367, 63367, + 63377, 63377, 63377, 63377, 63377, 63377, 63377, 63377, + 63389, 63389, 63389, 63389, 63389, 63389, 63389, 63389, + 63389, 63389, 63389, 63391, 63391, 63397, 63397, 63397, + 63397, 63397, 63409, 63409, 63409, 63409, 63409, 63409, + 63409, 63409, 63409, 63409, 63409, 63419, 63419, 63419, + 63419, 63419, 63419, 63419, 63419, 63419, 63421, 63421, + 63439, 63439, 63439, 63439, 63439, 63439, 63439, 63439, + 63439, 63439, 63439, 63439, 63439, 63439, 63439, 63439, + 63443, 63443, 63443, 63463, 63463, 63463, 63463, 63463, + 63463, 63463, 63463, 63463, 63463, 63463, 63463, 63463, + 63463, 63463, 63463, 63463, 63463, 63467, 63467, 63467, + 63473, 63473, 63473, 63473, 63473, 63473, 63487, 63487, + 63487, 63487, 63487, 63487, 63487, 63487, 63487, 63487, + 63487, 63487, 63493, 63493, 63493, 63493, 63493, 63493, + 63499, 63499, 63499, 63499, 63499, 63521, 63521, 63521, + 63521, 63521, 63521, 63521, 63521, 63521, 63521, 63521, + 63521, 63521, 63521, 63521, 63521, 63521, 63521, 63521, + 63527, 63527, 63527, 63527, 63527, 63527, 63533, 63533, + 63533, 63533, 63533, 63541, 63541, 63541, 63541, 63541, + 63541, 63541, 63559, 63559, 63559, 63559, 63559, 63559, + 63559, 63559, 63559, 63559, 63559, 63559, 63559, 63559, + 63559, 63559, 63577, 63577, 63577, 63577, 63577, 63577, + 63577, 63577, 63577, 63577, 63577, 63577, 63577, 63577, + 63577, 63577, 63587, 63587, 63587, 63587, 63587, 63587, + 63587, 63587, 63587, 63589, 63589, 63599, 63599, 63599, + 63599, 63599, 63599, 63599, 63599, 63599, 63601, 63601, + 63607, 63607, 63607, 63607, 63607, 63611, 63611, 63611, + 63617, 63617, 63617, 63617, 63617, 63617, 63629, 63629, + 63629, 63629, 63629, 63629, 63629, 63629, 63629, 63629, + 63647, 63647, 63647, 63647, 63647, 63647, 63647, 63647, + 63647, 63647, 63647, 63647, 63647, 63647, 63647, 63647, + 63649, 63649, 63659, 63659, 63659, 63659, 63659, 63659, + 63659, 63659, 63659, 63667, 63667, 63667, 63667, 63667, + 63667, 63667, 63671, 63671, 63671, 63671, 63689, 63689, + 63689, 63689, 63689, 63689, 63689, 63689, 63689, 63689, + 63689, 63689, 63689, 63689, 63689, 63689, 63691, 63691, + 63697, 63697, 63697, 63697, 63697, 63703, 63703, 63703, + 63703, 63703, 63709, 63709, 63709, 63709, 63709, 63709, + 63719, 63719, 63719, 63719, 63719, 63719, 63719, 63719, + 63727, 63727, 63727, 63727, 63727, 63727, 63727, 63727, + 63737, 63737, 63737, 63737, 63737, 63737, 63737, 63737, + 63743, 63743, 63743, 63743, 63743, 63743, 63761, 63761, + 63761, 63761, 63761, 63761, 63761, 63761, 63761, 63761, + 63761, 63761, 63761, 63761, 63761, 63761, 63773, 63773, + 63773, 63773, 63773, 63773, 63773, 63773, 63773, 63773, + 63781, 63781, 63781, 63781, 63781, 63781, 63781, 63781, + 63793, 63793, 63793, 63793, 63793, 63793, 63793, 63793, + 63793, 63793, 63799, 63799, 63799, 63799, 63799, 63799, + 63803, 63803, 63803, 63809, 63809, 63809, 63809, 63809, + 63823, 63823, 63823, 63823, 63823, 63823, 63823, 63823, + 63823, 63823, 63823, 63823, 63823, 63839, 63839, 63839, + 63839, 63839, 63839, 63839, 63839, 63839, 63839, 63839, + 63839, 63839, 63839, 63841, 63841, 63853, 63853, 63853, + 63853, 63853, 63853, 63853, 63853, 63853, 63853, 63853, + 63857, 63857, 63857, 63863, 63863, 63863, 63863, 63863, + 63901, 63901, 63901, 63901, 63901, 63901, 63901, 63901, + 63901, 63901, 63901, 63901, 63901, 63901, 63901, 63901, + 63901, 63901, 63901, 63901, 63901, 63901, 63901, 63901, + 63901, 63901, 63901, 63901, 63901, 63901, 63901, 63901, + 63901, 63901, 63907, 63907, 63907, 63907, 63907, 63907, + 63913, 63913, 63913, 63913, 63913, 63929, 63929, 63929, + 63929, 63929, 63929, 63929, 63929, 63929, 63929, 63929, + 63929, 63929, 63929, 63949, 63949, 63949, 63949, 63949, + 63949, 63949, 63949, 63949, 63949, 63949, 63949, 63949, + 63949, 63949, 63949, 63949, 63949, 63977, 63977, 63977, + 63977, 63977, 63977, 63977, 63977, 63977, 63977, 63977, + 63977, 63977, 63977, 63977, 63977, 63977, 63977, 63977, + 63977, 63977, 63977, 63977, 63977, 63977, 63997, 63997, + 63997, 63997, 63997, 63997, 63997, 63997, 63997, 63997, + 63997, 63997, 63997, 63997, 63997, 63997, 63997, 63997, + 64007, 64007, 64007, 64007, 64007, 64007, 64007, 64007, + 64013, 64013, 64013, 64013, 64013, 64013, 64019, 64019, + 64019, 64019, 64019, 64033, 64033, 64033, 64033, 64033, + 64033, 64033, 64033, 64033, 64033, 64033, 64033, 64033, + 64037, 64037, 64037, 64063, 64063, 64063, 64063, 64063, + 64063, 64063, 64063, 64063, 64063, 64063, 64063, 64063, + 64063, 64063, 64063, 64063, 64063, 64063, 64063, 64063, + 64063, 64063, 64067, 64067, 64067, 64067, 64081, 64081, + 64081, 64081, 64081, 64081, 64081, 64081, 64081, 64081, + 64081, 64081, 64091, 64091, 64091, 64091, 64091, 64091, + 64091, 64091, 64091, 64109, 64109, 64109, 64109, 64109, + 64109, 64109, 64109, 64109, 64109, 64109, 64109, 64109, + 64109, 64109, 64109, 64123, 64123, 64123, 64123, 64123, + 64123, 64123, 64123, 64123, 64123, 64123, 64123, 64123, + 64151, 64151, 64151, 64151, 64151, 64151, 64151, 64151, + 64151, 64151, 64151, 64151, 64151, 64151, 64151, 64151, + 64151, 64151, 64151, 64151, 64151, 64151, 64151, 64151, + 64153, 64153, 64157, 64157, 64157, 64157, 64171, 64171, + 64171, 64171, 64171, 64171, 64171, 64171, 64171, 64171, + 64171, 64171, 64187, 64187, 64187, 64187, 64187, 64187, + 64187, 64187, 64187, 64187, 64187, 64187, 64187, 64187, + 64189, 64189, 64217, 64217, 64217, 64217, 64217, 64217, + 64217, 64217, 64217, 64217, 64217, 64217, 64217, 64217, + 64217, 64217, 64217, 64217, 64217, 64217, 64217, 64217, + 64217, 64217, 64217, 64223, 64223, 64223, 64223, 64223, + 64231, 64231, 64231, 64231, 64231, 64231, 64231, 64231, + 64237, 64237, 64237, 64237, 64237, 64271, 64271, 64271, + 64271, 64271, 64271, 64271, 64271, 64271, 64271, 64271, + 64271, 64271, 64271, 64271, 64271, 64271, 64271, 64271, + 64271, 64271, 64271, 64271, 64271, 64271, 64271, 64271, + 64271, 64271, 64271, 64279, 64279, 64279, 64279, 64279, + 64279, 64279, 64283, 64283, 64283, 64283, 64301, 64301, + 64301, 64301, 64301, 64301, 64301, 64301, 64301, 64301, + 64301, 64301, 64301, 64301, 64301, 64301, 64303, 64303, + 64319, 64319, 64319, 64319, 64319, 64319, 64319, 64319, + 64319, 64319, 64319, 64319, 64319, 64319, 64327, 64327, + 64327, 64327, 64327, 64327, 64327, 64333, 64333, 64333, + 64333, 64333, 64373, 64373, 64373, 64373, 64373, 64373, + 64373, 64373, 64373, 64373, 64373, 64373, 64373, 64373, + 64373, 64373, 64373, 64373, 64373, 64373, 64373, 64373, + 64373, 64373, 64373, 64373, 64373, 64373, 64373, 64373, + 64373, 64373, 64373, 64373, 64373, 64373, 64381, 64381, + 64381, 64381, 64381, 64381, 64381, 64399, 64399, 64399, + 64399, 64399, 64399, 64399, 64399, 64399, 64399, 64399, + 64399, 64399, 64399, 64399, 64399, 64403, 64403, 64403, + 64433, 64433, 64433, 64433, 64433, 64433, 64433, 64433, + 64433, 64433, 64433, 64433, 64433, 64433, 64433, 64433, + 64433, 64433, 64433, 64433, 64433, 64433, 64433, 64433, + 64433, 64433, 64433, 64439, 64439, 64439, 64439, 64439, + 64451, 64451, 64451, 64451, 64451, 64451, 64451, 64451, + 64451, 64451, 64451, 64453, 64453, 64483, 64483, 64483, + 64483, 64483, 64483, 64483, 64483, 64483, 64483, 64483, + 64483, 64483, 64483, 64483, 64483, 64483, 64483, 64483, + 64483, 64483, 64483, 64483, 64483, 64483, 64483, 64483, + 64489, 64489, 64489, 64489, 64489, 64499, 64499, 64499, + 64499, 64499, 64499, 64499, 64499, 64499, 64513, 64513, + 64513, 64513, 64513, 64513, 64513, 64513, 64513, 64513, + 64513, 64513, 64553, 64553, 64553, 64553, 64553, 64553, + 64553, 64553, 64553, 64553, 64553, 64553, 64553, 64553, + 64553, 64553, 64553, 64553, 64553, 64553, 64553, 64553, + 64553, 64553, 64553, 64553, 64553, 64553, 64553, 64553, + 64553, 64553, 64553, 64553, 64553, 64553, 64567, 64567, + 64567, 64567, 64567, 64567, 64567, 64567, 64567, 64567, + 64567, 64567, 64577, 64577, 64577, 64577, 64577, 64577, + 64577, 64577, 64577, 64579, 64579, 64591, 64591, 64591, + 64591, 64591, 64591, 64591, 64591, 64591, 64591, 64591, + 64601, 64601, 64601, 64601, 64601, 64601, 64601, 64601, + 64609, 64609, 64609, 64609, 64609, 64609, 64609, 64609, + 64613, 64613, 64613, 64621, 64621, 64621, 64621, 64621, + 64621, 64621, 64627, 64627, 64627, 64627, 64627, 64627, + 64633, 64633, 64633, 64633, 64633, 64661, 64661, 64661, + 64661, 64661, 64661, 64661, 64661, 64661, 64661, 64661, + 64661, 64661, 64661, 64661, 64661, 64661, 64661, 64661, + 64661, 64661, 64661, 64661, 64661, 64661, 64663, 64663, + 64667, 64667, 64667, 64679, 64679, 64679, 64679, 64679, + 64679, 64679, 64679, 64679, 64679, 64679, 64693, 64693, + 64693, 64693, 64693, 64693, 64693, 64693, 64693, 64693, + 64693, 64693, 64709, 64709, 64709, 64709, 64709, 64709, + 64709, 64709, 64709, 64709, 64709, 64709, 64709, 64709, + 64717, 64717, 64717, 64717, 64717, 64717, 64717, 64717, + 64747, 64747, 64747, 64747, 64747, 64747, 64747, 64747, + 64747, 64747, 64747, 64747, 64747, 64747, 64747, 64747, + 64747, 64747, 64747, 64747, 64747, 64747, 64747, 64747, + 64747, 64747, 64763, 64763, 64763, 64763, 64763, 64763, + 64763, 64763, 64763, 64763, 64763, 64763, 64763, 64763, + 64781, 64781, 64781, 64781, 64781, 64781, 64781, 64781, + 64781, 64781, 64781, 64781, 64781, 64781, 64781, 64781, + 64783, 64783, 64793, 64793, 64793, 64793, 64793, 64793, + 64793, 64793, 64793, 64811, 64811, 64811, 64811, 64811, + 64811, 64811, 64811, 64811, 64811, 64811, 64811, 64811, + 64811, 64811, 64811, 64817, 64817, 64817, 64817, 64817, + 64849, 64849, 64849, 64849, 64849, 64849, 64849, 64849, + 64849, 64849, 64849, 64849, 64849, 64849, 64849, 64849, + 64849, 64849, 64849, 64849, 64849, 64849, 64849, 64849, + 64849, 64849, 64849, 64849, 64849, 64853, 64853, 64853, + 64871, 64871, 64871, 64871, 64871, 64871, 64871, 64871, + 64871, 64871, 64871, 64871, 64871, 64871, 64871, 64871, + 64877, 64877, 64877, 64877, 64877, 64877, 64879, 64879, + 64891, 64891, 64891, 64891, 64891, 64891, 64891, 64891, + 64891, 64891, 64901, 64901, 64901, 64901, 64901, 64901, + 64901, 64901, 64901, 64919, 64919, 64919, 64919, 64919, + 64919, 64919, 64919, 64919, 64919, 64919, 64919, 64919, + 64919, 64919, 64919, 64921, 64921, 64927, 64927, 64927, + 64927, 64927, 64937, 64937, 64937, 64937, 64937, 64937, + 64937, 64937, 64937, 64951, 64951, 64951, 64951, 64951, + 64951, 64951, 64951, 64951, 64951, 64951, 64951, 64951, + 64969, 64969, 64969, 64969, 64969, 64969, 64969, 64969, + 64969, 64969, 64969, 64969, 64969, 64969, 64969, 64969, + 64997, 64997, 64997, 64997, 64997, 64997, 64997, 64997, + 64997, 64997, 64997, 64997, 64997, 64997, 64997, 64997, + 64997, 64997, 64997, 64997, 64997, 64997, 64997, 64997, + 65003, 65003, 65003, 65003, 65003, 65003, 65011, 65011, + 65011, 65011, 65011, 65011, 65011, 65027, 65027, 65027, + 65027, 65027, 65027, 65027, 65027, 65027, 65027, 65027, + 65027, 65027, 65027, 65029, 65029, 65033, 65033, 65033, + 65053, 65053, 65053, 65053, 65053, 65053, 65053, 65053, + 65053, 65053, 65053, 65053, 65053, 65053, 65053, 65053, + 65053, 65053, 65063, 65063, 65063, 65063, 65063, 65063, + 65063, 65063, 65063, 65071, 65071, 65071, 65071, 65071, + 65071, 65071, 65089, 65089, 65089, 65089, 65089, 65089, + 65089, 65089, 65089, 65089, 65089, 65089, 65089, 65089, + 65089, 65089, 65099, 65099, 65099, 65099, 65099, 65099, + 65099, 65099, 65099, 65101, 65101, 65111, 65111, 65111, + 65111, 65111, 65111, 65111, 65111, 65111, 65119, 65119, + 65119, 65119, 65119, 65119, 65119, 65123, 65123, 65123, + 65129, 65129, 65129, 65129, 65129, 65129, 65141, 65141, + 65141, 65141, 65141, 65141, 65141, 65141, 65141, 65141, + 65147, 65147, 65147, 65147, 65147, 65147, 65167, 65167, + 65167, 65167, 65167, 65167, 65167, 65167, 65167, 65167, + 65167, 65167, 65167, 65167, 65167, 65167, 65167, 65167, + 65171, 65171, 65171, 65173, 65173, 65179, 65179, 65179, + 65179, 65179, 65183, 65183, 65183, 65183, 65203, 65203, + 65203, 65203, 65203, 65203, 65203, 65203, 65203, 65203, + 65203, 65203, 65203, 65203, 65203, 65203, 65203, 65203, + 65213, 65213, 65213, 65213, 65213, 65213, 65213, 65213, + 65239, 65239, 65239, 65239, 65239, 65239, 65239, 65239, + 65239, 65239, 65239, 65239, 65239, 65239, 65239, 65239, + 65239, 65239, 65239, 65239, 65239, 65239, 65239, 65239, + 65257, 65257, 65257, 65257, 65257, 65257, 65257, 65257, + 65257, 65257, 65257, 65257, 65257, 65257, 65257, 65257, + 65267, 65267, 65267, 65267, 65267, 65267, 65267, 65267, + 65269, 65269, 65287, 65287, 65287, 65287, 65287, 65287, + 65287, 65287, 65287, 65287, 65287, 65287, 65287, 65287, + 65287, 65287, 65293, 65293, 65293, 65293, 65293, 65293, + 65309, 65309, 65309, 65309, 65309, 65309, 65309, 65309, + 65309, 65309, 65309, 65309, 65309, 65309, 65323, 65323, + 65323, 65323, 65323, 65323, 65323, 65323, 65323, 65323, + 65323, 65323, 65327, 65327, 65327, 65327, 65353, 65353, + 65353, 65353, 65353, 65353, 65353, 65353, 65353, 65353, + 65353, 65353, 65353, 65353, 65353, 65353, 65353, 65353, + 65353, 65353, 65353, 65353, 65353, 65357, 65357, 65357, + 65371, 65371, 65371, 65371, 65371, 65371, 65371, 65371, + 65371, 65371, 65371, 65371, 65371, 65381, 65381, 65381, + 65381, 65381, 65381, 65381, 65381, 65381, 65393, 65393, + 65393, 65393, 65393, 65393, 65393, 65393, 65393, 65393, + 65407, 65407, 65407, 65407, 65407, 65407, 65407, 65407, + 65407, 65407, 65407, 65407, 65407, 65413, 65413, 65413, + 65413, 65413, 65419, 65419, 65419, 65419, 65419, 65419, + 65423, 65423, 65423, 65437, 65437, 65437, 65437, 65437, + 65437, 65437, 65437, 65437, 65437, 65437, 65437, 65437, + 65447, 65447, 65447, 65447, 65447, 65447, 65447, 65447, + 65449, 65449, 65479, 65479, 65479, 65479, 65479, 65479, + 65479, 65479, 65479, 65479, 65479, 65479, 65479, 65479, + 65479, 65479, 65479, 65479, 65479, 65479, 65479, 65479, + 65479, 65479, 65479, 65479, 65479, 65497, 65497, 65497, + 65497, 65497, 65497, 65497, 65497, 65497, 65497, 65497, + 65497, 65497, 65497, 65497, 65497, 65519, 65519, 65519, + 65519, 65519, 65519, 65519, 65519, 65519, 65519, 65519, + 65519, 65519, 65519, 65519, 65519, 65519, 65519, 65519, + 65521, 65521, 65537, 65537, 65537, 65537, 65537, 65537, + 65537, 65537, 65537, 65537, 65537, 65537, 65537 +}; diff --git a/hieroglyph/hgfile.c b/hieroglyph/hgfile.c index 0cd7d76..6c3ad8d 100644 --- a/hieroglyph/hgfile.c +++ b/hieroglyph/hgfile.c @@ -1,10 +1,10 @@ /* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ /* * hgfile.c - * Copyright (C) 2005-2006 Akira TAGOH + * Copyright (C) 2006-2007 Akira TAGOH * * Authors: - * Akira TAGOH <at@gclab.org> + * Akira TAGOH <akira@tagoh.org> * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -22,1016 +22,309 @@ * Boston, MA 02111-1307, USA. */ #ifdef HAVE_CONFIG_H -#include <config.h> +#include "config.h" #endif -#include <string.h> #include <fcntl.h> -#include <errno.h> +#include <string.h> #include <sys/mman.h> #include <sys/stat.h> +#include <unistd.h> +#include <glib/gstrfuncs.h> +#include <hieroglyph/hgobject.h> +#include <hieroglyph/vm.h> #include "hgfile.h" -#include "hgallocator-bfit.h" -#include "hglog.h" -#include "hgmem.h" -#include "hgstring.h" -#include "hglineedit.h" - - -typedef struct _HieroGlyphFileBuffer HgFileBuffer; - -struct _HieroGlyphFileBuffer { - gchar *buffer; - gint32 bufsize; - gint32 pos; -}; - -struct _HieroGlyphFileObject { - HgObject object; - gchar *filename; - gint error; - guint access_mode; - gchar ungetc; - gboolean is_eof : 1; - union { - struct { - gint fd; - gboolean is_mmap; - HgFileBuffer mmap; - } file; - HgFileBuffer buf; - struct { - gpointer user_data; - HgFileObjectCallback *vtable; - } callback; - } is; -}; - - -static void _hg_file_object_real_free (gpointer data); -static void _hg_file_object_real_set_flags(gpointer data, - guint flags); -static void _hg_file_object_real_relocate (gpointer data, - HgMemRelocateInfo *info); -static gpointer _hg_file_object_real_to_string(gpointer data); -HgFileObject *__hg_file_stdin = NULL; -HgFileObject *__hg_file_stdout = NULL; -HgFileObject *__hg_file_stderr = NULL; -static gboolean __hg_file_is_initialized = FALSE; -static gboolean __hg_file_is_io_synchronous = FALSE; -static HgMemPool *__hg_file_mem_pool = NULL; -static HgAllocator *__hg_file_allocator = NULL; -static HgObjectVTable __hg_file_vtable = { - .free = _hg_file_object_real_free, - .set_flags = _hg_file_object_real_set_flags, - .relocate = _hg_file_object_real_relocate, - .dup = NULL, - .copy = NULL, - .to_string = _hg_file_object_real_to_string, -}; - /* - * Private Functions + * private functions */ -static void -_hg_file_object_real_free(gpointer data) +static hg_filetype_t +_hg_object_file_get_io_type(const gchar *filename) { - HgFileObject *file = data; - - if (hg_file_object_is_writable(file)) - hg_file_object_flush(file); - hg_file_object_close(file); -} - -static void -_hg_file_object_real_set_flags(gpointer data, - guint flags) -{ - HgFileObject *file = data; - HgMemObject *obj; - - if (file->filename) { - hg_mem_get_object__inline(file->filename, obj); - if (obj == NULL) { - hg_log_warning("Invalid object %p to be marked: HgFileObject->filename", file->filename); - } else { -#ifdef DEBUG_GC - G_STMT_START { - if ((flags & HG_MEMOBJ_MARK_AGE_MASK) != 0) { - g_print("%s: marking filename %p\n", __FUNCTION__, obj); - } - } G_STMT_END; -#endif /* DEBUG_GC */ - if (!hg_mem_is_flags__inline(obj, flags)) - hg_mem_add_flags__inline(obj, flags, TRUE); - } - } - if ((HG_FILE_GET_FILE_TYPE (file) == HG_FILE_TYPE_BUFFER || - HG_FILE_GET_FILE_TYPE (file) == HG_FILE_TYPE_STATEMENT_EDIT || - HG_FILE_GET_FILE_TYPE (file) == HG_FILE_TYPE_LINE_EDIT) && - file->is.buf.buffer) { - hg_mem_get_object__inline(file->is.buf.buffer, obj); - if (obj == NULL) { - hg_log_warning("Invalid object %p to be marked: HgFileObject->buffer", file->is.buf.buffer); - } else { -#ifdef DEBUG_GC - G_STMT_START { - if ((flags & HG_MEMOBJ_MARK_AGE_MASK) != 0) { - g_print("%s: marking buffer %p\n", __FUNCTION__, obj); - } - } G_STMT_END; -#endif /* DEBUG_GC */ - if (!hg_mem_is_flags__inline(obj, flags)) - hg_mem_add_flags__inline(obj, flags, TRUE); - } + if (strcmp(filename, "%stdin") == 0) { + return HG_FILE_TYPE_STDIN; + } else if (strcmp(filename, "%stdout") == 0) { + return HG_FILE_TYPE_STDOUT; + } else if (strcmp(filename, "%stderr") == 0) { + return HG_FILE_TYPE_STDERR; + } else if (strcmp(filename, "%lineedit") == 0) { + return HG_FILE_TYPE_LINEEDIT; + } else if (strcmp(filename, "%statementedit") == 0) { + return HG_FILE_TYPE_STATEMENTEDIT; } -} - -static void -_hg_file_object_real_relocate(gpointer data, - HgMemRelocateInfo *info) -{ - HgFileObject *file = data; - - if ((gsize)file->filename >= info->start && - (gsize)file->filename <= info->end) { - file->filename = (gchar *)((gsize)file->filename + info->diff); - } - if ((HG_FILE_GET_FILE_TYPE (file) == HG_FILE_TYPE_BUFFER || - HG_FILE_GET_FILE_TYPE (file) == HG_FILE_TYPE_STATEMENT_EDIT || - HG_FILE_GET_FILE_TYPE (file) == HG_FILE_TYPE_LINE_EDIT) && - file->is.buf.buffer) { - if ((gsize)file->is.buf.buffer >= info->start && - (gsize)file->is.buf.buffer <= info->end) { - file->is.buf.buffer = (gchar *)((gsize)file->is.buf.buffer + info->diff); - } - } -} -static gpointer -_hg_file_object_real_to_string(gpointer data) -{ - HgMemObject *obj; - HgString *retval; - HgFileObject *file = data; - - hg_mem_get_object__inline(data, obj); - if (obj == NULL) - return NULL; - - retval = hg_string_new(obj->pool, -1); - if (HG_FILE_GET_FILE_TYPE (file) == HG_FILE_TYPE_BUFFER) { - /* it shows as string to evaluate it */ - hg_string_append_c(retval, '('); - hg_string_append(retval, file->is.buf.buffer + file->is.buf.pos, file->is.buf.bufsize - file->is.buf.pos); - hg_string_append(retval, ")/-file-", -1); - } else { - hg_string_append(retval, "-file-", -1); - } - hg_string_fix_string_size(retval); - - return retval; + return HG_FILE_TYPE_FILE_IO; } -static gint -_hg_file_get_access_mode(guint mode) +static int +_hg_object_file_get_open_mode(hg_filemode_t mode) { - static gint modes[] = { - 0, /* 0 */ - O_RDONLY, /* HG_OPEN_MODE_READ */ - O_WRONLY | O_CREAT | O_TRUNC, /* HG_OPEN_MODE_WRITE */ - O_RDWR, /* HG_OPEN_MODE_READ | HG_OPEN_MODE_WRITE */ - O_WRONLY | O_CREAT | O_APPEND, /* HG_OPEN_MODE_READWRITE */ - O_RDWR, /* HG_OPEN_MODE_READ | HG_OPEN_MODE_READWRITE */ - O_RDWR | O_CREAT | O_TRUNC, /* HG_OPEN_MODE_WRITE | HG_OPEN_MODE_READWRITE */ - O_RDWR | O_CREAT | O_APPEND, /* HG_OPEN_MODE_READ | HG_OPEN_MODE_WRITE | HG_OPEN_MODE_READWRITE */ - }; - - return modes[mode]; + return 0; } /* - * Public Functions + * public functions */ - -/* initializer */ -void -hg_file_init(void) +hg_object_t * +hg_object_file_new(hg_vm_t *vm, + const gchar *filename, + hg_filemode_t mode) { - hg_mem_init(); - - if (!__hg_file_is_initialized) { - __hg_file_allocator = hg_allocator_new(hg_allocator_bfit_get_vtable()); - __hg_file_mem_pool = hg_mem_pool_new(__hg_file_allocator, - "Memory pool for HgFileObject", - sizeof (HgFileObject) * 128, - HG_MEM_GLOBAL); - __hg_file_stdin = hg_file_object_new(__hg_file_mem_pool, - HG_FILE_TYPE_STDIN); - hg_mem_pool_add_root_node(__hg_file_mem_pool, __hg_file_stdin); - __hg_file_stdout = hg_file_object_new(__hg_file_mem_pool, - HG_FILE_TYPE_STDOUT); - hg_object_writable((HgObject *)__hg_file_stdout); - hg_mem_pool_add_root_node(__hg_file_mem_pool, __hg_file_stdout); - __hg_file_stderr = hg_file_object_new(__hg_file_mem_pool, - HG_FILE_TYPE_STDERR); - hg_object_writable((HgObject *)__hg_file_stderr); - hg_mem_pool_add_root_node(__hg_file_mem_pool, __hg_file_stderr); + hg_object_t *retval, *obj, *string; + gsize len, buflen = 0; + struct stat st; + hg_filetype_t iotype; + hg_filedata_t *data; + int fd; + gpointer buffer = NULL; + gboolean set_io = FALSE; + + hg_return_val_if_fail (vm != NULL, NULL); + hg_return_val_if_fail (filename != NULL, NULL); + + len = strlen(filename); + iotype = _hg_object_file_get_io_type(filename); + switch (iotype) { + case HG_FILE_TYPE_FILE_IO: + if (stat(filename, &st) == -1) { + hg_object_file_notify_error(vm, errno); - __hg_file_is_initialized = TRUE; - } -} - -void -hg_file_finalize(void) -{ - if (__hg_file_is_initialized) { - hg_mem_pool_destroy(__hg_file_mem_pool); - hg_allocator_destroy(__hg_file_allocator); - - __hg_file_is_initialized = FALSE; - } -} - -gboolean -hg_file_is_initialized(void) -{ - return __hg_file_is_initialized; -} - -void -hg_file_io_synchronous(gboolean flag) -{ - __hg_file_is_io_synchronous = flag; -} - -/* file object */ -HgFileObject * -hg_file_object_new(HgMemPool *pool, - HgFileType file_type, - ...) -{ - HgFileObject *retval; - va_list ap; - gchar *p; - gsize len; - gint flag; - HgLineEdit *lineedit; - - g_return_val_if_fail (pool != NULL, NULL); - - retval = hg_mem_alloc_with_flags(pool, sizeof (HgFileObject), - HG_FL_HGOBJECT | HG_FL_COMPLEX); - if (retval == NULL) { - hg_log_warning("Failed to create a file object."); - return NULL; - } - HG_OBJECT_INIT_STATE (&retval->object); - HG_OBJECT_SET_STATE (&retval->object, hg_mem_pool_get_default_access_mode(pool)); - hg_object_set_vtable(&retval->object, &__hg_file_vtable); - - HG_FILE_SET_FILE_TYPE (retval, file_type); - /* initialize filename here to avoid a warning - when allocating a memory for this and run GC. */ - retval->filename = NULL; - retval->error = 0; - retval->ungetc = 0; - retval->is_eof = FALSE; - va_start(ap, file_type); - switch (file_type) { - case HG_FILE_TYPE_FILE: - retval->access_mode = (guint)va_arg(ap, guint); - p = (gchar *)va_arg(ap, gchar *); - len = strlen(p); - retval->filename = hg_mem_alloc(pool, len + 1); - if (retval->filename == NULL) { - hg_log_warning("Failed to allocate a memory for file object."); return NULL; } - strncpy(retval->filename, p, len); - retval->filename[len] = 0; - errno = 0; - retval->is.file.fd = open(retval->filename, - _hg_file_get_access_mode(retval->access_mode)); - retval->error = errno; - if (retval->is.file.fd != -1) { - struct stat s; + buflen = st.st_size; + if ((fd = open(filename, _hg_object_file_get_open_mode(mode))) == -1) { + hg_object_file_notify_error(vm, errno); - stat(retval->filename, &s); - retval->is.file.mmap.buffer = mmap(NULL, - s.st_size, - PROT_READ, - MAP_PRIVATE, - retval->is.file.fd, - 0); - if (retval->is.file.mmap.buffer != MAP_FAILED) { - retval->is.file.mmap.bufsize = s.st_size; - retval->is.file.mmap.pos = 0; - retval->is.file.is_mmap = TRUE; - } else { - retval->is.file.is_mmap = FALSE; - } - } - break; - case HG_FILE_TYPE_BUFFER: - retval->access_mode = (guint)va_arg(ap, guint); - p = (gchar *)va_arg(ap, gchar *); - len = strlen(p); - retval->filename = hg_mem_alloc(pool, len + 1); - if (retval->filename == NULL) { - hg_log_warning("Failed to allocate a memory for file object."); return NULL; } - strncpy(retval->filename, p, len); - retval->filename[len] = 0; - p = (gchar *)va_arg(ap, gchar *); - retval->is.buf.bufsize = (gint32)va_arg(ap, gint32); - if (retval->is.buf.bufsize < 0) - retval->is.buf.bufsize = strlen(p); - retval->is.buf.buffer = NULL; - retval->is.buf.buffer = hg_mem_alloc(pool, retval->is.buf.bufsize); - if (retval->is.buf.buffer == NULL) { - hg_log_warning("Failed to allocate a memory for file object."); - return NULL; + if ((buffer = mmap(NULL, buflen, PROT_READ, MAP_PRIVATE, fd, 0)) != MAP_FAILED) { + iotype = HG_FILE_TYPE_MMAPPED_IO; } - memcpy(retval->is.buf.buffer, p, retval->is.buf.bufsize); - retval->is.buf.pos = 0; break; case HG_FILE_TYPE_STDIN: - retval->filename = hg_mem_alloc(pool, 6); - if (retval->filename == NULL) { - hg_log_warning("Failed to allocate a memory for file object."); + if ((mode & ~HG_FILE_MODE_READ) != 0) { + hg_object_file_notify_error(vm, EIO); + return NULL; } - strncpy(retval->filename, "stdin", 5); - retval->filename[5] = 0; - retval->is.file.fd = 0; - retval->is.file.is_mmap = FALSE; - retval->access_mode = HG_FILE_MODE_READ; - flag = fcntl(0, F_GETFL); - fcntl(0, F_SETFL, flag | O_NONBLOCK); + if ((retval = hg_vm_get_io(vm, iotype)) != NULL) + return retval; + fd = dup(0); + set_io = TRUE; break; case HG_FILE_TYPE_STDOUT: - retval->filename = hg_mem_alloc(pool, 7); - if (retval->filename == NULL) { - hg_log_warning("Failed to allocate a memory for file object."); + if ((mode & ~HG_FILE_MODE_WRITE) != 0) { + hg_object_file_notify_error(vm, EIO); + return NULL; } - strncpy(retval->filename, "stdout", 6); - retval->filename[6] = 0; - retval->is.file.fd = 1; - retval->is.file.is_mmap = FALSE; - retval->access_mode = HG_FILE_MODE_WRITE; + if ((retval = hg_vm_get_io(vm, iotype)) != NULL) + return retval; + fd = dup(1); + set_io = TRUE; break; case HG_FILE_TYPE_STDERR: - retval->filename = hg_mem_alloc(pool, 7); - if (retval->filename == NULL) { - hg_log_warning("Failed to allocate a memory for file object."); - return NULL; - } - strncpy(retval->filename, "stderr", 6); - retval->filename[6] = 0; - retval->is.file.fd = 2; - retval->is.file.is_mmap = FALSE; - retval->access_mode = HG_FILE_MODE_WRITE; - break; - case HG_FILE_TYPE_STATEMENT_EDIT: - lineedit = (HgLineEdit *)va_arg(ap, HgLineEdit *); - if (lineedit == NULL) { - hg_log_warning("[BUG] No HgLineEdit instance."); - return NULL; - } - retval->filename = hg_mem_alloc(pool, 15); - if (retval->filename == NULL) { - hg_log_warning("Failed to allocate a memory for file object."); - return NULL; - } - strncpy(retval->filename, "%statementedit", 14); - retval->filename[14] = 0; - p = hg_line_edit_get_statement(lineedit, NULL); - if (p == NULL) { - hg_log_warning("Failed to read a statement."); - return NULL; - } - retval->access_mode = HG_FILE_MODE_READ; - retval->is.buf.bufsize = strlen(p); - retval->is.buf.buffer = NULL; - retval->is.buf.buffer = hg_mem_alloc(pool, retval->is.buf.bufsize); - if (retval->is.buf.buffer == NULL) { - hg_log_warning("Failed to allocate a memory for file object."); - return NULL; - } - memcpy(retval->is.buf.buffer, p, retval->is.buf.bufsize); - g_free(p); - retval->is.buf.pos = 0; - break; - case HG_FILE_TYPE_LINE_EDIT: - lineedit = (HgLineEdit *)va_arg(ap, HgLineEdit *); - if (lineedit == NULL) { - hg_log_warning("[BUG] No HgLineEdit instance."); - return NULL; - } - retval->filename = hg_mem_alloc(pool, 10); - if (retval->filename == NULL) { - hg_log_warning("Failed to allocate a memory for file object."); - return NULL; - } - strncpy(retval->filename, "%lineedit", 9); - retval->filename[9] = 0; - p = hg_line_edit_get_line(lineedit, NULL, TRUE); - if (p == NULL) { - hg_log_warning("Failed to read a statement."); - return NULL; - } - retval->access_mode = HG_FILE_MODE_READ; - retval->is.buf.bufsize = strlen(p); - retval->is.buf.buffer = NULL; - retval->is.buf.buffer = hg_mem_alloc(pool, retval->is.buf.bufsize); - if (retval->is.buf.buffer == NULL) { - hg_log_warning("Failed to allocate a memory for file object."); + if ((mode & ~HG_FILE_MODE_WRITE) != 0) { + hg_object_file_notify_error(vm, EIO); + return NULL; } - memcpy(retval->is.buf.buffer, p, retval->is.buf.bufsize); - g_free(p); - retval->is.buf.pos = 0; + if ((retval = hg_vm_get_io(vm, iotype)) != NULL) + return retval; + fd = dup(2); + set_io = TRUE; break; - case HG_FILE_TYPE_BUFFER_WITH_CALLBACK: - retval->access_mode = (guint)va_arg(ap, guint); - p = (gchar *)va_arg(ap, gchar *); - len = strlen(p); - retval->filename = hg_mem_alloc(pool, len + 1); - if (retval->filename == NULL) { - hg_log_warning("Failed to allocate a memory for file object."); + case HG_FILE_TYPE_LINEEDIT: + case HG_FILE_TYPE_STATEMENTEDIT: + if ((mode & ~HG_FILE_MODE_READ) != 0) { + hg_object_file_notify_error(vm, EIO); + return NULL; } - strncpy(retval->filename, p, len); - retval->filename[len] = 0; - retval->is.callback.vtable = (HgFileObjectCallback *)va_arg(ap, HgFileObjectCallback *); - retval->is.callback.user_data = (gpointer)va_arg(ap, gpointer); - break; - default: - hg_log_warning("Unknown file type %d\n", HG_FILE_GET_FILE_TYPE (retval)); - retval = NULL; - break; - } - va_end(ap); - - return retval; -} + if ((obj = hg_vm_get_io(vm, iotype)) == NULL) { + hg_object_file_notify_error(vm, EIO); -gboolean -hg_file_object_has_error(HgFileObject *object) -{ - g_return_val_if_fail (object != NULL, TRUE); - - switch (HG_FILE_GET_FILE_TYPE (object)) { - case HG_FILE_TYPE_FILE: - if (object->is.file.fd == -1) - return TRUE; - break; - case HG_FILE_TYPE_STATEMENT_EDIT: - case HG_FILE_TYPE_LINE_EDIT: - if (object->is.buf.bufsize == 0) { - object->error = ENOENT; - return TRUE; - } - case HG_FILE_TYPE_BUFFER: - if (object->is.buf.buffer == NULL) { - object->error = EACCES; - return TRUE; + return NULL; } - break; - case HG_FILE_TYPE_STDIN: - case HG_FILE_TYPE_STDOUT: - case HG_FILE_TYPE_STDERR: - break; - case HG_FILE_TYPE_BUFFER_WITH_CALLBACK: - object->error = object->is.callback.vtable->get_error_code(object->is.callback.user_data); - break; + /* XXX */ + return hg_object_file_new_from_string(vm, string, HG_FILE_MODE_READ); default: - hg_log_warning("[BUG] Invalid file type %d was given to check the error.", HG_FILE_GET_FILE_TYPE (object)); - return TRUE; - } - - return object->error != 0; -} - -gint -hg_file_object_get_error(HgFileObject *object) -{ - g_return_val_if_fail (object != NULL, EIO); - - return object->error; -} - -void -hg_file_object_clear_error(HgFileObject *object) -{ - g_return_if_fail (object != NULL); - - object->error = 0; -} - -gboolean -hg_file_object_is_eof(HgFileObject *object) -{ - g_return_val_if_fail (object != NULL, TRUE); - - return object->is_eof; -} - -gsize -hg_file_object_read(HgFileObject *object, - gpointer buffer, - gsize size, - gsize n) -{ - gsize retval = 0; - - g_return_val_if_fail (object != NULL, 0); - g_return_val_if_fail (buffer != NULL, 0); - g_return_val_if_fail ((object->access_mode & HG_FILE_MODE_READ) != 0, 0); - g_return_val_if_fail (hg_object_is_readable((HgObject *)object), FALSE); - - /* FIXME: need to handle ungetc here properly */ - if (object->ungetc != 0) { - hg_log_warning("FIXME: ungetc handling not yet implemented!!"); + g_warning("Unknown file type `%d' in creating file object", iotype); + return NULL; } - switch (HG_FILE_GET_FILE_TYPE (object)) { - case HG_FILE_TYPE_FILE: - if (object->is.file.is_mmap) { - if ((object->is.file.mmap.bufsize - object->is.file.mmap.pos) < (size * n)) - retval = object->is.file.mmap.bufsize - object->is.file.mmap.pos; - else - retval = size * n; - memcpy(buffer, object->is.file.mmap.buffer + object->is.file.mmap.pos, retval); - ((gchar *)buffer)[retval] = 0; - object->is.file.mmap.pos += retval; - if (retval == 0 && - object->is.file.mmap.pos == object->is.file.mmap.bufsize) - object->is_eof = TRUE; - break; - } - case HG_FILE_TYPE_STDIN: - errno = 0; - retval = read(object->is.file.fd, buffer, size * n); - object->error = errno; - if (size * n != 0 && retval == 0) - object->is_eof = TRUE; - break; - case HG_FILE_TYPE_BUFFER: - case HG_FILE_TYPE_STATEMENT_EDIT: - case HG_FILE_TYPE_LINE_EDIT: - if ((object->is.buf.bufsize - object->is.buf.pos) < (size * n)) - retval = object->is.buf.bufsize - object->is.buf.pos; - else - retval = size * n; - memcpy(buffer, object->is.buf.buffer + object->is.buf.pos, retval); - ((gchar *)buffer)[retval] = 0; - object->is.buf.pos += retval; - if (retval == 0 && - object->is.buf.pos == object->is.buf.bufsize) - object->is_eof = TRUE; - break; - case HG_FILE_TYPE_BUFFER_WITH_CALLBACK: - retval = object->is.callback.vtable->read(object->is.callback.user_data, buffer, size, n); - object->is_eof = object->is.callback.vtable->is_eof(object->is.callback.user_data); - object->error = object->is.callback.vtable->get_error_code(object->is.callback.user_data); - break; - default: - hg_log_warning("[BUG] Invalid file type %d was given to be read.", HG_FILE_GET_FILE_TYPE (object)); - object->error = EACCES; - break; + retval = hg_object_sized_new(vm, hg_n_alignof (sizeof (hg_filedata_t) + sizeof (gchar) * (len + 1))); + if (retval != NULL) { + HG_OBJECT_GET_TYPE (retval) = HG_OBJECT_TYPE_FILE; + data = HG_OBJECT_FILE_DATA (retval); + memset(data, 0, sizeof (hg_filedata_t) + sizeof (gchar) * (len + 1)); + data->v.buffer = buffer; + data->fd = fd; + data->filesize = buflen; + data->current_position = 0; + data->current_line = 0; + data->iotype = iotype; + data->mode = mode; + data->filename_length = len; + memcpy(data->filename, filename, len); + if (set_io) + hg_vm_set_io(vm, retval); + } else { + if (buffer) + munmap(buffer, buflen); + close(fd); } return retval; } -gsize -hg_file_object_write(HgFileObject *object, - gconstpointer buffer, - gsize size, - gsize n) +hg_object_t * +hg_object_file_new_from_string(hg_vm_t *vm, + hg_object_t *string, + hg_filemode_t mode) { - gsize retval = 0; - - g_return_val_if_fail (object != NULL, 0); - g_return_val_if_fail (buffer != NULL, 0); - g_return_val_if_fail ((object->access_mode & HG_FILE_MODE_WRITE) != 0, 0); - g_return_val_if_fail (hg_object_is_readable((HgObject *)object), FALSE); - g_return_val_if_fail (hg_object_is_writable((HgObject *)object), FALSE); - - switch (HG_FILE_GET_FILE_TYPE (object)) { - case HG_FILE_TYPE_FILE: - case HG_FILE_TYPE_STDOUT: - case HG_FILE_TYPE_STDERR: - errno = 0; - retval = write(object->is.file.fd, buffer, size * n); - object->error = errno; - if (__hg_file_is_io_synchronous) - fsync(object->is.file.fd); - break; - case HG_FILE_TYPE_BUFFER: - if ((object->is.buf.bufsize - object->is.buf.pos) < (size * n)) - retval = object->is.buf.bufsize - object->is.buf.pos; - else - retval = size * n; - memcpy(object->is.buf.buffer + object->is.buf.pos, buffer, retval); - ((gchar *)buffer)[retval] = 0; - object->is.buf.pos += retval; - if (retval == 0 && - object->is.buf.pos == object->is.buf.bufsize) - object->error = EIO; - break; - case HG_FILE_TYPE_BUFFER_WITH_CALLBACK: - retval = object->is.callback.vtable->write(object->is.callback.user_data, buffer, size, n); - object->error = object->is.callback.vtable->get_error_code(object->is.callback.user_data); - break; - default: - hg_log_warning("[BUG] Invalid file type %d to be wrriten.", HG_FILE_GET_FILE_TYPE (object)); - object->error = EACCES; - break; + hg_object_t *retval; + static gchar name[] = "%file buffer"; + gsize len = strlen(name); + hg_filedata_t *data; + + hg_return_val_if_fail (vm != NULL, NULL); + hg_return_val_if_fail (string != NULL, NULL); + hg_return_val_if_fail (HG_OBJECT_IS_STRING (string), NULL); + + retval = hg_object_sized_new(vm, hg_n_alignof (sizeof (hg_filedata_t) + sizeof (gchar) * (len + 1))); + if (retval != NULL) { + HG_OBJECT_GET_TYPE (retval) = HG_OBJECT_TYPE_FILE; + data = HG_OBJECT_FILE_DATA (retval); + data->v.buffer = string; + data->fd = -1; + data->filesize = HG_OBJECT_STRING (string)->real_length; + data->current_position = 0; + data->current_line = 0; + data->iotype = HG_FILE_TYPE_BUFFER; + data->mode = mode; + data->filename_length = len; + memcpy(data->filename, name, len); + data->filename[len] = 0; } return retval; } -gchar -hg_file_object_getc(HgFileObject *object) +hg_object_t * +hg_object_file_new_with_custom(hg_vm_t *vm, + hg_filetable_t *table, + hg_filemode_t mode) { - gchar retval = 0; - - g_return_val_if_fail (object != NULL, 0); - g_return_val_if_fail ((object->access_mode & HG_FILE_MODE_READ) != 0, 0); - g_return_val_if_fail (hg_object_is_readable((HgObject *)object), FALSE); - - if (object->ungetc != 0) { - retval = object->ungetc; - object->ungetc = 0; - } else { - switch (HG_FILE_GET_FILE_TYPE (object)) { - case HG_FILE_TYPE_FILE: - if (object->is.file.is_mmap) { - if (object->is.file.mmap.pos == object->is.file.mmap.bufsize) - object->is_eof = TRUE; - if (object->is.file.mmap.pos < object->is.file.mmap.bufsize) - retval = object->is.file.mmap.buffer[object->is.file.mmap.pos++]; - break; - } - case HG_FILE_TYPE_STDIN: - errno = 0; - if (read(object->is.file.fd, &retval, 1) == 0) - object->is_eof = TRUE; - object->error = errno; - break; - case HG_FILE_TYPE_BUFFER: - case HG_FILE_TYPE_STATEMENT_EDIT: - case HG_FILE_TYPE_LINE_EDIT: - if (object->is.buf.pos == object->is.buf.bufsize) - object->is_eof = TRUE; - if (object->is.buf.pos < object->is.buf.bufsize) - retval = object->is.buf.buffer[object->is.buf.pos++]; - break; - case HG_FILE_TYPE_BUFFER_WITH_CALLBACK: - retval = object->is.callback.vtable->getc(object->is.callback.user_data); - object->is_eof = object->is.callback.vtable->is_eof(object->is.callback.user_data); - object->error = object->is.callback.vtable->get_error_code(object->is.callback.user_data); - break; - default: - hg_log_warning("[BUG] Invalid file type %d was given to be get a character.", HG_FILE_GET_FILE_TYPE (object)); - break; - } + hg_object_t *retval; + static gchar name[] = "%custom file object"; + gsize len = strlen(name); + hg_filedata_t *data; + + hg_return_val_if_fail (vm != NULL, NULL); + hg_return_val_if_fail (table != NULL, NULL); + + retval = hg_object_sized_new(vm, hg_n_alignof (sizeof (hg_filedata_t) + sizeof (gchar) * (len + 1))); + if (retval != NULL) { + HG_OBJECT_GET_TYPE (retval) = HG_OBJECT_TYPE_FILE; + data = HG_OBJECT_FILE_DATA (retval); + memset(data, 0, sizeof (hg_filedata_t) + sizeof (gchar) * (len + 1)); + data->v.table = table; + data->filesize = 0; + data->current_position = 0; + data->current_line = 0; + data->iotype = HG_FILE_TYPE_CALLBACK; + data->mode = mode; + data->filename_length = len; + memcpy(data->filename, name, len); } return retval; } void -hg_file_object_ungetc(HgFileObject *object, - gchar c) -{ - gssize retval; - - g_return_if_fail (object != NULL); - g_return_if_fail ((object->access_mode & HG_FILE_MODE_READ) != 0); - g_return_if_fail (object->ungetc == 0); - g_return_if_fail (hg_object_is_readable((HgObject *)object)); - g_return_if_fail (hg_object_is_writable((HgObject *)object)); - - switch (HG_FILE_GET_FILE_TYPE (object)) { - case HG_FILE_TYPE_FILE: - case HG_FILE_TYPE_BUFFER: - case HG_FILE_TYPE_STATEMENT_EDIT: - case HG_FILE_TYPE_LINE_EDIT: - case HG_FILE_TYPE_BUFFER_WITH_CALLBACK: - object->is_eof = FALSE; - retval = hg_file_object_seek(object, -1, HG_FILE_POS_CURRENT); - if (retval > 0) - break; - hg_log_debug(DEBUG_FILE, "Failed to push back a character to a file stream."); - break; - case HG_FILE_TYPE_STDIN: - object->is_eof = FALSE; - object->ungetc = c; - break; - default: - hg_log_warning("[BUG] Invalid file type %d was given to be unget a character.", HG_FILE_GET_FILE_TYPE (object)); - break; - } -} - -gboolean -hg_file_object_flush(HgFileObject *object) +hg_object_file_free(hg_vm_t *vm, + hg_object_t *object) { - gboolean retval = FALSE; + hg_return_if_fail (vm != NULL); + hg_return_if_fail (object != NULL); + hg_return_if_fail (HG_OBJECT_IS_FILE (object)); - g_return_val_if_fail (object != NULL, FALSE); - g_return_val_if_fail (hg_object_is_writable((HgObject *)object), FALSE); - - switch (HG_FILE_GET_FILE_TYPE (object)) { - case HG_FILE_TYPE_FILE: - case HG_FILE_TYPE_STDIN: - case HG_FILE_TYPE_STDOUT: - case HG_FILE_TYPE_STDERR: - if (hg_file_object_is_readable(object)) { - /* clear the inbuffer */ - gchar tmp[256]; - - while (!hg_file_object_is_eof(object)) { - hg_file_object_read(object, tmp, sizeof (gchar), 255); - } - } else { - /* FIXME: clear the outbuffer */ - sync(); - } - retval = TRUE; - break; - case HG_FILE_TYPE_BUFFER: - case HG_FILE_TYPE_STATEMENT_EDIT: - case HG_FILE_TYPE_LINE_EDIT: - if (hg_file_object_is_readable(object)) { - object->is.buf.pos = object->is.buf.bufsize; - object->is_eof = TRUE; - } - retval = TRUE; - break; - case HG_FILE_TYPE_BUFFER_WITH_CALLBACK: - retval = object->is.callback.vtable->flush(object->is.callback.user_data); - break; + switch (HG_OBJECT_FILE_DATA (object)->iotype) { default: - hg_log_warning("Invalid file type %d was given to be flushed.", HG_FILE_GET_FILE_TYPE (object)); break; } - - return retval; -} - -gssize -hg_file_object_seek(HgFileObject *object, - gssize offset, - HgFilePosType whence) -{ - gssize retval = -1; - - g_return_val_if_fail (object != NULL, -1); - - switch (HG_FILE_GET_FILE_TYPE (object)) { - case HG_FILE_TYPE_FILE: - if (object->is.file.is_mmap) { - switch (whence) { - case HG_FILE_POS_BEGIN: - if (offset < 0) - object->is.file.mmap.pos = 0; - else if (offset > object->is.file.mmap.bufsize) - object->is.file.mmap.pos = object->is.file.mmap.bufsize; - else - object->is.file.mmap.pos = offset; - break; - case HG_FILE_POS_CURRENT: - if (object->ungetc) - object->is.file.mmap.pos--; - object->is.file.mmap.pos += offset; - if (object->is.file.mmap.pos < 0) - object->is.file.mmap.pos = 0; - else if (object->is.file.mmap.pos > object->is.file.mmap.bufsize) - object->is.file.mmap.pos = object->is.file.mmap.bufsize; - break; - case HG_FILE_POS_END: - object->is.file.mmap.pos = object->is.file.mmap.bufsize + offset; - if (object->is.file.mmap.pos < 0) - object->is.file.mmap.pos = 0; - else if (object->is.file.mmap.pos > object->is.file.mmap.bufsize) - object->is.file.mmap.pos = object->is.file.mmap.bufsize; - break; - default: - hg_log_warning("Invalid whence `%d' was given.", whence); - object->error = EINVAL; - break; - } - retval = object->is.file.mmap.pos; - } else { - retval = lseek(object->is.file.fd, offset, whence); - object->error = errno; - } - break; - case HG_FILE_TYPE_BUFFER: - case HG_FILE_TYPE_STATEMENT_EDIT: - case HG_FILE_TYPE_LINE_EDIT: - switch (whence) { - case HG_FILE_POS_BEGIN: - if (offset < 0) - object->is.buf.pos = 0; - else if (offset > object->is.buf.bufsize) - object->is.buf.pos = object->is.buf.bufsize; - else - object->is.buf.pos = offset; - break; - case HG_FILE_POS_CURRENT: - if (object->ungetc) - object->is.buf.pos--; - object->is.buf.pos += offset; - if (object->is.buf.pos < 0) - object->is.buf.pos = 0; - else if (object->is.buf.pos > object->is.buf.bufsize) - object->is.buf.pos = object->is.buf.bufsize; - break; - case HG_FILE_POS_END: - object->is.buf.pos = object->is.buf.bufsize + offset; - if (object->is.buf.pos < 0) - object->is.buf.pos = 0; - else if (object->is.buf.pos > object->is.buf.bufsize) - object->is.buf.pos = object->is.buf.bufsize; - break; - default: - hg_log_warning("Invalid whence `%d' was given.", whence); - object->error = EINVAL; - break; - } - retval = object->is.buf.pos; - break; - case HG_FILE_TYPE_STDIN: - case HG_FILE_TYPE_STDOUT: - case HG_FILE_TYPE_STDERR: - hg_log_warning("Not supported to be sought."); - object->error = ESPIPE; - break; - case HG_FILE_TYPE_BUFFER_WITH_CALLBACK: - retval = object->is.callback.vtable->seek(object->is.callback.user_data, offset, whence); - object->error = object->is.callback.vtable->get_error_code(object->is.callback.user_data); - break; - default: - hg_log_warning("Unknown file type %d was given to be sought.", - HG_FILE_GET_FILE_TYPE (object)); - break; - } - object->ungetc = 0; - - return retval; } void -hg_file_object_close(HgFileObject *object) +hg_object_file_notify_error(hg_vm_t *vm, + error_t _errno) { - g_return_if_fail (object != NULL); + hg_error_t error = 0; + gchar buffer[4096]; - object->ungetc = 0; - object->is_eof = TRUE; - switch (HG_FILE_GET_FILE_TYPE (object)) { - case HG_FILE_TYPE_FILE: - if (object->is.file.is_mmap) { - munmap(object->is.file.mmap.buffer, object->is.file.mmap.bufsize); - object->is.file.is_mmap = FALSE; - } - if (object->is.file.fd != -1) { - close(object->is.file.fd); - object->is.file.fd = -1; - } - break; - case HG_FILE_TYPE_STDIN: - case HG_FILE_TYPE_STDOUT: - case HG_FILE_TYPE_STDERR: - /* just ignore for them */ - break; - case HG_FILE_TYPE_BUFFER: - case HG_FILE_TYPE_STATEMENT_EDIT: - case HG_FILE_TYPE_LINE_EDIT: - object->is.buf.pos = 0; - object->is.buf.bufsize = 0; + hg_return_if_fail (vm != NULL); + + switch (_errno) { + case 0: break; - case HG_FILE_TYPE_BUFFER_WITH_CALLBACK: - object->is.callback.vtable->close(object->is.callback.user_data); + case EACCES: + case EBADF: + case EEXIST: + case ENOTDIR: + case ENOTEMPTY: + case EPERM: + case EROFS: + error = HG_e_invalidfileaccess; break; - default: - hg_log_warning("Unknown file type %d was given to be closed.", - HG_FILE_GET_FILE_TYPE (object)); + case EAGAIN: + case EBUSY: + case EIO: + case ENOSPC: + error = HG_e_ioerror; break; - } -} - -gboolean -hg_file_object_is_closed(HgFileObject *object) -{ - gboolean retval = FALSE; - - g_return_val_if_fail (object != NULL, TRUE); - - switch (HG_FILE_GET_FILE_TYPE (object)) { - case HG_FILE_TYPE_FILE: - retval = (!object->is.file.is_mmap && object->is.file.fd == -1); + case EMFILE: + error = HG_e_limitcheck; break; - case HG_FILE_TYPE_STDIN: - case HG_FILE_TYPE_STDOUT: - case HG_FILE_TYPE_STDERR: - /* just ignore for them */ + case ENAMETOOLONG: + case ENODEV: + case ENOENT: + error = HG_e_undefinedfilename; break; - case HG_FILE_TYPE_BUFFER: - case HG_FILE_TYPE_STATEMENT_EDIT: - case HG_FILE_TYPE_LINE_EDIT: - retval = (object->is.buf.pos == 0 && object->is.buf.bufsize == 0); - break; - case HG_FILE_TYPE_BUFFER_WITH_CALLBACK: - retval = object->is.callback.vtable->is_closed(object->is.callback.user_data); + case ENOMEM: + error = HG_e_VMerror; break; default: - hg_log_warning("Unknown file type %d was given to be closed.", - HG_FILE_GET_FILE_TYPE (object)); + strerror_r(_errno, buffer, 4096); + g_warning("%s: need to support errno %d\n %s\n", + __PRETTY_FUNCTION__, _errno, buffer); break; } - - return retval; -} - -gboolean -hg_file_object_is_readable(HgFileObject *object) -{ - g_return_val_if_fail (object != NULL, FALSE); - g_return_val_if_fail (hg_object_is_readable((HgObject *)object), FALSE); - - return (object->access_mode & HG_FILE_MODE_READ) != 0; + if (error != 0) + hg_vm_set_error(vm, error); } gboolean -hg_file_object_is_writable(HgFileObject *object) -{ - g_return_val_if_fail (object != NULL, FALSE); - g_return_val_if_fail (hg_object_is_readable((HgObject *)object), FALSE); - - return (object->access_mode & HG_FILE_MODE_WRITE) != 0; -} - -void -hg_file_object_printf(HgFileObject *object, - gchar const *format, - ...) -{ - va_list ap; - - va_start(ap, format); - hg_file_object_vprintf(object, format, ap); - va_end(ap); -} - -void -hg_file_object_vprintf(HgFileObject *object, - gchar const *format, - va_list va_args) -{ - gchar *buffer; - - g_return_if_fail (object != NULL); - g_return_if_fail (format != NULL); - g_return_if_fail (hg_object_is_readable((HgObject *)object)); - g_return_if_fail (hg_object_is_writable((HgObject *)object)); - - buffer = g_strdup_vprintf(format, va_args); - hg_file_object_write(object, buffer, sizeof (gchar), strlen(buffer)); - g_free(buffer); -} - -void -hg_stdout_printf(gchar const *format, ...) +hg_object_file_compare(hg_object_t *object1, + hg_object_t *object2) { - va_list ap; - - if (!hg_file_is_initialized()) - hg_file_init(); - - va_start(ap, format); - hg_file_object_vprintf(__hg_file_stdout, format, ap); - va_end(ap); + hg_return_val_if_fail (object1 != NULL, FALSE); + hg_return_val_if_fail (object2 != NULL, FALSE); + hg_return_val_if_fail (HG_OBJECT_IS_FILE (object1), FALSE); + hg_return_val_if_fail (HG_OBJECT_IS_FILE (object2), FALSE); + + /* XXX: no copy and dup functionalities are available so far. + * so just comparing a pointer should works enough + */ + return object1 == object2; } -void -hg_stderr_printf(gchar const *format, ...) +gchar * +hg_object_file_dump(hg_object_t *object, + gboolean verbose) { - va_list ap; - - if (!hg_file_is_initialized()) - hg_file_init(); + hg_return_val_if_fail (object != NULL, NULL); + hg_return_val_if_fail (HG_OBJECT_IS_FILE (object), NULL); - va_start(ap, format); - hg_file_object_vprintf(__hg_file_stderr, format, ap); - va_end(ap); + return g_strdup("--file--"); } diff --git a/hieroglyph/hgfile.h b/hieroglyph/hgfile.h index 384556f..b99d266 100644 --- a/hieroglyph/hgfile.h +++ b/hieroglyph/hgfile.h @@ -1,10 +1,10 @@ /* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ /* * hgfile.h - * Copyright (C) 2006 Akira TAGOH + * Copyright (C) 2006-2007 Akira TAGOH * * Authors: - * Akira TAGOH <at@gclab.org> + * Akira TAGOH <akira@tagoh.org> * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -21,66 +21,33 @@ * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ -#ifndef __HG_FILE_H__ -#define __HG_FILE_H__ +#ifndef __HIEROGLYPH_HGFILE_H__ +#define __HIEROGLYPH_HGFILE_H__ #include <hieroglyph/hgtypes.h> -G_BEGIN_DECLS - -#define HG_FILE_GET_FILE_TYPE(_obj) ((HgFileType)HG_OBJECT_GET_USER_DATA ((HgObject *)_obj)) -#define HG_FILE_SET_FILE_TYPE(_obj, _type) (HG_OBJECT_SET_USER_DATA ((HgObject *)(_obj), (_type))) - -extern HgFileObject *__hg_file_stdin; -extern HgFileObject *__hg_file_stdout; -extern HgFileObject *__hg_file_stderr; +G_BEGIN_DECLS -/* initializer */ -void hg_file_init (void); -void hg_file_finalize (void); -gboolean hg_file_is_initialized(void); -void hg_file_io_synchronous(gboolean flag); - -/* file object */ -HgFileObject *hg_file_object_new (HgMemPool *pool, - HgFileType file_type, - ...); -gboolean hg_file_object_has_error (HgFileObject *object); -gint hg_file_object_get_error (HgFileObject *object); -void hg_file_object_clear_error(HgFileObject *object); -gboolean hg_file_object_is_eof (HgFileObject *object); -gsize hg_file_object_read (HgFileObject *object, - gpointer buffer, - gsize size, - gsize n); -gsize hg_file_object_write (HgFileObject *object, - gconstpointer buffer, - gsize size, - gsize n); -gchar hg_file_object_getc (HgFileObject *object); -void hg_file_object_ungetc (HgFileObject *object, - gchar c); -gboolean hg_file_object_flush (HgFileObject *object); -gssize hg_file_object_seek (HgFileObject *object, - gssize offset, - HgFilePosType whence); -void hg_file_object_close (HgFileObject *object); -gboolean hg_file_object_is_closed (HgFileObject *object); -gboolean hg_file_object_is_readable(HgFileObject *object); -gboolean hg_file_object_is_writable(HgFileObject *object); -void hg_file_object_printf (HgFileObject *object, - gchar const *format, - ...) G_GNUC_PRINTF (2, 3); -void hg_file_object_vprintf (HgFileObject *object, - gchar const *format, - va_list va_args); - -/* for information */ -void hg_stdout_printf (gchar const *format, ...) G_GNUC_PRINTF (1, 2); -void hg_stderr_printf (gchar const *format, ...) G_GNUC_PRINTF (1, 2); +hg_object_t *hg_object_file_new (hg_vm_t *vm, + const gchar *filename, + hg_filemode_t mode) G_GNUC_WARN_UNUSED_RESULT; +hg_object_t *hg_object_file_new_from_string(hg_vm_t *vm, + hg_object_t *string, + hg_filemode_t mode) G_GNUC_WARN_UNUSED_RESULT; +hg_object_t *hg_object_file_new_with_custom(hg_vm_t *vm, + hg_filetable_t *table, + hg_filemode_t mode) G_GNUC_WARN_UNUSED_RESULT; +void hg_object_file_free (hg_vm_t *vm, + hg_object_t *object); +void hg_object_file_notify_error (hg_vm_t *vm, + error_t _errno); +gboolean hg_object_file_compare (hg_object_t *object1, + hg_object_t *object2); +gchar *hg_object_file_dump (hg_object_t *object, + gboolean verbose) G_GNUC_MALLOC; G_END_DECLS -#endif /* __HG_FILE_H__ */ +#endif /* __HIEROGLYPH_HGFILE_H__ */ diff --git a/hieroglyph/hggraphics.c b/hieroglyph/hggraphics.c deleted file mode 100644 index eb131f1..0000000 --- a/hieroglyph/hggraphics.c +++ /dev/null @@ -1,750 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* - * hggraphics.c - * Copyright (C) 2006 Akira TAGOH - * - * Authors: - * Akira TAGOH <at@gclab.org> - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - */ -#ifdef HAVE_CONFIG_H -#include <config.h> -#endif - -#include <string.h> -#include "hggraphics.h" -#include "hglog.h" -#include "hgmem.h" -#include "hgarray.h" -#include "hgdict.h" -#include "hgmatrix.h" -#include "hgpage.h" -#include "hgpath.h" -#include "hgrender.h" - - -static void _hg_graphic_state_real_set_flags(gpointer data, - guint flags); -static void _hg_graphic_state_real_relocate (gpointer data, - HgMemRelocateInfo *info); -static gpointer _hg_graphic_state_real_copy (gpointer data); -static void _hg_graphics_real_free (gpointer data); -static void _hg_graphics_real_set_flags (gpointer data, - guint flags); -static void _hg_graphics_real_relocate (gpointer data, - HgMemRelocateInfo *info); - - -static HgObjectVTable __hg_gstate_vtable = { - .free = NULL, - .set_flags = _hg_graphic_state_real_set_flags, - .relocate = _hg_graphic_state_real_relocate, - .dup = NULL, - .copy = _hg_graphic_state_real_copy, - .to_string = NULL, -}; - -static HgObjectVTable __hg_graphics_vtable = { - .free = _hg_graphics_real_free, - .set_flags = _hg_graphics_real_set_flags, - .relocate = _hg_graphics_real_relocate, - .dup = NULL, - .copy = NULL, - .to_string = NULL, -}; - -/* - * Private Functions - */ -static void -_hg_graphic_state_real_set_flags(gpointer data, - guint flags) -{ - HgGraphicState *gstate = data; - HgMemObject *obj; - -#define _hg_graphic_state_set_mark(member) \ - if (gstate->member) { \ - hg_mem_get_object__inline(gstate->member, obj); \ - if (obj == NULL) { \ - hg_log_warning("Invalid object %p to be marked: Graphics", gstate->member); \ - } else { \ - hg_mem_add_flags__inline(obj, flags, TRUE); \ - } \ - } - - _hg_graphic_state_set_mark(path); - _hg_graphic_state_set_mark(clip_path); - _hg_graphic_state_set_mark(color_space); - _hg_graphic_state_set_mark(font); - _hg_graphic_state_set_mark(dashline_pattern); - -#undef _hg_graphic_state_set_mark -} - -static void -_hg_graphic_state_real_relocate(gpointer data, - HgMemRelocateInfo *info) -{ - HgGraphicState *gstate = data; - -#define _hg_graphic_state_relocate(member) \ - if ((gsize)gstate->member >= info->start && \ - (gsize)gstate->member <= info->end) { \ - gstate->member = (gpointer)((gsize)gstate->member + info->diff); \ - } - - _hg_graphic_state_relocate(path); - _hg_graphic_state_relocate(clip_path); - _hg_graphic_state_relocate(color_space); - _hg_graphic_state_relocate(font); - _hg_graphic_state_relocate(dashline_pattern); - -#undef _hg_graphic_state_relocate -} - -static gpointer -_hg_graphic_state_real_copy(gpointer data) -{ - HgGraphicState *gstate = data, *retval; - HgMemObject *obj; - - hg_mem_get_object__inline(data, obj); - if (obj == NULL) - return NULL; - retval = hg_graphic_state_new(obj->pool); - if (retval == NULL) { - hg_log_warning("Failed to duplicate a graphic state."); - return NULL; - } - memcpy(retval, data, sizeof (HgGraphicState)); - retval->path = hg_object_copy((HgObject *)gstate->path); - if (retval->path == NULL) - return NULL; - retval->clip_path = hg_object_copy((HgObject *)gstate->clip_path); - if (retval->clip_path == NULL) - return NULL; - retval->color_space = hg_object_copy((HgObject *)gstate->color_space); - retval->font = hg_object_copy((HgObject *)gstate->font); - retval->dashline_pattern = hg_object_copy((HgObject *)gstate->dashline_pattern); - - /* FIXME */ - - return retval; -} - -static void -_hg_graphics_real_free(gpointer data) -{ - HgGraphics *graphics = data; - - if (graphics->pages) { - GList *l = graphics->pages; - - while (l) { - hg_page_destroy(l->data); - l = g_list_next(l); - } - g_list_free(graphics->pages); - } - /* FIXME: current_page too? */ - if (graphics->gstate_stack) - g_list_free(graphics->gstate_stack); -} - -static void -_hg_graphics_real_set_flags(gpointer data, - guint flags) -{ - HgGraphics *graphics = data; - HgMemObject *obj; - GList *l; - -#define _hg_graphics_set_mark(member) \ - if (member) { \ - hg_mem_get_object__inline(member, obj); \ - if (obj == NULL) { \ - hg_log_warning("Invalid object %p to be marked: Graphics", member); \ - } else { \ - hg_mem_add_flags__inline(obj, flags, TRUE); \ - } \ - } - - _hg_graphics_set_mark(graphics->current_gstate); - for (l = graphics->gstate_stack; l != NULL; l = g_list_next(l)) { - _hg_graphics_set_mark(l->data); - } - -#undef _hg_graphics_set_mark -} - -static void -_hg_graphics_real_relocate(gpointer data, - HgMemRelocateInfo *info) -{ - HgGraphics *graphics = data; - GList *l; - -#define _hg_graphics_relocate(member) \ - if ((gsize)member >= info->start && \ - (gsize)member <= info->end) { \ - member = (gpointer)((gsize)member + info->diff); \ - } - - _hg_graphics_relocate(graphics->current_gstate); - for (l = graphics->gstate_stack; l != NULL; l = g_list_next(l)) { - _hg_graphics_relocate(l->data); - } - -#undef _hg_graphics_relocate -} - -/* - * Public Functions - */ -HgGraphicState * -hg_graphic_state_new(HgMemPool *pool) -{ - HgGraphicState *retval; - - g_return_val_if_fail (pool != NULL, NULL); - - while (1) { - retval = hg_mem_alloc_with_flags(pool, - sizeof (HgGraphicState), - HG_FL_HGOBJECT | HG_FL_COMPLEX); - if (retval == NULL) - break; - HG_OBJECT_INIT_STATE (&retval->object); - HG_OBJECT_SET_STATE (&retval->object, hg_mem_pool_get_default_access_mode(pool)); - hg_object_set_vtable(&retval->object, &__hg_gstate_vtable); - - retval->path = hg_path_new(pool); - if (retval->path == NULL) - break; - retval->clip_path = hg_path_new(pool); - if (retval->clip_path == NULL) - break; - retval->color_space = hg_array_new(pool, 0); /* FIXME */ - hg_graphic_state_color_set_rgb(retval, 0.0, 0.0, 0.0); - retval->font = hg_dict_new(pool, 1); /* FIXME */ - retval->line_width = 1.0; - retval->line_cap = 0; - retval->line_join = 0; - retval->miter_limit = 10.0; - retval->dashline_offset = 0; - retval->dashline_pattern = hg_array_new(pool, 0); - if (retval->dashline_pattern == NULL) - break; - retval->stroke_correction = FALSE; - - return retval; - } - hg_log_warning("Failed to create a graphic state."); - - return NULL; -} - -HgGraphics * -hg_graphics_new(HgMemPool *pool) -{ - HgGraphics *retval; - - g_return_val_if_fail (pool != NULL, NULL); - - while (1) { - retval = hg_mem_alloc_with_flags(pool, sizeof (HgGraphics), - HG_FL_HGOBJECT); - if (retval == NULL) - break; - HG_OBJECT_INIT_STATE (&retval->object); - HG_OBJECT_SET_STATE (&retval->object, hg_mem_pool_get_default_access_mode(pool)); - hg_object_set_vtable(&retval->object, &__hg_graphics_vtable); - - retval->pool = pool; - retval->current_gstate = hg_graphic_state_new(pool); - retval->current_page = hg_page_new_with_pagesize(HG_PAGE_A4); - retval->pages = g_list_append(NULL, retval->current_page); - retval->gstate_stack = NULL; - if (retval->current_page == NULL) - break; - hg_graphics_init(retval); - - return retval; - } - hg_log_warning("Failed to create a graphic state."); - - return NULL; -} - -gboolean -hg_graphics_init(HgGraphics *graphics) -{ - HgGraphicState *gstate; - HgMatrix *mtx; - - g_return_val_if_fail (graphics != NULL, FALSE); - - gstate = hg_graphics_get_state(graphics); - mtx = hg_matrix_new(graphics->pool, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0); - memcpy(&gstate->ctm, mtx, sizeof (HgMatrix)); - memcpy(&gstate->snapshot_matrix, mtx, sizeof (HgMatrix)); - hg_mem_free(mtx); - gstate->x = 0.0; - gstate->y = 0.0; - hg_path_clear(gstate->path, TRUE); - hg_graphics_set_graphic_size(graphics, graphics->current_page->width, - graphics->current_page->height); - /* FIXME: color space */ - hg_graphic_state_color_set_rgb(gstate, 0.0, 0.0, 0.0); - gstate->line_width = 1.0; - gstate->line_cap = 0; - gstate->line_join = 0; - gstate->miter_limit = 10.0; - /* FIXME: dashline */ - - return TRUE; -} - -gboolean -hg_graphics_initclip(HgGraphics *graphics) -{ - g_return_val_if_fail (graphics != NULL, FALSE); - g_return_val_if_fail (graphics->current_page != NULL, FALSE); - - hg_path_clear(graphics->current_gstate->clip_path, TRUE); - hg_path_moveto(graphics->current_gstate->clip_path, 0, 0); - hg_path_lineto(graphics->current_gstate->clip_path, - graphics->current_page->width, 0); - hg_path_lineto(graphics->current_gstate->clip_path, - graphics->current_page->width, graphics->current_page->height); - hg_path_lineto(graphics->current_gstate->clip_path, - 0, graphics->current_page->height); - - return hg_path_close(graphics->current_gstate->clip_path); -} - -gboolean -hg_graphics_set_page_size(HgGraphics *graphics, - HgPageSize size) -{ - gdouble width, height; - - g_return_val_if_fail (graphics != NULL, FALSE); - - hg_page_get_size(size, &width, &height); - - return hg_graphics_set_graphic_size(graphics, width, height); -} - -gboolean -hg_graphics_set_graphic_size(HgGraphics *graphics, - gdouble width, - gdouble height) -{ - g_return_val_if_fail (graphics != NULL, FALSE); - g_return_val_if_fail (graphics->current_gstate != NULL, FALSE); - - if (graphics->current_page->node) { - hg_log_warning("Can't change the page size after the rendering code is invoked."); - return FALSE; - } - - return hg_graphics_initclip(graphics); -} - -gboolean -hg_graphics_save(HgGraphics *graphics) -{ - gpointer data; - - g_return_val_if_fail (graphics != NULL, FALSE); - - data = hg_object_copy((HgObject *)graphics->current_gstate); - graphics->gstate_stack = g_list_append(graphics->gstate_stack, data); - - return TRUE; -} - -gboolean -hg_graphics_restore(HgGraphics *graphics) -{ - GList *l; - HgGraphicState *gstate; - - g_return_val_if_fail (graphics != NULL, FALSE); - - l = g_list_last(graphics->gstate_stack); - if (l != NULL) { - if (l->prev) - l->prev->next = NULL; - else - graphics->gstate_stack = NULL; - gstate = l->data; - g_list_free_1(l); - hg_mem_free(graphics->current_gstate); - graphics->current_gstate = gstate; - } - - return TRUE; -} - -gboolean -hg_graphics_show_page(HgGraphics *graphics) -{ - GList *l; - - g_return_val_if_fail (graphics != NULL, FALSE); - - l = g_list_last(graphics->pages); - if (l != NULL && l->data != graphics->current_page) - graphics->pages = g_list_append(graphics->pages, graphics->current_page); - graphics->current_page = hg_page_new_with_size(graphics->current_page->width, - graphics->current_page->height); - /* FIXME */ - return hg_graphics_init(graphics); -} - -/* matrix */ -gboolean -hg_graphics_matrix_rotate(HgGraphics *graphics, - gdouble angle) -{ - HgGraphicState *gstate; - HgMatrix *mtx, *new_ctm; - - g_return_val_if_fail (graphics != NULL, FALSE); - - mtx = hg_matrix_rotate(graphics->pool, angle); - new_ctm = hg_matrix_multiply(graphics->pool, mtx, &graphics->current_gstate->ctm); - memcpy(&graphics->current_gstate->ctm, new_ctm, sizeof (HgMatrix)); - hg_mem_free(mtx); - hg_mem_free(new_ctm); - - gstate = hg_graphics_get_state(graphics); - - return hg_path_matrix(gstate->path, - gstate->ctm.xx, gstate->ctm.yx, - gstate->ctm.xy, gstate->ctm.yy, - gstate->ctm.x0, gstate->ctm.y0); -} - -gboolean -hg_graphics_matrix_scale(HgGraphics *graphics, - gdouble x, - gdouble y) -{ - HgGraphicState *gstate; - HgMatrix *mtx, *new_ctm; - - g_return_val_if_fail (graphics != NULL, FALSE); - - mtx = hg_matrix_scale(graphics->pool, x, y); - new_ctm = hg_matrix_multiply(graphics->pool, mtx, &graphics->current_gstate->ctm); - memcpy(&graphics->current_gstate->ctm, new_ctm, sizeof (HgMatrix)); - hg_mem_free(mtx); - hg_mem_free(new_ctm); - - gstate = hg_graphics_get_state(graphics); - - return hg_path_matrix(gstate->path, - gstate->ctm.xx, gstate->ctm.yx, - gstate->ctm.xy, gstate->ctm.yy, - gstate->ctm.x0, gstate->ctm.y0); -} - -gboolean -hg_graphics_matrix_translate(HgGraphics *graphics, - gdouble x, - gdouble y) -{ - HgGraphicState *gstate; - HgMatrix *mtx, *new_ctm; - - g_return_val_if_fail (graphics != NULL, FALSE); - - mtx = hg_matrix_translate(graphics->pool, x, y); - new_ctm = hg_matrix_multiply(graphics->pool, mtx, &graphics->current_gstate->ctm); - memcpy(&graphics->current_gstate->ctm, new_ctm, sizeof (HgMatrix)); - hg_mem_free(mtx); - hg_mem_free(new_ctm); - - gstate = hg_graphics_get_state(graphics); - - return hg_path_matrix(gstate->path, - gstate->ctm.xx, gstate->ctm.yx, - gstate->ctm.xy, gstate->ctm.yy, - gstate->ctm.x0, gstate->ctm.y0); -} - -/* path */ -gboolean -hg_graphic_state_path_new(HgGraphicState *gstate) -{ - g_return_val_if_fail (gstate != NULL, FALSE); - - if (gstate->path) { - hg_path_clear(gstate->path, TRUE); - /* snapshot_matrix needs to be updated because - * path might has HG_PATH_MATRIX and this operator initializes it. - * it won't be tracable then. - */ - memcpy(&gstate->snapshot_matrix, - &gstate->ctm, - sizeof (HgMatrix)); - - return TRUE; - } - - return FALSE; -} - -gboolean -hg_graphic_state_path_close(HgGraphicState *gstate) -{ - g_return_val_if_fail (gstate != NULL, FALSE); - - return hg_path_close(gstate->path); -} - -gboolean -hg_graphic_state_path_from_clip(HgGraphicState *gstate) -{ - g_return_val_if_fail (gstate != NULL, FALSE); - - return hg_path_copy(gstate->clip_path, gstate->path); -} - -gboolean -hg_graphic_state_get_bbox_from_path(HgGraphicState *gstate, - gboolean ignore_moveto, - HgPathBBox *bbox) -{ - g_return_val_if_fail (gstate != NULL, FALSE); - - return hg_path_get_bbox(gstate->path, ignore_moveto, bbox); -} - -gboolean -hg_graphic_state_path_moveto(HgGraphicState *gstate, - gdouble x, - gdouble y) -{ - g_return_val_if_fail (gstate != NULL, FALSE); - - return hg_path_moveto(gstate->path, x, y); -} - -gboolean -hg_graphic_state_path_lineto(HgGraphicState *gstate, - gdouble x, - gdouble y) -{ - g_return_val_if_fail (gstate != NULL, FALSE); - - return hg_path_lineto(gstate->path, x, y); -} - -gboolean -hg_graphic_state_path_rlineto(HgGraphicState *gstate, - gdouble x, - gdouble y) -{ - g_return_val_if_fail (gstate != NULL, FALSE); - - return hg_path_rlineto(gstate->path, x, y); -} - -gboolean -hg_graphic_state_path_curveto(HgGraphicState *gstate, - gdouble x1, - gdouble y1, - gdouble x2, - gdouble y2, - gdouble x3, - gdouble y3) -{ - g_return_val_if_fail (gstate != NULL, FALSE); - - return hg_path_curveto(gstate->path, x1, y1, x2, y2, x3, y3); -} - -gboolean -hg_graphic_state_path_arc(HgGraphicState *gstate, - gdouble x, - gdouble y, - gdouble r, - gdouble angle1, - gdouble angle2) -{ - g_return_val_if_fail (gstate != NULL, FALSE); - - return hg_path_arc(gstate->path, x, y, r, angle1, angle2); -} - -/* color */ -gboolean -hg_graphic_state_color_set_rgb(HgGraphicState *gstate, - gdouble red, - gdouble green, - gdouble blue) -{ - g_return_val_if_fail (gstate != NULL, FALSE); - - gstate->color.is_rgb = TRUE; - gstate->color.is.rgb.r = red; - gstate->color.is.rgb.g = green; - gstate->color.is.rgb.b = blue; - - return TRUE; -} - -gboolean -hg_graphic_state_color_set_hsv(HgGraphicState *gstate, - gdouble hue, - gdouble saturation, - gdouble value) -{ - g_return_val_if_fail (gstate != NULL, FALSE); - - gstate->color.is_rgb = FALSE; - gstate->color.is.hsv.h = hue; - gstate->color.is.hsv.s = saturation; - gstate->color.is.hsv.v = value; - - return TRUE; -} - -/* rendering */ -gboolean -hg_graphics_render_eofill(HgGraphics *graphics) -{ - HgRender *render; - HgGraphicState *gstate; - - g_return_val_if_fail (graphics != NULL, FALSE); - g_return_val_if_fail (graphics->current_gstate != NULL, FALSE); - - gstate = hg_graphics_get_state(graphics); - render = hg_render_eofill_new(graphics->pool, - &gstate->snapshot_matrix, - gstate->path->node, - &gstate->color); - if (render == NULL) - return FALSE; - hg_page_append_node(graphics->current_page, render); - hg_path_clear(gstate->path, FALSE); - /* snapshot_matrix needs to be updated because - * path might has HG_PATH_MATRIX and this operator initializes it. - * it won't be tracable then. - */ - memcpy(&gstate->snapshot_matrix, &gstate->ctm, sizeof (HgMatrix)); - - return TRUE; -} - -gboolean -hg_graphics_render_fill(HgGraphics *graphics) -{ - HgGraphicState *gstate; - HgRender *render; - - g_return_val_if_fail (graphics != NULL, FALSE); - g_return_val_if_fail (graphics->current_gstate != NULL, FALSE); - - gstate = hg_graphics_get_state(graphics); - render = hg_render_fill_new(graphics->pool, - &gstate->snapshot_matrix, - gstate->path->node, - &gstate->color); - if (render == NULL) - return FALSE; - hg_page_append_node(graphics->current_page, render); - hg_path_clear(gstate->path, FALSE); - /* snapshot_matrix needs to be updated because - * path might has HG_PATH_MATRIX and this operator initializes it. - * it won't be tracable then. - */ - memcpy(&gstate->snapshot_matrix, &gstate->ctm, sizeof (HgMatrix)); - - return TRUE; -} - -gboolean -hg_graphics_render_stroke(HgGraphics *graphics) -{ - HgGraphicState *gstate; - HgRender *render; - - g_return_val_if_fail (graphics != NULL, FALSE); - g_return_val_if_fail (graphics->current_gstate != NULL, FALSE); - - gstate = hg_graphics_get_state(graphics); - render = hg_render_stroke_new(graphics->pool, - &gstate->snapshot_matrix, - gstate->path->node, - &gstate->color, - gstate->line_width, - gstate->line_cap, - gstate->line_join, - gstate->miter_limit, - gstate->dashline_offset, - gstate->dashline_pattern); - if (render == NULL) - return FALSE; - hg_page_append_node(graphics->current_page, render); - hg_path_clear(gstate->path, FALSE); - /* snapshot_matrix needs to be updated because - * path might has HG_PATH_MATRIX and this operator initializes it. - * it won't be tracable then. - */ - memcpy(&gstate->snapshot_matrix, &gstate->ctm, sizeof (HgMatrix)); - - return TRUE; -} - -/* state */ -gboolean -hg_graphic_state_set_linewidth(HgGraphicState *gstate, - gdouble width) -{ - g_return_val_if_fail (gstate != NULL, FALSE); - - gstate->line_width = width; - - return TRUE; -} - -/* debugging support */ -gboolean -hg_graphics_debug(HgGraphics *graphics, - HgDebugFunc func, - gpointer data) -{ - HgRender *render; - - g_return_val_if_fail (graphics != NULL, FALSE); - g_return_val_if_fail (graphics->current_gstate != NULL, FALSE); - g_return_val_if_fail (func != NULL, FALSE); - - render = hg_render_debug_new(graphics->pool, func, data); - if (render == NULL) - return FALSE; - hg_page_append_node(graphics->current_page, render); - - return TRUE; -} diff --git a/hieroglyph/hggraphics.h b/hieroglyph/hggraphics.h deleted file mode 100644 index 58ae460..0000000 --- a/hieroglyph/hggraphics.h +++ /dev/null @@ -1,114 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* - * hggraphics.h - * Copyright (C) 2006 Akira TAGOH - * - * Authors: - * Akira TAGOH <at@gclab.org> - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - */ -#ifndef __HG_GRAPHICS_H__ -#define __HG_GRAPHICS_H__ - -#include <hieroglyph/hgtypes.h> - -G_BEGIN_DECLS - - -#define hg_graphics_get_state(graphics_) ((graphics_)->current_gstate) - -HgGraphics *hg_graphics_new (HgMemPool *pool); -gboolean hg_graphics_init (HgGraphics *graphics); -gboolean hg_graphics_initclip (HgGraphics *graphics); -gboolean hg_graphics_set_page_size (HgGraphics *graphics, - HgPageSize size); -gboolean hg_graphics_set_graphic_size(HgGraphics *graphics, - gdouble width, - gdouble height); -gboolean hg_graphics_show_page (HgGraphics *graphics); -gboolean hg_graphics_save (HgGraphics *graphics); -gboolean hg_graphics_restore (HgGraphics *graphics); - -/* matrix */ -gboolean hg_graphics_matrix_rotate (HgGraphics *graphics, - gdouble angle); -gboolean hg_graphics_matrix_scale (HgGraphics *graphics, - gdouble x, - gdouble y); -gboolean hg_graphics_matrix_translate(HgGraphics *graphics, - gdouble x, - gdouble y); - -/* path */ -gboolean hg_graphic_state_path_new (HgGraphicState *gstate); -gboolean hg_graphic_state_path_close (HgGraphicState *gstate); -gboolean hg_graphic_state_path_from_clip (HgGraphicState *gstate); -gboolean hg_graphic_state_get_bbox_from_path(HgGraphicState *gstate, - gboolean ignore_moveto, - HgPathBBox *bbox); -gboolean hg_graphic_state_path_moveto (HgGraphicState *gstate, - gdouble x, - gdouble y); -gboolean hg_graphic_state_path_lineto (HgGraphicState *gstate, - gdouble x, - gdouble y); -gboolean hg_graphic_state_path_rlineto (HgGraphicState *gstate, - gdouble x, - gdouble y); -gboolean hg_graphic_state_path_curveto (HgGraphicState *gstate, - gdouble x1, - gdouble y1, - gdouble x2, - gdouble y2, - gdouble x3, - gdouble y3); -gboolean hg_graphic_state_path_arc (HgGraphicState *gstate, - gdouble x, - gdouble y, - gdouble r, - gdouble angle1, - gdouble angle2); - -/* color */ -gboolean hg_graphic_state_color_set_rgb(HgGraphicState *graphics, - gdouble red, - gdouble green, - gdouble blue); -gboolean hg_graphic_state_color_set_hsv(HgGraphicState *graphics, - gdouble hue, - gdouble saturation, - gdouble value); - -/* rendering */ -gboolean hg_graphics_render_eofill(HgGraphics *graphics); -gboolean hg_graphics_render_fill (HgGraphics *graphics); -gboolean hg_graphics_render_stroke(HgGraphics *graphics); - -/* state */ -HgGraphicState *hg_graphic_state_new (HgMemPool *pool); -gboolean hg_graphic_state_set_linewidth(HgGraphicState *graphics, - gdouble width); - -/* debugging support */ -gboolean hg_graphics_debug(HgGraphics *graphics, - HgDebugFunc func, - gpointer data); - - -G_END_DECLS - -#endif /* __HG_GRAPHICS_H__ */ diff --git a/hieroglyph/hglineedit.c b/hieroglyph/hglineedit.c deleted file mode 100644 index 8ba8339..0000000 --- a/hieroglyph/hglineedit.c +++ /dev/null @@ -1,341 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* - * hglineedit.c - * Copyright (C) 2006 Akira TAGOH - * - * Authors: - * Akira TAGOH <at@gclab.org> - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - */ -#ifdef HAVE_CONFIG_H -#include <config.h> -#endif - -#include <stdlib.h> -#include <string.h> -#include <errno.h> -#include "hglineedit.h" -#include "hgfile.h" -#include "hglog.h" -#include "hgmem.h" - - -static void _hg_line_edit_real_set_flags (gpointer data, - guint flags); -static void _hg_line_edit_real_relocate (gpointer data, - HgMemRelocateInfo *info); -static gchar *_hg_line_edit__default_get_line (HgLineEdit *lineedit, - const gchar *prompt); -static void _hg_line_edit__default_add_history (HgLineEdit *lineedit, - const gchar *strings); -static void _hg_line_edit__default_load_history(HgLineEdit *lineedit, - const gchar *filename); -static void _hg_line_edit__default_save_history(HgLineEdit *lineedit, - const gchar *filename); - - -struct _HieroGlyphLineEdit { - HgObject object; - const HgLineEditVTable *vtable; - HgFileObject *stdin; - HgFileObject *stdout; -}; - -static HgObjectVTable __hg_line_edit_vtable = { - .free = NULL, - .set_flags = _hg_line_edit_real_set_flags, - .relocate = _hg_line_edit_real_relocate, - .dup = NULL, - .copy = NULL, - .to_string = NULL, -}; -static const HgLineEditVTable __hg_line_edit_default_vtable = { - .get_line = _hg_line_edit__default_get_line, - .add_history = _hg_line_edit__default_add_history, - .load_history = _hg_line_edit__default_load_history, - .save_history = _hg_line_edit__default_save_history, -}; - -/* - * Private Functions - */ -static void -_hg_line_edit_real_set_flags(gpointer data, - guint flags) -{ - HgLineEdit *lineedit = data; - HgMemObject *obj; - - hg_mem_get_object__inline(lineedit->stdin, obj); - if (obj == NULL) { - hg_log_warning("[BUG] Invalid object %p to be marked: HgLineEdit", lineedit->stdin); - } else { - hg_mem_add_flags__inline(obj, flags, TRUE); - } - hg_mem_get_object__inline(lineedit->stdout, obj); - if (obj == NULL) { - hg_log_warning("[BUG] Invalid object %p to be marked: HgLineEdit", lineedit->stdout); - } else { - hg_mem_add_flags__inline(obj, flags, TRUE); - } -} - -static void -_hg_line_edit_real_relocate(gpointer data, - HgMemRelocateInfo *info) -{ - HgLineEdit *lineedit = data; - - if ((gsize)lineedit->stdin >= info->start && - (gsize)lineedit->stdin <= info->end) { - lineedit->stdin = (HgFileObject *)((gsize)lineedit->stdin + info->diff); - } - if ((gsize)lineedit->stdout >= info->start && - (gsize)lineedit->stdout <= info->end) { - lineedit->stdout = (HgFileObject *)((gsize)lineedit->stdout + info->diff); - } -} - -static gchar * -_hg_line_edit__default_get_line(HgLineEdit *lineedit, - const gchar *prompt) -{ - gchar c; - gboolean cr = FALSE; - GString *buf = g_string_new(NULL); - gint error; - - if (prompt) { - hg_file_object_write(lineedit->stdout, prompt, sizeof (gchar), strlen(prompt)); - hg_file_object_flush(lineedit->stdout); - } - while (1) { - c = hg_file_object_getc(lineedit->stdin); - error = hg_file_object_get_error(lineedit->stdin); - if (error == EAGAIN) { - sleep(1); - continue; - } else if (error == EBADF) { - g_string_free(buf, TRUE); - return NULL; - } else if (error != 0) { - g_print("FIXME: errno %d: %s\n", errno, strerror(errno)); - break; - } - if (hg_file_object_is_eof(lineedit->stdin)) { - g_string_free(buf, TRUE); - return NULL; - } - if (c == '\r') { - cr = TRUE; - continue; - } else if (c == '\n') { - break; - } else { - if (cr) { - hg_file_object_ungetc(lineedit->stdin, c); - break; - } - g_string_append_c(buf, c); - } - } - - return g_string_free(buf, FALSE); -} - -static void -_hg_line_edit__default_add_history(HgLineEdit *lineedit, - const gchar *strings) -{ -} - -static void -_hg_line_edit__default_load_history(HgLineEdit *lineedit, - const gchar *filename) -{ -} - -static void -_hg_line_edit__default_save_history(HgLineEdit *lineedit, - const gchar *filename) -{ -} - -/* - * Public Functions - */ -HgLineEdit * -hg_line_edit_new(HgMemPool *pool, - const HgLineEditVTable *vtable, - HgFileObject *stdin, - HgFileObject *stdout) -{ - HgLineEdit *retval; - - g_return_val_if_fail (pool != NULL, NULL); - g_return_val_if_fail (stdin != NULL, NULL); - g_return_val_if_fail (stdout != NULL, NULL); - - retval = hg_mem_alloc_with_flags(pool, sizeof (HgLineEdit), HG_FL_HGOBJECT); - if (retval == NULL) - return NULL; - HG_OBJECT_INIT_STATE (&retval->object); - HG_OBJECT_SET_STATE (&retval->object, hg_mem_pool_get_default_access_mode(pool)); - hg_object_set_vtable(&retval->object, &__hg_line_edit_vtable); - - if (vtable == NULL) { - retval->vtable = &__hg_line_edit_default_vtable; - } else { - retval->vtable = vtable; - } - retval->stdin = stdin; - retval->stdout = stdout; - - return retval; -} - -gchar * -hg_line_edit_get_line(HgLineEdit *lineedit, - const gchar *prompt, - gboolean history) -{ - gchar *retval; - const HgLineEditVTable *vtable; - - g_return_val_if_fail (lineedit != NULL, NULL); - g_return_val_if_fail (lineedit->vtable != NULL, NULL); - g_return_val_if_fail (lineedit->vtable->get_line != NULL, NULL); - g_return_val_if_fail (lineedit->vtable->add_history != NULL, NULL); - - if (HG_FILE_GET_FILE_TYPE (lineedit->stdin) != HG_FILE_TYPE_STDIN) { - vtable = &__hg_line_edit_default_vtable; - } else { - vtable = lineedit->vtable; - } - retval = vtable->get_line(lineedit, prompt); - if (retval != NULL && history) - vtable->add_history(lineedit, retval); - - return retval; -} - -gchar * -hg_line_edit_get_statement(HgLineEdit *lineedit, - const gchar *prompt) -{ - gchar *line, *retval, *p; - gint array_nest = 0, string_nest = 0; - size_t len, i; - const HgLineEditVTable *vtable; - - g_return_val_if_fail (lineedit != NULL, NULL); - g_return_val_if_fail (lineedit->vtable != NULL, NULL); - g_return_val_if_fail (lineedit->vtable->add_history != NULL, NULL); - - retval = g_strdup(""); - line = hg_line_edit_get_line(lineedit, prompt, FALSE); - if (line == NULL) - return retval; - while (1) { - len = strlen(line); - for (i = 0; i < len; i++) { - if (line[i] == '(') - string_nest++; - else if (line[i] == ')') - string_nest--; - if (string_nest < 0) - string_nest = 0; - if (string_nest > 0) - continue; - if (line[i] == '{') - array_nest++; - else if (line[i] == '}') - array_nest--; - if (array_nest < 0) - array_nest = 0; - } - p = g_strconcat(retval, line, "\n", NULL); - g_free(retval); - free(line); - retval = p; - if (string_nest == 0 && array_nest == 0) - break; - line = hg_line_edit_get_line(lineedit, "", FALSE); - if (line == NULL) - return retval; - } - p = g_strdup(retval); - g_strchomp(p); - len = strlen(p); - if (len > 0) { - if (HG_FILE_GET_FILE_TYPE (lineedit->stdin) != HG_FILE_TYPE_STDIN) { - vtable = &__hg_line_edit_default_vtable; - } else { - vtable = lineedit->vtable; - } - vtable->add_history(lineedit, p); - } - g_free(p); - - return retval; -} - -gboolean -hg_line_edit_load_history(HgLineEdit *lineedit, - const gchar *filename) -{ - g_return_val_if_fail (lineedit != NULL, FALSE); - g_return_val_if_fail (lineedit->vtable != NULL, FALSE); - g_return_val_if_fail (lineedit->vtable->load_history != NULL, FALSE); - g_return_val_if_fail (filename != NULL, FALSE); - - lineedit->vtable->load_history(lineedit, filename); - - return TRUE; -} - -gboolean -hg_line_edit_save_history(HgLineEdit *lineedit, - const gchar *filename) -{ - g_return_val_if_fail (lineedit != NULL, FALSE); - g_return_val_if_fail (lineedit->vtable != NULL, FALSE); - g_return_val_if_fail (lineedit->vtable->save_history != NULL, FALSE); - g_return_val_if_fail (filename != NULL, FALSE); - - lineedit->vtable->save_history(lineedit, filename); - - return TRUE; -} - -void -hg_line_edit_set_stdin(HgLineEdit *lineedit, - HgFileObject *stdin) -{ - g_return_if_fail (lineedit != NULL); - - lineedit->stdin = stdin; -} - -void -hg_line_edit_set_stdout(HgLineEdit *lineedit, - HgFileObject *stdout) -{ - g_return_if_fail (lineedit != NULL); - - lineedit->stdout = stdout; -} diff --git a/hieroglyph/hglineedit.h b/hieroglyph/hglineedit.h deleted file mode 100644 index 4a29c5e..0000000 --- a/hieroglyph/hglineedit.h +++ /dev/null @@ -1,55 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* - * hglineedit.h - * Copyright (C) 2006 Akira TAGOH - * - * Authors: - * Akira TAGOH <at@gclab.org> - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - */ -#ifndef __HG_LINEEDIT_H__ -#define __HG_LINEEDIT_H__ - -#include <hieroglyph/hgtypes.h> - - -G_BEGIN_DECLS - - -HgLineEdit *hg_line_edit_new (HgMemPool *pool, - const HgLineEditVTable *vtable, - HgFileObject *stdin, - HgFileObject *stdout); -gchar *hg_line_edit_get_line (HgLineEdit *lineedit, - const gchar *prompt, - gboolean history); -gchar *hg_line_edit_get_statement(HgLineEdit *lineedit, - const gchar *prompt); -gboolean hg_line_edit_load_history (HgLineEdit *lineedit, - const gchar *filename); -gboolean hg_line_edit_save_history (HgLineEdit *lineedit, - const gchar *filename); -void hg_line_edit_set_stdin (HgLineEdit *lineedit, - HgFileObject *stdin); -void hg_line_edit_set_stdout (HgLineEdit *lineedit, - HgFileObject *stdout); - - -G_END_DECLS - - -#endif /* __HG_LINEEDIT_H__ */ diff --git a/hieroglyph/hglist.c b/hieroglyph/hglist.c deleted file mode 100644 index 43225e8..0000000 --- a/hieroglyph/hglist.c +++ /dev/null @@ -1,782 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* - * hglist.c - * Copyright (C) 2006 Akira TAGOH - * - * Authors: - * Akira TAGOH <at@gclab.org> - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - */ -#ifdef HAVE_CONFIG_H -#include <config.h> -#endif - -#include "hglist.h" -#include "hglog.h" -#include "hgmem.h" -#include "hgallocator-bfit.h" - - -#define HG_LIST_POOL_SIZE 16384 - -enum { - HG_LIST_MASK_UNUSED = 1 << 0, - HG_LIST_MASK_LAST_NODE = 1 << 1, - HG_LIST_MASK_OBJECT_NODE = 1 << 2, -}; - -struct _HieroGlyphList { - HgObject object; - HgList *prev; - HgList *next; - gpointer data; -}; - -struct _HieroGlyphListIter { - HgObject object; - HgList *top; - HgList *last; - HgList *current; - gint32 index; -}; - -#define hg_list_next(_list) ((_list)->next) -#define hg_list_previous(_list) ((_list)->prev) - -#define HG_LIST_GET_USER_DATA(_obj, _mask) \ - (HG_OBJECT_GET_USER_DATA ((HgObject *)(_obj)) & _mask) -#define HG_LIST_SET_USER_DATA(_obj, _mask, _flag) \ - if (_flag) { \ - HG_OBJECT_SET_USER_DATA ((HgObject *)(_obj), \ - (HG_LIST_GET_USER_DATA (_obj, 0xff & ~(_mask)) | \ - _mask)); \ - } else { \ - HG_OBJECT_SET_USER_DATA ((HgObject *)(_obj), \ - (HG_LIST_GET_USER_DATA (_obj, 0xff & ~(_mask)) & \ - ~(_mask))); \ - } -#define HG_LIST_SET_UNUSED(_obj, _flag) \ - HG_LIST_SET_USER_DATA (_obj, HG_LIST_MASK_UNUSED, _flag) -#define HG_LIST_IS_UNUSED(_obj) \ - (HG_LIST_GET_USER_DATA (_obj, HG_LIST_MASK_UNUSED) != 0) -#define HG_LIST_SET_LAST_NODE(_obj, _flag) \ - HG_LIST_SET_USER_DATA (_obj, HG_LIST_MASK_LAST_NODE, _flag) -#define HG_LIST_IS_LAST_NODE(_obj) \ - (HG_LIST_GET_USER_DATA (_obj, HG_LIST_MASK_LAST_NODE) != 0) -#define HG_LIST_SET_OBJECT_NODE(_obj, _flag) \ - HG_LIST_SET_USER_DATA (_obj, HG_LIST_MASK_OBJECT_NODE, _flag) -#define HG_LIST_IS_OBJECT_NODE(_obj) \ - (HG_LIST_GET_USER_DATA (_obj, HG_LIST_MASK_OBJECT_NODE) != 0) - - -static void _hg_list_real_set_flags (gpointer data, - guint flags); -static void _hg_list_real_relocate (gpointer data, - HgMemRelocateInfo *info); -static void _hg_list_iter_real_set_flags(gpointer data, - guint flags); -static void _hg_list_iter_real_relocate (gpointer data, - HgMemRelocateInfo *info); - - -static HgObjectVTable __hg_list_vtable = { - .free = NULL, - .set_flags = _hg_list_real_set_flags, - .relocate = _hg_list_real_relocate, - .dup = NULL, - .copy = NULL, - .to_string = NULL, -}; -static HgObjectVTable __hg_list_iter_vtable = { - .free = NULL, - .set_flags = _hg_list_iter_real_set_flags, - .relocate = _hg_list_iter_real_relocate, - .dup = NULL, - .copy = NULL, - .to_string = NULL, -}; -static HgAllocator *__hg_list_allocator = NULL; -static HgMemPool *__hg_list_pool = NULL; -static gboolean __hg_list_initialized = FALSE; - -/* - * Private Functions - */ -static void -_hg_list_real_set_flags(gpointer data, - guint flags) -{ - HgList *list = data, *tmp; - HgMemObject *obj; - - if (list->data && HG_LIST_IS_OBJECT_NODE (list)) { - hg_mem_get_object__inline(list->data, obj); - if (obj == NULL) { - hg_log_warning("[BUG] Invalid object %p to be marked: HgList data", - list->data); - } else { - if (!hg_mem_is_flags__inline(obj, flags)) - hg_mem_add_flags__inline(obj, flags, TRUE); - } - } - if ((tmp = hg_list_next(list)) != NULL) { - hg_mem_get_object__inline(tmp, obj); - if (obj == NULL) { - hg_log_warning("[BUG] Invalid object %p to be marked: HgList next node", tmp); - } else { - if (!hg_mem_is_flags__inline(obj, flags)) - hg_mem_add_flags__inline(obj, flags, TRUE); - } - } - if ((tmp = hg_list_previous(list)) != NULL) { - hg_mem_get_object__inline(tmp, obj); - if (obj == NULL) { - hg_log_warning("[BUG] Invalid object %p to be marked: HgList previous node", tmp); - } else { - if (!hg_mem_is_flags__inline(obj, flags)) - hg_mem_add_flags__inline(obj, flags, TRUE); - } - } -} - -static void -_hg_list_real_relocate(gpointer data, - HgMemRelocateInfo *info) -{ - HgList *list = data; - - if (list->data && HG_LIST_IS_OBJECT_NODE (list)) { - if ((gsize)list->data >= info->start && - (gsize)list->data <= info->end) { - list->data = (gpointer)((gsize)list->data + info->diff); - } - } - if (hg_list_next(list)) { - if ((gsize)hg_list_next(list) >= info->start && - (gsize)hg_list_next(list) <= info->end) { - hg_list_next(list) = (gpointer)((gsize)hg_list_next(list) + info->diff); - } - } - if (hg_list_previous(list)) { - if ((gsize)hg_list_previous(list) >= info->start && - (gsize)hg_list_previous(list) <= info->end) { - hg_list_previous(list) = (gpointer)((gsize)hg_list_previous(list) + info->diff); - } - } -} - -static void -_hg_list_iter_real_set_flags(gpointer data, - guint flags) -{ - HgListIter iter = data; - HgMemObject *obj; - - hg_mem_get_object__inline(iter->top, obj); - if (obj == NULL) { - hg_log_warning("[BUG] Invalid object %p to be marked: HgListIter top node", iter->top); - } else { - if (!hg_mem_is_flags__inline(obj, flags)) - hg_mem_add_flags__inline(obj, flags, TRUE); - } - hg_mem_get_object__inline(iter->last, obj); - if (obj == NULL) { - hg_log_warning("[BUG] Invalid object %p to be marked: HgListIter last node", iter->last); - } else { - if (!hg_mem_is_flags__inline(obj, flags)) - hg_mem_add_flags__inline(obj, flags, TRUE); - } - hg_mem_get_object__inline(iter->current, obj); - if (obj == NULL) { - hg_log_warning("[BUG] Invalid object %p to be marked: HgListIter current node", iter->current); - } else { - if (!hg_mem_is_flags__inline(obj, flags)) - hg_mem_add_flags__inline(obj, flags, TRUE); - } -} - -static void -_hg_list_iter_real_relocate(gpointer data, - HgMemRelocateInfo *info) -{ - HgListIter iter = data; - - if ((gsize)iter->top >= info->start && - (gsize)iter->top <= info->end) { - iter->top = (gpointer)((gsize)iter->top + info->diff); - } - if ((gsize)iter->last >= info->start && - (gsize)iter->last <= info->end) { - iter->last = (gpointer)((gsize)iter->last + info->diff); - } - if ((gsize)iter->current >= info->start && - (gsize)iter->current <= info->end) { - iter->current = (gpointer)((gsize)iter->current + info->diff); - } -} - -static HgList * -_hg_list_get_last_node(HgList *list) -{ - HgList *tmp = list; - - g_return_val_if_fail (list != NULL, NULL); - - /* assume that the initial position may be the top node */ - while (tmp) { - if (HG_LIST_IS_UNUSED (tmp)) { - /* validate node */ - if (hg_list_next(tmp) != NULL || - hg_list_previous(tmp) != NULL) { - /* found incomplete node */ - hg_log_warning("[BUG] incomplete HgList node %p found.", tmp); - } else { - /* this can be used as the last node */ - return tmp; - } - } else { - if (HG_LIST_IS_LAST_NODE (tmp)) { - return tmp; - } - } - tmp = hg_list_previous(tmp); - /* validate node */ - if (tmp == list) { - /* detected the circular reference */ - hg_log_warning("[BUG] Circular reference happened without the last node mark: %p", - list); - /* workaround */ - return hg_list_previous(list); - } - } - - return NULL; -} - -static HgList * -_hg_list_get_top_node(HgList *list) -{ - HgList *retval; - - g_return_val_if_fail (list != NULL, NULL); - - retval = _hg_list_get_last_node(list); - if (retval != NULL) { - retval = hg_list_next(retval); - } - - return retval; -} - -static HgList * -_hg_list_real_append(HgList *list, - gpointer data, - gboolean is_object) -{ - HgMemObject *obj; - HgList *tmp, *last, *top; - - g_return_val_if_fail (list != NULL, NULL); - - if ((last = _hg_list_get_last_node(list)) != NULL) { - if (!HG_LIST_IS_UNUSED (last)) { - hg_mem_get_object__inline(last, obj); - if (obj == NULL) { - hg_log_warning("[BUG] Invalid object %p is given to append a list.", - last); - return NULL; - } - tmp = hg_list_new(obj->pool); - top = hg_list_next(last); - hg_list_next(tmp) = top; - hg_list_next(last) = tmp; - hg_list_previous(top) = tmp; - hg_list_previous(tmp) = last; - HG_LIST_SET_LAST_NODE (last, FALSE); - list = top; - } else { - tmp = list; - hg_list_next(tmp) = tmp; - hg_list_previous(tmp) = tmp; - } - tmp->data = data; - HG_LIST_SET_LAST_NODE (tmp, TRUE); - HG_LIST_SET_UNUSED (tmp, FALSE); - HG_LIST_SET_OBJECT_NODE (tmp, is_object); - } - - return list; -} - -static HgList * -_hg_list_real_prepend(HgList *list, - gpointer data, - gboolean is_object) -{ - HgMemObject *obj; - HgList *tmp, *last, *top; - - g_return_val_if_fail (list != NULL, NULL); - - if ((top = _hg_list_get_top_node(list)) != NULL) { - if (!HG_LIST_IS_UNUSED (top)) { - hg_mem_get_object__inline(top, obj); - if (obj == NULL) { - hg_log_warning("[BUG] Invalid object %p is given to prepend a list.", - top); - return NULL; - } - tmp = hg_list_new(obj->pool); - last = hg_list_previous(top); - hg_list_next(last) = tmp; - hg_list_next(tmp) = top; - hg_list_previous(top) = tmp; - hg_list_previous(tmp) = last; - list = tmp; - } else { - tmp = list; - hg_list_next(tmp) = tmp; - hg_list_previous(tmp) = tmp; - } - tmp->data = data; - HG_LIST_SET_UNUSED (tmp, FALSE); - HG_LIST_SET_OBJECT_NODE (tmp, is_object); - } - - return list; -} - -static void -_hg_list_iter_real_set_data(HgListIter iter, - gpointer data, - gboolean is_object) -{ - g_return_if_fail (iter != NULL); - - iter->current->data = data; - HG_LIST_SET_OBJECT_NODE (iter->current, is_object); -} - -/* - * Public Functions - */ -void -hg_list_init(void) -{ - if (!__hg_list_initialized) { - hg_mem_init(); - __hg_list_allocator = hg_allocator_new(hg_allocator_bfit_get_vtable()); - __hg_list_pool = hg_mem_pool_new(__hg_list_allocator, - "HgList Pool", - HG_LIST_POOL_SIZE, HG_MEM_GLOBAL | HG_MEM_RESIZABLE); - hg_mem_pool_use_garbage_collection(__hg_list_pool, FALSE); - __hg_list_initialized = TRUE; - } -} - -void -hg_list_finalize(void) -{ - if (__hg_list_initialized) { - hg_mem_pool_destroy(__hg_list_pool); - hg_allocator_destroy(__hg_list_allocator); - __hg_list_initialized = FALSE; - } -} - -HgList * -hg_list_new(HgMemPool *pool) -{ - HgList *retval; - - retval = hg_mem_alloc_with_flags(pool, sizeof (HgList), - HG_FL_RESTORABLE | HG_FL_COMPLEX | HG_FL_HGOBJECT); - if (retval == NULL) - return NULL; - HG_OBJECT_INIT_STATE (&retval->object); - HG_OBJECT_SET_STATE (&retval->object, hg_mem_pool_get_default_access_mode(pool)); - hg_object_set_vtable(&retval->object, &__hg_list_vtable); - - HG_LIST_SET_UNUSED (&retval->object, TRUE); - hg_list_next(retval) = NULL; - hg_list_previous(retval) = NULL; - retval->data = NULL; - - return retval; -} - -HgList * -hg_list_append(HgList *list, - gpointer data) -{ - return _hg_list_real_append(list, data, FALSE); -} - -HgList * -hg_list_append_object(HgList *list, - HgObject *hobject) -{ - return _hg_list_real_append(list, hobject, TRUE); -} - -HgList * -hg_list_prepend(HgList *list, - gpointer data) -{ - return _hg_list_real_prepend(list, data, FALSE); -} - -HgList * -hg_list_prepend_object(HgList *list, - HgObject *hobject) -{ - return _hg_list_real_prepend(list, hobject, TRUE); -} - -guint -hg_list_length(HgList *list) -{ - guint retval = 0; - HgList *l = list; - - g_return_val_if_fail (list != NULL, 0); - - do { - l = hg_list_next(l); - retval++; - } while (l && l != list); - - /* validate node */ - if (l == NULL) { - hg_log_warning("[BUG] no loop detected in HgList %p", list); - } - - return retval; -} - -HgList * -hg_list_remove(HgList *list, - gpointer data) -{ - HgListIter iter; - - g_return_val_if_fail (list != NULL, NULL); - - iter = hg_list_iter_new(list); - do { - if (hg_list_iter_get_data(iter) == data) { - list = hg_list_iter_delete_link(iter); - break; - } - } while (hg_list_get_iter_next(list, iter)); - hg_list_iter_free(iter); - - return list; -} - -HgList * -hg_list_first(HgList *list) -{ - return _hg_list_get_top_node(list); -} - -HgList * -hg_list_last(HgList *list) -{ - return _hg_list_get_last_node(list); -} - -/* iterators */ -HgListIter -hg_list_iter_new(HgList *list) -{ - HgListIter iter; - - g_return_val_if_fail (list != NULL, NULL); - g_return_val_if_fail (hg_list_previous(list) != NULL, NULL); - g_return_val_if_fail (HG_LIST_IS_LAST_NODE (hg_list_previous(list)), NULL); - - if (!__hg_list_initialized) - hg_list_init(); - iter = hg_mem_alloc_with_flags(__hg_list_pool, sizeof (struct _HieroGlyphListIter), - HG_FL_RESTORABLE | HG_FL_COMPLEX | HG_FL_HGOBJECT); - if (iter == NULL) - return NULL; - HG_OBJECT_INIT_STATE (&iter->object); - HG_OBJECT_SET_STATE (&iter->object, hg_mem_pool_get_default_access_mode(__hg_list_pool)); - hg_object_set_vtable(&iter->object, &__hg_list_iter_vtable); - - iter->top = list; - iter->last = hg_list_previous(list); - iter->current = list; - iter->index = 0; - - return iter; -} - -gboolean -hg_list_get_iter_first(HgList *list, - HgListIter iter) -{ - g_return_val_if_fail (list != NULL, FALSE); - g_return_val_if_fail (iter != NULL, FALSE); - g_return_val_if_fail (iter->top == list, FALSE); - g_return_val_if_fail (iter->last == hg_list_previous(list), FALSE); - - iter->current = iter->top; - iter->index = 0; - - return TRUE; -} - -gboolean -hg_list_get_iter_next(HgList *list, - HgListIter iter) -{ - g_return_val_if_fail (list != NULL, FALSE); - g_return_val_if_fail (iter != NULL, FALSE); - g_return_val_if_fail (iter->top == list, FALSE); - g_return_val_if_fail (iter->last == hg_list_previous(list), FALSE); - g_return_val_if_fail (iter->index < G_MAXINT32, FALSE); - - iter->current = hg_list_next(iter->current); - if (iter->current == iter->top) - return FALSE; - iter->index++; - - return TRUE; -} - -gboolean -hg_list_get_iter_previous(HgList *list, - HgListIter iter) -{ - g_return_val_if_fail (list != NULL, FALSE); - g_return_val_if_fail (iter != NULL, FALSE); - g_return_val_if_fail (iter->top == list, FALSE); - g_return_val_if_fail (iter->last == hg_list_previous(list), FALSE); - g_return_val_if_fail (iter->index != 0, FALSE); - - iter->current = hg_list_previous(iter->current); - if (iter->current == iter->last) - return FALSE; - iter->index--; - - return TRUE; -} - -gboolean -hg_list_get_iter_last(HgList *list, - HgListIter iter) -{ - g_return_val_if_fail (list != NULL, FALSE); - g_return_val_if_fail (iter != NULL, FALSE); - g_return_val_if_fail (iter->top == list, FALSE); - g_return_val_if_fail (iter->last == hg_list_previous(list), FALSE); - - iter->current = hg_list_last(iter->current); - /* postpone to calculate current index */ - iter->index = -1; - - return TRUE; -} - -gpointer -hg_list_iter_get_data(HgListIter iter) -{ - g_return_val_if_fail (iter != NULL, NULL); - - return iter->current->data; -} - -void -hg_list_iter_set_data(HgListIter iter, - gpointer data) -{ - _hg_list_iter_real_set_data(iter, data, FALSE); -} - -void -hg_list_iter_set_object(HgListIter iter, - HgObject *hobject) -{ - _hg_list_iter_real_set_data(iter, hobject, TRUE); -} - -HgList * -hg_list_iter_delete_link(HgListIter iter) -{ - HgList *list, *next, *prev; - - g_return_val_if_fail (iter != NULL, NULL); - - prev = hg_list_previous(iter->current); - next = hg_list_next(iter->current); - hg_list_next(prev) = next; - hg_list_previous(next) = prev; - - if (HG_LIST_IS_LAST_NODE (iter->current)) { - HG_LIST_SET_LAST_NODE (iter->current, FALSE); - HG_LIST_SET_LAST_NODE (prev, TRUE); - HG_LIST_SET_UNUSED (iter->current, TRUE); - } - hg_list_next(iter->current) = NULL; - hg_list_previous(iter->current) = NULL; - if (iter->current == next) - iter->top = NULL; - else if (iter->current == iter->top) - iter->top = next; - list = iter->top; - iter->current = prev; - iter->index--; - - return list; -} - -gint32 -hg_list_iter_get_index(HgListIter iter) -{ - g_return_val_if_fail (iter != NULL, -1); - - if (iter->index < 0) - iter->index += hg_list_length(iter->top); - - return iter->index; -} - -HgList * -hg_list_iter_roll(HgListIter start, - HgListIter end, - guint n) -{ - guint n_blocks, start_offset, end_offset; - HgList *l, *beginning = NULL, *ending = NULL, *out_beginning = NULL, *out_ending = NULL; - - g_return_val_if_fail (start != NULL, NULL); - g_return_val_if_fail (end != NULL, NULL); - g_return_val_if_fail (start->top == end->top, NULL); - g_return_val_if_fail (start->last == end->last, NULL); - - if (n == 0) - return start->top; - - start_offset = hg_list_iter_get_index(start); - end_offset = hg_list_iter_get_index(end); - if (start_offset < end_offset) - n_blocks = end_offset - start_offset + 1; - else - n_blocks = start_offset - end_offset + 1; - - if (n_blocks == 0) - return start->top; - n %= n_blocks; - if (n != 0) { - HG_LIST_SET_LAST_NODE (start->last, FALSE); - if (start_offset < end_offset) { - out_beginning = hg_list_previous(start->current); - out_ending = hg_list_next(end->current); - hg_list_next(end->current) = start->current; - hg_list_previous(start->current) = end->current; - } else { - out_beginning = hg_list_previous(end->current); - out_ending = hg_list_next(start->current); - hg_list_previous(end->current) = start->current; - hg_list_next(start->current) = end->current; - } - if (out_beginning == start->last && - out_ending == start->top) { - out_beginning = NULL; - out_ending = NULL; - } - - if (start_offset > end_offset) { - for (l = start->current; n > 0; l = hg_list_next(l), n--); - beginning = hg_list_next(l); - ending = l; - } else { - for (l = start->current; n > 0; l = hg_list_previous(l), n--); - beginning = l; - ending = hg_list_previous(l); - } - if (out_beginning) { - hg_list_next(out_beginning) = beginning; - hg_list_previous(beginning) = out_beginning; - } - if (out_ending) { - hg_list_previous(out_ending) = ending; - hg_list_next(ending) = out_ending; - } - if (start_offset < end_offset) { - if (start->current == start->top) - start->top = end->top = beginning; - } else { - if (end->current == end->top) - start->top = end->top = beginning; - } - start->last = end->last = hg_list_previous(start->top); - HG_LIST_SET_LAST_NODE (start->last, TRUE); - } - - return start->top; -} - -HgListIter -hg_list_find_iter(HgList *list, - gconstpointer data) -{ - gpointer p; - HgListIter iter; - - g_return_val_if_fail (list != NULL, NULL); - - iter = hg_list_iter_new(list); - while (iter) { - p = hg_list_iter_get_data(iter); - if (p == data) - return iter; - if (!hg_list_get_iter_next(list, iter)) - break; - } - if (iter) - hg_list_iter_free(iter); - - return NULL; -} - -HgListIter -hg_list_find_iter_custom(HgList *list, - gconstpointer data, - HgCompareFunc func) -{ - gpointer p; - HgListIter iter; - - g_return_val_if_fail (list != NULL, NULL); - - iter = hg_list_iter_new(list); - while (iter) { - p = hg_list_iter_get_data(iter); - if (func(p, data)) - return iter; - if (!hg_list_get_iter_next(list, iter)) - break; - } - if (iter) - hg_list_iter_free(iter); - - return NULL; -} diff --git a/hieroglyph/hglist.h b/hieroglyph/hglist.h deleted file mode 100644 index f25c146..0000000 --- a/hieroglyph/hglist.h +++ /dev/null @@ -1,80 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* - * hglist.h - * Copyright (C) 2006 Akira TAGOH - * - * Authors: - * Akira TAGOH <at@gclab.org> - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - */ -#ifndef __HG_LIST_H__ -#define __HG_LIST_H__ - -#include <hieroglyph/hgtypes.h> - -G_BEGIN_DECLS - - -void hg_list_init (void); -void hg_list_finalize(void); - -HgList *hg_list_new (HgMemPool *pool); -HgList *hg_list_append (HgList *list, - gpointer data); -HgList *hg_list_append_object (HgList *list, - HgObject *hobject); -HgList *hg_list_prepend (HgList *list, - gpointer data); -HgList *hg_list_prepend_object(HgList *list, - HgObject *hobject); -guint hg_list_length (HgList *list); -HgList *hg_list_remove (HgList *list, - gpointer data); -HgList *hg_list_first (HgList *list); -HgList *hg_list_last (HgList *list); - -#define hg_list_iter_free hg_mem_free - -HgListIter hg_list_iter_new (HgList *list); -gboolean hg_list_get_iter_first (HgList *list, - HgListIter iter); -gboolean hg_list_get_iter_next (HgList *list, - HgListIter iter); -gboolean hg_list_get_iter_previous(HgList *list, - HgListIter iter); -gboolean hg_list_get_iter_last (HgList *list, - HgListIter iter); -HgListIter hg_list_find_iter (HgList *list, - gconstpointer data); -HgListIter hg_list_find_iter_custom (HgList *list, - gconstpointer data, - HgCompareFunc func); -gpointer hg_list_iter_get_data (HgListIter iter); -void hg_list_iter_set_data (HgListIter iter, - gpointer data); -void hg_list_iter_set_object (HgListIter iter, - HgObject *hobject); -HgList *hg_list_iter_delete_link (HgListIter iter); -gint32 hg_list_iter_get_index (HgListIter iter); -HgList *hg_list_iter_roll (HgListIter start, - HgListIter end, - guint n); - - -G_END_DECLS - -#endif /* __HG_LIST_H__ */ diff --git a/hieroglyph/hglog.c b/hieroglyph/hglog.c deleted file mode 100644 index cb28ac3..0000000 --- a/hieroglyph/hglog.c +++ /dev/null @@ -1,227 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* - * hglog.c - * Copyright (C) 2006 Akira TAGOH - * - * Authors: - * Akira TAGOH <at@gclab.org> - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - */ -#ifdef HAVE_CONFIG_H -#include <config.h> -#endif - -#include "hglog.h" -#include "hgallocator-bfit.h" -#include "hgdict.h" -#include "hgfile.h" -#include "hgmem.h" -#include "hgstring.h" -#include "hgvaluenode.h" - - -#define HG_LOG_POOL_SIZE 3000000 - -static void _hg_log_default_handler(HgLogType log_type, - const gchar *domain, - const gchar *subtype, - const gchar *message, - gpointer data); - -static gboolean __hg_log_initialized = FALSE; -static HgDict *__hg_log_options_dict = NULL; -static HgMemPool *__hg_log_mem_pool = NULL; -static HgAllocator *__hg_log_allocator = NULL; -static gchar const *log_type_to_string[] = { - "Info", - "Debug", - "Warning", - "Error", -}; -static HgLogFunc __hg_log_handler = _hg_log_default_handler; -static gpointer __hg_log_handler_data = NULL; - -/* - * Private Functions - */ -static void -_hg_log_default_handler(HgLogType log_type, - const gchar *domain, - const gchar *subtype, - const gchar *message, - gpointer data) -{ - gchar *header; - - header = hg_log_get_log_type_header(log_type, domain); - if (!hg_file_is_initialized()) { - g_printerr("%s ***%s%s%s %s\n\n", - header, - (subtype ? " " : ""), - (subtype ? subtype : ""), - (subtype ? ":" : ""), - message); - } else { - hg_stderr_printf("%s ***%s%s%s %s\n\n", - header, - (subtype ? " " : ""), - (subtype ? subtype : ""), - (subtype ? ":" : ""), - message); - } - g_free(header); -} - -/* - * Public Functions - */ -/* initializer */ -gboolean -hg_log_init(void) -{ - if (!__hg_log_initialized) { - __hg_log_allocator = hg_allocator_new(hg_allocator_bfit_get_vtable()); - __hg_log_mem_pool = hg_mem_pool_new(__hg_log_allocator, - "Memory pool for HgLog", - HG_LOG_POOL_SIZE, - HG_MEM_GLOBAL); - __hg_log_options_dict = hg_dict_new(__hg_log_mem_pool, - 65535); - hg_mem_pool_add_root_node(__hg_log_mem_pool, __hg_log_options_dict); - __hg_log_handler = _hg_log_default_handler; - - __hg_log_initialized = TRUE; - } - - return TRUE; -} - -void -hg_log_finalize(void) -{ - if (__hg_log_initialized) { - __hg_log_initialized = FALSE; -#ifdef DEBUG -#ifdef DEBUG_LOG_WITHOUT_LOGGER - hg_log_info("Masking logs are disabled now."); -#else - hg_log_info("Logging facilities are disabled now."); -#endif /* DEBUG_LOG_WITHOUT_LOGGER */ -#endif /* DEBUG */ - __hg_log_options_dict = NULL; - hg_mem_pool_destroy(__hg_log_mem_pool); - hg_allocator_destroy(__hg_log_allocator); - __hg_log_mem_pool = NULL; - __hg_log_allocator = NULL; - } -} - -/* utilities */ -void -hg_log_set_default_handler(HgLogFunc func, - gpointer user_data) -{ - g_return_if_fail (func); - - __hg_log_handler = func; - __hg_log_handler_data = user_data; -} - -void -hg_log_set_flag(const gchar *key, - gboolean val) -{ - HgValueNode *k, *v; - - g_return_if_fail (__hg_log_initialized); - g_return_if_fail (key != NULL); - - HG_VALUE_MAKE_NAME_STATIC (__hg_log_mem_pool, k, key); - HG_VALUE_MAKE_BOOLEAN (__hg_log_mem_pool, v, val); - hg_dict_insert(__hg_log_mem_pool, __hg_log_options_dict, k, v); -} - -gchar * -hg_log_get_log_type_header(HgLogType log_type, - const gchar *domain) -{ - gchar *retval; - - if (domain) - retval = g_strdup_printf("%s-%s", domain, log_type_to_string[log_type]); - else - retval = g_strdup(log_type_to_string[log_type]); - - return retval; -} - -void -hg_log(HgLogType log_type, - const gchar *domain, - const gchar *subtype, - const gchar *format, - ...) -{ - va_list ap; - - va_start(ap, format); - hg_logv(log_type, domain, subtype, format, ap); - va_end(ap); -} - -void -hg_logv(HgLogType log_type, - const gchar *domain, - const gchar *subtype, - const gchar *format, - va_list va_args) -{ - HgValueNode *node; - gchar *buffer = NULL; - - g_return_if_fail (format != NULL); - - buffer = g_strdup_vprintf(format, va_args); - if (subtype == NULL) { - /* just invoke a default handler */ - __hg_log_handler(log_type, domain, subtype, buffer, __hg_log_handler_data); - goto finalize; - } - - if (!__hg_log_initialized) { -#if defined(DEBUG) && defined(DEBUG_LOG_WITHOUT_LOGGER) - /* just invoke a default handler */ - __hg_log_handler(log_type, domain, subtype, buffer, __hg_log_handler_data); - goto finalize; -#endif /* DEBUG */ - } else if ((node = hg_dict_lookup_with_string(__hg_log_options_dict, subtype)) != NULL) { - if (HG_IS_VALUE_BOOLEAN (node)) { - if (HG_VALUE_GET_BOOLEAN (node)) { - /* just invoke a default handler */ - __hg_log_handler(log_type, domain, subtype, buffer, __hg_log_handler_data); - } - } else if (HG_IS_VALUE_OPERATOR (node) || - (HG_IS_VALUE_ARRAY (node) && hg_object_is_executable((HgObject *)node))) { - hg_log_warning("FIXME: not yet supported."); - } else { - hg_log_warning("Invalid object specified for logger."); - } - } - finalize:; - if (buffer) - g_free(buffer); -} diff --git a/hieroglyph/hglog.h b/hieroglyph/hglog.h deleted file mode 100644 index 9a6b868..0000000 --- a/hieroglyph/hglog.h +++ /dev/null @@ -1,74 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* - * hglog.h - * Copyright (C) 2006 Akira TAGOH - * - * Authors: - * Akira TAGOH <at@gclab.org> - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - */ -#ifndef __HG_LOG_H__ -#define __HG_LOG_H__ - -#include <hieroglyph/hgtypes.h> - -G_BEGIN_DECLS - - -typedef void (*HgLogFunc)(HgLogType log_type, - const gchar *domain, - const gchar *subtype, - const gchar *message, - gpointer user_data); - -#define hg_log_info(...) \ - hg_log(HG_LOG_TYPE_INFO, HG_LOG_DOMAIN, NULL, __VA_ARGS__) -#ifdef DEBUG -#define hg_log_debug(_type_, ...) \ - hg_log(HG_LOG_TYPE_DEBUG, HG_LOG_DOMAIN, #_type_, __VA_ARGS__) -#else -#define hg_log_debug(_type_, ...) -#endif /* DEBUG */ -#define hg_log_warning(...) \ - hg_log(HG_LOG_TYPE_WARNING, HG_LOG_DOMAIN, NULL, __VA_ARGS__) -#define hg_log_error(...) \ - hg_log(HG_LOG_TYPE_ERROR, HG_LOG_DOMAIN, NULL, __VA_ARGS__) - - -gboolean hg_log_init (void); -void hg_log_finalize (void); -void hg_log_set_default_handler(HgLogFunc func, - gpointer user_data); -void hg_log_set_flag (const gchar *key, - gboolean val); -gchar *hg_log_get_log_type_header(HgLogType log_type, - const gchar *domain) G_GNUC_MALLOC; -void hg_log (HgLogType log_type, - const gchar *domain, - const gchar *subtype, - const gchar *format, - ...); -void hg_logv (HgLogType log_type, - const gchar *domain, - const gchar *subtype, - const gchar *format, - va_list va_args); - - -G_END_DECLS - -#endif /* __HG_LOG_H__ */ diff --git a/hieroglyph/hgmacros.h b/hieroglyph/hgmacros.h index c406bbb..6083cf7 100644 --- a/hieroglyph/hgmacros.h +++ b/hieroglyph/hgmacros.h @@ -1,10 +1,10 @@ /* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ /* * hgmacros.h - * Copyright (C) 2006 Akira TAGOH + * Copyright (C) 2006-2007 Akira TAGOH * * Authors: - * Akira TAGOH <at@gclab.org> + * Akira TAGOH <akira@tagoh.org> * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -21,101 +21,103 @@ * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ -#ifndef __HG_MACROS_H__ -#define __HG_MACROS_H__ +#ifndef __HIEROGLYPH__HGMACROS_H__ +#define __HIEROGLYPH__HGMACROS_H__ -#include <glib.h> +#include <stdio.h> +#include <glib/gmacros.h> +#include <glib/gtypes.h> +#include <glib/gmem.h> +#include <glib/gmessages.h> +#include <hieroglyph/utils.h> -G_BEGIN_DECLS - -#define HG_MEM_HEADER 0x48474d4f -#define HG_CHECK_MAGIC_CODE(_obj, _magic) \ - ((_obj)->magic == (_magic)) -#define HG_SET_MAGIC_CODE(_obj, _magic) \ - ((_obj)->magic = (_magic)) -#define HG_STACK_INIT \ - gpointer __hg_stack_mark; \ - \ - hg_mem_init_stack_start(&__hg_stack_mark) -#define HG_SET_STACK_END \ - gpointer __hg_stack_mark; \ - \ - hg_mem_set_stack_end(&__hg_stack_mark) -#define HG_SET_STACK_END_AGAIN \ - hg_mem_set_stack_end(&__hg_stack_mark) -#define HG_MEM_INIT \ - HG_STACK_INIT; \ - hg_mem_init() - -#define HG_MEM_ALIGNMENT 4 +G_BEGIN_DECLS -/* HgMemObject */ -#define HG_MEMOBJ_HEAP_ID_MASK 0xff000000 -#define HG_MEMOBJ_MARK_AGE_MASK 0x00ff0000 -#define HG_MEMOBJ_SNAPSHOT_AGE_MASK 0x0000ff00 -#define HG_MEMOBJ_HGOBJECT_MASK 0x00000080 -#define HG_MEMOBJ_FLAGS_MASK 0x0000007f -#define HG_MEMOBJ_GET_HEAP_ID(_obj) (((_obj)->flags & HG_MEMOBJ_HEAP_ID_MASK) >> 24) -#define HG_MEMOBJ_SET_HEAP_ID(_obj, _id) \ - ((_obj)->flags = (((_id) << 24) & HG_MEMOBJ_HEAP_ID_MASK) \ - | (HG_MEMOBJ_GET_MARK_AGE (_obj) << 16) \ - | (HG_MEMOBJ_GET_SNAPSHOT_AGE (_obj) << 8) \ - | (HG_MEMOBJ_GET_HGOBJECT_ID (_obj) << 7) \ - | HG_MEMOBJ_GET_FLAGS (_obj)) -#define HG_MEMOBJ_GET_MARK_AGE(_obj) (((_obj)->flags & HG_MEMOBJ_MARK_AGE_MASK) >> 16) -#define HG_MEMOBJ_SET_MARK_AGE(_obj, _age) \ - ((_obj)->flags = (HG_MEMOBJ_GET_HEAP_ID (_obj) << 24) \ - | (((_age) << 16) & HG_MEMOBJ_MARK_AGE_MASK) \ - | (HG_MEMOBJ_GET_SNAPSHOT_AGE (_obj) << 8) \ - | (HG_MEMOBJ_GET_HGOBJECT_ID (_obj) << 7) \ - | HG_MEMOBJ_GET_FLAGS (_obj)) -#define HG_MEMOBJ_GET_SNAPSHOT_AGE(_obj) (((_obj)->flags & HG_MEMOBJ_SNAPSHOT_AGE_MASK) >> 8) -#define HG_MEMOBJ_SET_SNAPSHOT_AGE(_obj, _age) \ - ((_obj)->flags = (HG_MEMOBJ_GET_HEAP_ID (_obj) << 24) \ - | (HG_MEMOBJ_GET_MARK_AGE (_obj) << 16) \ - | (((_age) << 8) & HG_MEMOBJ_SNAPSHOT_AGE_MASK) \ - | (HG_MEMOBJ_GET_HGOBJECT_ID (_obj) << 7) \ - | HG_MEMOBJ_GET_FLAGS (_obj)) -#define HG_MEMOBJ_GET_HGOBJECT_ID(_obj) (((_obj)->flags & HG_MEMOBJ_HGOBJECT_MASK) >> 7) -#define HG_MEMOBJ_SET_HGOBJECT_ID(_obj) \ - ((_obj)->flags = (HG_MEMOBJ_GET_HEAP_ID (_obj) << 24) \ - | (HG_MEMOBJ_GET_MARK_AGE (_obj) << 16) \ - | (HG_MEMOBJ_GET_SNAPSHOT_AGE (_obj) << 8) \ - | HG_FL_HGOBJECT \ - | HG_MEMOBJ_GET_FLAGS (_obj)) -#define HG_MEMOBJ_GET_FLAGS(_obj) ((_obj)->flags & HG_MEMOBJ_FLAGS_MASK) -#define HG_MEMOBJ_SET_FLAGS(_obj, _flags) \ - ((_obj)->flags = (HG_MEMOBJ_GET_HEAP_ID (_obj) << 24) \ - | (HG_MEMOBJ_GET_MARK_AGE (_obj) << 16) \ - | (HG_MEMOBJ_GET_SNAPSHOT_AGE (_obj) << 8) \ - | (HG_MEMOBJ_GET_HGOBJECT_ID (_obj) << 7) \ - | ((_flags) & HG_MEMOBJ_FLAGS_MASK)) -#define HG_MEMOBJ_INIT_FLAGS(_obj) (_obj)->flags = 0; -#define HG_MEMOBJ_IS_HGOBJECT(_obj) (HG_MEMOBJ_GET_HGOBJECT_ID (_obj) == 1) +#define hg_n_alignof(_hg_n_) \ + ((((_hg_n_) / ALIGNOF_VOID_P) + (((_hg_n_) % ALIGNOF_VOID_P) ? 1 : 0)) * ALIGNOF_VOID_P) +#define hg_stacktrace() \ + G_STMT_START { \ + if (hg_is_stacktrace_enabled()) { \ + gchar *__stacktrace__ = hg_get_stacktrace(); \ + \ + fprintf(stderr, "Stacktraces:\n%s\n", __stacktrace__); \ + g_free(__stacktrace__); \ + } \ + } G_STMT_END +#ifdef __GNUC__ +#define _hg_return_after_eval_if_fail(__expr__,__eval__) \ + G_STMT_START { \ + if (G_LIKELY(__expr__)) { \ + } else { \ + g_return_if_fail_warning(G_LOG_DOMAIN, \ + __PRETTY_FUNCTION__, \ + #__expr__); \ + __eval__; \ + return; \ + } \ + } G_STMT_END +#define _hg_return_val_after_eval_if_fail(__expr__,__val__,__eval__) \ + G_STMT_START { \ + if (G_LIKELY(__expr__)) { \ + } else { \ + g_return_if_fail_warning(G_LOG_DOMAIN, \ + __PRETTY_FUNCTION__, \ + #__expr__); \ + __eval__; \ + return (__val__); \ + } \ + } G_STMT_END +#else /* !__GNUC__ */ +#define _hg_return_after_eval_if_fail(__expr__,__eval__) \ + G_STMT_START { \ + if (__expr__) { \ + } else { \ + g_log(G_LOG_DOMAIN, \ + G_LOG_LEVEL_CRITICAL, \ + "file %s: line %d: assertion `%s' failed", \ + __FILE__, \ + __LINE__, \ + #__expr__); \ + __eval__; \ + return; \ + } \ + } G_STMT_END +#define _hg_return_val_after_eval_if_fail(__expr__,__val__,__eval__) \ + G_STMT_START { \ + if (__expr__) { \ + } else { \ + g_log(G_LOG_DOMAIN, \ + G_LOG_LEVEL_CRITICAL, \ + "file %s: line %d: assertion `%s' failed", \ + __FILE__, \ + __LINE__, \ + #__expr__); \ + __eval__; \ + return (__val__); \ + } \ + } G_STMT_END +#endif /* __GNUC__ */ -/* HgObject */ -#define HG_OBJECT_VTABLE_ID_MASK 0xff000000 -#define HG_OBJECT_USER_DATA_MASK 0x00ff0000 -#define HG_OBJECT_STATE_MASK 0x0000ffff -#define HG_OBJECT_GET_VTABLE_ID(_obj) (((_obj)->state & HG_OBJECT_VTABLE_ID_MASK) >> 24) -#define HG_OBJECT_SET_VTABLE_ID(_obj, _id) \ - ((_obj)->state = (((_id) << 24) & HG_OBJECT_VTABLE_ID_MASK) \ - | (HG_OBJECT_GET_USER_DATA (_obj) << 16) \ - | HG_OBJECT_GET_STATE (_obj)) -#define HG_OBJECT_GET_USER_DATA(_obj) (((_obj)->state & HG_OBJECT_USER_DATA_MASK) >> 16) -#define HG_OBJECT_SET_USER_DATA(_obj, _data) \ - ((_obj)->state = (HG_OBJECT_GET_VTABLE_ID (_obj) << 24) \ - | (((_data) << 16) & HG_OBJECT_USER_DATA_MASK) \ - | HG_OBJECT_GET_STATE (_obj)) -#define HG_OBJECT_GET_STATE(_obj) ((_obj)->state & HG_OBJECT_STATE_MASK) -#define HG_OBJECT_SET_STATE(_obj,_state) \ - ((_obj)->state = (HG_OBJECT_GET_VTABLE_ID (_obj) << 24) \ - | (HG_OBJECT_GET_USER_DATA (_obj) << 16) \ - | ((_state) & HG_OBJECT_STATE_MASK)) -#define HG_OBJECT_INIT_STATE(_obj) ((_obj)->state = 0) +#ifdef DEBUG +#define hg_return_if_fail(__expr__) \ + _hg_return_after_eval_if_fail(__expr__,hg_stacktrace()) +#define hg_return_val_if_fail(__expr__,__val__) \ + _hg_return_val_after_eval_if_fail(__expr__,__val__,hg_stacktrace()) +#define hg_return_after_eval_if_fail(__expr__,__eval__) \ + _hg_return_after_eval_if_fail(__expr__,hg_stacktrace();__eval__) +#define hg_return_val_after_eval_if_fail(__expr__,__val__,__eval__) \ + _hg_return_val_after_eval_if_fail(__expr__,__val__,hg_stacktrace();__eval__) +#else /* !DEBUG */ +#define hg_return_if_fail(__expr__) g_return_if_fail(__expr__) +#define hg_return_val_if_fail(__expr__,__val__) g_return_val_if_fail(__expr__, __val__) +#define hg_return_after_eval_if_fail(__expr__,__eval__) \ + _hg_return_after_eval_if_fail(__expr__,__eval__) +#define hg_return_val_after_eval_if_fail(__expr__,__val__,__eval__) \ + _hg_return_val_after_eval_if_fail(__expr__, __val__,__eval__) +#endif /* DEBUG */ G_END_DECLS -#endif /* __HG_MACROS_H__ */ +#endif /* __HIEROGLYPH_HGMACROS_H__ */ diff --git a/hieroglyph/hgmatrix.c b/hieroglyph/hgmatrix.c deleted file mode 100644 index 02d540c..0000000 --- a/hieroglyph/hgmatrix.c +++ /dev/null @@ -1,113 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* - * hgmatrix.c - * Copyright (C) 2006 Akira TAGOH - * - * Authors: - * Akira TAGOH <at@gclab.org> - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - */ -#ifdef HAVE_CONFIG_H -#include <config.h> -#endif - -#include <math.h> -#include "hgmatrix.h" -#include "hgmem.h" - - -/* - * Private Functions - */ - -/* - * Public Functions - */ -HgMatrix * -hg_matrix_new(HgMemPool *pool, - gdouble xx, - gdouble yx, - gdouble xy, - gdouble yy, - gdouble x0, - gdouble y0) -{ - HgMatrix *retval; - - g_return_val_if_fail (pool != NULL, NULL); - - retval = hg_mem_alloc(pool, sizeof (HgMatrix)); - if (retval == NULL) - return NULL; - - retval->xx = xx; - retval->yx = yx; - retval->xy = xy; - retval->yy = yy; - retval->x0 = x0; - retval->y0 = y0; - - return retval; -} - -HgMatrix * -hg_matrix_multiply(HgMemPool *pool, - const HgMatrix *mtx1, - const HgMatrix *mtx2) -{ - gdouble xx, yx, xy, yy, x0, y0; - - g_return_val_if_fail (mtx1 != NULL, FALSE); - g_return_val_if_fail (mtx2 != NULL, FALSE); - - xx = mtx1->xx * mtx2->xx + mtx1->yx * mtx2->xy; - yx = mtx1->xx * mtx2->yx + mtx1->yx * mtx2->yy; - xy = mtx1->xy * mtx2->xx + mtx1->yy * mtx2->xy; - yy = mtx1->xy * mtx2->yx + mtx1->yy * mtx2->yy; - x0 = mtx1->x0 * mtx2->xx + mtx1->y0 * mtx2->xy + mtx2->x0; - y0 = mtx1->x0 * mtx2->yx + mtx1->y0 * mtx2->yy + mtx2->y0; - - return hg_matrix_new(pool, xx, yx, xy, yy, x0, y0); -} - -HgMatrix * -hg_matrix_rotate(HgMemPool *pool, - gdouble angle) -{ - gdouble c = cos(angle), s = sin(angle); - - return hg_matrix_new(pool, - c, s, - -s, c, - 0.0, 0.0); -} - -HgMatrix * -hg_matrix_scale(HgMemPool *pool, - gdouble x, - gdouble y) -{ - return hg_matrix_new(pool, x, 0.0, 0.0, y, 0.0, 0.0); -} - -HgMatrix * -hg_matrix_translate(HgMemPool *pool, - gdouble x, - gdouble y) -{ - return hg_matrix_new(pool, 1.0, 0.0, 0.0, 1.0, x, y); -} diff --git a/hieroglyph/hgmatrix.h b/hieroglyph/hgmatrix.h deleted file mode 100644 index 00bacba..0000000 --- a/hieroglyph/hgmatrix.h +++ /dev/null @@ -1,53 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* - * hgmatrix.h - * Copyright (C) 2006 Akira TAGOH - * - * Authors: - * Akira TAGOH <at@gclab.org> - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - */ -#ifndef __HG_MATRIX_H__ -#define __HG_MATRIX_H__ - -#include <hieroglyph/hgtypes.h> - -G_BEGIN_DECLS - -HgMatrix *hg_matrix_new (HgMemPool *pool, - gdouble xx, - gdouble yx, - gdouble xy, - gdouble yy, - gdouble x0, - gdouble y0); -HgMatrix *hg_matrix_multiply (HgMemPool *pool, - const HgMatrix *mtx1, - const HgMatrix *mtx2); -HgMatrix *hg_matrix_rotate (HgMemPool *pool, - gdouble angle); -HgMatrix *hg_matrix_scale (HgMemPool *pool, - gdouble x, - gdouble y); -HgMatrix *hg_matrix_translate(HgMemPool *pool, - gdouble x, - gdouble y); - - -G_END_DECLS - -#endif /* __HG_MATRIX_H__ */ diff --git a/hieroglyph/hgmem.c b/hieroglyph/hgmem.c deleted file mode 100644 index 401d6ed..0000000 --- a/hieroglyph/hgmem.c +++ /dev/null @@ -1,876 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* - * hgmem.c - * Copyright (C) 2005-2006 Akira TAGOH - * - * Authors: - * Akira TAGOH <at@gclab.org> - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - */ -#ifdef HAVE_CONFIG_H -#include <config.h> -#endif - -#include <ctype.h> -#include <fcntl.h> -#include <unistd.h> -#include "hgmem.h" -#include "ilist.h" -#include "hgallocator-private.h" -#include "hglog.h" - -#define VTABLE_TREE_N_NODE 3 - -gpointer _hg_stack_start = NULL; -gpointer _hg_stack_end = NULL; -static gboolean hg_mem_is_initialized = FALSE; -static GHashTable *_hg_object_vtable_tree = NULL; -static GPtrArray *_hg_object_vtable_array = NULL; - -G_LOCK_DEFINE_STATIC (hgobject); - -/* - * Private Functions - */ - -/* - * initializer - */ -#ifdef USE_SYSDEP_CODE -static void -_hg_mem_init_stack_start(void) -{ -#if 0 -#define STAT_BUFSIZE 4096 -#define STAT_SKIP 27 - int fd, i; - char stat_buffer[STAT_BUFSIZE]; - char c; - guint offset = 0; - gsize result = 0; - - if ((fd = open("/proc/self/stat", O_RDONLY)) == -1 || - read(fd, stat_buffer, STAT_BUFSIZE) < 2 * STAT_SKIP) { - hg_log_error("Failed to read /proc/self/stat"); - abort(); - } else { - c = stat_buffer[offset++]; - for (i = 0; i < STAT_SKIP; i++) { - while (isspace(c)) c = stat_buffer[offset++]; - while (!isspace(c)) c = stat_buffer[offset++]; - } - while (isspace(c)) c = stat_buffer[offset++]; - while (isdigit(c)) { - result *= 10; - result += c - '0'; - c = stat_buffer[offset++]; - } - close(fd); - if (result < 0x10000000) { - hg_log_error("the stack bottom may be invalid: %x.", result); - abort(); - } - _hg_stack_start = (gpointer)result; - } -#else - extern int *__libc_stack_end; - /* FIXME: the above code somehow doesn't work on valgrind */ - _hg_stack_start = __libc_stack_end; -#endif -} -#endif - -/* memory pool */ -static void -_hg_mem_pool_free(HgMemPool *pool) -{ - gint i; - - for (i = 0; i < pool->n_heaps; i++) { - HgHeap *heap = g_ptr_array_index(pool->heap_list, i); - - hg_heap_free(heap); - } - g_free(pool->name); - g_ptr_array_free(pool->heap_list, TRUE); - g_free(pool); -} - -/* - * Public Functions - */ - -/* allocator */ -HgAllocator * -hg_allocator_new(const HgAllocatorVTable *vtable) -{ - HgAllocator *retval; - - retval = g_new(HgAllocator, 1); - retval->private = NULL; - retval->used = FALSE; - retval->vtable = vtable; - - return retval; -} - -void -hg_allocator_destroy(HgAllocator *allocator) -{ - g_return_if_fail (allocator != NULL); - g_return_if_fail (!allocator->used); - - g_free(allocator); -} - -HgHeap * -hg_heap_new(HgMemPool *pool, - gsize size) -{ - HgHeap *retval = g_new(HgHeap, 1); - - if (retval != NULL) { - retval->heaps = g_malloc(size); - if (retval->heaps == NULL) { - g_free(retval); - return NULL; - } - retval->total_heap_size = size; - retval->used_heap_size = 0; - retval->serial = pool->n_heaps++; - } - - return retval; -} - -void -hg_heap_free(HgHeap *heap) -{ - g_return_if_fail (heap != NULL); - - if (heap->heaps) - g_free(heap->heaps); - g_free(heap); -} - -/* initializer */ -void -hg_mem_init_stack_start(gpointer mark) -{ - _hg_stack_start = mark; -} - -void -hg_mem_init(void) -{ - g_return_if_fail (_hg_stack_start != NULL); - - if (!hg_mem_is_initialized) { - if (!_hg_object_vtable_tree) { - _hg_object_vtable_tree = g_hash_table_new(NULL, g_direct_equal); - if (_hg_object_vtable_tree == NULL) { - hg_log_warning("Failed to initialize VTable tree."); - return; - } - _hg_object_vtable_array = g_ptr_array_new(); - } - hg_mem_is_initialized = TRUE; - } -} - -void -hg_mem_finalize(void) -{ - if (hg_mem_is_initialized) { - g_hash_table_destroy(_hg_object_vtable_tree); - g_ptr_array_free(_hg_object_vtable_array, TRUE); - _hg_object_vtable_tree = NULL; - _hg_object_vtable_array = NULL; - hg_mem_is_initialized = FALSE; - } -} - -void -hg_mem_set_stack_end(gpointer mark) -{ - _hg_stack_end = mark; -} - -/* memory pool */ -HgMemPool * -hg_mem_pool_new(HgAllocator *allocator, - const gchar *identity, - gsize prealloc, - guint flags) -{ - HgMemPool *pool; - - g_return_val_if_fail (_hg_stack_start != NULL, NULL); - g_return_val_if_fail (allocator != NULL, NULL); - g_return_val_if_fail (allocator->vtable->initialize != NULL && - allocator->vtable->alloc != NULL && - allocator->vtable->free != NULL, NULL); - g_return_val_if_fail (identity != NULL, NULL); - g_return_val_if_fail (prealloc > 0, NULL); - g_return_val_if_fail (!HG_MEM_POOL_FLAGS_HAS_FLAGS (flags, HG_MEM_RESIZABLE) || - (HG_MEM_POOL_FLAGS_HAS_FLAGS (flags, HG_MEM_RESIZABLE) && - allocator->vtable->resize_pool != NULL), NULL); - g_return_val_if_fail (!allocator->used, NULL); - - pool = (HgMemPool *)g_new(HgMemPool, 1); - if (pool == NULL) { - hg_log_error("Failed to allocate a memory pool for %s", identity); - return NULL; - } - pool->name = g_strdup(identity); - pool->heap_list = g_ptr_array_new(); - pool->n_heaps = 0; - pool->initial_heap_size = 0; - pool->total_heap_size = 0; - pool->used_heap_size = 0; - pool->access_mode = HG_ST_READABLE | HG_ST_WRITABLE | HG_ST_ACCESSIBLE; - pool->flags = flags; - pool->destroyed = FALSE; - pool->allocator = allocator; - pool->root_node = NULL; - pool->other_pool_ref_list = NULL; - pool->snapshot_list = NULL; - pool->periodical_gc = FALSE; - pool->gc_checked = FALSE; - pool->use_gc = TRUE; - pool->is_processing = FALSE; - pool->is_collecting = FALSE; - pool->gc_threshold = 50; - pool->age_of_gc_mark = 0; - pool->age_of_snapshot = 0; - allocator->used = TRUE; - if (!allocator->vtable->initialize(pool, prealloc)) { - _hg_mem_pool_free(pool); - return NULL; - } - - return pool; -} - -void -hg_mem_pool_destroy(HgMemPool *pool) -{ - g_return_if_fail (pool != NULL); - - pool->destroyed = TRUE; - if (pool->allocator->vtable->destroy) { - pool->allocator->vtable->destroy(pool); - } - if (pool->root_node) { - hg_list_free(pool->root_node); - } - if (pool->other_pool_ref_list) { - hg_list_free(pool->other_pool_ref_list); - } - if (pool->snapshot_list) { - hg_list_free(pool->snapshot_list); - } - pool->allocator->used = FALSE; - _hg_mem_pool_free(pool); -} - -const gchar * -hg_mem_pool_get_name(HgMemPool *pool) -{ - return pool->name; -} - -gboolean -hg_mem_pool_allow_resize(HgMemPool *pool, - gboolean flag) -{ - g_return_val_if_fail (pool != NULL, FALSE); - g_return_val_if_fail (!flag || - (flag && pool->allocator->vtable->resize_pool != NULL), FALSE); - - HG_MEM_POOL_SET_FLAGS (pool, HG_MEM_RESIZABLE, flag); - - return TRUE; -} - -gsize -hg_mem_pool_get_used_heap_size(HgMemPool *pool) -{ - g_return_val_if_fail (pool != NULL, 0); - - return pool->used_heap_size; -} - -gsize -hg_mem_pool_get_free_heap_size(HgMemPool *pool) -{ - g_return_val_if_fail (pool != NULL, 0); - - return pool->total_heap_size - pool->used_heap_size; -} - -void -hg_mem_pool_add_heap(HgMemPool *pool, - HgHeap *heap) -{ - guint i; - - g_return_if_fail (pool != NULL); - g_return_if_fail (heap != NULL); - - for (i = 0; i < pool->heap_list->len; i++) { - HgHeap *h = g_ptr_array_index(pool->heap_list, i); - - g_return_if_fail (h != heap); - } - - g_ptr_array_add(pool->heap_list, heap); -} - -void -hg_mem_pool_use_periodical_gc(HgMemPool *pool, - gboolean flag) -{ - g_return_if_fail (pool != NULL); - - pool->periodical_gc = flag; -} - -void -hg_mem_pool_use_garbage_collection(HgMemPool *pool, - gboolean flag) -{ - g_return_if_fail (pool != NULL); - - pool->use_gc = flag; -} - -guint -hg_mem_pool_get_default_access_mode(HgMemPool *pool) -{ - g_return_val_if_fail (pool != NULL, 0); - - return pool->access_mode; -} - -void -hg_mem_pool_set_default_access_mode(HgMemPool *pool, - guint state) -{ - g_return_if_fail (pool != NULL); - - pool->access_mode = state; -} - -gboolean -hg_mem_pool_is_global_mode(HgMemPool *pool) -{ - g_return_val_if_fail (pool != NULL, FALSE); - - return HG_MEM_POOL_HAS_FLAGS (pool, HG_MEM_GLOBAL); -} - -gboolean -_hg_mem_pool_is_own_memobject(HgMemPool *pool, - HgMemObject *obj) -{ - gint i; - gboolean retval = FALSE; - - for (i = 0; i < pool->n_heaps; i++) { - HgHeap *heap = g_ptr_array_index(pool->heap_list, i); - - if ((gsize)obj >= (gsize)heap->heaps && - (gsize)obj <= ((gsize)heap->heaps + heap->total_heap_size)) { - retval = TRUE; - break; - } - } - - return retval; -} - -gboolean -hg_mem_pool_is_own_object(HgMemPool *pool, - gpointer data) -{ - HgMemObject *obj; - HgListIter iter; - - g_return_val_if_fail (pool != NULL, FALSE); - - if (!hg_mem_pool_is_global_mode(pool)) { - /* always return true */ - return TRUE; - } - hg_mem_get_object__inline(data, obj); - if ((iter = hg_list_find_iter(obj->pool->root_node, data)) != NULL) { - /* We privilege the object that is already in the root node */ - hg_list_iter_free(iter); - return TRUE; - } - - return _hg_mem_pool_is_own_memobject(pool, obj); -} - -HgMemSnapshot * -hg_mem_pool_save_snapshot(HgMemPool *pool) -{ - HgMemSnapshot *retval; - - g_return_val_if_fail (pool != NULL, NULL); - g_return_val_if_fail (pool->allocator->vtable->save_snapshot != NULL, NULL); - - retval = pool->allocator->vtable->save_snapshot(pool); - if (pool->snapshot_list == NULL) - pool->snapshot_list = hg_list_new(); - pool->snapshot_list = hg_list_append(pool->snapshot_list, retval); - - return retval; -} - -guint8 -hg_mem_pool_get_age_of_snapshot(HgMemPool *pool) -{ - g_return_val_if_fail (pool != NULL, 0); - - return pool->age_of_snapshot; -} - -gboolean -hg_mem_pool_restore_snapshot(HgMemPool *pool, - HgMemSnapshot *snapshot, - guint adjuster) -{ - g_return_val_if_fail (pool != NULL, FALSE); - g_return_val_if_fail (snapshot != NULL, FALSE); - g_return_val_if_fail (pool->allocator->vtable->restore_snapshot != NULL, FALSE); - - return pool->allocator->vtable->restore_snapshot(pool, snapshot, adjuster); -} - -guint -hg_mem_pool_get_n_snapshots(HgMemPool *pool) -{ - g_return_val_if_fail (pool != NULL, 0); - - if (pool->snapshot_list == NULL) - return 0; - return hg_list_length(pool->snapshot_list); -} - -HgMemSnapshot * -hg_mem_pool_get_snapshot(HgMemPool *pool, - guint n) -{ - HgMemSnapshot *retval = NULL; - HgListIter iter; - int i; - - g_return_val_if_fail (pool != NULL, NULL); - g_return_val_if_fail (hg_mem_pool_get_n_snapshots(pool) > n, NULL); - - iter = hg_list_iter_new(pool->snapshot_list); - for (i = 1; i <= n; i++) { - if (!hg_list_get_iter_next(pool->snapshot_list, iter)) { - hg_log_warning("Failed to look up the snapshot image."); - return NULL; - } - } - retval = hg_list_iter_get_data(iter); - hg_list_iter_free(iter); - - return retval; -} - -void -hg_mem_pool_clear_snapshot(HgMemPool *pool) -{ - g_return_if_fail (pool != NULL); - - hg_list_free(pool->snapshot_list); - pool->snapshot_list = NULL; -} - -gboolean -hg_mem_garbage_collection(HgMemPool *pool) -{ - gboolean retval = FALSE; - - g_return_val_if_fail (pool != NULL, FALSE); - - if (pool->allocator->vtable->garbage_collection) - retval = pool->allocator->vtable->garbage_collection(pool); - - return retval; -} - -gpointer -hg_mem_alloc(HgMemPool *pool, - gsize size) -{ - return hg_mem_alloc_with_flags(pool, size, 0); -} - -gpointer -hg_mem_alloc_with_flags(HgMemPool *pool, - gsize size, - guint flags) -{ - gpointer retval; - - g_return_val_if_fail (pool != NULL, NULL); - - if (pool->periodical_gc) { - if (!pool->gc_checked && - (pool->used_heap_size * 100 / pool->total_heap_size) > pool->gc_threshold) { - if (!hg_mem_garbage_collection(pool)) { - pool->gc_threshold += 5; - } else { - pool->gc_checked = TRUE; - if ((pool->used_heap_size * 100 / pool->total_heap_size) > pool->gc_threshold) { - pool->gc_threshold += 5; - } else { - pool->gc_threshold -= 5; - } - } - } else { - pool->gc_threshold -= 5; - pool->gc_checked = FALSE; - } - if (pool->gc_threshold < 50) - pool->gc_threshold = 50; - if (pool->gc_threshold > 90) - pool->gc_threshold = 90; - } - retval = pool->allocator->vtable->alloc(pool, size, flags); - if (!retval) { - if (hg_mem_garbage_collection(pool)) { - /* retry */ - retval = pool->allocator->vtable->alloc(pool, size, flags); - } - } - if (!retval) { - /* try growing the heap up when still failed */ - if (HG_MEM_POOL_HAS_FLAGS (pool, HG_MEM_RESIZABLE) && - pool->allocator->vtable->resize_pool(pool, size)) { - hg_mem_garbage_collection(pool); - retval = pool->allocator->vtable->alloc(pool, size, flags); - } - } - - return retval; -} - -gboolean -hg_mem_free(gpointer data) -{ - HgMemObject *obj; - HgObject *hobj; - - g_return_val_if_fail (data != NULL, FALSE); - - hg_mem_get_object__inline(data, obj); - if (obj == NULL) { - hg_log_warning("[BUG] Invalid object %p is given to be freed.", data); - return FALSE; - } else { - const HgObjectVTable const *vtable; - - hobj = data; - if (HG_MEMOBJ_IS_HGOBJECT (obj) && - (vtable = hg_object_get_vtable(hobj)) != NULL && - vtable->free) { - vtable->free(data); - /* prevents to invoke 'free' twice - * when the pool destroy process is being run. - */ - HG_OBJECT_SET_VTABLE_ID (hobj, 0); - } - if (!obj->pool->destroyed) - obj->pool->allocator->vtable->free(obj->pool, data); - } - - return TRUE; -} - -gpointer -hg_mem_resize(gpointer data, - gsize size) -{ - HgMemObject *obj; - - g_return_val_if_fail (data != NULL, NULL); - - hg_mem_get_object__inline(data, obj); - if (obj == NULL) { - hg_log_warning("Invalid object %p was about to be resized.", data); - return NULL; - } - - return obj->pool->allocator->vtable->resize(obj, size); -} - -gsize -hg_mem_get_object_size(gpointer data) -{ - HgMemObject *obj; - - g_return_val_if_fail (data != NULL, 0); - - hg_mem_get_object__inline(data, obj); - if (obj == NULL) { - hg_log_warning("Invalid object %p was about to get an object size.", data); - return 0; - } - - return obj->pool->allocator->vtable->get_size(obj); -} - -void -_hg_mem_set_flags(HgMemObject *object, - guint flags) -{ - if (object->pool->allocator->vtable->set_flags) - object->pool->allocator->vtable->set_flags(object, flags); - HG_MEMOBJ_SET_FLAGS (object, flags); -} - -/* GC */ -guint8 -hg_mem_pool_get_age_of_mark(HgMemPool *pool) -{ - g_return_val_if_fail (pool != NULL, 0); - - return pool->age_of_gc_mark; -} - -void -hg_mem_gc_mark_array_region(HgMemPool *pool, - gpointer start, - gpointer end) -{ - gpointer p; - HgMemObject *obj; - - g_return_if_fail (pool->allocator->vtable->is_safe_object != NULL); - - if (start > end) { - p = start; - start = end - 1; - end = p + 1; - } - for (p = start; p < end; p++) { - obj = hg_mem_get_object__inline_nocheck(*(gsize *)p); - if (pool->allocator->vtable->is_safe_object(pool, obj)) { - if (!hg_mem_is_gc_mark__inline(obj)) { - hg_log_debug(DEBUG_GC, "MARK: %p (mem: %p age: %d) from array region.", obj->data, obj, HG_MEMOBJ_GET_MARK_AGE (obj)); - hg_mem_gc_mark__inline(obj); - } else { - hg_log_debug(DEBUG_GC, "MARK[already]: %p (mem: %p) from array region.", obj->data, obj); - } - } - obj = p; - if (pool->allocator->vtable->is_safe_object(pool, obj)) { - if (!hg_mem_is_gc_mark__inline(obj)) { - hg_log_debug(DEBUG_GC, "MARK: %p (mem: %p) from array region.", obj->data, obj); - hg_mem_gc_mark__inline(obj); - } else { - hg_log_debug(DEBUG_GC, "MARK[already]: %p (mem: %p) from array region.", obj->data, obj); - } - } - } -} - -void -hg_mem_pool_add_root_node(HgMemPool *pool, - gpointer data) -{ - if (pool->root_node == NULL) - pool->root_node = hg_list_new(); - pool->root_node = hg_list_append(pool->root_node, data); -} - -void -hg_mem_pool_remove_root_node(HgMemPool *pool, - gpointer data) -{ - HgMemObject *obj; - - g_return_if_fail (pool != NULL); - - hg_mem_get_object__inline(data, obj); - g_return_if_fail (obj != NULL); - g_return_if_fail (_hg_mem_pool_is_own_memobject(pool, obj)); - - pool->root_node = hg_list_remove(pool->root_node, data); -} - -void -hg_mem_pool_add_pool_reference(HgMemPool *pool, - HgMemPool *other_pool) -{ - HgListIter iter = NULL; - - g_return_if_fail (pool != NULL); - g_return_if_fail (other_pool != NULL); - g_return_if_fail (pool != other_pool); /* to avoid the loop */ - - if (pool->other_pool_ref_list == NULL) { - pool->other_pool_ref_list = hg_list_new(); - pool->other_pool_ref_list = hg_list_append(pool->other_pool_ref_list, - other_pool); - } else { - if ((iter = hg_list_find_iter(pool->other_pool_ref_list, other_pool)) == NULL) - pool->other_pool_ref_list = hg_list_append(pool->other_pool_ref_list, - other_pool); - if (iter) - hg_list_iter_free(iter); - } -} - -void -hg_mem_pool_remove_pool_reference(HgMemPool *pool, - HgMemPool *other_pool) -{ - g_return_if_fail (pool != NULL); - g_return_if_fail (other_pool != NULL); - - pool->other_pool_ref_list = hg_list_remove(pool->other_pool_ref_list, other_pool); -} - -/* HgObject */ -guint -hg_object_get_state(HgObject *object) -{ - g_return_val_if_fail (object != NULL, 0); - - return HG_OBJECT_GET_STATE (object); -} - -void -hg_object_set_state(HgObject *object, - guint state) -{ - g_return_if_fail (object != NULL); - - HG_OBJECT_SET_STATE (object, state); -} - -void -hg_object_add_state(HgObject *object, - guint state) -{ - state |= hg_object_get_state(object); - hg_object_set_state(object, state); -} - -gboolean -hg_object_is_state(HgObject *object, - guint state) -{ - g_return_val_if_fail (object != NULL, FALSE); - - return (HG_OBJECT_GET_STATE (object) & state) == state; -} - -gpointer -hg_object_dup(HgObject *object) -{ - const HgObjectVTable const *vtable; - HgMemObject *obj; - - g_return_val_if_fail (object != NULL, NULL); - - hg_mem_get_object__inline(object, obj); - if (obj != NULL && HG_MEMOBJ_IS_HGOBJECT (obj) && - (vtable = hg_object_get_vtable(object)) != NULL && - vtable->dup) - return vtable->dup(object); - - return object; -} - -gpointer -hg_object_copy(HgObject *object) -{ - const HgObjectVTable const *vtable; - HgMemObject *obj; - - g_return_val_if_fail (object != NULL, NULL); - - hg_mem_get_object__inline(object, obj); - if (obj != NULL && HG_MEMOBJ_IS_HGOBJECT (obj) && - (vtable = hg_object_get_vtable(object)) != NULL && - vtable->copy) - return vtable->copy(object); - - return object; -} - -const HgObjectVTable const * -hg_object_get_vtable(HgObject *object) -{ - guint id; - HgMemObject *obj; - - g_return_val_if_fail (object != NULL, NULL); - hg_mem_get_object__inline(object, obj); - g_return_val_if_fail (HG_MEMOBJ_IS_HGOBJECT (obj), NULL); - - id = HG_OBJECT_GET_VTABLE_ID (object); - - if (id == 0) { - /* 0 is still valid and intentional that means no vtable. */ - return NULL; - } - if (id > _hg_object_vtable_array->len) { - hg_log_warning("[BUG] Invalid vtable ID found: %p id: %d latest id: %u", - object, id, _hg_object_vtable_array->len); - - return NULL; - } - - return g_ptr_array_index(_hg_object_vtable_array, id - 1); -} - -void -hg_object_set_vtable(HgObject *object, - const HgObjectVTable const *vtable) -{ - guint id = 0; - - g_return_if_fail (object != NULL); - g_return_if_fail (vtable != NULL); - g_return_if_fail (hg_mem_is_initialized); - g_return_if_fail (_hg_object_vtable_array->len < 255); - - G_LOCK (hgobject); - - if ((id = GPOINTER_TO_UINT(g_hash_table_lookup(_hg_object_vtable_tree, (gpointer)vtable))) == 0) { - g_ptr_array_add(_hg_object_vtable_array, (gpointer)vtable); - id = _hg_object_vtable_array->len; - g_hash_table_insert(_hg_object_vtable_tree, (gpointer)vtable, GUINT_TO_POINTER (id)); - } - if (id > 255) { - hg_log_warning("[BUG] Invalid vtable ID found in tree: %p id %u", object, id); - id = 0; - } - HG_OBJECT_SET_VTABLE_ID (object, id); - - G_UNLOCK (hgobject); -} diff --git a/hieroglyph/hgmem.h b/hieroglyph/hgmem.h deleted file mode 100644 index aa7d2d1..0000000 --- a/hieroglyph/hgmem.h +++ /dev/null @@ -1,224 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* - * hgmem.h - * Copyright (C) 2005-2006 Akira TAGOH - * - * Authors: - * Akira TAGOH <at@gclab.org> - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - */ -#ifndef __HG_MEM_H__ -#define __HG_MEM_H__ - -#include <hieroglyph/hgtypes.h> - -G_BEGIN_DECLS - -/* initializer */ -void hg_mem_init_stack_start(gpointer mark); -void hg_mem_init (void); -void hg_mem_finalize (void); -void hg_mem_set_stack_end (gpointer mark); - -/* allocator */ -HgAllocator *hg_allocator_new (const HgAllocatorVTable *vtable); -void hg_allocator_destroy(HgAllocator *allocator); -HgHeap *hg_heap_new (HgMemPool *pool, - gsize size); -void hg_heap_free (HgHeap *heap); - -/* memory pool */ -#define hg_mem_get_object__inline_nocheck(__data__) \ - ((HgMemObject *)((gsize)(__data__) - sizeof (HgMemObject))) -#define hg_mem_get_object__inline(__data__, __retval__) \ - G_STMT_START { \ - (__retval__) = hg_mem_get_object__inline_nocheck(__data__); \ - if (!HG_CHECK_MAGIC_CODE ((__retval__), HG_MEM_HEADER)) \ - (__retval__) = NULL; \ - } G_STMT_END - - -HgMemPool *hg_mem_pool_new (HgAllocator *allocator, - const gchar *identity, - gsize prealloc, - guint flags); -void hg_mem_pool_destroy (HgMemPool *pool); -const gchar *hg_mem_pool_get_name (HgMemPool *pool); -gboolean hg_mem_pool_allow_resize (HgMemPool *pool, - gboolean flag); -gsize hg_mem_pool_get_used_heap_size (HgMemPool *pool); -gsize hg_mem_pool_get_free_heap_size (HgMemPool *pool); -void hg_mem_pool_add_heap (HgMemPool *pool, - HgHeap *heap); -guint hg_mem_pool_get_default_access_mode(HgMemPool *pool); -void hg_mem_pool_set_default_access_mode(HgMemPool *pool, - guint state); -gboolean hg_mem_pool_is_global_mode (HgMemPool *pool); -gboolean hg_mem_pool_is_own_object (HgMemPool *pool, - gpointer data); -HgMemSnapshot *hg_mem_pool_save_snapshot (HgMemPool *pool); -gboolean hg_mem_pool_restore_snapshot (HgMemPool *pool, - HgMemSnapshot *snapshot, - guint adjuster); -guint8 hg_mem_pool_get_age_of_snapshot (HgMemPool *pool); -guint hg_mem_pool_get_n_snapshots (HgMemPool *pool); -HgMemSnapshot *hg_mem_pool_get_snapshot (HgMemPool *pool, - guint n); -void hg_mem_pool_clear_snapshot (HgMemPool *pool); -gboolean hg_mem_garbage_collection (HgMemPool *pool); -gpointer hg_mem_alloc (HgMemPool *pool, - gsize size); -gpointer hg_mem_alloc_with_flags (HgMemPool *pool, - gsize size, - guint flags); -gboolean hg_mem_free (gpointer data); -gpointer hg_mem_resize (gpointer data, - gsize size); -gsize hg_mem_get_object_size (gpointer data); - -/* internal use */ -gboolean _hg_mem_pool_is_own_memobject (HgMemPool *pool, - HgMemObject *obj); -void _hg_mem_set_flags (HgMemObject *object, - guint flags); - -/* GC */ -#define hg_mem_is_flags__inline(__obj__, __flags__) \ - (((__flags__) & HG_MEMOBJ_MARK_AGE_MASK) ? \ - hg_mem_is_gc_mark__inline(__obj__) : \ - (((__obj__)->flags & HG_MEMOBJ_FLAGS_MASK) & (__flags__)) == (__flags__)) -#define hg_mem_get_flags__inline(__obj__) \ - (HG_MEMOBJ_GET_FLAGS (__obj__)) -#define hg_mem_set_flags__inline(__obj__, __flags__, __notify__) \ - G_STMT_START { \ - HgObject *__hg_mem_hobj__ = (HgObject *)(__obj__)->data; \ - const HgObjectVTable const *__hg_obj_vtable__; \ - \ - if ((__flags__) > HG_MEMOBJ_MARK_AGE_MASK) { \ - g_warning("[BUG] Invalid flags to not be set by hg_mem_set_flags: (possibly vtable id) %X", (__flags__)); \ - } else if ((__flags__) > HG_MEMOBJ_HGOBJECT_MASK) { \ - /* don't inherit the age to the children. \ - * it causes the unexpected GC. \ - */ \ - HG_MEMOBJ_SET_MARK_AGE ((__obj__), hg_mem_pool_get_age_of_mark((__obj__)->pool)); \ - } else if ((__flags__) > HG_MEMOBJ_FLAGS_MASK) { \ - g_warning("[BUG] Invalid flags to not be set by hg_mem_set_flags: (possibly hgobject id) %X", (__flags__)); \ - } else { \ - _hg_mem_set_flags((__obj__), (__flags__)); \ - } \ - if ((__notify__) && \ - HG_MEMOBJ_IS_HGOBJECT (__obj__) && \ - (__hg_obj_vtable__ = hg_object_get_vtable(__hg_mem_hobj__)) != NULL && \ - __hg_obj_vtable__->set_flags) { \ - __hg_obj_vtable__->set_flags(__hg_mem_hobj__, (__flags__)); \ - } \ - } G_STMT_END -#define hg_mem_add_flags__inline(__obj__, __flags__, __notify__) \ - G_STMT_START { \ - if (((__flags__) & HG_MEMOBJ_FLAGS_MASK) != 0 && \ - ((__flags__) & HG_MEMOBJ_MARK_AGE_MASK) != 0) { \ - g_warning("[BUG] can't set a flags with mark"); \ - } else if (((__flags__) & HG_MEMOBJ_FLAGS_MASK) == 0) { \ - /* set a mark */ \ - hg_mem_set_flags__inline((__obj__), (__flags__), (__notify__)); \ - } else { \ - hg_mem_set_flags__inline((__obj__), \ - (__flags__) | hg_mem_get_flags__inline(__obj__), \ - (__notify__)); \ - } \ - } G_STMT_END - -#define hg_mem_gc_mark__inline(_obj) \ - G_STMT_START { \ - HgObject *__hg_mem_hobj__ = (HgObject *)(_obj)->data; \ - const HgObjectVTable const *__hg_obj_vtable__; \ - \ - HG_MEMOBJ_SET_MARK_AGE ((_obj), hg_mem_pool_get_age_of_mark((_obj)->pool)); \ - if (HG_MEMOBJ_IS_HGOBJECT (_obj) && \ - (__hg_obj_vtable__ = hg_object_get_vtable(__hg_mem_hobj__)) != NULL && \ - __hg_obj_vtable__->set_flags) { \ - guint __hg_mem_flags__ = HG_MEMOBJ_GET_MARK_AGE ((_obj)) << 16; \ - __hg_obj_vtable__->set_flags(__hg_mem_hobj__, __hg_mem_flags__); \ - } \ - } G_STMT_END -#define hg_mem_is_gc_mark__inline(_obj) \ - (hg_mem_pool_get_age_of_mark((_obj)->pool) == HG_MEMOBJ_GET_MARK_AGE (_obj)) -#define hg_mem_restorable(_obj) hg_mem_set_flags__inline(_obj, hg_mem_get_flags__inline(_obj) | HG_FL_RESTORABLE, FALSE) -#define hg_mem_unrestorable(_obj) hg_mem_set_flags__inline(_obj, hg_mem_get_flags__inline(_obj) & ~HG_FL_RESTORABLE, FALSE) -#define hg_mem_is_restorable(_obj) hg_mem_is_flags__inline(_obj, HG_FL_RESTORABLE) -#define hg_mem_complex_mark(_obj) hg_mem_set_flags__inline(_obj, hg_mem_get_flags__inline(_obj) | HG_FL_COMPLEX, FALSE) -#define hg_mem_complex_unmark(_obj) hg_mem_set_flags__inline(_obj, hg_mem_get_flags__inline(_obj) & ~HG_FL_COMPLEX, FALSE) -#define hg_mem_is_complex_mark(_obj) hg_mem_is_flags__inline(_obj, HG_FL_COMPLEX) -#define hg_mem_set_lock(_obj) hg_mem_set_flags__inline(_obj, hg_mem_get_flags__inline(_obj) | HG_FL_LOCK, FALSE) -#define hg_mem_set_unlock(_obj) hg_mem_set_flags__inline(_obj, hg_mem_get_flags__inline(_obj) & ~HG_FL_LOCK, FALSE) -#define hg_mem_is_locked(_obj) hg_mem_is_flags__inline(_obj, HG_FL_LOCK) -#define hg_mem_set_copying(_obj) hg_mem_set_flags__inline(_obj, hg_mem_get_flags__inline(_obj) | HG_FL_COPYING, FALSE) -#define hg_mem_unset_copying(_obj) hg_mem_set_flags__inline(_obj, hg_mem_get_flags__inline(_obj) & ~HG_FL_COPYING, FALSE) -#define hg_mem_is_copying(_obj) hg_mem_is_flags__inline(_obj, HG_FL_COPYING) -#define hg_mem_set_dead(_obj) hg_mem_set_flags__inline(_obj, hg_mem_get_flags__inline(_obj) | HG_FL_DEAD, FALSE) -#define hg_mem_unset_dead(_obj) hg_mem_set_flags__inline(_obj, hg_mem_get_flags__inline(_obj) & ~HG_FL_DEAD, FALSE) -#define hg_mem_is_dead(_obj) hg_mem_is_flags__inline(_obj, HG_FL_DEAD) - -guint8 hg_mem_pool_get_age_of_mark (HgMemPool *pool); -void hg_mem_gc_mark_array_region (HgMemPool *pool, - gpointer start, - gpointer end); -void hg_mem_pool_add_root_node (HgMemPool *pool, - gpointer data); -void hg_mem_pool_remove_root_node (HgMemPool *pool, - gpointer data); -void hg_mem_pool_add_pool_reference (HgMemPool *pool, - HgMemPool *other_pool); -void hg_mem_pool_remove_pool_reference (HgMemPool *pool, - HgMemPool *other_pool); -void hg_mem_pool_use_periodical_gc (HgMemPool *pool, - gboolean flag); -void hg_mem_pool_use_garbage_collection(HgMemPool *pool, - gboolean flag); - -/* HgObject */ -#define hg_object_readable(_obj) hg_object_add_state(_obj, HG_ST_READABLE | HG_ST_ACCESSIBLE) -#define hg_object_unreadable(_obj) hg_object_set_state(_obj, hg_object_get_state(_obj) & ~HG_ST_READABLE) -#define hg_object_is_readable(_obj) hg_object_is_state(_obj, HG_ST_READABLE | HG_ST_ACCESSIBLE) -#define hg_object_writable(_obj) hg_object_add_state(_obj, HG_ST_WRITABLE | HG_ST_ACCESSIBLE) -#define hg_object_unwritable(_obj) hg_object_set_state(_obj, hg_object_get_state(_obj) & ~HG_ST_WRITABLE) -#define hg_object_is_writable(_obj) hg_object_is_state(_obj, HG_ST_WRITABLE | HG_ST_ACCESSIBLE) -#define hg_object_executable(_obj) hg_object_add_state(_obj, HG_ST_EXECUTABLE) -#define hg_object_inexecutable(_obj) hg_object_set_state(_obj, hg_object_get_state(_obj) & ~HG_ST_EXECUTABLE) -#define hg_object_is_executable(_obj) hg_object_is_state(_obj, HG_ST_EXECUTABLE) -#define hg_object_executeonly(_obj) hg_object_set_state(_obj, (hg_object_get_state(_obj) & ~(HG_ST_READABLE | HG_ST_WRITABLE)) | HG_ST_EXECUTEONLY) -#define hg_object_is_executeonly(_obj) hg_object_is_state(_obj, HG_ST_EXECUTEONLY) -#define hg_object_inaccessible(_obj) hg_object_set_state(_obj, hg_object_get_state(_obj) & ~(HG_ST_READABLE | HG_ST_WRITABLE | HG_ST_EXECUTEONLY | HG_ST_ACCESSIBLE)) -#define hg_object_is_accessible(_obj) hg_object_is_state(_obj, HG_ST_ACCESSIBLE) - -guint hg_object_get_state (HgObject *object); -void hg_object_set_state (HgObject *object, - guint state); -void hg_object_add_state (HgObject *object, - guint state); -gboolean hg_object_is_state (HgObject *object, - guint state); -gpointer hg_object_dup (HgObject *object); -gpointer hg_object_copy (HgObject *object); -const HgObjectVTable const *hg_object_get_vtable(HgObject *object); -void hg_object_set_vtable(HgObject *object, - const HgObjectVTable const *vtable); - - -G_END_DECLS - -#endif /* __HG_MEM_H__ */ diff --git a/hieroglyph/hgobject.c b/hieroglyph/hgobject.c new file mode 100644 index 0000000..655707c --- /dev/null +++ b/hieroglyph/hgobject.c @@ -0,0 +1,542 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ +/* + * hgobject.c + * Copyright (C) 2005-2007 Akira TAGOH + * + * Authors: + * Akira TAGOH <akira@tagoh.org> + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include <math.h> +#include <string.h> +#include <glib/gstring.h> +#include <hieroglyph/hgarray.h> +#include <hieroglyph/hgdict.h> +#include <hieroglyph/hgfile.h> +#include <hieroglyph/hgoperator.h> +#include <hieroglyph/hgstring.h> +#include <hieroglyph/vm.h> +#include "hgobject.h" + + +/* + * Private functions + */ +static hg_object_t * +_hg_object_new(hg_vm_t *vm, + gsize data_size) +{ + hg_object_t *retval; + guint32 total_size = hg_n_alignof (sizeof (hg_object_header_t) + sizeof (_hg_object_t) + data_size); + hg_attribute_t attr; + + hg_return_val_if_fail (vm != NULL, NULL); + + retval = hg_vm_malloc(vm, total_size); + if (retval != NULL) { + memset(HG_OBJECT_OBJECT (retval), -1, sizeof (_hg_object_t) + data_size); + hg_vm_get_attributes(vm, &attr); + HG_OBJECT_HEADER (retval)->token_type = hg_vm_get_object_format(vm); + HG_OBJECT_HEADER (retval)->n_objects = 0xff; + HG_OBJECT_HEADER (retval)->total_length = total_size; + HG_OBJECT_OBJECT (retval)->attr.attributes = attr.attributes; + } else { + hg_vm_set_error(vm, HG_e_VMerror); + } + + return retval; +} + +/* name */ +static gboolean +_hg_object_name_compare(const hg_object_t *object1, + const hg_object_t *object2) +{ + guint16 i; + gchar *p1, *p2; + + if (HG_OBJECT_ENCODING_NAME (object1)->representation == -1 && + HG_OBJECT_ENCODING_NAME (object2)->representation == -1) { + return HG_OBJECT_ENCODING_NAME (object1)->index == HG_OBJECT_ENCODING_NAME (object2)->index; + } else if (HG_OBJECT_NAME (object1)->reserved1 == 0 && + HG_OBJECT_NAME (object2)->reserved1 == 0) { + if (HG_OBJECT_NAME (object1)->length != HG_OBJECT_NAME (object2)->length) + return FALSE; + + p1 = HG_OBJECT_NAME_DATA (object1); + p2 = HG_OBJECT_NAME_DATA (object2); + for (i = 0; i < HG_OBJECT_NAME (object1)->length; i++) { + if (p1[i] != p2[i]) + return FALSE; + } + return TRUE; + } + + return FALSE; +} + +/* + * Public functions + */ +hg_object_t * +hg_object_new(hg_vm_t *vm, + guint16 n_objects) +{ + hg_object_t *retval; + + hg_return_val_if_fail (vm != NULL, NULL); + hg_return_val_if_fail (n_objects > 0, NULL); + + retval = _hg_object_new(vm, sizeof (_hg_object_t) * (n_objects - 1)); + if (retval != NULL) { + /* initialize header */ + HG_OBJECT_HEADER (retval)->n_objects = n_objects; + } + + return retval; +} + +hg_object_t * +hg_object_sized_new(hg_vm_t *vm, + gsize size) +{ + hg_object_t *retval; + + hg_return_val_if_fail (vm != NULL, NULL); + + retval = _hg_object_new(vm, size); + if (retval != NULL) { + /* initialize header */ + HG_OBJECT_HEADER (retval)->n_objects = 1; + } + + return retval; +} + +void +hg_object_free(hg_vm_t *vm, + hg_object_t *object) +{ + hg_return_if_fail (vm != NULL); + hg_return_if_fail (object != NULL); + + switch (HG_OBJECT_GET_TYPE (object)) { + case HG_OBJECT_TYPE_NULL: + case HG_OBJECT_TYPE_INTEGER: + case HG_OBJECT_TYPE_REAL: + case HG_OBJECT_TYPE_NAME: + case HG_OBJECT_TYPE_BOOLEAN: + case HG_OBJECT_TYPE_STRING: + case HG_OBJECT_TYPE_EVAL: + case HG_OBJECT_TYPE_ARRAY: + case HG_OBJECT_TYPE_MARK: + case HG_OBJECT_TYPE_DICT: + case HG_OBJECT_TYPE_OPERATOR: + case HG_OBJECT_TYPE_END: /* uninitialized object */ + hg_vm_mfree(vm, object); + break; + case HG_OBJECT_TYPE_FILE: + hg_object_file_free(vm, object); + break; + default: + g_warning("[BUG] Unknown object type `%d'", HG_OBJECT_GET_TYPE (object)); + break; + } +} + +hg_object_t * +hg_object_dup(hg_vm_t *vm, + hg_object_t *object) +{ + hg_object_t *retval; + gsize length; + + hg_return_val_if_fail (vm != NULL, NULL); + hg_return_val_if_fail (object != NULL, NULL); + + switch (HG_OBJECT_GET_TYPE (object)) { + case HG_OBJECT_TYPE_NULL: + case HG_OBJECT_TYPE_INTEGER: + case HG_OBJECT_TYPE_REAL: + case HG_OBJECT_TYPE_NAME: + case HG_OBJECT_TYPE_BOOLEAN: + case HG_OBJECT_TYPE_EVAL: + case HG_OBJECT_TYPE_MARK: + length = HG_OBJECT_HEADER (object)->total_length - sizeof (hg_object_header_t) - sizeof (_hg_object_t); + retval = hg_object_sized_new(vm, length); + if (retval != NULL) { + memcpy(retval, object, HG_OBJECT_HEADER (object)->total_length); + } + break; + case HG_OBJECT_TYPE_STRING: + retval = hg_object_string_substring_new(vm, object, 0, HG_OBJECT_STRING (object)->real_length); + break; + case HG_OBJECT_TYPE_ARRAY: + retval = hg_object_array_subarray_new(vm, object, 0, HG_OBJECT_ARRAY (object)->real_length); + break; + case HG_OBJECT_TYPE_DICT: + case HG_OBJECT_TYPE_FILE: + case HG_OBJECT_TYPE_OPERATOR: + /* XXX: perhaps we may want to create another container? */ + retval = object; + break; + default: + g_warning("[BUG] Unknown object type `%d'", HG_OBJECT_GET_TYPE (object)); + break; + } + + return retval; +} + +hg_object_t * +hg_object_copy(hg_vm_t *vm, + hg_object_t *object) +{ + hg_object_t *retval; + gsize length; + + hg_return_val_if_fail (vm != NULL, NULL); + hg_return_val_if_fail (object != NULL, NULL); + + length = HG_OBJECT_HEADER (object)->total_length - sizeof (hg_object_header_t) - sizeof (_hg_object_t); + retval = hg_object_sized_new(vm, length); + if (retval != NULL) { + memcpy(retval, object, HG_OBJECT_HEADER (object)->total_length); + } + + return retval; +} + +gboolean +hg_object_compare(hg_object_t *object1, + hg_object_t *object2) +{ + hg_return_val_if_fail (object1 != NULL, FALSE); + hg_return_val_if_fail (object2 != NULL, FALSE); + + if (HG_OBJECT_GET_TYPE (object1) != HG_OBJECT_GET_TYPE (object2)) + return FALSE; + + switch (HG_OBJECT_GET_TYPE (object1)) { + case HG_OBJECT_TYPE_NULL: + case HG_OBJECT_TYPE_MARK: + return TRUE; + case HG_OBJECT_TYPE_INTEGER: + return HG_OBJECT_INTEGER (object1) == HG_OBJECT_INTEGER (object2); + case HG_OBJECT_TYPE_REAL: + return HG_OBJECT_REAL_IS_EQUAL (object1, object2); + case HG_OBJECT_TYPE_NAME: + case HG_OBJECT_TYPE_EVAL: + return _hg_object_name_compare(object1, object2); + case HG_OBJECT_TYPE_BOOLEAN: + return HG_OBJECT_BOOLEAN (object1) == HG_OBJECT_BOOLEAN (object2); + case HG_OBJECT_TYPE_STRING: + return hg_object_string_compare(object1, object2); + case HG_OBJECT_TYPE_ARRAY: + return hg_object_array_compare(object1, object2); + case HG_OBJECT_TYPE_DICT: + return hg_object_dict_compare(object1, object2); + case HG_OBJECT_TYPE_FILE: + return hg_object_file_compare(object1, object2); + case HG_OBJECT_TYPE_OPERATOR: + return hg_object_operator_compare(object1, object2); + default: + g_warning("Unknown object type `%d' in comparing", HG_OBJECT_GET_TYPE (object1)); + } + + return FALSE; +} + +gchar * +hg_object_dump(hg_object_t *object, + gboolean verbose) +{ + GString *string; + gsize i; + gchar *p; + hg_stringdata_t *sdata; + static gchar nostringval[] = "--nostringval--"; + + hg_return_val_if_fail (object != NULL, NULL); + + string = g_string_new(NULL); + switch (HG_OBJECT_GET_TYPE (object)) { + case HG_OBJECT_TYPE_NULL: + if (verbose) { + g_string_append(string, "null"); + } else { + g_string_append(string, nostringval); + } + break; + case HG_OBJECT_TYPE_MARK: + if (verbose) { + g_string_append(string, "-mark-"); + } else { + g_string_append(string, nostringval); + } + break; + case HG_OBJECT_TYPE_INTEGER: + g_string_append_printf(string, "%d", HG_OBJECT_INTEGER (object)); + break; + case HG_OBJECT_TYPE_REAL: + g_string_append_printf(string, "%.8f", HG_OBJECT_REAL (object)); + break; + case HG_OBJECT_TYPE_EVAL: + if (verbose) + g_string_append_c(string, '/'); + case HG_OBJECT_TYPE_NAME: + if (verbose) + g_string_append_c(string, '/'); + if (HG_OBJECT_ENCODING_NAME (object)->representation == -1) { + g_string_append(string, hg_object_operator_get_name(HG_OBJECT_ENCODING_NAME (object)->index)); + } else { + p = HG_OBJECT_NAME_DATA (object); + + for (i = 0; i < HG_OBJECT_NAME (object)->length; i++) { + g_string_append_c(string, p[i]); + } + } + break; + case HG_OBJECT_TYPE_BOOLEAN: + g_string_append_printf(string, "%s", (HG_OBJECT_BOOLEAN (object) ? "true" : "false")); + break; + case HG_OBJECT_TYPE_STRING: + if (verbose) + g_string_append_c(string, '('); + sdata = HG_OBJECT_STRING_DATA (object); + for (i = 0; i < HG_OBJECT_STRING (object)->real_length; i++) { + g_string_append_c(string, ((gchar *)sdata->string)[i]); + } + if (verbose) + g_string_append_c(string, ')'); + break; + case HG_OBJECT_TYPE_ARRAY: + return hg_object_array_dump(object, verbose); + case HG_OBJECT_TYPE_DICT: + return hg_object_dict_dump(object, verbose); + case HG_OBJECT_TYPE_FILE: + return hg_object_file_dump(object, verbose); + case HG_OBJECT_TYPE_OPERATOR: + return hg_object_operator_dump(object, verbose); + default: + g_warning("Unknown object type `%d' in dumping", HG_OBJECT_GET_TYPE (object)); + } + + return g_string_free(string, FALSE); +} + +gsize +hg_object_get_hash(hg_object_t *object) +{ + gsize retval = 0; + + hg_return_val_if_fail (object != NULL, 0); + + switch (HG_OBJECT_GET_TYPE (object)) { + case HG_OBJECT_TYPE_NULL: + retval = 0; + break; + case HG_OBJECT_TYPE_INTEGER: + retval = HG_OBJECT_INTEGER (object); + break; + case HG_OBJECT_TYPE_REAL: + retval = HG_OBJECT_REAL (object); + break; + case HG_OBJECT_TYPE_NAME: + case HG_OBJECT_TYPE_EVAL: + G_STMT_START { + guint16 i, length; + const gchar *p; + + if (HG_OBJECT_ENCODING_NAME (object)->representation == -1) { + p = hg_object_operator_get_name(HG_OBJECT_ENCODING_NAME (object)->index); + length = strlen(p); + } else { + p = HG_OBJECT_NAME_DATA (object); + length = HG_OBJECT_NAME (object)->length; + } + for (i = 0; i < length; i++) { + retval = (retval << 5) - retval + p[i]; + } + } G_STMT_END; + break; + case HG_OBJECT_TYPE_BOOLEAN: + retval = HG_OBJECT_BOOLEAN (object); + break; + case HG_OBJECT_TYPE_STRING: + G_STMT_START { + guint16 i, length = HG_OBJECT_STRING (object)->real_length; + gchar *p = HG_OBJECT_STRING_DATA (object)->string; + + for (i = 0; i < length; i++) { + retval = (retval << 5) - retval + p[i]; + } + } G_STMT_END; + break; + case HG_OBJECT_TYPE_ARRAY: + case HG_OBJECT_TYPE_MARK: + case HG_OBJECT_TYPE_DICT: + case HG_OBJECT_TYPE_FILE: + case HG_OBJECT_TYPE_OPERATOR: + /* XXX */ + default: + g_warning("Unknown object type `%d' during getting a hash", HG_OBJECT_GET_TYPE (object)); + break; + } + + return retval; +} + +/* null */ +hg_object_t * +hg_object_null_new(hg_vm_t *vm) +{ + hg_object_t *retval; + + hg_return_val_if_fail (vm != NULL, NULL); + + retval = hg_object_new(vm, 1); + if (retval != NULL) { + HG_OBJECT_GET_TYPE (retval) = HG_OBJECT_TYPE_NULL; + } + + return retval; +} + +/* integer */ +hg_object_t * +hg_object_integer_new(hg_vm_t *vm, + gint32 value) +{ + hg_object_t *retval; + + hg_return_val_if_fail (vm != NULL, NULL); + + retval = hg_object_new(vm, 1); + if (retval != NULL) { + HG_OBJECT_GET_TYPE (retval) = HG_OBJECT_TYPE_INTEGER; + HG_OBJECT_INTEGER (retval) = value; + } + + return retval; +} + +/* real */ +hg_object_t * +hg_object_real_new(hg_vm_t *vm, + gfloat value) +{ + hg_object_t *retval; + + hg_return_val_if_fail (vm != NULL, NULL); + + retval = hg_object_new(vm, 1); + if (retval != NULL) { + HG_OBJECT_GET_TYPE (retval) = HG_OBJECT_TYPE_REAL; + HG_OBJECT_REAL (retval) = value; + } + + return retval; +} + +/* name */ +hg_object_t * +hg_object_name_new(hg_vm_t *vm, + const gchar *value, + gboolean is_evaluated) +{ + hg_object_t *retval; + gsize size; + + hg_return_val_if_fail (vm != NULL, NULL); + hg_return_val_if_fail (value != NULL, NULL); + + size = strlen(value); + retval = hg_object_sized_new(vm, size + 1); + if (retval != NULL) { + if (is_evaluated) { + HG_OBJECT_GET_TYPE (retval) = HG_OBJECT_TYPE_EVAL; + } else { + HG_OBJECT_GET_TYPE (retval) = HG_OBJECT_TYPE_NAME; + } + HG_OBJECT_NAME (retval)->length = size; + memcpy(HG_OBJECT_DATA (retval), value, size); + } + + return retval; +} + +hg_object_t * +hg_object_system_encoding_new(hg_vm_t *vm, + guint32 index, + gboolean is_evaluated) +{ + hg_object_t *retval; + + hg_return_val_if_fail (vm != NULL, NULL); + + retval = hg_object_new(vm, 1); + if (retval != NULL) { + if (is_evaluated) { + HG_OBJECT_GET_TYPE (retval) = HG_OBJECT_TYPE_EVAL; + } else { + HG_OBJECT_GET_TYPE (retval) = HG_OBJECT_TYPE_NAME; + } + HG_OBJECT_ENCODING_NAME (retval)->representation = -1; + HG_OBJECT_ENCODING_NAME (retval)->index = index; + } + + return retval; +} + +/* boolean */ +hg_object_t * +hg_object_boolean_new(hg_vm_t *vm, + gboolean value) +{ + hg_object_t *retval; + + hg_return_val_if_fail (vm != NULL, NULL); + + retval = hg_object_new(vm, 1); + if (retval != NULL) { + HG_OBJECT_GET_TYPE (retval) = HG_OBJECT_TYPE_BOOLEAN; + HG_OBJECT_BOOLEAN (retval) = value; + } + + return retval; +} + +/* mark */ +hg_object_t * +hg_object_mark_new(hg_vm_t *vm) +{ + hg_object_t *retval; + + hg_return_val_if_fail (vm != NULL, NULL); + + retval = hg_object_new(vm, 1); + if (retval != NULL) { + HG_OBJECT_GET_TYPE (retval) = HG_OBJECT_TYPE_MARK; + } + + return retval; +} diff --git a/hieroglyph/hgobject.h b/hieroglyph/hgobject.h new file mode 100644 index 0000000..e82c95a --- /dev/null +++ b/hieroglyph/hgobject.h @@ -0,0 +1,117 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ +/* + * hgobject.h + * Copyright (C) 2005-2007 Akira TAGOH + * + * Authors: + * Akira TAGOH <akira@tagoh.org> + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ +#ifndef __HIEROGLYPH__HGOBJECT_H__ +#define __HIEROGLYPH__HGOBJECT_H__ + +#include <hieroglyph/hgtypes.h> + + +G_BEGIN_DECLS + +#define HG_OBJECT_OBJECT(_hg_o_) (&((_hg_o_)->object)) +#define HG_OBJECT_HEADER(_hg_o_) (&((_hg_o_)->header)) +#define HG_OBJECT_DATA(_hg_o_) (&(_hg_o_)->data) +#define HG_OBJECT_GET_TYPE(_hg_o_) (HG_OBJECT_OBJECT (_hg_o_)->t.v.object_type) +#define HG_OBJECT_IS(_hg_o_,_hg_t_) (HG_OBJECT_GET_TYPE (_hg_o_) == HG_OBJECT_TYPE_ ## _hg_t_) +#define HG_OBJECT_IS_NULL(_hg_o_) HG_OBJECT_IS (_hg_o_, NULL) +#define HG_OBJECT_IS_INTEGER(_hg_o_) HG_OBJECT_IS (_hg_o_, INTEGER) +#define HG_OBJECT_IS_REAL(_hg_o_) HG_OBJECT_IS (_hg_o_, REAL) +#define HG_OBJECT_IS_NAME(_hg_o_) HG_OBJECT_IS (_hg_o_, NAME) +#define HG_OBJECT_IS_BOOLEAN(_hg_o_) HG_OBJECT_IS (_hg_o_, BOOLEAN) +#define HG_OBJECT_IS_STRING(_hg_o_) HG_OBJECT_IS (_hg_o_, STRING) +#define HG_OBJECT_IS_EVAL(_hg_o_) HG_OBJECT_IS (_hg_o_, EVAL) +#define HG_OBJECT_IS_ARRAY(_hg_o_) HG_OBJECT_IS (_hg_o_, ARRAY) +#define HG_OBJECT_IS_MARK(_hg_o_) HG_OBJECT_IS (_hg_o_, MARK) +#define HG_OBJECT_IS_DICT(_hg_o_) HG_OBJECT_IS (_hg_o_, DICT) +#define HG_OBJECT_IS_FILE(_hg_o_) HG_OBJECT_IS (_hg_o_, FILE) +#define HG_OBJECT_IS_OPERATOR(_hg_o_) HG_OBJECT_IS (_hg_o_, OPERATOR) +#define HG_OBJECT_IS_COMPLEX(_hg_o_) (HG_OBJECT_IS_ARRAY (_hg_o_) || \ + HG_OBJECT_IS_STRING (_hg_o_) || \ + HG_OBJECT_IS_DICT (_hg_o_) || \ + HG_OBJECT_IS_FILE (_hg_o_) || \ + HG_OBJECT_IS_OPERATOR (_hg_o_)) +#define HG_OBJECT_ATTR_IS(_hg_o_,_hg_a_) ((HG_OBJECT_OBJECT (_hg_o_)->attr.bit.is_ ## _hg_a_) == TRUE) +#define HG_OBJECT_ATTR_IS_ACCESSIBLE(_hg_o_) HG_OBJECT_ATTR_IS (_hg_o_, accessible) +#define HG_OBJECT_ATTR_IS_READABLE(_hg_o_) HG_OBJECT_ATTR_IS (_hg_o_, readable) +#define HG_OBJECT_ATTR_IS_EXECUTEONLY(_hg_o_) HG_OBJECT_ATTR_IS (_hg_o_, executeonly) +#define HG_OBJECT_ATTR_IS_GLOBAL(_hg_o_) HG_OBJECT_ATTR_IS (_hg_o_, global) +#define HG_OBJECT_ATTR_IS_EXECUTABLE(_hg_o_) (HG_OBJECT_OBJECT (_hg_o_)->t.v.is_executable) +#define HG_OBJECT_GET_N_OBJECTS(_hg_o_) HG_OBJECT_HEADER (_hg_o_)->n_objects +#define HG_OBJECT_CHECK_N_OBJECTS(_hg_o_,_hg_n_) \ + (_hg_n_ < HG_OBJECT_GET_N_OBJECTS (_hg_o_)) +#define HG_OBJECT_INTEGER(_hg_o_) (HG_OBJECT_OBJECT (_hg_o_)->v.integer) +#define HG_OBJECT_REAL(_hg_o_) (HG_OBJECT_OBJECT (_hg_o_)->v.real) +#define HG_OBJECT_REAL_IS_EQUAL(_hg_o_1,_hg_o_2) \ + (fabsf(HG_OBJECT_REAL (_hg_o_1) - HG_OBJECT_REAL (_hg_o_2)) <= FLT_EPSILON) +#define HG_OBJECT_REAL_IS_ZERO(_hg_o_) (fabsf(HG_OBJECT_REAL (_hg_o_)) <= FLT_EPSILON) +#define HG_OBJECT_NAME(_hg_o_) (&(HG_OBJECT_OBJECT (_hg_o_)->v.name)) +#define HG_OBJECT_NAME_DATA(_hg_o_) (gchar *)(HG_OBJECT_DATA (_hg_o_)) +#define HG_OBJECT_ENCODING_NAME(_hg_o_) (&(HG_OBJECT_OBJECT (_hg_o_)->v.encoding)) +#define HG_OBJECT_BOOLEAN(_hg_o_) (HG_OBJECT_OBJECT (_hg_o_)->v.boolean) +#define HG_OBJECT_STRING(_hg_o_) (&(HG_OBJECT_OBJECT (_hg_o_)->v.string)) +#define HG_OBJECT_STRING_DATA(_hg_o_) ((hg_stringdata_t *)HG_OBJECT_DATA (_hg_o_)) +#define HG_OBJECT_ARRAY(_hg_o_) (&(HG_OBJECT_OBJECT (_hg_o_)->v.array)) +#define HG_OBJECT_ARRAY_DATA(_hg_o_) ((hg_arraydata_t *)HG_OBJECT_DATA (_hg_o_)) +#define HG_OBJECT_DICT(_hg_o_) (&(HG_OBJECT_OBJECT (_hg_o_)->v.dict)) +#define HG_OBJECT_DICT_DATA(_hg_o_) ((hg_dictdata_t *)HG_OBJECT_DATA (_hg_o_)) +#define HG_OBJECT_FILE(_hg_o_) (&(HG_OBJECT_OBJECT (_hg_o_)->v.file)) +#define HG_OBJECT_FILE_DATA(_hg_o_) ((hg_filedata_t *)HG_OBJECT_DATA (_hg_o_)) +#define HG_OBJECT_OPERATOR(_hg_o_) (&(HG_OBJECT_OBJECT (_hg_o_)->v.operator)) +#define HG_OBJECT_OPERATOR_DATA(_hg_o_) ((hg_operatordata_t *)HG_OBJECT_DATA (_hg_o_)) + + +hg_object_t *hg_object_new (hg_vm_t *vm, + guint16 n_objects) G_GNUC_WARN_UNUSED_RESULT; +hg_object_t *hg_object_sized_new (hg_vm_t *vm, + gsize size) G_GNUC_WARN_UNUSED_RESULT; +void hg_object_free (hg_vm_t *vm, + hg_object_t *object); +hg_object_t *hg_object_dup (hg_vm_t *vm, + hg_object_t *object) G_GNUC_WARN_UNUSED_RESULT; +hg_object_t *hg_object_copy (hg_vm_t *vm, + hg_object_t *object) G_GNUC_WARN_UNUSED_RESULT; +gboolean hg_object_compare (hg_object_t *object1, + hg_object_t *object2); +gchar *hg_object_dump (hg_object_t *object, + gboolean verbose) G_GNUC_MALLOC; +gsize hg_object_get_hash (hg_object_t *object); +hg_object_t *hg_object_null_new (hg_vm_t *vm) G_GNUC_WARN_UNUSED_RESULT; +hg_object_t *hg_object_integer_new (hg_vm_t *vm, + gint32 value) G_GNUC_WARN_UNUSED_RESULT; +hg_object_t *hg_object_real_new (hg_vm_t *vm, + gfloat value) G_GNUC_WARN_UNUSED_RESULT; +hg_object_t *hg_object_name_new (hg_vm_t *vm, + const gchar *value, + gboolean is_evaluated) G_GNUC_WARN_UNUSED_RESULT; +hg_object_t *hg_object_system_encoding_new(hg_vm_t *vm, + guint32 index, + gboolean is_evaluated) G_GNUC_WARN_UNUSED_RESULT; +hg_object_t *hg_object_boolean_new (hg_vm_t *vm, + gboolean value) G_GNUC_WARN_UNUSED_RESULT; +hg_object_t *hg_object_mark_new (hg_vm_t *vm) G_GNUC_WARN_UNUSED_RESULT; + + +G_END_DECLS + +#endif /* __HIEROGLYPH__HGOBJECT_H__ */ diff --git a/hieroglyph/hgoperator-private.h b/hieroglyph/hgoperator-private.h new file mode 100644 index 0000000..0c18ea9 --- /dev/null +++ b/hieroglyph/hgoperator-private.h @@ -0,0 +1,92 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ +/* + * hgoperator-private.h + * Copyright (C) 2007 Akira TAGOH + * + * Authors: + * Akira TAGOH <akira@tagoh.org> + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ +#ifndef __HIEROGLYPH_HGOPERATOR_PRIVATE_H__ +#define __HIEROGLYPH_HGOPERATOR_PRIVATE_H__ + +#include <hieroglyph/hgtypes.h> + +G_BEGIN_DECLS + + +#define HG_DEFUNC_BEGIN_OPER(name) \ + static gboolean \ + _hg_object_operator_ ## name ## _cb(hg_vm_t *vm, \ + hg_object_t *object) \ + { \ + gboolean retval = FALSE; +#define HG_DEFUNC_END_OPER \ + return retval; \ + } +#define HG_DEFUNC_UNIMPLEMENTED_OPER(name) \ + static gboolean \ + _hg_object_operator_ ## name ## _cb(hg_vm_t *vm, \ + hg_object_t *object) \ + { \ + g_warning("%s isn't yet implemented.", __PRETTY_FUNCTION__); \ + \ + return FALSE; \ + } +#define _hg_object_operator_build(_hg_v_,_hg_i_,_hg_n_) \ + G_STMT_START { \ + hg_object_t *_hg_o_, *_hg_d_, *_hg_on_; \ + \ + if (__hg_system_encoding_names[HG_enc_ ## _hg_i_] != NULL) \ + g_free(__hg_system_encoding_names[HG_enc_ ## _hg_i_]); \ + __hg_system_encoding_names[HG_enc_ ## _hg_i_] = g_strdup(# _hg_n_); \ + _hg_o_ = hg_object_operator_new((_hg_v_), HG_enc_ ## _hg_i_, _hg_object_operator_ ## _hg_i_ ## _cb); \ + if (_hg_o_) { \ + _hg_d_ = hg_vm_get_currentdict(_hg_v_); \ + _hg_on_ = hg_vm_name_lookup((_hg_v_), # _hg_n_); \ + if (!hg_object_dict_insert(_hg_d_, _hg_on_, _hg_o_)) { \ + retval = FALSE; \ + } \ + } else { \ + retval = FALSE; \ + } \ + } G_STMT_END +#define _hg_object_operator_priv_build(_hg_v_,_hg_n_, _hg_fn_) \ + G_STMT_START { \ + hg_object_t *_hg_o_, *_hg_d_, *_hg_on_; \ + \ + _hg_o_ = hg_object_operator_new_with_custom((_hg_v_), # _hg_n_, _hg_object_operator_ ## _hg_fn_ ## _cb); \ + if (_hg_o_) { \ + _hg_d_ = hg_vm_get_currentdict(_hg_v_); \ + _hg_on_ = hg_vm_name_lookup((_hg_v_), # _hg_n_); \ + if (!hg_object_dict_insert(_hg_d_, _hg_on_, _hg_o_)) { \ + retval = FALSE; \ + } \ + } else { \ + retval = FALSE; \ + } \ + } G_STMT_END +#define _hg_object_operator_unbuild(_hg_v_,_hg_n_) \ + G_STMT_START { \ + if (!hg_vm_dict_remove((_hg_v_), # _hg_n_, TRUE)) { \ + retval = FALSE; \ + } \ + } G_STMT_END + +G_END_DECLS + +#endif /* __HIEROGLYPH_HGOPERATOR_PRIVATE_H__ */ diff --git a/hieroglyph/hgoperator.c b/hieroglyph/hgoperator.c new file mode 100644 index 0000000..d21db41 --- /dev/null +++ b/hieroglyph/hgoperator.c @@ -0,0 +1,1271 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ +/* + * hgoperator.c + * Copyright (C) 2005-2007 Akira TAGOH + * + * Authors: + * Akira TAGOH <akira@tagoh.org> + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include <string.h> +#include <glib/gstrfuncs.h> +#include <hieroglyph/hgdict.h> +#include <hieroglyph/hgobject.h> +#include <hieroglyph/vm.h> +#include "hgoperator.h" +#include "hgoperator-private.h" + + +static gchar *__hg_system_encoding_names[HG_enc_END]; + + +/* + * private functions + */ +HG_DEFUNC_UNIMPLEMENTED_OPER (private_arraytomark); +HG_DEFUNC_UNIMPLEMENTED_OPER (private_dicttomark); +HG_DEFUNC_UNIMPLEMENTED_OPER (private_for_pos_int_continue); +HG_DEFUNC_UNIMPLEMENTED_OPER (private_for_pos_real_continue); +HG_DEFUNC_UNIMPLEMENTED_OPER (private_forall_array_continue); +HG_DEFUNC_UNIMPLEMENTED_OPER (private_forall_dict_continue); +HG_DEFUNC_UNIMPLEMENTED_OPER (private_forall_string_continue); +HG_DEFUNC_UNIMPLEMENTED_OPER (private_loop_continue); +HG_DEFUNC_UNIMPLEMENTED_OPER (private_repeat_continue); +HG_DEFUNC_UNIMPLEMENTED_OPER (private_stopped_continue); +HG_DEFUNC_UNIMPLEMENTED_OPER (private_findfont); +HG_DEFUNC_UNIMPLEMENTED_OPER (private_definefont); +HG_DEFUNC_UNIMPLEMENTED_OPER (private_stringcvs); +HG_DEFUNC_UNIMPLEMENTED_OPER (private_undefinefont); +HG_DEFUNC_UNIMPLEMENTED_OPER (private_write_eqeq_only); +HG_DEFUNC_UNIMPLEMENTED_OPER (abs); +HG_DEFUNC_UNIMPLEMENTED_OPER (add); +HG_DEFUNC_UNIMPLEMENTED_OPER (aload); +HG_DEFUNC_UNIMPLEMENTED_OPER (and); +HG_DEFUNC_UNIMPLEMENTED_OPER (arc); +HG_DEFUNC_UNIMPLEMENTED_OPER (arcn); +HG_DEFUNC_UNIMPLEMENTED_OPER (arcto); +HG_DEFUNC_UNIMPLEMENTED_OPER (array); +HG_DEFUNC_UNIMPLEMENTED_OPER (ashow); +HG_DEFUNC_UNIMPLEMENTED_OPER (astore); +HG_DEFUNC_UNIMPLEMENTED_OPER (atan); +HG_DEFUNC_UNIMPLEMENTED_OPER (awidthshow); +HG_DEFUNC_UNIMPLEMENTED_OPER (begin); +HG_DEFUNC_UNIMPLEMENTED_OPER (bind); +HG_DEFUNC_UNIMPLEMENTED_OPER (bitshift); +HG_DEFUNC_UNIMPLEMENTED_OPER (bytesavailable); +HG_DEFUNC_UNIMPLEMENTED_OPER (cachestatus); +HG_DEFUNC_UNIMPLEMENTED_OPER (ceiling); +HG_DEFUNC_UNIMPLEMENTED_OPER (charpath); +HG_DEFUNC_UNIMPLEMENTED_OPER (clear); +HG_DEFUNC_UNIMPLEMENTED_OPER (cleardictstack); +HG_DEFUNC_UNIMPLEMENTED_OPER (cleartomark); +HG_DEFUNC_UNIMPLEMENTED_OPER (clip); +HG_DEFUNC_UNIMPLEMENTED_OPER (clippath); +HG_DEFUNC_UNIMPLEMENTED_OPER (closefile); +HG_DEFUNC_UNIMPLEMENTED_OPER (closepath); +HG_DEFUNC_UNIMPLEMENTED_OPER (concat); +HG_DEFUNC_UNIMPLEMENTED_OPER (concatmatrix); +HG_DEFUNC_UNIMPLEMENTED_OPER (copy); +HG_DEFUNC_UNIMPLEMENTED_OPER (copypage); +HG_DEFUNC_UNIMPLEMENTED_OPER (cos); +HG_DEFUNC_UNIMPLEMENTED_OPER (count); +HG_DEFUNC_UNIMPLEMENTED_OPER (countdictstack); +HG_DEFUNC_UNIMPLEMENTED_OPER (countexecstack); +HG_DEFUNC_UNIMPLEMENTED_OPER (counttomark); +HG_DEFUNC_UNIMPLEMENTED_OPER (currentdash); +HG_DEFUNC_UNIMPLEMENTED_OPER (currentdict); +HG_DEFUNC_UNIMPLEMENTED_OPER (currentfile); +HG_DEFUNC_UNIMPLEMENTED_OPER (currentflat); +HG_DEFUNC_UNIMPLEMENTED_OPER (currentfont); +HG_DEFUNC_UNIMPLEMENTED_OPER (currentgray); +HG_DEFUNC_UNIMPLEMENTED_OPER (currenthsbcolor); +HG_DEFUNC_UNIMPLEMENTED_OPER (currentlinecap); +HG_DEFUNC_UNIMPLEMENTED_OPER (currentlinejoin); +HG_DEFUNC_UNIMPLEMENTED_OPER (currentlinewidth); +HG_DEFUNC_UNIMPLEMENTED_OPER (currentmatrix); +HG_DEFUNC_UNIMPLEMENTED_OPER (currentmiterlimit); +HG_DEFUNC_UNIMPLEMENTED_OPER (currentpoint); +HG_DEFUNC_UNIMPLEMENTED_OPER (currentrgbcolor); +HG_DEFUNC_UNIMPLEMENTED_OPER (currentscreen); +HG_DEFUNC_UNIMPLEMENTED_OPER (currenttransfer); +HG_DEFUNC_UNIMPLEMENTED_OPER (curveto); +HG_DEFUNC_UNIMPLEMENTED_OPER (cvi); +HG_DEFUNC_UNIMPLEMENTED_OPER (cvlit); +HG_DEFUNC_UNIMPLEMENTED_OPER (cvn); +HG_DEFUNC_UNIMPLEMENTED_OPER (cvr); +HG_DEFUNC_UNIMPLEMENTED_OPER (cvrs); +HG_DEFUNC_UNIMPLEMENTED_OPER (cvx); +HG_DEFUNC_UNIMPLEMENTED_OPER (def); +HG_DEFUNC_UNIMPLEMENTED_OPER (defaultmatrix); +HG_DEFUNC_UNIMPLEMENTED_OPER (dict); +HG_DEFUNC_UNIMPLEMENTED_OPER (dictstack); +HG_DEFUNC_UNIMPLEMENTED_OPER (div); +HG_DEFUNC_UNIMPLEMENTED_OPER (dtransform); +HG_DEFUNC_UNIMPLEMENTED_OPER (dup); +HG_DEFUNC_UNIMPLEMENTED_OPER (echo); +HG_DEFUNC_UNIMPLEMENTED_OPER (eexec); +HG_DEFUNC_UNIMPLEMENTED_OPER (end); +HG_DEFUNC_UNIMPLEMENTED_OPER (eoclip); +HG_DEFUNC_UNIMPLEMENTED_OPER (eofill); +HG_DEFUNC_UNIMPLEMENTED_OPER (eq); +HG_DEFUNC_UNIMPLEMENTED_OPER (erasepage); +HG_DEFUNC_UNIMPLEMENTED_OPER (exch); +HG_DEFUNC_UNIMPLEMENTED_OPER (exec); +HG_DEFUNC_UNIMPLEMENTED_OPER (execstack); +HG_DEFUNC_UNIMPLEMENTED_OPER (executeonly); +HG_DEFUNC_UNIMPLEMENTED_OPER (exit); +HG_DEFUNC_UNIMPLEMENTED_OPER (exp); +HG_DEFUNC_UNIMPLEMENTED_OPER (file); +HG_DEFUNC_UNIMPLEMENTED_OPER (fill); +HG_DEFUNC_UNIMPLEMENTED_OPER (flattenpath); +HG_DEFUNC_UNIMPLEMENTED_OPER (flush); +HG_DEFUNC_UNIMPLEMENTED_OPER (flushfile); +HG_DEFUNC_UNIMPLEMENTED_OPER (FontDirectory); +HG_DEFUNC_UNIMPLEMENTED_OPER (for); +HG_DEFUNC_UNIMPLEMENTED_OPER (forall); +HG_DEFUNC_UNIMPLEMENTED_OPER (ge); +HG_DEFUNC_UNIMPLEMENTED_OPER (get); +HG_DEFUNC_UNIMPLEMENTED_OPER (getinterval); +HG_DEFUNC_UNIMPLEMENTED_OPER (grestore); +HG_DEFUNC_UNIMPLEMENTED_OPER (grestoreall); +HG_DEFUNC_UNIMPLEMENTED_OPER (gsave); +HG_DEFUNC_UNIMPLEMENTED_OPER (gt); +HG_DEFUNC_UNIMPLEMENTED_OPER (identmatrix); +HG_DEFUNC_UNIMPLEMENTED_OPER (idiv); +HG_DEFUNC_UNIMPLEMENTED_OPER (idtransform); +HG_DEFUNC_UNIMPLEMENTED_OPER (if); +HG_DEFUNC_UNIMPLEMENTED_OPER (ifelse); +HG_DEFUNC_UNIMPLEMENTED_OPER (image); +HG_DEFUNC_UNIMPLEMENTED_OPER (imagemask); +HG_DEFUNC_UNIMPLEMENTED_OPER (index); +HG_DEFUNC_UNIMPLEMENTED_OPER (initclip); +HG_DEFUNC_UNIMPLEMENTED_OPER (initgraphics); +HG_DEFUNC_UNIMPLEMENTED_OPER (initmatrix); +HG_DEFUNC_UNIMPLEMENTED_OPER (internaldict); +HG_DEFUNC_UNIMPLEMENTED_OPER (invertmatrix); +HG_DEFUNC_UNIMPLEMENTED_OPER (itransform); +HG_DEFUNC_UNIMPLEMENTED_OPER (known); +HG_DEFUNC_UNIMPLEMENTED_OPER (kshow); +HG_DEFUNC_UNIMPLEMENTED_OPER (le); +HG_DEFUNC_UNIMPLEMENTED_OPER (length); +HG_DEFUNC_UNIMPLEMENTED_OPER (lineto); +HG_DEFUNC_UNIMPLEMENTED_OPER (ln); +HG_DEFUNC_UNIMPLEMENTED_OPER (log); +HG_DEFUNC_UNIMPLEMENTED_OPER (loop); +HG_DEFUNC_UNIMPLEMENTED_OPER (lt); +HG_DEFUNC_UNIMPLEMENTED_OPER (makefont); +HG_DEFUNC_UNIMPLEMENTED_OPER (maxlength); +HG_DEFUNC_UNIMPLEMENTED_OPER (mod); +HG_DEFUNC_UNIMPLEMENTED_OPER (moveto); +HG_DEFUNC_UNIMPLEMENTED_OPER (mul); +HG_DEFUNC_UNIMPLEMENTED_OPER (ne); +HG_DEFUNC_UNIMPLEMENTED_OPER (neg); +HG_DEFUNC_UNIMPLEMENTED_OPER (newpath); +HG_DEFUNC_UNIMPLEMENTED_OPER (noaccess); +HG_DEFUNC_UNIMPLEMENTED_OPER (not); +HG_DEFUNC_UNIMPLEMENTED_OPER (nulldevice); +HG_DEFUNC_UNIMPLEMENTED_OPER (or); +HG_DEFUNC_UNIMPLEMENTED_OPER (pathbbox); +HG_DEFUNC_UNIMPLEMENTED_OPER (pathforall); +HG_DEFUNC_UNIMPLEMENTED_OPER (pop); +HG_DEFUNC_UNIMPLEMENTED_OPER (print); +HG_DEFUNC_UNIMPLEMENTED_OPER (put); +HG_DEFUNC_UNIMPLEMENTED_OPER (rand); +HG_DEFUNC_UNIMPLEMENTED_OPER (rcheck); +HG_DEFUNC_UNIMPLEMENTED_OPER (rcurveto); +HG_DEFUNC_UNIMPLEMENTED_OPER (read); +HG_DEFUNC_UNIMPLEMENTED_OPER (readhexstring); +HG_DEFUNC_UNIMPLEMENTED_OPER (readline); +HG_DEFUNC_UNIMPLEMENTED_OPER (readonly); +HG_DEFUNC_UNIMPLEMENTED_OPER (readstring); +HG_DEFUNC_UNIMPLEMENTED_OPER (repeat); +HG_DEFUNC_UNIMPLEMENTED_OPER (resetfile); +HG_DEFUNC_UNIMPLEMENTED_OPER (restore); +HG_DEFUNC_UNIMPLEMENTED_OPER (reversepath); +HG_DEFUNC_UNIMPLEMENTED_OPER (rlineto); +HG_DEFUNC_UNIMPLEMENTED_OPER (rmoveto); +HG_DEFUNC_UNIMPLEMENTED_OPER (roll); +HG_DEFUNC_UNIMPLEMENTED_OPER (rotate); +HG_DEFUNC_UNIMPLEMENTED_OPER (round); +HG_DEFUNC_UNIMPLEMENTED_OPER (rrand); +HG_DEFUNC_UNIMPLEMENTED_OPER (save); +HG_DEFUNC_UNIMPLEMENTED_OPER (scale); +HG_DEFUNC_UNIMPLEMENTED_OPER (scalefont); +HG_DEFUNC_UNIMPLEMENTED_OPER (search); +HG_DEFUNC_UNIMPLEMENTED_OPER (setcachedevice); +HG_DEFUNC_UNIMPLEMENTED_OPER (setcachelimit); +HG_DEFUNC_UNIMPLEMENTED_OPER (setcharwidth); +HG_DEFUNC_UNIMPLEMENTED_OPER (setdash); +HG_DEFUNC_UNIMPLEMENTED_OPER (setflat); +HG_DEFUNC_UNIMPLEMENTED_OPER (setfont); +HG_DEFUNC_UNIMPLEMENTED_OPER (setgray); +HG_DEFUNC_UNIMPLEMENTED_OPER (sethsbcolor); +HG_DEFUNC_UNIMPLEMENTED_OPER (setlinecap); +HG_DEFUNC_UNIMPLEMENTED_OPER (setlinejoin); +HG_DEFUNC_UNIMPLEMENTED_OPER (setlinewidth); +HG_DEFUNC_UNIMPLEMENTED_OPER (setmatrix); +HG_DEFUNC_UNIMPLEMENTED_OPER (setmiterlimit); +HG_DEFUNC_UNIMPLEMENTED_OPER (setrgbcolor); +HG_DEFUNC_UNIMPLEMENTED_OPER (setscreen); +HG_DEFUNC_UNIMPLEMENTED_OPER (settransfer); +HG_DEFUNC_UNIMPLEMENTED_OPER (show); +HG_DEFUNC_UNIMPLEMENTED_OPER (showpage); +HG_DEFUNC_UNIMPLEMENTED_OPER (sin); +HG_DEFUNC_UNIMPLEMENTED_OPER (sqrt); +HG_DEFUNC_UNIMPLEMENTED_OPER (srand); +HG_DEFUNC_UNIMPLEMENTED_OPER (status); +HG_DEFUNC_UNIMPLEMENTED_OPER (stop); +HG_DEFUNC_UNIMPLEMENTED_OPER (stopped); +HG_DEFUNC_UNIMPLEMENTED_OPER (string); +HG_DEFUNC_UNIMPLEMENTED_OPER (stringwidth); +HG_DEFUNC_UNIMPLEMENTED_OPER (stroke); +HG_DEFUNC_UNIMPLEMENTED_OPER (strokepath); +HG_DEFUNC_UNIMPLEMENTED_OPER (sub); +HG_DEFUNC_UNIMPLEMENTED_OPER (token); +HG_DEFUNC_UNIMPLEMENTED_OPER (transform); +HG_DEFUNC_UNIMPLEMENTED_OPER (translate); +HG_DEFUNC_UNIMPLEMENTED_OPER (truncate); +HG_DEFUNC_UNIMPLEMENTED_OPER (type); +HG_DEFUNC_UNIMPLEMENTED_OPER (usertime); +HG_DEFUNC_UNIMPLEMENTED_OPER (vmstatus); +HG_DEFUNC_UNIMPLEMENTED_OPER (wcheck); +HG_DEFUNC_UNIMPLEMENTED_OPER (where); +HG_DEFUNC_UNIMPLEMENTED_OPER (widthshow); +HG_DEFUNC_UNIMPLEMENTED_OPER (write); +HG_DEFUNC_UNIMPLEMENTED_OPER (writehexstring); +HG_DEFUNC_UNIMPLEMENTED_OPER (writestring); +HG_DEFUNC_UNIMPLEMENTED_OPER (xcheck); +HG_DEFUNC_UNIMPLEMENTED_OPER (xor); + +HG_DEFUNC_UNIMPLEMENTED_OPER (arct); +HG_DEFUNC_UNIMPLEMENTED_OPER (colorimage); +HG_DEFUNC_UNIMPLEMENTED_OPER (cshow); +HG_DEFUNC_UNIMPLEMENTED_OPER (currentblackgeneration); +HG_DEFUNC_UNIMPLEMENTED_OPER (currentcacheparams); +HG_DEFUNC_UNIMPLEMENTED_OPER (currentcmykcolor); +HG_DEFUNC_UNIMPLEMENTED_OPER (currentcolor); +HG_DEFUNC_UNIMPLEMENTED_OPER (currentcolorrendering); +HG_DEFUNC_UNIMPLEMENTED_OPER (currentcolorscreen); +HG_DEFUNC_UNIMPLEMENTED_OPER (currentcolorspace); +HG_DEFUNC_UNIMPLEMENTED_OPER (currentcolortransfer); +HG_DEFUNC_UNIMPLEMENTED_OPER (currentdevparams); +HG_DEFUNC_UNIMPLEMENTED_OPER (currentgstate); +HG_DEFUNC_UNIMPLEMENTED_OPER (currenthalftone); +HG_DEFUNC_UNIMPLEMENTED_OPER (currentobjectformat); +HG_DEFUNC_UNIMPLEMENTED_OPER (currentoverprint); +HG_DEFUNC_UNIMPLEMENTED_OPER (currentpacking); +HG_DEFUNC_UNIMPLEMENTED_OPER (currentpagedevice); +HG_DEFUNC_UNIMPLEMENTED_OPER (currentshared); +HG_DEFUNC_UNIMPLEMENTED_OPER (currentstrokeadjust); +HG_DEFUNC_UNIMPLEMENTED_OPER (currentsystemparams); +HG_DEFUNC_UNIMPLEMENTED_OPER (currentundercolorremoval); +HG_DEFUNC_UNIMPLEMENTED_OPER (currentuserparams); +HG_DEFUNC_UNIMPLEMENTED_OPER (defineresource); +HG_DEFUNC_UNIMPLEMENTED_OPER (defineuserobject); +HG_DEFUNC_UNIMPLEMENTED_OPER (deletefile); +HG_DEFUNC_UNIMPLEMENTED_OPER (execform); +HG_DEFUNC_UNIMPLEMENTED_OPER (execuserobject); +HG_DEFUNC_UNIMPLEMENTED_OPER (filenameforall); +HG_DEFUNC_UNIMPLEMENTED_OPER (fileposition); +HG_DEFUNC_UNIMPLEMENTED_OPER (filter); +HG_DEFUNC_UNIMPLEMENTED_OPER (findencoding); +HG_DEFUNC_UNIMPLEMENTED_OPER (findresource); +HG_DEFUNC_UNIMPLEMENTED_OPER (gcheck); +HG_DEFUNC_UNIMPLEMENTED_OPER (GlobalFontDirectory); +HG_DEFUNC_UNIMPLEMENTED_OPER (glyphshow); +HG_DEFUNC_UNIMPLEMENTED_OPER (gstate); +HG_DEFUNC_UNIMPLEMENTED_OPER (ineofill); +HG_DEFUNC_UNIMPLEMENTED_OPER (infill); +HG_DEFUNC_UNIMPLEMENTED_OPER (instroke); +HG_DEFUNC_UNIMPLEMENTED_OPER (inueofill); +HG_DEFUNC_UNIMPLEMENTED_OPER (inufill); +HG_DEFUNC_UNIMPLEMENTED_OPER (inustroke); +HG_DEFUNC_UNIMPLEMENTED_OPER (ISOLatin1Encoding); +HG_DEFUNC_UNIMPLEMENTED_OPER (languagelevel); +HG_DEFUNC_UNIMPLEMENTED_OPER (makepattern); +HG_DEFUNC_UNIMPLEMENTED_OPER (packedarray); +HG_DEFUNC_UNIMPLEMENTED_OPER (printobject); +HG_DEFUNC_UNIMPLEMENTED_OPER (realtime); +HG_DEFUNC_UNIMPLEMENTED_OPER (rectclip); +HG_DEFUNC_UNIMPLEMENTED_OPER (rectfill); +HG_DEFUNC_UNIMPLEMENTED_OPER (rectstroke); +HG_DEFUNC_UNIMPLEMENTED_OPER (renamefile); +HG_DEFUNC_UNIMPLEMENTED_OPER (resourceforall); +HG_DEFUNC_UNIMPLEMENTED_OPER (resourcestatus); +HG_DEFUNC_UNIMPLEMENTED_OPER (rootfont); +HG_DEFUNC_UNIMPLEMENTED_OPER (scheck); +HG_DEFUNC_UNIMPLEMENTED_OPER (selectfont); +HG_DEFUNC_UNIMPLEMENTED_OPER (serialnumber); +HG_DEFUNC_UNIMPLEMENTED_OPER (setbbox); +HG_DEFUNC_UNIMPLEMENTED_OPER (setblackgeneration); +HG_DEFUNC_UNIMPLEMENTED_OPER (setcachedevice2); +HG_DEFUNC_UNIMPLEMENTED_OPER (setcacheparams); +HG_DEFUNC_UNIMPLEMENTED_OPER (setcmykcolor); +HG_DEFUNC_UNIMPLEMENTED_OPER (setcolor); +HG_DEFUNC_UNIMPLEMENTED_OPER (setcolorrendering); +HG_DEFUNC_UNIMPLEMENTED_OPER (setcolorscreen); +HG_DEFUNC_UNIMPLEMENTED_OPER (setcolorspace); +HG_DEFUNC_UNIMPLEMENTED_OPER (setcolortransfer); +HG_DEFUNC_UNIMPLEMENTED_OPER (setdevparams); +HG_DEFUNC_UNIMPLEMENTED_OPER (setfileposition); +HG_DEFUNC_UNIMPLEMENTED_OPER (setgstate); +HG_DEFUNC_UNIMPLEMENTED_OPER (sethalftone); +HG_DEFUNC_UNIMPLEMENTED_OPER (setobjectformat); +HG_DEFUNC_UNIMPLEMENTED_OPER (setoverprint); +HG_DEFUNC_UNIMPLEMENTED_OPER (setpacking); +HG_DEFUNC_UNIMPLEMENTED_OPER (setpagedevice); +HG_DEFUNC_UNIMPLEMENTED_OPER (setpattern); +HG_DEFUNC_UNIMPLEMENTED_OPER (setshared); +HG_DEFUNC_UNIMPLEMENTED_OPER (setstrokeadjust); +HG_DEFUNC_UNIMPLEMENTED_OPER (setsystemparams); +HG_DEFUNC_UNIMPLEMENTED_OPER (setucacheparams); +HG_DEFUNC_UNIMPLEMENTED_OPER (setundercolorremoval); +HG_DEFUNC_UNIMPLEMENTED_OPER (setuserparams); +HG_DEFUNC_UNIMPLEMENTED_OPER (setvmthreshold); +HG_DEFUNC_UNIMPLEMENTED_OPER (shareddict); +HG_DEFUNC_UNIMPLEMENTED_OPER (SharedFontDirectory); +HG_DEFUNC_UNIMPLEMENTED_OPER (startjob); +HG_DEFUNC_UNIMPLEMENTED_OPER (uappend); +HG_DEFUNC_UNIMPLEMENTED_OPER (ucache); +HG_DEFUNC_UNIMPLEMENTED_OPER (ucachestatus); +HG_DEFUNC_UNIMPLEMENTED_OPER (ueofill); +HG_DEFUNC_UNIMPLEMENTED_OPER (ufill); +HG_DEFUNC_UNIMPLEMENTED_OPER (undef); +HG_DEFUNC_UNIMPLEMENTED_OPER (undefineresource); +HG_DEFUNC_UNIMPLEMENTED_OPER (undefineuserobject); +HG_DEFUNC_UNIMPLEMENTED_OPER (upath); +HG_DEFUNC_UNIMPLEMENTED_OPER (UserObjects); +HG_DEFUNC_UNIMPLEMENTED_OPER (ustroke); +HG_DEFUNC_UNIMPLEMENTED_OPER (ustrokepath); +HG_DEFUNC_UNIMPLEMENTED_OPER (vmreclaim); +HG_DEFUNC_UNIMPLEMENTED_OPER (writeobject); +HG_DEFUNC_UNIMPLEMENTED_OPER (xshow); +HG_DEFUNC_UNIMPLEMENTED_OPER (xyshow); +HG_DEFUNC_UNIMPLEMENTED_OPER (yshow); + +HG_DEFUNC_UNIMPLEMENTED_OPER (addglyph); +HG_DEFUNC_UNIMPLEMENTED_OPER (beginbfchar); +HG_DEFUNC_UNIMPLEMENTED_OPER (beginbfrange); +HG_DEFUNC_UNIMPLEMENTED_OPER (begincidchar); +HG_DEFUNC_UNIMPLEMENTED_OPER (begincidrange); +HG_DEFUNC_UNIMPLEMENTED_OPER (begincmap); +HG_DEFUNC_UNIMPLEMENTED_OPER (begincodespacerange); +HG_DEFUNC_UNIMPLEMENTED_OPER (beginnotdefchar); +HG_DEFUNC_UNIMPLEMENTED_OPER (beginnotdefrange); +HG_DEFUNC_UNIMPLEMENTED_OPER (beginrearrangedfont); +HG_DEFUNC_UNIMPLEMENTED_OPER (beginusematrix); +HG_DEFUNC_UNIMPLEMENTED_OPER (cliprestore); +HG_DEFUNC_UNIMPLEMENTED_OPER (clipsave); +HG_DEFUNC_UNIMPLEMENTED_OPER (composefont); +HG_DEFUNC_UNIMPLEMENTED_OPER (currentsmoothness); +HG_DEFUNC_UNIMPLEMENTED_OPER (currentrapparams); +HG_DEFUNC_UNIMPLEMENTED_OPER (endbfchar); +HG_DEFUNC_UNIMPLEMENTED_OPER (endbfrange); +HG_DEFUNC_UNIMPLEMENTED_OPER (endcidchar); +HG_DEFUNC_UNIMPLEMENTED_OPER (endcidrange); +HG_DEFUNC_UNIMPLEMENTED_OPER (endcmap); +HG_DEFUNC_UNIMPLEMENTED_OPER (endcodespacerange); +HG_DEFUNC_UNIMPLEMENTED_OPER (endnotdefchar); +HG_DEFUNC_UNIMPLEMENTED_OPER (endnotdefrange); +HG_DEFUNC_UNIMPLEMENTED_OPER (endrearrangedfont); +HG_DEFUNC_UNIMPLEMENTED_OPER (endusematrix); +HG_DEFUNC_UNIMPLEMENTED_OPER (findcolorrendering); +HG_DEFUNC_UNIMPLEMENTED_OPER (gethalftonename); +HG_DEFUNC_UNIMPLEMENTED_OPER (getpagedevicename); +HG_DEFUNC_UNIMPLEMENTED_OPER (getsubstitutecrd); +HG_DEFUNC_UNIMPLEMENTED_OPER (removeall); +HG_DEFUNC_UNIMPLEMENTED_OPER (removeglyphs); +HG_DEFUNC_UNIMPLEMENTED_OPER (setsmoothness); +HG_DEFUNC_UNIMPLEMENTED_OPER (settrapparams); +HG_DEFUNC_UNIMPLEMENTED_OPER (settrapzone); +HG_DEFUNC_UNIMPLEMENTED_OPER (shfill); +HG_DEFUNC_UNIMPLEMENTED_OPER (startdata); +HG_DEFUNC_UNIMPLEMENTED_OPER (usecmap); +HG_DEFUNC_UNIMPLEMENTED_OPER (usefont); + +/* + * public functions + */ +hg_object_t * +hg_object_operator_new(hg_vm_t *vm, + hg_system_encoding_t enc, + hg_operator_func_t func) +{ + hg_object_t *retval; + gint16 length; + hg_operatordata_t *data; + + hg_return_val_if_fail (vm != NULL, NULL); + hg_return_val_if_fail (__hg_system_encoding_names[enc] != NULL, NULL); + + length = strlen(__hg_system_encoding_names[enc]); + retval = hg_object_sized_new(vm, hg_n_alignof (sizeof (hg_operatordata_t) + sizeof (gchar) * (length + 1))); + if (retval != NULL) { + HG_OBJECT_GET_TYPE (retval) = HG_OBJECT_TYPE_OPERATOR; + HG_OBJECT_OPERATOR (retval)->length = length; + data = HG_OBJECT_OPERATOR_DATA (retval); + data->func = func; + memcpy(data->name, __hg_system_encoding_names[enc], length); + } + + return retval; +} + +hg_object_t * +hg_object_operator_new_with_custom(hg_vm_t *vm, + gchar *name, + hg_operator_func_t func) +{ + hg_object_t *retval; + gint16 length; + hg_operatordata_t *data; + + hg_return_val_if_fail (vm != NULL, NULL); + hg_return_val_if_fail (name != NULL, NULL); + + length = strlen(name); + retval = hg_object_sized_new(vm, hg_n_alignof (sizeof (hg_operatordata_t) + sizeof (gchar) * (length + 1))); + if (retval != NULL) { + HG_OBJECT_GET_TYPE (retval) = HG_OBJECT_TYPE_OPERATOR; + HG_OBJECT_OPERATOR (retval)->length = length; + data = HG_OBJECT_OPERATOR_DATA (retval); + data->func = func; + memcpy(data->name, name, length); + } + + return retval; +} + +gboolean +hg_object_operator_initialize(hg_vm_t *vm, + hg_emulation_type_t level) +{ + gboolean retval = TRUE; + hg_emulation_type_t current; + + hg_return_val_if_fail (vm != NULL, FALSE); + hg_return_val_if_fail (level < HG_EMU_END, FALSE); + + current = hg_vm_get_emulation_level(vm); + if (level >= HG_EMU_PS_LEVEL_1 && current < level) { + _hg_object_operator_priv_build(vm, %arraytomark, private_arraytomark); + _hg_object_operator_priv_build(vm, %dicttomark, private_dicttomark); + _hg_object_operator_priv_build(vm, %for_pos_int_continue, private_for_pos_int_continue); + _hg_object_operator_priv_build(vm, %for_pos_real_continue, private_for_pos_real_continue); + _hg_object_operator_priv_build(vm, %forall_array_continue, private_forall_array_continue); + _hg_object_operator_priv_build(vm, %forall_dict_continue, private_forall_dict_continue); + _hg_object_operator_priv_build(vm, %forall_string_continue, private_forall_string_continue); + _hg_object_operator_priv_build(vm, %loop_continue, private_loop_continue); + _hg_object_operator_priv_build(vm, %repeat_continue, private_repeat_continue); + _hg_object_operator_priv_build(vm, %stopped_continue, private_stopped_continue); + _hg_object_operator_priv_build(vm, .findfont, private_findfont); + _hg_object_operator_priv_build(vm, .definefont, private_definefont); + _hg_object_operator_priv_build(vm, .stringcvs, private_stringcvs); + _hg_object_operator_priv_build(vm, .undefinefont, private_undefinefont); + _hg_object_operator_priv_build(vm, .write==only, private_write_eqeq_only); + _hg_object_operator_build(vm, abs, abs); + _hg_object_operator_build(vm, add, add); + _hg_object_operator_build(vm, aload, aload); + _hg_object_operator_build(vm, and, and); + _hg_object_operator_build(vm, arc, arc); + _hg_object_operator_build(vm, arcn, arcn); + _hg_object_operator_build(vm, arcto, arcto); + _hg_object_operator_build(vm, array, array); + _hg_object_operator_build(vm, ashow, ashow); + _hg_object_operator_build(vm, astore, astore); + _hg_object_operator_build(vm, atan, atan); + _hg_object_operator_build(vm, awidthshow, awidthshow); + _hg_object_operator_build(vm, begin, begin); + _hg_object_operator_build(vm, bind, bind); + _hg_object_operator_build(vm, bitshift, bitshift); + _hg_object_operator_build(vm, bytesavailable, bytesavailable); + _hg_object_operator_build(vm, cachestatus, cachestatus); + _hg_object_operator_build(vm, ceiling, ceiling); + _hg_object_operator_build(vm, charpath, charpath); + _hg_object_operator_build(vm, clear, clear); + _hg_object_operator_build(vm, cleardictstack, cleardictstack); + _hg_object_operator_build(vm, cleartomark, cleartomark); + _hg_object_operator_build(vm, clip, clip); + _hg_object_operator_build(vm, clippath, clippath); + _hg_object_operator_build(vm, closefile, closefile); + _hg_object_operator_build(vm, closepath, closepath); + _hg_object_operator_build(vm, concat, concat); + _hg_object_operator_build(vm, concatmatrix, concatmatrix); + _hg_object_operator_build(vm, copy, copy); + _hg_object_operator_build(vm, copypage, copypage); + _hg_object_operator_build(vm, cos, cos); + _hg_object_operator_build(vm, count, count); + _hg_object_operator_build(vm, countdictstack, countdictstack); + _hg_object_operator_build(vm, countexecstack, countexecstack); + _hg_object_operator_build(vm, counttomark, counttomark); + _hg_object_operator_build(vm, currentdash, currentdash); + _hg_object_operator_build(vm, currentdict, currentdict); + _hg_object_operator_build(vm, currentfile, currentfile); + _hg_object_operator_build(vm, currentflat, currentflat); + _hg_object_operator_build(vm, currentfont, currentfont); + _hg_object_operator_build(vm, currentgray, currentgray); + _hg_object_operator_build(vm, currenthsbcolor, currenthsbcolor); + _hg_object_operator_build(vm, currentlinecap, currentlinecap); + _hg_object_operator_build(vm, currentlinejoin, currentlinejoin); + _hg_object_operator_build(vm, currentlinewidth, currentlinewidth); + _hg_object_operator_build(vm, currentmatrix, currentmatrix); + _hg_object_operator_build(vm, currentmiterlimit, currentmiterlimit); + _hg_object_operator_build(vm, currentpoint, currentpoint); + _hg_object_operator_build(vm, currentrgbcolor, currentrgbcolor); + _hg_object_operator_build(vm, currentscreen, currentscreen); + _hg_object_operator_build(vm, currenttransfer, currenttransfer); + _hg_object_operator_build(vm, curveto, curveto); + _hg_object_operator_build(vm, cvi, cvi); + _hg_object_operator_build(vm, cvlit, cvlit); + _hg_object_operator_build(vm, cvn, cvn); + _hg_object_operator_build(vm, cvr, cvr); + _hg_object_operator_build(vm, cvrs, cvrs); + _hg_object_operator_build(vm, cvx, cvx); + _hg_object_operator_build(vm, def, def); + _hg_object_operator_build(vm, defaultmatrix, defaultmatrix); + _hg_object_operator_build(vm, dict, dict); + _hg_object_operator_build(vm, dictstack, dictstack); + _hg_object_operator_build(vm, div, div); + _hg_object_operator_build(vm, dtransform, dtransform); + _hg_object_operator_build(vm, dup, dup); + _hg_object_operator_build(vm, echo, echo); + _hg_object_operator_priv_build(vm, eexec, eexec); + _hg_object_operator_build(vm, end, end); + _hg_object_operator_build(vm, eoclip, eoclip); + _hg_object_operator_build(vm, eofill, eofill); + _hg_object_operator_build(vm, eq, eq); + _hg_object_operator_build(vm, erasepage, erasepage); + _hg_object_operator_build(vm, exch, exch); + _hg_object_operator_build(vm, exec, exec); + _hg_object_operator_build(vm, execstack, execstack); + _hg_object_operator_build(vm, executeonly, executeonly); + _hg_object_operator_build(vm, exit, exit); + _hg_object_operator_build(vm, exp, exp); + _hg_object_operator_build(vm, file, file); + _hg_object_operator_build(vm, fill, fill); + _hg_object_operator_build(vm, flattenpath, flattenpath); + _hg_object_operator_build(vm, flush, flush); + _hg_object_operator_build(vm, flushfile, flushfile); + _hg_object_operator_build(vm, FontDirectory, fontdirectory); + _hg_object_operator_build(vm, for, for); + _hg_object_operator_build(vm, forall, forall); + _hg_object_operator_build(vm, ge, ge); + _hg_object_operator_build(vm, get, get); + _hg_object_operator_build(vm, getinterval, getinterval); + _hg_object_operator_build(vm, grestore, grestore); + _hg_object_operator_build(vm, grestoreall, grestoreall); + _hg_object_operator_build(vm, gsave, gsave); + _hg_object_operator_build(vm, gt, gt); + _hg_object_operator_build(vm, identmatrix, identmatrix); + _hg_object_operator_build(vm, idiv, idiv); + _hg_object_operator_build(vm, idtransform, idtransform); + _hg_object_operator_build(vm, if, if); + _hg_object_operator_build(vm, ifelse, ifelse); + _hg_object_operator_build(vm, image, image); + _hg_object_operator_build(vm, imagemask, imagemask); + _hg_object_operator_build(vm, index, index); + _hg_object_operator_build(vm, initclip, initclip); + _hg_object_operator_build(vm, initgraphics, initgraphics); + _hg_object_operator_build(vm, initmatrix, initmatrix); + _hg_object_operator_priv_build(vm, internaldict, internaldict); + _hg_object_operator_build(vm, invertmatrix, invertmatrix); + _hg_object_operator_build(vm, itransform, itransform); + _hg_object_operator_build(vm, known, known); + _hg_object_operator_build(vm, kshow, kshow); + _hg_object_operator_build(vm, le, le); + _hg_object_operator_build(vm, length, length); + _hg_object_operator_build(vm, lineto, lineto); + _hg_object_operator_build(vm, ln, ln); + _hg_object_operator_build(vm, log, log); + _hg_object_operator_build(vm, loop, loop); + _hg_object_operator_build(vm, lt, lt); + _hg_object_operator_build(vm, makefont, makefont); + _hg_object_operator_build(vm, maxlength, maxlength); + _hg_object_operator_build(vm, mod, mod); + _hg_object_operator_build(vm, moveto, moveto); + _hg_object_operator_build(vm, mul, mul); + _hg_object_operator_build(vm, ne, ne); + _hg_object_operator_build(vm, neg, neg); + _hg_object_operator_build(vm, newpath, newpath); + _hg_object_operator_build(vm, noaccess, noaccess); + _hg_object_operator_build(vm, not, not); + _hg_object_operator_build(vm, nulldevice, nulldevice); + _hg_object_operator_build(vm, or, or); + _hg_object_operator_build(vm, pathbbox, pathbbox); + _hg_object_operator_build(vm, pathforall, pathforall); + _hg_object_operator_build(vm, pop, pop); + _hg_object_operator_build(vm, print, print); + _hg_object_operator_build(vm, put, put); + _hg_object_operator_build(vm, rand, rand); + _hg_object_operator_build(vm, rcheck, rcheck); + _hg_object_operator_build(vm, rcurveto, rcurveto); + _hg_object_operator_build(vm, read, read); + _hg_object_operator_build(vm, readhexstring, readhexstring); + _hg_object_operator_build(vm, readline, readline); + _hg_object_operator_build(vm, readonly, readonly); + _hg_object_operator_build(vm, readstring, readstring); + _hg_object_operator_build(vm, repeat, repeat); + _hg_object_operator_build(vm, resetfile, resetfile); + _hg_object_operator_build(vm, restore, restore); + _hg_object_operator_build(vm, reversepath, reversepath); + _hg_object_operator_build(vm, rlineto, rlineto); + _hg_object_operator_build(vm, rmoveto, rmoveto); + _hg_object_operator_build(vm, roll, roll); + _hg_object_operator_build(vm, rotate, rotate); + _hg_object_operator_build(vm, round, round); + _hg_object_operator_build(vm, rrand, rrand); + _hg_object_operator_build(vm, save, save); + _hg_object_operator_build(vm, scale, scale); + _hg_object_operator_build(vm, scalefont, scalefont); + _hg_object_operator_build(vm, search, search); + _hg_object_operator_build(vm, setcachedevice, setcachedevice); + _hg_object_operator_build(vm, setcachelimit, setcachelimit); + _hg_object_operator_build(vm, setcharwidth, setcharwidth); + _hg_object_operator_build(vm, setdash, setdash); + _hg_object_operator_build(vm, setflat, setflat); + _hg_object_operator_build(vm, setfont, setfont); + _hg_object_operator_build(vm, setgray, setgray); + _hg_object_operator_build(vm, sethsbcolor, sethsbcolor); + _hg_object_operator_build(vm, setlinecap, setlinecap); + _hg_object_operator_build(vm, setlinejoin, setlinejoin); + _hg_object_operator_build(vm, setlinewidth, setlinewidth); + _hg_object_operator_build(vm, setmatrix, setmatrix); + _hg_object_operator_build(vm, setmiterlimit, setmiterlimit); + _hg_object_operator_build(vm, setrgbcolor, setrgbcolor); + _hg_object_operator_build(vm, setscreen, setscreen); + _hg_object_operator_build(vm, settransfer, settransfer); + _hg_object_operator_build(vm, show, show); + _hg_object_operator_build(vm, showpage, showpage); + _hg_object_operator_build(vm, sin, sin); + _hg_object_operator_build(vm, sqrt, sqrt); + _hg_object_operator_build(vm, srand, srand); + _hg_object_operator_build(vm, status, status); + _hg_object_operator_build(vm, stop, stop); + _hg_object_operator_build(vm, stopped, stopped); + _hg_object_operator_build(vm, string, string); + _hg_object_operator_build(vm, stringwidth, stringwidth); + _hg_object_operator_build(vm, stroke, stroke); + _hg_object_operator_build(vm, strokepath, strokepath); + _hg_object_operator_build(vm, sub, sub); + _hg_object_operator_build(vm, token, token); + _hg_object_operator_build(vm, transform, transform); + _hg_object_operator_build(vm, translate, translate); + _hg_object_operator_build(vm, truncate, truncate); + _hg_object_operator_build(vm, type, type); + _hg_object_operator_build(vm, usertime, usertime); + _hg_object_operator_build(vm, vmstatus, vmstatus); + _hg_object_operator_build(vm, wcheck, wcheck); + _hg_object_operator_build(vm, where, where); + _hg_object_operator_build(vm, widthshow, widthshow); + _hg_object_operator_build(vm, write, write); + _hg_object_operator_build(vm, writehexstring, writehexstring); + _hg_object_operator_build(vm, writestring, writestring); + _hg_object_operator_build(vm, xcheck, xcheck); + _hg_object_operator_build(vm, xor, xor); + } + + if (level >= HG_EMU_PS_LEVEL_2 && current < level) { + _hg_object_operator_build(vm, arct, arct); + _hg_object_operator_build(vm, colorimage, colorimage); + _hg_object_operator_build(vm, cshow, cshow); + _hg_object_operator_build(vm, currentblackgeneration, currentblackgeneration); + _hg_object_operator_build(vm, currentcacheparams, currentcacheparams); + _hg_object_operator_build(vm, currentcmykcolor, currentcmykcolor); + _hg_object_operator_build(vm, currentcolor, currentcolor); + _hg_object_operator_build(vm, currentcolorrendering, currentcolorrendering); + _hg_object_operator_build(vm, currentcolorscreen, currentcolorscreen); + _hg_object_operator_build(vm, currentcolorspace, currentcolorspace); + _hg_object_operator_build(vm, currentcolortransfer, currentcolortransfer); + _hg_object_operator_build(vm, currentdevparams, currentdevparams); + _hg_object_operator_build(vm, currentgstate, currentgstate); + _hg_object_operator_build(vm, currenthalftone, currenthalftone); + _hg_object_operator_build(vm, currentobjectformat, currentobjectformat); + _hg_object_operator_build(vm, currentoverprint, currentoverprint); + _hg_object_operator_build(vm, currentpacking, currentpacking); + _hg_object_operator_build(vm, currentpagedevice, currentpagedevice); + _hg_object_operator_build(vm, currentshared, currentshared); + _hg_object_operator_build(vm, currentstrokeadjust, currentstrokeadjust); + _hg_object_operator_build(vm, currentsystemparams, currentsystemparams); + _hg_object_operator_build(vm, currentundercolorremoval, currentundercolorremoval); + _hg_object_operator_build(vm, currentuserparams, currentuserparams); + _hg_object_operator_build(vm, defineresource, defineresource); + _hg_object_operator_build(vm, defineuserobject, defineuserobject); + _hg_object_operator_build(vm, deletefile, deletefile); + _hg_object_operator_build(vm, execform, execform); + _hg_object_operator_build(vm, execuserobject, execuserobject); + _hg_object_operator_build(vm, filenameforall, filenameforall); + _hg_object_operator_build(vm, fileposition, fileposition); + _hg_object_operator_build(vm, filter, filter); + _hg_object_operator_build(vm, findencoding, findencoding); + _hg_object_operator_build(vm, findresource, findresource); + _hg_object_operator_build(vm, gcheck, gcheck); + _hg_object_operator_build(vm, GlobalFontDirectory, globalfontdirectory); + _hg_object_operator_build(vm, glyphshow, glyphshow); + _hg_object_operator_build(vm, gstate, gstate); + _hg_object_operator_build(vm, ineofill, ineofill); + _hg_object_operator_build(vm, infill, infill); + _hg_object_operator_build(vm, instroke, instroke); + _hg_object_operator_build(vm, inueofill, inueofill); + _hg_object_operator_build(vm, inufill, inufill); + _hg_object_operator_build(vm, inustroke, inustroke); + _hg_object_operator_build(vm, ISOLatin1Encoding, isolatin1encoding); + _hg_object_operator_build(vm, languagelevel, languagelevel); + _hg_object_operator_build(vm, makepattern, makepattern); + _hg_object_operator_build(vm, packedarray, packedarray); + _hg_object_operator_build(vm, printobject, printobject); + _hg_object_operator_build(vm, realtime, realtime); + _hg_object_operator_build(vm, rectclip, rectclip); + _hg_object_operator_build(vm, rectfill, rectfill); + _hg_object_operator_build(vm, rectstroke, rectstroke); + _hg_object_operator_build(vm, renamefile, renamefile); + _hg_object_operator_build(vm, resourceforall, resourceforall); + _hg_object_operator_build(vm, resourcestatus, resourcestatus); + _hg_object_operator_build(vm, rootfont, rootfont); + _hg_object_operator_build(vm, scheck, scheck); + _hg_object_operator_build(vm, selectfont, selectfont); + _hg_object_operator_build(vm, serialnumber, serialnumber); + _hg_object_operator_build(vm, setbbox, setbbox); + _hg_object_operator_build(vm, setblackgeneration, setblackgeneration); + _hg_object_operator_build(vm, setcachedevice2, setcachedevice2); + _hg_object_operator_build(vm, setcacheparams, setcacheparams); + _hg_object_operator_build(vm, setcmykcolor, setcmykcolor); + _hg_object_operator_build(vm, setcolor, setcolor); + _hg_object_operator_build(vm, setcolorrendering, setcolorrendering); + _hg_object_operator_build(vm, setcolorscreen, setcolorscreen); + _hg_object_operator_build(vm, setcolorspace, setcolorspace); + _hg_object_operator_build(vm, setcolortransfer, setcolortransfer); + _hg_object_operator_build(vm, setdevparams, setdevparams); + _hg_object_operator_build(vm, setfileposition, setfileposition); + _hg_object_operator_build(vm, setgstate, setgstate); + _hg_object_operator_build(vm, sethalftone, sethalftone); + _hg_object_operator_build(vm, setobjectformat, setobjectformat); + _hg_object_operator_build(vm, setoverprint, setoverprint); + _hg_object_operator_build(vm, setpacking, setpacking); + _hg_object_operator_build(vm, setpagedevice, setpagedevice); + _hg_object_operator_build(vm, setpattern, setpattern); + _hg_object_operator_build(vm, setshared, setshared); + _hg_object_operator_build(vm, setstrokeadjust, setstrokeadjust); + _hg_object_operator_build(vm, setsystemparams, setsystemparams); + _hg_object_operator_build(vm, setucacheparams, setucacheparams); + _hg_object_operator_build(vm, setundercolorremoval, setundercoloremoval); + _hg_object_operator_build(vm, setuserparams, setuserparams); + _hg_object_operator_build(vm, setvmthreshold, setvmthreshold); + _hg_object_operator_build(vm, shareddict, shareddict); + _hg_object_operator_build(vm, SharedFontDirectory, sharedfontdirectory); + _hg_object_operator_build(vm, startjob, startjob); + _hg_object_operator_build(vm, uappend, uappend); + _hg_object_operator_build(vm, ucache, ucache); + _hg_object_operator_build(vm, ucachestatus, ucachestatus); + _hg_object_operator_build(vm, ueofill, ueofill); + _hg_object_operator_build(vm, ufill, ufill); + _hg_object_operator_build(vm, undef, undef); + _hg_object_operator_build(vm, undefineresource, undefineresource); + _hg_object_operator_build(vm, undefineuserobject, undefineuserobject); + _hg_object_operator_build(vm, upath, upath); + _hg_object_operator_build(vm, UserObjects, userobjects); + _hg_object_operator_build(vm, ustroke, ustroke); + _hg_object_operator_build(vm, ustrokepath, ustrokepath); + _hg_object_operator_build(vm, vmreclaim, vmreclaim); + _hg_object_operator_build(vm, writeobject, writeobject); + _hg_object_operator_build(vm, xshow, xshow); + _hg_object_operator_build(vm, xyshow, xyshow); + _hg_object_operator_build(vm, yshow, yshow); + } + + if (level >= HG_EMU_PS_LEVEL_3 && current < level) { + _hg_object_operator_priv_build(vm, addglyph, addglyph); + _hg_object_operator_priv_build(vm, beginbfchar, beginbfchar); + _hg_object_operator_priv_build(vm, beginbfrange, beginbfrange); + _hg_object_operator_priv_build(vm, begincidchar, begincidchar); + _hg_object_operator_priv_build(vm, begincidrange, begincidrange); + _hg_object_operator_priv_build(vm, begincmap, begincmap); + _hg_object_operator_priv_build(vm, begincodespacerange, begincodespacerange); + _hg_object_operator_priv_build(vm, beginnotdefchar, beginnotdefchar); + _hg_object_operator_priv_build(vm, beginnotdefrange, beginnotdefrange); + _hg_object_operator_priv_build(vm, beginrearrangedfont, beginrearrangedfont); + _hg_object_operator_priv_build(vm, beginusematrix, beginusematrix); + _hg_object_operator_priv_build(vm, cliprestore, cliprestore); + _hg_object_operator_priv_build(vm, clipsave, clipsave); + _hg_object_operator_priv_build(vm, composefont, composefont); + _hg_object_operator_priv_build(vm, currentsmoothness, currentsmoothness); + _hg_object_operator_priv_build(vm, currentrapparams, currentrapparams); + _hg_object_operator_priv_build(vm, endbfchar, endbfchar); + _hg_object_operator_priv_build(vm, endbfrange, endbfrange); + _hg_object_operator_priv_build(vm, endcidchar, endcidchar); + _hg_object_operator_priv_build(vm, endcidrange, endcidrange); + _hg_object_operator_priv_build(vm, endcmap, endcmap); + _hg_object_operator_priv_build(vm, endcodespacerange, endcodespacerange); + _hg_object_operator_priv_build(vm, endnotdefchar, endnotdefchar); + _hg_object_operator_priv_build(vm, endnotdefrange, endnotdefrange); + _hg_object_operator_priv_build(vm, endrearrangedfont, endrearrangedfont); + _hg_object_operator_priv_build(vm, endusematrix, endusematrix); + _hg_object_operator_priv_build(vm, findcolorrendering, findcolorrendering); + _hg_object_operator_priv_build(vm, GetHalftoneName, gethalftonename); + _hg_object_operator_priv_build(vm, GetPageDeviceName, getpagedevicename); + _hg_object_operator_priv_build(vm, GetSubstituteCRD, getsubstitutecrd); + _hg_object_operator_priv_build(vm, removeall, removeall); + _hg_object_operator_priv_build(vm, removeglyphs, removeglyphs); + _hg_object_operator_priv_build(vm, setsmoothness, setsmoothness); + _hg_object_operator_priv_build(vm, settrapparams, settrapparams); + _hg_object_operator_priv_build(vm, settrapzone, settrapzone); + _hg_object_operator_priv_build(vm, shfill, shfill); + _hg_object_operator_priv_build(vm, StartData, startdata); + _hg_object_operator_priv_build(vm, usecmap, usecmap); + _hg_object_operator_priv_build(vm, usefont, usefont); + } + + return retval; +} + +gboolean +hg_object_operator_finalize(hg_vm_t *vm, + hg_emulation_type_t level) +{ + gboolean retval = TRUE; + + hg_return_val_if_fail (vm != NULL, FALSE); + hg_return_val_if_fail (level < HG_EMU_END, FALSE); + + if (level < HG_EMU_PS_LEVEL_3) { + _hg_object_operator_unbuild(vm, addglyph); + _hg_object_operator_unbuild(vm, beginbfchar); + _hg_object_operator_unbuild(vm, beginbfrange); + _hg_object_operator_unbuild(vm, begincidchar); + _hg_object_operator_unbuild(vm, begincidrange); + _hg_object_operator_unbuild(vm, begincmap); + _hg_object_operator_unbuild(vm, begincodespacerange); + _hg_object_operator_unbuild(vm, beginnotdefchar); + _hg_object_operator_unbuild(vm, beginnotdefrange); + _hg_object_operator_unbuild(vm, beginrearrangedfont); + _hg_object_operator_unbuild(vm, beginusematrix); + _hg_object_operator_unbuild(vm, cliprestore); + _hg_object_operator_unbuild(vm, clipsave); + _hg_object_operator_unbuild(vm, composefont); + _hg_object_operator_unbuild(vm, currentsmoothness); + _hg_object_operator_unbuild(vm, currentrapparams); + _hg_object_operator_unbuild(vm, endbfchar); + _hg_object_operator_unbuild(vm, endbfrange); + _hg_object_operator_unbuild(vm, endcidchar); + _hg_object_operator_unbuild(vm, endcidrange); + _hg_object_operator_unbuild(vm, endcmap); + _hg_object_operator_unbuild(vm, endcodespacerange); + _hg_object_operator_unbuild(vm, endnotdefchar); + _hg_object_operator_unbuild(vm, endnotdefrange); + _hg_object_operator_unbuild(vm, endrearrangedfont); + _hg_object_operator_unbuild(vm, endusematrix); + _hg_object_operator_unbuild(vm, findcolorrendering); + _hg_object_operator_unbuild(vm, GetHalftoneName); + _hg_object_operator_unbuild(vm, GetPageDeviceName); + _hg_object_operator_unbuild(vm, GetSubstituteCRD); + _hg_object_operator_unbuild(vm, removeall); + _hg_object_operator_unbuild(vm, removeglyphs); + _hg_object_operator_unbuild(vm, setsmoothness); + _hg_object_operator_unbuild(vm, settrapparams); + _hg_object_operator_unbuild(vm, settrapzone); + _hg_object_operator_unbuild(vm, shfill); + _hg_object_operator_unbuild(vm, StartData); + _hg_object_operator_unbuild(vm, usecmap); + _hg_object_operator_unbuild(vm, usefont); + } + if (level < HG_EMU_PS_LEVEL_2) { + _hg_object_operator_unbuild(vm, arct); + _hg_object_operator_unbuild(vm, colorimage); + _hg_object_operator_unbuild(vm, cshow); + _hg_object_operator_unbuild(vm, currentblackgeneration); + _hg_object_operator_unbuild(vm, currentcacheparams); + _hg_object_operator_unbuild(vm, currentcmykcolor); + _hg_object_operator_unbuild(vm, currentcolor); + _hg_object_operator_unbuild(vm, currentcolorrendering); + _hg_object_operator_unbuild(vm, currentcolorscreen); + _hg_object_operator_unbuild(vm, currentcolorspace); + _hg_object_operator_unbuild(vm, currentcolortransfer); + _hg_object_operator_unbuild(vm, currentdevparams); + _hg_object_operator_unbuild(vm, currentgstate); + _hg_object_operator_unbuild(vm, currenthalftone); + _hg_object_operator_unbuild(vm, currentobjectformat); + _hg_object_operator_unbuild(vm, currentoverprint); + _hg_object_operator_unbuild(vm, currentpacking); + _hg_object_operator_unbuild(vm, currentpagedevice); + _hg_object_operator_unbuild(vm, currentshared); + _hg_object_operator_unbuild(vm, currentstrokeadjust); + _hg_object_operator_unbuild(vm, currentsystemparams); + _hg_object_operator_unbuild(vm, currentundercolorremoval); + _hg_object_operator_unbuild(vm, currentuserparams); + _hg_object_operator_unbuild(vm, defineresource); + _hg_object_operator_unbuild(vm, defineuserobject); + _hg_object_operator_unbuild(vm, deletefile); + _hg_object_operator_unbuild(vm, execform); + _hg_object_operator_unbuild(vm, execuserobject); + _hg_object_operator_unbuild(vm, filenameforall); + _hg_object_operator_unbuild(vm, fileposition); + _hg_object_operator_unbuild(vm, filter); + _hg_object_operator_unbuild(vm, findencoding); + _hg_object_operator_unbuild(vm, findresource); + _hg_object_operator_unbuild(vm, gcheck); + _hg_object_operator_unbuild(vm, GlobalFontDirectory); + _hg_object_operator_unbuild(vm, glyphshow); + _hg_object_operator_unbuild(vm, gstate); + _hg_object_operator_unbuild(vm, ineofill); + _hg_object_operator_unbuild(vm, infill); + _hg_object_operator_unbuild(vm, instroke); + _hg_object_operator_unbuild(vm, inueofill); + _hg_object_operator_unbuild(vm, inufill); + _hg_object_operator_unbuild(vm, inustroke); + _hg_object_operator_unbuild(vm, ISOLatin1Encoding); + _hg_object_operator_unbuild(vm, languagelevel); + _hg_object_operator_unbuild(vm, makepattern); + _hg_object_operator_unbuild(vm, packedarray); + _hg_object_operator_unbuild(vm, printobject); + _hg_object_operator_unbuild(vm, realtime); + _hg_object_operator_unbuild(vm, rectclip); + _hg_object_operator_unbuild(vm, rectfill); + _hg_object_operator_unbuild(vm, rectstroke); + _hg_object_operator_unbuild(vm, renamefile); + _hg_object_operator_unbuild(vm, resourceforall); + _hg_object_operator_unbuild(vm, resourcestatus); + _hg_object_operator_unbuild(vm, rootfont); + _hg_object_operator_unbuild(vm, scheck); + _hg_object_operator_unbuild(vm, selectfont); + _hg_object_operator_unbuild(vm, serialnumber); + _hg_object_operator_unbuild(vm, setbbox); + _hg_object_operator_unbuild(vm, setblackgeneration); + _hg_object_operator_unbuild(vm, setcachedevice2); + _hg_object_operator_unbuild(vm, setcacheparams); + _hg_object_operator_unbuild(vm, setcmykcolor); + _hg_object_operator_unbuild(vm, setcolor); + _hg_object_operator_unbuild(vm, setcolorrendering); + _hg_object_operator_unbuild(vm, setcolorscreen); + _hg_object_operator_unbuild(vm, setcolorspace); + _hg_object_operator_unbuild(vm, setcolortransfer); + _hg_object_operator_unbuild(vm, setdevparams); + _hg_object_operator_unbuild(vm, setfileposition); + _hg_object_operator_unbuild(vm, setgstate); + _hg_object_operator_unbuild(vm, sethalftone); + _hg_object_operator_unbuild(vm, setobjectformat); + _hg_object_operator_unbuild(vm, setoverprint); + _hg_object_operator_unbuild(vm, setpacking); + _hg_object_operator_unbuild(vm, setpagedevice); + _hg_object_operator_unbuild(vm, setpattern); + _hg_object_operator_unbuild(vm, setshared); + _hg_object_operator_unbuild(vm, setstrokeadjust); + _hg_object_operator_unbuild(vm, setsystemparams); + _hg_object_operator_unbuild(vm, setucacheparams); + _hg_object_operator_unbuild(vm, setundercolorremoval); + _hg_object_operator_unbuild(vm, setuserparams); + _hg_object_operator_unbuild(vm, setvmthreshold); + _hg_object_operator_unbuild(vm, shareddict); + _hg_object_operator_unbuild(vm, SharedFontDirectory); + _hg_object_operator_unbuild(vm, startjob); + _hg_object_operator_unbuild(vm, uappend); + _hg_object_operator_unbuild(vm, ucache); + _hg_object_operator_unbuild(vm, ucachestatus); + _hg_object_operator_unbuild(vm, ueofill); + _hg_object_operator_unbuild(vm, ufill); + _hg_object_operator_unbuild(vm, undef); + _hg_object_operator_unbuild(vm, undefineresource); + _hg_object_operator_unbuild(vm, undefineuserobject); + _hg_object_operator_unbuild(vm, upath); + _hg_object_operator_unbuild(vm, UserObjects); + _hg_object_operator_unbuild(vm, ustroke); + _hg_object_operator_unbuild(vm, ustrokepath); + _hg_object_operator_unbuild(vm, vmreclaim); + _hg_object_operator_unbuild(vm, writeobject); + _hg_object_operator_unbuild(vm, xshow); + _hg_object_operator_unbuild(vm, xyshow); + _hg_object_operator_unbuild(vm, yshow); + } + if (level < HG_EMU_PS_LEVEL_1) { + _hg_object_operator_unbuild(vm, %arraytomark); + _hg_object_operator_unbuild(vm, %dicttomark); + _hg_object_operator_unbuild(vm, %for_pos_int_continue); + _hg_object_operator_unbuild(vm, %for_pos_real_continue); + _hg_object_operator_unbuild(vm, %forall_array_continue); + _hg_object_operator_unbuild(vm, %forall_dict_continue); + _hg_object_operator_unbuild(vm, %forall_string_continue); + _hg_object_operator_unbuild(vm, %loop_continue); + _hg_object_operator_unbuild(vm, %repeat_continue); + _hg_object_operator_unbuild(vm, %stopped_continue); + _hg_object_operator_unbuild(vm, .findfont); + _hg_object_operator_unbuild(vm, .definefont); + _hg_object_operator_unbuild(vm, .stringcvs); + _hg_object_operator_unbuild(vm, .undefinefont); + _hg_object_operator_unbuild(vm, .write==only); + _hg_object_operator_unbuild(vm, abs); + _hg_object_operator_unbuild(vm, add); + _hg_object_operator_unbuild(vm, aload); + _hg_object_operator_unbuild(vm, and); + _hg_object_operator_unbuild(vm, arc); + _hg_object_operator_unbuild(vm, arcn); + _hg_object_operator_unbuild(vm, arcto); + _hg_object_operator_unbuild(vm, array); + _hg_object_operator_unbuild(vm, ashow); + _hg_object_operator_unbuild(vm, astore); + _hg_object_operator_unbuild(vm, atan); + _hg_object_operator_unbuild(vm, awidthshow); + _hg_object_operator_unbuild(vm, begin); + _hg_object_operator_unbuild(vm, bind); + _hg_object_operator_unbuild(vm, bitshift); + _hg_object_operator_unbuild(vm, bytesavailable); + _hg_object_operator_unbuild(vm, cachestatus); + _hg_object_operator_unbuild(vm, ceiling); + _hg_object_operator_unbuild(vm, charpath); + _hg_object_operator_unbuild(vm, clear); + _hg_object_operator_unbuild(vm, cleardictstack); + _hg_object_operator_unbuild(vm, cleartomark); + _hg_object_operator_unbuild(vm, clip); + _hg_object_operator_unbuild(vm, clippath); + _hg_object_operator_unbuild(vm, closefile); + _hg_object_operator_unbuild(vm, closepath); + _hg_object_operator_unbuild(vm, concat); + _hg_object_operator_unbuild(vm, concatmatrix); + _hg_object_operator_unbuild(vm, copy); + _hg_object_operator_unbuild(vm, copypage); + _hg_object_operator_unbuild(vm, cos); + _hg_object_operator_unbuild(vm, count); + _hg_object_operator_unbuild(vm, countdictstack); + _hg_object_operator_unbuild(vm, countexecstack); + _hg_object_operator_unbuild(vm, counttomark); + _hg_object_operator_unbuild(vm, currentdash); + _hg_object_operator_unbuild(vm, currentdict); + _hg_object_operator_unbuild(vm, currentfile); + _hg_object_operator_unbuild(vm, currentflat); + _hg_object_operator_unbuild(vm, currentfont); + _hg_object_operator_unbuild(vm, currentgray); + _hg_object_operator_unbuild(vm, currenthsbcolor); + _hg_object_operator_unbuild(vm, currentlinecap); + _hg_object_operator_unbuild(vm, currentlinejoin); + _hg_object_operator_unbuild(vm, currentlinewidth); + _hg_object_operator_unbuild(vm, currentmatrix); + _hg_object_operator_unbuild(vm, currentmiterlimit); + _hg_object_operator_unbuild(vm, currentpoint); + _hg_object_operator_unbuild(vm, currentrgbcolor); + _hg_object_operator_unbuild(vm, currentscreen); + _hg_object_operator_unbuild(vm, currenttransfer); + _hg_object_operator_unbuild(vm, curveto); + _hg_object_operator_unbuild(vm, cvi); + _hg_object_operator_unbuild(vm, cvlit); + _hg_object_operator_unbuild(vm, cvn); + _hg_object_operator_unbuild(vm, cvr); + _hg_object_operator_unbuild(vm, cvrs); + _hg_object_operator_unbuild(vm, cvx); + _hg_object_operator_unbuild(vm, def); + _hg_object_operator_unbuild(vm, defaultmatrix); + _hg_object_operator_unbuild(vm, dict); + _hg_object_operator_unbuild(vm, dictstack); + _hg_object_operator_unbuild(vm, div); + _hg_object_operator_unbuild(vm, dtransform); + _hg_object_operator_unbuild(vm, dup); + _hg_object_operator_unbuild(vm, echo); + _hg_object_operator_unbuild(vm, eexec); + _hg_object_operator_unbuild(vm, end); + _hg_object_operator_unbuild(vm, eoclip); + _hg_object_operator_unbuild(vm, eofill); + _hg_object_operator_unbuild(vm, eq); + _hg_object_operator_unbuild(vm, erasepage); + _hg_object_operator_unbuild(vm, exch); + _hg_object_operator_unbuild(vm, exec); + _hg_object_operator_unbuild(vm, execstack); + _hg_object_operator_unbuild(vm, executeonly); + _hg_object_operator_unbuild(vm, exit); + _hg_object_operator_unbuild(vm, exp); + _hg_object_operator_unbuild(vm, file); + _hg_object_operator_unbuild(vm, fill); + _hg_object_operator_unbuild(vm, flattenpath); + _hg_object_operator_unbuild(vm, flush); + _hg_object_operator_unbuild(vm, flushfile); + _hg_object_operator_unbuild(vm, FontDirectory); + _hg_object_operator_unbuild(vm, for); + _hg_object_operator_unbuild(vm, forall); + _hg_object_operator_unbuild(vm, ge); + _hg_object_operator_unbuild(vm, get); + _hg_object_operator_unbuild(vm, getinterval); + _hg_object_operator_unbuild(vm, grestore); + _hg_object_operator_unbuild(vm, grestoreall); + _hg_object_operator_unbuild(vm, gsave); + _hg_object_operator_unbuild(vm, gt); + _hg_object_operator_unbuild(vm, identmatrix); + _hg_object_operator_unbuild(vm, idiv); + _hg_object_operator_unbuild(vm, idtransform); + _hg_object_operator_unbuild(vm, if); + _hg_object_operator_unbuild(vm, ifelse); + _hg_object_operator_unbuild(vm, image); + _hg_object_operator_unbuild(vm, imagemask); + _hg_object_operator_unbuild(vm, index); + _hg_object_operator_unbuild(vm, initclip); + _hg_object_operator_unbuild(vm, initgraphics); + _hg_object_operator_unbuild(vm, initmatrix); + _hg_object_operator_unbuild(vm, internaldict); + _hg_object_operator_unbuild(vm, invertmatrix); + _hg_object_operator_unbuild(vm, itransform); + _hg_object_operator_unbuild(vm, known); + _hg_object_operator_unbuild(vm, kshow); + _hg_object_operator_unbuild(vm, le); + _hg_object_operator_unbuild(vm, length); + _hg_object_operator_unbuild(vm, lineto); + _hg_object_operator_unbuild(vm, ln); + _hg_object_operator_unbuild(vm, log); + _hg_object_operator_unbuild(vm, loop); + _hg_object_operator_unbuild(vm, lt); + _hg_object_operator_unbuild(vm, makefont); + _hg_object_operator_unbuild(vm, maxlength); + _hg_object_operator_unbuild(vm, mod); + _hg_object_operator_unbuild(vm, moveto); + _hg_object_operator_unbuild(vm, mul); + _hg_object_operator_unbuild(vm, ne); + _hg_object_operator_unbuild(vm, neg); + _hg_object_operator_unbuild(vm, newpath); + _hg_object_operator_unbuild(vm, noaccess); + _hg_object_operator_unbuild(vm, not); + _hg_object_operator_unbuild(vm, nulldevice); + _hg_object_operator_unbuild(vm, or); + _hg_object_operator_unbuild(vm, pathbbox); + _hg_object_operator_unbuild(vm, pathforall); + _hg_object_operator_unbuild(vm, pop); + _hg_object_operator_unbuild(vm, print); + _hg_object_operator_unbuild(vm, put); + _hg_object_operator_unbuild(vm, rand); + _hg_object_operator_unbuild(vm, rcheck); + _hg_object_operator_unbuild(vm, rcurveto); + _hg_object_operator_unbuild(vm, read); + _hg_object_operator_unbuild(vm, readhexstring); + _hg_object_operator_unbuild(vm, readline); + _hg_object_operator_unbuild(vm, readonly); + _hg_object_operator_unbuild(vm, readstring); + _hg_object_operator_unbuild(vm, repeat); + _hg_object_operator_unbuild(vm, resetfile); + _hg_object_operator_unbuild(vm, restore); + _hg_object_operator_unbuild(vm, reversepath); + _hg_object_operator_unbuild(vm, rlineto); + _hg_object_operator_unbuild(vm, rmoveto); + _hg_object_operator_unbuild(vm, roll); + _hg_object_operator_unbuild(vm, rotate); + _hg_object_operator_unbuild(vm, round); + _hg_object_operator_unbuild(vm, rrand); + _hg_object_operator_unbuild(vm, save); + _hg_object_operator_unbuild(vm, scale); + _hg_object_operator_unbuild(vm, scalefont); + _hg_object_operator_unbuild(vm, search); + _hg_object_operator_unbuild(vm, setcachedevice); + _hg_object_operator_unbuild(vm, setcachelimit); + _hg_object_operator_unbuild(vm, setcharwidth); + _hg_object_operator_unbuild(vm, setdash); + _hg_object_operator_unbuild(vm, setflat); + _hg_object_operator_unbuild(vm, setfont); + _hg_object_operator_unbuild(vm, setgray); + _hg_object_operator_unbuild(vm, sethsbcolor); + _hg_object_operator_unbuild(vm, setlinecap); + _hg_object_operator_unbuild(vm, setlinejoin); + _hg_object_operator_unbuild(vm, setlinewidth); + _hg_object_operator_unbuild(vm, setmatrix); + _hg_object_operator_unbuild(vm, setmiterlimit); + _hg_object_operator_unbuild(vm, setrgbcolor); + _hg_object_operator_unbuild(vm, setscreen); + _hg_object_operator_unbuild(vm, settransfer); + _hg_object_operator_unbuild(vm, show); + _hg_object_operator_unbuild(vm, showpage); + _hg_object_operator_unbuild(vm, sin); + _hg_object_operator_unbuild(vm, sqrt); + _hg_object_operator_unbuild(vm, srand); + _hg_object_operator_unbuild(vm, status); + _hg_object_operator_unbuild(vm, stop); + _hg_object_operator_unbuild(vm, stopped); + _hg_object_operator_unbuild(vm, string); + _hg_object_operator_unbuild(vm, stringwidth); + _hg_object_operator_unbuild(vm, stroke); + _hg_object_operator_unbuild(vm, strokepath); + _hg_object_operator_unbuild(vm, sub); + _hg_object_operator_unbuild(vm, token); + _hg_object_operator_unbuild(vm, transform); + _hg_object_operator_unbuild(vm, translate); + _hg_object_operator_unbuild(vm, truncate); + _hg_object_operator_unbuild(vm, type); + _hg_object_operator_unbuild(vm, usertime); + _hg_object_operator_unbuild(vm, vmstatus); + _hg_object_operator_unbuild(vm, wcheck); + _hg_object_operator_unbuild(vm, where); + _hg_object_operator_unbuild(vm, widthshow); + _hg_object_operator_unbuild(vm, write); + _hg_object_operator_unbuild(vm, writehexstring); + _hg_object_operator_unbuild(vm, writestring); + _hg_object_operator_unbuild(vm, xcheck); + _hg_object_operator_unbuild(vm, xor); + } + + return retval; +} + +gboolean +hg_object_operator_invoke(hg_vm_t *vm, + hg_object_t *object) +{ + hg_operatordata_t *data; + + hg_return_val_if_fail (vm != NULL, FALSE); + hg_return_val_if_fail (object != NULL, FALSE); + hg_return_val_if_fail (HG_OBJECT_IS_OPERATOR (object), FALSE); + + data = HG_OBJECT_OPERATOR_DATA (object); + + return data->func(vm, object); +} + +gboolean +hg_object_operator_compare(hg_object_t *object1, + hg_object_t *object2) +{ + hg_return_val_if_fail (object1 != NULL, FALSE); + hg_return_val_if_fail (object2 != NULL, FALSE); + hg_return_val_if_fail (HG_OBJECT_IS_OPERATOR (object1), FALSE); + hg_return_val_if_fail (HG_OBJECT_IS_OPERATOR (object2), FALSE); + + /* XXX: no copy and dup functionalities are available so far. + * so just comparing a pointer should works enough + */ + return object1 == object2; +} + +gchar * +hg_object_operator_dump(hg_object_t *object, + gboolean verbose) +{ + hg_operatordata_t *data; + + hg_return_val_if_fail (object != NULL, NULL); + hg_return_val_if_fail (HG_OBJECT_IS_OPERATOR (object), NULL); + + data = HG_OBJECT_OPERATOR_DATA (object); + + return g_strndup((gchar *)data->name, HG_OBJECT_OPERATOR (object)->length); +} + +const gchar * +hg_object_operator_get_name(hg_system_encoding_t encoding) +{ + const gchar *retval; + + hg_return_val_if_fail (encoding < HG_enc_END, NULL); + + retval = __hg_system_encoding_names[encoding]; + + hg_return_val_if_fail (retval != NULL, NULL); + + return retval; +} diff --git a/hieroglyph/hgoperator.h b/hieroglyph/hgoperator.h new file mode 100644 index 0000000..c74bc53 --- /dev/null +++ b/hieroglyph/hgoperator.h @@ -0,0 +1,52 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ +/* + * hgoperator.h + * Copyright (C) 2005-2007 Akira TAGOH + * + * Authors: + * Akira TAGOH <akira@tagoh.org> + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ +#ifndef __HIEROGLYPH_HGOPERATOR_H__ +#define __HIEROGLYPH_HGOPERATOR_H__ + +#include <hieroglyph/hgtypes.h> + + +G_BEGIN_DECLS + +hg_object_t *hg_object_operator_new (hg_vm_t *vm, + hg_system_encoding_t enc, + hg_operator_func_t func) G_GNUC_WARN_UNUSED_RESULT; +hg_object_t *hg_object_operator_new_with_custom(hg_vm_t *vm, + gchar *name, + hg_operator_func_t func) G_GNUC_WARN_UNUSED_RESULT; +gboolean hg_object_operator_initialize (hg_vm_t *vm, + hg_emulation_type_t level); +gboolean hg_object_operator_finalize (hg_vm_t *vm, + hg_emulation_type_t level); +gboolean hg_object_operator_invoke (hg_vm_t *vm, + hg_object_t *object); +gboolean hg_object_operator_compare (hg_object_t *object1, + hg_object_t *object2); +gchar *hg_object_operator_dump (hg_object_t *object, + gboolean verbose) G_GNUC_MALLOC; +const gchar *hg_object_operator_get_name (hg_system_encoding_t encoding) G_GNUC_CONST; + +G_END_DECLS + +#endif /* __HIEROGLYPH_HGOPERATOR_H__ */ diff --git a/hieroglyph/hgpage.c b/hieroglyph/hgpage.c deleted file mode 100644 index 45d2ef7..0000000 --- a/hieroglyph/hgpage.c +++ /dev/null @@ -1,251 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* - * hgpage.c - * Copyright (C) 2006 Akira TAGOH - * - * Authors: - * Akira TAGOH <at@gclab.org> - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - */ -#ifdef HAVE_CONFIG_H -#include <config.h> -#endif - -#include "hgpage.h" -#include "hglog.h" - - -/* - * Private Functions - */ -static HgPage * -_hg_page_new(void) -{ - HgPage *retval; - - retval = g_new(HgPage, 1); - retval->width = 0; - retval->height = 0; - retval->node = NULL; - retval->last_node = NULL; - - return retval; -} - -/* - * Public Functions - */ -HgPage * -hg_page_new(void) -{ - return hg_page_new_with_pagesize(HG_PAGE_A4); -} - -HgPage * -hg_page_new_with_pagesize(HgPageSize size) -{ - gdouble width, height; - - if (!hg_page_get_size(size, &width, &height)) { - hg_log_warning("Failed to get a paper size."); - return NULL; - } - return hg_page_new_with_size(width, height); -} - -HgPage * -hg_page_new_with_size(gdouble width, - gdouble height) -{ - HgPage *retval; - - retval = _hg_page_new(); - if (retval == NULL) { - hg_log_warning("Failed to create a page object."); - return NULL; - } - retval->width = width; - retval->height = height; - - return retval; -} - -void -hg_page_destroy(HgPage *page) -{ - g_return_if_fail (page != NULL); - - if (page->node) - g_list_free(page->node); - - g_free(page); -} - -gboolean -hg_page_get_size(HgPageSize size, - gdouble *width, - gdouble *height) -{ - guint i, j, w, h; - - g_return_val_if_fail (width != NULL, FALSE); - g_return_val_if_fail (height != NULL, FALSE); - - switch (size) { - case HG_PAGE_4A0: - *width = 1682; - *height = 2378; - break; - case HG_PAGE_2A0: - *width = 1189; - *height = 1682; - break; - case HG_PAGE_A0: - case HG_PAGE_A1: - case HG_PAGE_A2: - case HG_PAGE_A3: - case HG_PAGE_A4: - case HG_PAGE_A5: - case HG_PAGE_A6: - case HG_PAGE_A7: - i = size - HG_PAGE_A0; - if ((i % 2) == 0) { - w = 841; - h = 1189; - } else { - w = 594; - h = 841; - } - for (j = 0; j < i / 2; j++) { - w /= 2; - h /= 2; - } - *width = w; - *height = h; - break; - case HG_PAGE_B0: - case HG_PAGE_B1: - case HG_PAGE_B2: - case HG_PAGE_B3: - case HG_PAGE_B4: - case HG_PAGE_B5: - case HG_PAGE_B6: - case HG_PAGE_B7: - i = size - HG_PAGE_B0; - if ((i % 2) == 0) { - w = 1000; - h = 1414; - } else { - w = 707; - h = 1000; - } - for (j = 0; j < i / 2; j++) { - w /= 2; - h /= 2; - } - *width = w; - *height = h; - break; - case HG_PAGE_JIS_B0: - case HG_PAGE_JIS_B1: - case HG_PAGE_JIS_B2: - case HG_PAGE_JIS_B3: - case HG_PAGE_JIS_B4: - case HG_PAGE_JIS_B5: - case HG_PAGE_JIS_B6: - i = size - HG_PAGE_JIS_B0; - if ((i % 2) == 0) { - w = 1030; - h = 1456; - } else { - w = 728; - h = 1030; - } - for (j = 0; j < i / 2; j++) { - w /= 2; - h /= 2; - } - *width = w; - *height = h; - break; - case HG_PAGE_C0: - case HG_PAGE_C1: - case HG_PAGE_C2: - case HG_PAGE_C3: - case HG_PAGE_C4: - case HG_PAGE_C5: - case HG_PAGE_C6: - case HG_PAGE_C7: - i = size - HG_PAGE_C0; - if ((i % 2) == 0) { - w = 917; - h = 1297; - } else { - w = 648; - h = 917; - } - for (j = 0; j < i / 2; j++) { - w /= 2; - h /= 2; - } - *width = w; - *height = h; - break; - case HG_PAGE_LETTER: - *width = 215.9; - *height = 279.4; - break; - case HG_PAGE_LEGAL: - *width = 215.9; - *height = 355.6; - break; - case HG_PAGE_JAPAN_POSTCARD: - *width = 100; - *height = 148; - break; - default: - hg_log_warning("Unknown page size type %d", size); - *width = 0; - *height = 0; - return FALSE; - } - /* convert mm to unit: 1mm = 1/25.4 inch : 1 inch = 72 unit */ - *width = (*width / 25.4 * 72); - *height = (*height / 25.4 * 72); - - return TRUE; -} - -void -hg_page_append_node(HgPage *page, - HgRender *render) -{ - GList *l; - - g_return_if_fail (page != NULL); - g_return_if_fail (render != NULL); - - l = g_list_alloc(); - l->data = render; - if (page->last_node == NULL) { - page->last_node = page->node = l; - } else { - page->last_node->next = l; - l->prev = page->last_node; - page->last_node = l; - } -} diff --git a/hieroglyph/hgpage.h b/hieroglyph/hgpage.h deleted file mode 100644 index f9457c7..0000000 --- a/hieroglyph/hgpage.h +++ /dev/null @@ -1,46 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* - * hgpage.h - * Copyright (C) 2006 Akira TAGOH - * - * Authors: - * Akira TAGOH <at@gclab.org> - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - */ -#ifndef __HG_PAGE_H__ -#define __HG_PAGE_H__ - -#include <hieroglyph/hgtypes.h> - -G_BEGIN_DECLS - - -HgPage *hg_page_new (void); -HgPage *hg_page_new_with_pagesize(HgPageSize size); -HgPage *hg_page_new_with_size (gdouble width, - gdouble height); -void hg_page_destroy (HgPage *page); -gboolean hg_page_get_size (HgPageSize size, - gdouble *width, - gdouble *height); -void hg_page_append_node (HgPage *page, - HgRender *render); - - -G_END_DECLS - -#endif /* __HG_PAGE_H__ */ diff --git a/hieroglyph/hgpath.c b/hieroglyph/hgpath.c deleted file mode 100644 index fd4e7fd..0000000 --- a/hieroglyph/hgpath.c +++ /dev/null @@ -1,788 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* - * hgpath.c - * Copyright (C) 2006 Akira TAGOH - * - * Authors: - * Akira TAGOH <at@gclab.org> - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - */ -#ifdef HAVE_CONFIG_H -#include <config.h> -#endif - -#include <math.h> -#include <string.h> -#include "hgpath.h" -#include "hglog.h" -#include "hgmem.h" - - -static void _hg_path_node_real_set_flags(gpointer data, - guint flags); -static void _hg_path_node_real_relocate (gpointer data, - HgMemRelocateInfo *info); -static gpointer _hg_path_node_real_copy (gpointer data); -static void _hg_path_real_free (gpointer data); -static void _hg_path_real_set_flags (gpointer data, - guint flags); -static void _hg_path_real_relocate (gpointer data, - HgMemRelocateInfo *info); -static gpointer _hg_path_real_copy (gpointer data); - - -static HgObjectVTable __hg_path_vtable = { - .free = _hg_path_real_free, - .set_flags = _hg_path_real_set_flags, - .relocate = _hg_path_real_relocate, - .dup = NULL, - .copy = _hg_path_real_copy, - .to_string = NULL, -}; -static HgObjectVTable __hg_path_node_vtable = { - .free = NULL, - .set_flags = _hg_path_node_real_set_flags, - .relocate = _hg_path_node_real_relocate, - .dup = NULL, - .copy = _hg_path_node_real_copy, - .to_string = NULL, -}; - -/* - * Private Functions - */ -static void -_hg_path_node_real_set_flags(gpointer data, - guint flags) -{ - HgPathNode *node = data; - HgMemObject *obj; - - if (node->next) { - hg_mem_get_object__inline(node->next, obj); - if (obj == NULL) { - hg_log_warning("[BUG] Invalid object %p to be marked: HgPathNode", node->next); - } else { - if (!hg_mem_is_flags__inline(obj, flags)) - hg_mem_add_flags__inline(obj, flags, TRUE); - } - } -} - -static void -_hg_path_node_real_relocate(gpointer data, - HgMemRelocateInfo *info) -{ - HgPathNode *node = data; - - if ((gsize)node->next >= info->start && - (gsize)node->next <= info->end) { - node->next = (gpointer)((gsize)node->next + info->diff); - } -} - -static gpointer -_hg_path_node_real_copy(gpointer data) -{ - HgPathNode *node = data; - HgMemObject *obj; - - hg_mem_get_object__inline(data, obj); - if (obj == NULL) - return NULL; - - return hg_path_node_new(obj->pool, node->type, node->x, node->y); -} - -static void -_hg_path_real_free(gpointer data) -{ - HgPath *path = data; - - if (path->node) - hg_path_node_free(path->node); -} - -static void -_hg_path_real_set_flags(gpointer data, - guint flags) -{ - HgPath *path = data; - HgMemObject *obj; - - if (path->node) { - hg_mem_get_object__inline(path->node, obj); - if (obj == NULL) { - hg_log_warning("[BUG] Invalid object %p to be marked: HgPathNode (in HgPath)", path->node); - } else { - if (!hg_mem_is_flags__inline(obj, flags)) - hg_mem_add_flags__inline(obj, flags, TRUE); - } - } -} - -static void -_hg_path_real_relocate(gpointer data, - HgMemRelocateInfo *info) -{ - HgPath *path = data; - - if ((gsize)path->node >= info->start && - (gsize)path->node <= info->end) { - path->node = (gpointer)((gsize)path->node + info->diff); - } - if ((gsize)path->last_node >= info->start && - (gsize)path->last_node <= info->end) { - path->last_node = (gpointer)((gsize)path->last_node + info->diff); - } -} - -static gpointer -_hg_path_real_copy(gpointer data) -{ - HgPath *path = data, *retval; - HgMemObject *obj; - - hg_mem_get_object__inline(data, obj); - if (obj == NULL) - return NULL; - - retval = hg_path_new(obj->pool); - if (retval == NULL) - return NULL; - - if (!hg_path_copy(path, retval)) - return NULL; - - return retval; -} - -static HgPathNode * -_hg_path_node_last(HgPathNode *node) -{ - if (node) { - while (node->next) - node = node->next; - } - - return node; -} - -static HgPathNode * -_hg_path_node_real_path_last(HgPathNode *node) -{ - HgPathNode *last = _hg_path_node_last(node); - - if (last) { - while (last->type == HG_PATH_MATRIX) - last = last->prev; - } - - return last; -} - -static gboolean -_hg_path_node_find(HgPathNode *node, - HgPathType type) -{ - gboolean retval = FALSE; - - while (node) { - if (node->type == type) - return TRUE; - node = node->next; - } - - return retval; -} - -static void -_hg_path_append_node(HgPath *path, - HgPathNode *node) -{ - if (path->last_node == NULL) { - path->last_node = path->node = node; - path->last_node->prev = NULL; - path->last_node->next = NULL; - } else { - path->last_node->next = node; - node->prev = path->last_node; - path->last_node = _hg_path_node_last(node); - path->last_node->next = NULL; - } -} - -/* - * Public Functions - */ -HgPathNode * -hg_path_node_new(HgMemPool *pool, - HgPathType type, - gdouble x, - gdouble y) -{ - HgPathNode *node; - - /* HgPathNode object may goes into somewhere out of the memory management. - * so it may be a good idea to lock this until free it apparently. - */ - node = hg_mem_alloc_with_flags(pool, - sizeof (HgPathNode), - HG_FL_HGOBJECT | HG_FL_RESTORABLE | HG_FL_LOCK); - if (node == NULL) - return NULL; - - HG_OBJECT_INIT_STATE (&node->object); - HG_OBJECT_SET_STATE (&node->object, hg_mem_pool_get_default_access_mode(pool)); - hg_object_set_vtable(&node->object, &__hg_path_node_vtable); - - node->type = type; - node->x = x; - node->y = y; - node->prev = NULL; - node->next = NULL; - - return node; -} - -void -hg_path_node_free(HgPathNode *node) -{ - HgMemObject *obj; - - while (node) { - hg_mem_get_object__inline(node, obj); - hg_mem_set_unlock(obj); - node = node->next; - } -} - -HgPath * -hg_path_new(HgMemPool *pool) -{ - HgPath *retval; - - g_return_val_if_fail (pool != NULL, NULL); - - retval = hg_mem_alloc_with_flags(pool, sizeof (HgPath), - HG_FL_HGOBJECT); - HG_OBJECT_INIT_STATE (&retval->object); - HG_OBJECT_SET_STATE (&retval->object, hg_mem_pool_get_default_access_mode(pool)); - hg_object_set_vtable(&retval->object, &__hg_path_vtable); - - retval->node = NULL; - retval->last_node = NULL; - - return retval; -} - -gboolean -hg_path_copy(HgPath *src, HgPath *dest) -{ - HgPathNode *node, *n; - - g_return_val_if_fail (src != NULL, FALSE); - g_return_val_if_fail (dest != NULL, FALSE); - - hg_path_clear(dest, TRUE); - for (n = src->node; n != NULL; n = n->next) { - node = hg_object_copy((HgObject *)n); - if (node == NULL) - return FALSE; - _hg_path_append_node(dest, node); - } - - return TRUE; -} - -gboolean -hg_path_find(HgPath *path, - HgPathType type) -{ - g_return_val_if_fail (path != NULL, FALSE); - - return _hg_path_node_find(path->node, type); -} - -gboolean -hg_path_compute_current_point(HgPath *path, - gdouble *x, - gdouble *y) -{ - HgPathNode *node; - gboolean currentpoint = FALSE; - - g_return_val_if_fail (path != NULL, FALSE); - g_return_val_if_fail (x != NULL, FALSE); - g_return_val_if_fail (y != NULL, FALSE); - - for (node = path->node; node != NULL; node = node->next) { - switch (node->type) { - case HG_PATH_CURVETO: - if (!currentpoint) { - hg_log_warning("[BUG] no current point found in %d.", node->type); - return FALSE; - } - if (node->next == NULL || - node->next->next == NULL) { - hg_log_warning("[BUG] Invalid path found in %d.", node->type); - return FALSE; - } - node = node->next->next; - case HG_PATH_LINETO: - if (!currentpoint) { - hg_log_warning("[BUG] no current point found in %d.", node->type); - return FALSE; - } - case HG_PATH_MOVETO: - *x = node->x; - *y = node->y; - currentpoint = TRUE; - break; - case HG_PATH_RCURVETO: - if (node->next == NULL || - node->next->next == NULL) { - hg_log_warning("[BUG] Invalid path found in %d.", node->type); - return FALSE; - } - node = node->next->next; - case HG_PATH_RMOVETO: - case HG_PATH_RLINETO: - if (!currentpoint) { - hg_log_warning("[BUG] no current point found in %d.", node->type); - return FALSE; - } - *x = *x + node->x; - *y = *y + node->y; - break; - case HG_PATH_ARC: - if (node->next == NULL || - node->next->next == NULL) { - hg_log_warning("[BUG] Invalid path found in %d.\n", node->type); - return FALSE; - } - G_STMT_START { - gdouble dbx, dby, dr, dangle2; - - dbx = node->x; - dby = node->y; - dr = node->next->x; - dangle2 = node->next->next->y; - *x = cos(dangle2) * dr + dbx; - *y = sin(dangle2) * dr + dby; - node = node->next->next; - currentpoint = TRUE; - } G_STMT_END; - break; - case HG_PATH_CLOSE: - case HG_PATH_MATRIX: - break; - default: - hg_log_warning("[BUG] Unknown path %d was given.", node->type); - return FALSE; - } - } - - return currentpoint; -} - -gboolean -hg_path_get_bbox(HgPath *path, - gboolean ignore_moveto, - HgPathBBox *bbox) -{ - HgPathNode *node, *last = NULL; - HgPathBBox prev; - gboolean flag = FALSE, currentpoint = FALSE; - gdouble dx = 0, dy = 0; - - g_return_val_if_fail (path != NULL, FALSE); - g_return_val_if_fail (bbox != NULL, FALSE); - - for (node = path->node; node != NULL; node = node->next) { - last = node; - switch (node->type) { - case HG_PATH_LINETO: - flag = TRUE; - if (!currentpoint) - return FALSE; - case HG_PATH_MOVETO: - if (node == path->node) { - /* set an initial bbox */ - bbox->llx = node->x; - bbox->lly = node->y; - } else { - if (node->x < bbox->llx) - bbox->llx = node->x; - if (node->y < bbox->lly) - bbox->lly = node->y; - } - if (node->x > bbox->urx) - bbox->urx = node->x; - if (node->y > bbox->ury) - bbox->ury = node->y; - memcpy(&prev, bbox, sizeof (HgPathBBox)); - dx = node->x; - dy = node->y; - currentpoint = TRUE; - break; - case HG_PATH_RLINETO: - flag = TRUE; - case HG_PATH_RMOVETO: - if (!currentpoint) - return FALSE; - if ((dx + node->x) < bbox->llx) - bbox->llx = node->x + dx; - if ((dy + node->y) < bbox->lly) - bbox->lly = node->y + dy; - if ((dx + node->x) > bbox->urx) - bbox->urx = node->x + dx; - if ((dy + node->y) > bbox->ury) - bbox->ury = node->y + dy; - memcpy(&prev, bbox, sizeof (HgPathBBox)); - dx += node->x; - dy += node->y; - break; - case HG_PATH_CURVETO: - if (!currentpoint) - return FALSE; - if (node->x < bbox->llx) - bbox->llx = node->x; - if (node->y < bbox->lly) - bbox->lly = node->y; - if (node->x < bbox->urx) - bbox->urx = node->x; - if (node->y < bbox->ury) - bbox->ury = node->y; - memcpy(&prev, bbox, sizeof (HgPathBBox)); - flag = TRUE; - dx = node->x; - dy = node->y; - currentpoint = TRUE; - break; - case HG_PATH_RCURVETO: - if (!currentpoint) - return FALSE; - if ((dx + node->x) < bbox->llx) - bbox->llx = node->x + dx; - if ((dy + node->y) < bbox->lly) - bbox->lly = node->y + dy; - if ((dx + node->x) < bbox->urx) - bbox->urx = node->x + dx; - if ((dy + node->y) < bbox->ury) - bbox->ury = node->y + dy; - memcpy(&prev, bbox, sizeof (HgPathBBox)); - dx += node->x; - dy += node->y; - flag = TRUE; - break; - case HG_PATH_CLOSE: - flag = TRUE; - break; - case HG_PATH_ARC: - flag = TRUE; - if (node->next == NULL || node->next->next == NULL) { - hg_log_warning("[BUG] Invalid path for arc."); - break; - } - G_STMT_START { - gdouble dx1, dy1, dx2, dy2, dbx, dby, dr, dangle1, dangle2; - - dbx = node->x; - dby = node->y; - dr = node->next->x; - dangle1 = node->next->next->x; - dangle2 = node->next->next->y; - dx1 = cos(dangle1) * dr + dbx; - dy1 = sin(dangle1) * dr + dby; - dx2 = cos(dangle2) * dr + dbx; - dy2 = sin(dangle2) * dr + dby; - if (node == path->node) { - /* set an initial bbox */ - bbox->llx = dx1; - bbox->lly = dy1; - } else { - if (dx1 < bbox->llx) - bbox->llx = dx1; - if (dy1 < bbox->lly) - bbox->lly = dy1; - } - if (dx1 > bbox->urx) - bbox->urx = dx1; - if (dy1 > bbox->ury) - bbox->ury = dy1; - if (dx2 < bbox->llx) - bbox->llx = dx2; - if (dy2 < bbox->llx) - bbox->lly = dx2; - if (dx2 > bbox->urx) - bbox->urx = dx2; - if (dy2 > bbox->ury) - bbox->ury = dy2; - memcpy(&prev, bbox, sizeof (HgPathBBox)); - dx = dx2; - dy = dy2; - currentpoint = TRUE; - node = node->next->next; - } G_STMT_END; - break; - case HG_PATH_MATRIX: - /* this isn't used to calculate bbox at all */ - break; - default: - hg_log_warning("[BUG] Unknown path type %d to examine current bbox.", node->type); - return FALSE; - } - } - if (ignore_moveto && - last != NULL && - (last->type == HG_PATH_MOVETO || last->type == HG_PATH_RMOVETO) && - flag) { - memcpy(bbox, &prev, sizeof (HgPathBBox)); - } - - return currentpoint; -} - -gboolean -hg_path_clear(HgPath *path, - gboolean free_segment) -{ - g_return_val_if_fail (path != NULL, FALSE); - - if (free_segment && path->node) - hg_path_node_free(path->node); - - path->node = NULL; - path->last_node = NULL; - - return TRUE; -} - -gboolean -hg_path_close(HgPath *path) -{ - HgPathNode *node; - HgMemObject *obj; - - g_return_val_if_fail (path != NULL, FALSE); - - hg_mem_get_object__inline(path, obj); - if (obj == NULL) - return FALSE; - if (path->last_node == NULL) { - /* nothing to do */ - return TRUE; - } else { - HgPathNode *last = _hg_path_node_real_path_last(path->last_node); - - if (last->type == HG_PATH_CLOSE) { - /* nothing to do */ - return TRUE; - } - } - node = hg_path_node_new(obj->pool, HG_PATH_CLOSE, 0, 0); - if (node == NULL) - return FALSE; - - _hg_path_append_node(path, node); - - return TRUE; -} - -gboolean -hg_path_moveto(HgPath *path, - gdouble x, - gdouble y) -{ - HgPathNode *node; - HgMemObject *obj; - - g_return_val_if_fail (path != NULL, FALSE); - - hg_mem_get_object__inline(path, obj); - if (obj == NULL) - return FALSE; - node = hg_path_node_new(obj->pool, HG_PATH_MOVETO, x, y); - if (node == NULL) - return FALSE; - - _hg_path_append_node(path, node); - - return TRUE; -} - -gboolean -hg_path_lineto(HgPath *path, - gdouble x, - gdouble y) -{ - HgPathNode *node; - HgMemObject *obj; - - g_return_val_if_fail (path != NULL, FALSE); - - hg_mem_get_object__inline(path, obj); - if (obj == NULL) - return FALSE; - node = hg_path_node_new(obj->pool, HG_PATH_LINETO, x, y); - if (node == NULL) - return FALSE; - - _hg_path_append_node(path, node); - - return TRUE; -} - -gboolean -hg_path_rlineto(HgPath *path, - gdouble x, - gdouble y) -{ - HgPathNode *node; - HgMemObject *obj; - - g_return_val_if_fail (path != NULL, FALSE); - - hg_mem_get_object__inline(path, obj); - if (obj == NULL) - return FALSE; - node = hg_path_node_new(obj->pool, HG_PATH_RLINETO, x, y); - if (node == NULL) - return FALSE; - - _hg_path_append_node(path, node); - - return TRUE; -} - -gboolean -hg_path_curveto(HgPath *path, - gdouble x1, - gdouble y1, - gdouble x2, - gdouble y2, - gdouble x3, - gdouble y3) -{ - HgPathNode *node; - HgMemObject *obj; - - g_return_val_if_fail (path != NULL, FALSE); - - hg_mem_get_object__inline(path, obj); - if (obj == NULL) - return FALSE; - - /* first path */ - node = hg_path_node_new(obj->pool, HG_PATH_CURVETO, x1, y1); - if (node == NULL) - return FALSE; - _hg_path_append_node(path, node); - - /* second path */ - node = hg_path_node_new(obj->pool, HG_PATH_CURVETO, x2, y2); - if (node == NULL) - return FALSE; - _hg_path_append_node(path, node); - - /* third path */ - node = hg_path_node_new(obj->pool, HG_PATH_CURVETO, x3, y3); - if (node == NULL) - return FALSE; - _hg_path_append_node(path, node); - - return TRUE; -} - -gboolean -hg_path_arc(HgPath *path, - gdouble x, - gdouble y, - gdouble r, - gdouble angle1, - gdouble angle2) -{ - HgPathNode *node; - HgMemObject *obj; - - g_return_val_if_fail (path != NULL, FALSE); - - hg_mem_get_object__inline(path, obj); - if (obj == NULL) - return FALSE; - - node = hg_path_node_new(obj->pool, HG_PATH_ARC, x, y); - if (node == NULL) - return FALSE; - _hg_path_append_node(path, node); - node = hg_path_node_new(obj->pool, HG_PATH_ARC, r, 0); - if (node == NULL) - return FALSE; - _hg_path_append_node(path, node); - node = hg_path_node_new(obj->pool, HG_PATH_ARC, angle1, angle2); - if (node == NULL) - return FALSE; - _hg_path_append_node(path, node); - - return TRUE; -} - -gboolean -hg_path_matrix(HgPath *path, - gdouble xx, - gdouble yx, - gdouble xy, - gdouble yy, - gdouble x0, - gdouble y0) -{ - HgPathNode *node; - HgMemObject *obj; - - g_return_val_if_fail (path != NULL, FALSE); - - hg_mem_get_object__inline(path, obj); - if (obj == NULL) - return FALSE; - - if (path->last_node && - path->last_node->type == HG_PATH_MATRIX) { - /* it could be optimized */ - path->last_node->prev->prev->x = xx; - path->last_node->prev->prev->y = yx; - path->last_node->prev->x = xy; - path->last_node->prev->y = yy; - path->last_node->x = x0; - path->last_node->y = y0; - } else { - node = hg_path_node_new(obj->pool, HG_PATH_MATRIX, xx, yx); - if (node == NULL) - return FALSE; - _hg_path_append_node(path, node); - node = hg_path_node_new(obj->pool, HG_PATH_MATRIX, xy, yy); - if (node == NULL) - return FALSE; - _hg_path_append_node(path, node); - node = hg_path_node_new(obj->pool, HG_PATH_MATRIX, x0, y0); - if (node == NULL) - return FALSE; - _hg_path_append_node(path, node); - } - - return TRUE; -} diff --git a/hieroglyph/hgpath.h b/hieroglyph/hgpath.h deleted file mode 100644 index cb021b3..0000000 --- a/hieroglyph/hgpath.h +++ /dev/null @@ -1,83 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* - * hgpath.h - * Copyright (C) 2006 Akira TAGOH - * - * Authors: - * Akira TAGOH <at@gclab.org> - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - */ -#ifndef __HG_PATH_H__ -#define __HG_PATH_H__ - -#include <hieroglyph/hgtypes.h> - -G_BEGIN_DECLS - -HgPathNode *hg_path_node_new (HgMemPool *pool, - HgPathType type, - gdouble x, - gdouble y); -void hg_path_node_free (HgPathNode *node); -HgPath *hg_path_new (HgMemPool *pool); -gboolean hg_path_copy (HgPath *src, - HgPath *dest); -gboolean hg_path_find (HgPath *path, - HgPathType type); -gboolean hg_path_compute_current_point(HgPath *path, - gdouble *x, - gdouble *y); -gboolean hg_path_get_bbox (HgPath *path, - gboolean ignore_moveto, - HgPathBBox *bbox); -gboolean hg_path_clear (HgPath *path, - gboolean free_segment); -gboolean hg_path_close (HgPath *path); -gboolean hg_path_moveto (HgPath *path, - gdouble x, - gdouble y); -gboolean hg_path_lineto (HgPath *path, - gdouble x, - gdouble y); -gboolean hg_path_rlineto (HgPath *path, - gdouble x, - gdouble y); -gboolean hg_path_curveto (HgPath *path, - gdouble x1, - gdouble y1, - gdouble x2, - gdouble y2, - gdouble x3, - gdouble y3); -gboolean hg_path_arc (HgPath *path, - gdouble x, - gdouble y, - gdouble r, - gdouble angle1, - gdouble angle2); -gboolean hg_path_matrix (HgPath *path, - gdouble xx, - gdouble yx, - gdouble xy, - gdouble yy, - gdouble x0, - gdouble y0); - - -G_END_DECLS - -#endif /* __HG_PATH_H__ */ diff --git a/hieroglyph/hgplugins.c b/hieroglyph/hgplugins.c deleted file mode 100644 index f6a8630..0000000 --- a/hieroglyph/hgplugins.c +++ /dev/null @@ -1,268 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* - * hgplugins.c - * Copyright (C) 2006 Akira TAGOH - * - * Authors: - * Akira TAGOH <at@gclab.org> - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - */ -#ifdef HAVE_CONFIG_H -#include <config.h> -#endif - -#include <string.h> -#include "hgplugins.h" -#include "hgmem.h" -#include "hglog.h" - - -static void _hg_plugin_real_free (gpointer data); -static void _hg_plugin_real_set_flags(gpointer data, - guint flags); - - -static HgObjectVTable __hg_plugin_vtable = { - .free = _hg_plugin_real_free, - .set_flags = _hg_plugin_real_set_flags, - .relocate = NULL, - .dup = NULL, - .copy = NULL, - .to_string = NULL, -}; - -/* - * Private Functions - */ -static void -_hg_plugin_real_free(gpointer data) -{ - HgPlugin *plugin = data; - - if (plugin->vtable->finalize) { - plugin->vtable->finalize(); - } - if (plugin->module) { - g_module_close(plugin->module); - plugin->module = NULL; - } -} - -static void -_hg_plugin_real_set_flags(gpointer data, - guint flags) -{ - HgPlugin *plugin = data; - HgMemObject *obj; - - if (plugin->user_data) { - hg_mem_get_object__inline(plugin->user_data, obj); - if (obj != NULL) { - hg_mem_add_flags__inline(obj, flags, TRUE); - } - } -} - -static HgPlugin * -_hg_plugin_load(HgMemPool *pool, - const gchar *filename) -{ - GModule *module; - HgPlugin *retval = NULL; - gpointer plugin_new = NULL; - - if ((module = g_module_open(filename, G_MODULE_BIND_LAZY | G_MODULE_BIND_LOCAL)) != NULL) { -#define _CHECK_SYMBOL(_sym) \ - g_module_symbol(module, #_sym, &(_sym)); \ - if ((_sym) == NULL) { \ - hg_log_warning(g_module_error()); \ - g_module_close(module); \ - return NULL; \ - } - - _CHECK_SYMBOL (plugin_new); - -#undef _CHECK_SYMBOL - - /* initialize a plugin and get a HgPlugin instance */ - retval = ((HgPluginNewFunc)plugin_new) (pool); - if (retval == NULL) { - hg_log_warning("Failed to create an instance of the plugin `%s'", filename); - g_module_close(module); - } else if (retval->version < HG_PLUGIN_VERSION || - retval->vtable == NULL) { - hg_log_warning("`%s' is an invalid plugin.", filename); - g_module_close(module); - retval = NULL; - } else { - retval->module = module; - } - } else { - hg_log_debug(DEBUG_PLUGIN, g_module_error()); - } - - return retval; -} - -/* - * Public Functions - */ -HgPlugin * -hg_plugin_new(HgMemPool *pool, - HgPluginType type) -{ - HgPlugin *retval; - - g_return_val_if_fail (pool != NULL, NULL); - - retval = hg_mem_alloc_with_flags(pool, - sizeof (HgPlugin), - HG_FL_HGOBJECT | HG_FL_COMPLEX); - if (retval == NULL) { - hg_log_warning("Failed to create a plugin."); - return NULL; - } - HG_OBJECT_INIT_STATE (&retval->object); - HG_OBJECT_SET_STATE (&retval->object, hg_mem_pool_get_default_access_mode(pool)); - hg_object_set_vtable(&retval->object, &__hg_plugin_vtable); - HG_OBJECT_SET_USER_DATA (&retval->object, type); - retval->version = 0; - retval->vtable = NULL; - retval->module = NULL; - retval->user_data = NULL; - - return retval; -} - -HgPlugin * -hg_plugin_open(HgMemPool *pool, - const gchar *name, - HgPluginType type) -{ - HgPlugin *retval = NULL; - gchar *realname, *modulename, *fullmodname; - const gchar *modpath; - const gchar *typenames[HG_PLUGIN_END] = { - "", - "extension", - "device" - }; - - g_return_val_if_fail (pool != NULL, NULL); - g_return_val_if_fail (name != NULL, NULL); - - realname = g_path_get_basename(name); - switch (type) { - case HG_PLUGIN_EXTENSION: - modulename = g_strdup_printf("libext-%s.so", realname); - break; - case HG_PLUGIN_DEVICE: - modulename = g_strdup_printf("libdevice-%s.so", realname); - break; - default: - hg_log_warning("Unknown plugin type: %d", type); - return NULL; - } - if ((modpath = g_getenv("HIEROGLYPH_PLUGIN_PATH")) != NULL) { - gchar **path_list = g_strsplit(modpath, G_SEARCHPATH_SEPARATOR_S, -1); - gchar *p, *path; - gint i = 0; - size_t len; - - while (path_list[i]) { - p = path_list[i]; - - /* trims leading and trailing whitespace from path */ - while (*p && g_ascii_isspace(*p)) - p++; - len = strlen(p); - while (len > 0 && g_ascii_isspace(p[len - 1])) - len--; - path = g_strndup(p, len); - - if (path[0] != '\0') { - fullmodname = g_build_filename(path, modulename, NULL); - retval = _hg_plugin_load(pool, fullmodname); - g_free(fullmodname); - } - g_free(path); - if (retval != NULL) - break; - i++; - } - g_strfreev(path_list); - } - if (retval == NULL) { - fullmodname = g_build_filename(HIEROGLYPH_PLUGINDIR, modulename, NULL); - retval = _hg_plugin_load(pool, fullmodname); - g_free(fullmodname); - } - if (retval == NULL) { - hg_log_warning("No `%s' %s plugin module found.", realname, typenames[type]); - } else { - /* initialize a plugin */ - if (retval->vtable->init == NULL || - !retval->vtable->init()) { - hg_log_warning("Failed to initialize a plugin `%s'", realname); - retval = NULL; - } - } - - g_free(realname); - g_free(modulename); - - return retval; -} - -gboolean -hg_plugin_load(HgPlugin *plugin, - HgVM *vm) -{ - gboolean retval = FALSE; - - g_return_val_if_fail (plugin != NULL, FALSE); - g_return_val_if_fail (plugin->vtable != NULL && plugin->vtable->load != NULL, FALSE); - g_return_val_if_fail (vm != NULL, FALSE); - - retval = plugin->vtable->load(plugin, vm); - if (retval) { - plugin->is_loaded = TRUE; - } else { - hg_log_warning("Failed to load a plugin `%s'", - g_module_name(plugin->module)); - } - - return retval; -} - -gboolean -hg_plugin_unload(HgPlugin *plugin, - HgVM *vm) -{ - gboolean retval = FALSE; - - g_return_val_if_fail (plugin != NULL, FALSE); - g_return_val_if_fail (plugin->vtable != NULL && plugin->vtable->unload != NULL, FALSE); - g_return_val_if_fail (plugin->is_loaded == TRUE, FALSE); - g_return_val_if_fail (vm != NULL, FALSE); - - retval = plugin->vtable->unload(plugin, vm); - if (retval) - plugin->is_loaded = FALSE; - - return retval; -} diff --git a/hieroglyph/hgplugins.h b/hieroglyph/hgplugins.h deleted file mode 100644 index 8cbf937..0000000 --- a/hieroglyph/hgplugins.h +++ /dev/null @@ -1,67 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* - * hgplugins.h - * Copyright (C) 2006 Akira TAGOH - * - * Authors: - * Akira TAGOH <at@gclab.org> - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - */ -#ifndef __HG_PLUGINS_H__ -#define __HG_PLUGINS_H__ - -#include <hieroglyph/hgtypes.h> -#include <gmodule.h> - -G_BEGIN_DECLS - -#define HG_PLUGIN_VERSION 0x0001 -#define HG_PLUGIN_GET_PLUGIN_TYPE(_obj) ((HgPluginType)HG_OBJECT_GET_USER_DATA (&(_obj)->object)) - - -struct _HieroGlyphPluginVTable { - gboolean (* init) (void); - gboolean (* finalize) (void); - gboolean (* load) (HgPlugin *plugin, - HgVM *vm); - gboolean (* unload) (HgPlugin *plugin, - HgVM *vm); -}; - -struct _HieroGlyphPlugin { - HgObject object; - gint16 version; - HgPluginVTable *vtable; - GModule *module; - gpointer user_data; - gboolean is_loaded; -}; - - -HgPlugin *hg_plugin_new (HgMemPool *pool, - HgPluginType type); -HgPlugin *hg_plugin_open (HgMemPool *pool, - const gchar *name, - HgPluginType type); -gboolean hg_plugin_load (HgPlugin *plugin, - HgVM *vm); -gboolean hg_plugin_unload(HgPlugin *plugin, - HgVM *vm); - -G_END_DECLS - -#endif /* __HG_PLUGINS_H__ */ diff --git a/hieroglyph/hgrender.c b/hieroglyph/hgrender.c deleted file mode 100644 index 4148b65..0000000 --- a/hieroglyph/hgrender.c +++ /dev/null @@ -1,289 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* - * hgrender.c - * Copyright (C) 2006 Akira TAGOH - * - * Authors: - * Akira TAGOH <at@gclab.org> - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - */ -#ifdef HAVE_CONFIG_H -#include <config.h> -#endif - -#include <string.h> -#include "hgrender.h" -#include "hglog.h" -#include "hgmem.h" - - -static void _hg_render_fill_real_set_flags (gpointer data, - guint flags); -static void _hg_render_fill_real_relocate (gpointer data, - HgMemRelocateInfo *info); -static void _hg_render_stroke_real_set_flags(gpointer data, - guint flags); -static void _hg_render_stroke_real_relocate (gpointer data, - HgMemRelocateInfo *info); -static void _hg_render_debug_real_set_flags (gpointer data, - guint flags); -static void _hg_render_debug_real_relocate (gpointer data, - HgMemRelocateInfo *info); - - -static HgObjectVTable __hg_render_fill_vtable = { - .free = NULL, - .set_flags = _hg_render_fill_real_set_flags, - .relocate = _hg_render_fill_real_relocate, - .dup = NULL, - .copy = NULL, - .to_string = NULL, -}; -static HgObjectVTable __hg_render_stroke_vtable = { - .free = NULL, - .set_flags = _hg_render_stroke_real_set_flags, - .relocate = _hg_render_stroke_real_relocate, - .dup = NULL, - .copy = NULL, - .to_string = NULL, -}; -static HgObjectVTable __hg_render_debug_vtable = { - .free = NULL, - .set_flags = _hg_render_debug_real_set_flags, - .relocate = _hg_render_debug_real_relocate, - .dup = NULL, - .copy = NULL, - .to_string = NULL, -}; - -/* - * Private Functions - */ -static void -_hg_render_fill_real_set_flags(gpointer data, - guint flags) -{ - HgRender *render = data; - HgMemObject *obj; - - hg_mem_get_object__inline(render->u.fill.path, obj); - if (obj == NULL) { - hg_log_warning("[BUG] Invalid object %p to be marked: HgRenderFill.", render->u.fill.path); - } else { - if (!hg_mem_is_flags__inline(obj, flags)) - hg_mem_add_flags__inline(obj, flags, TRUE); - } -} - -static void -_hg_render_fill_real_relocate(gpointer data, - HgMemRelocateInfo *info) -{ - HgRender *render = data; - - if ((gsize)render->u.fill.path >= info->start && - (gsize)render->u.fill.path <= info->end) { - render->u.fill.path = (gpointer)((gsize)render->u.fill.path + info->diff); - } -} - -static void -_hg_render_stroke_real_set_flags(gpointer data, - guint flags) -{ - HgRender *render = data; - HgMemObject *obj; - - hg_mem_get_object__inline(render->u.stroke.path, obj); - if (obj == NULL) { - hg_log_warning("[BUG] Invalid object %p to be marked: HgRenderStroke->path.", render->u.stroke.path); - } else { - if (!hg_mem_is_flags__inline(obj, flags)) - hg_mem_add_flags__inline(obj, flags, TRUE); - } - hg_mem_get_object__inline(render->u.stroke.dashline_pattern, obj); - if (obj == NULL) { - hg_log_warning("[BUG] Invalid object %p to be marked: HgRenderStroke->dashline_pattern.", render->u.stroke.dashline_pattern); - } else { - if (!hg_mem_is_flags__inline(obj, flags)) - hg_mem_add_flags__inline(obj, flags, TRUE); - } -} - -static void -_hg_render_stroke_real_relocate(gpointer data, - HgMemRelocateInfo *info) -{ - HgRender *render = data; - - if ((gsize)render->u.stroke.path >= info->start && - (gsize)render->u.stroke.path <= info->end) { - render->u.stroke.path = (gpointer)((gsize)render->u.stroke.path + info->diff); - } - if ((gsize)render->u.stroke.dashline_pattern >= info->start && - (gsize)render->u.stroke.dashline_pattern <= info->end) { - render->u.stroke.dashline_pattern = (gpointer)((gsize)render->u.stroke.dashline_pattern + info->diff); - } -} - -static void -_hg_render_debug_real_set_flags(gpointer data, - guint flags) -{ - HgRender *render = data; - HgMemObject *obj; - - if (render->u.debug.data) { - hg_mem_get_object__inline(render->u.debug.data, obj); - if (obj != NULL) { - if (!hg_mem_is_flags__inline(obj, flags)) - hg_mem_add_flags__inline(obj, flags, TRUE); - } - } -} - -static void -_hg_render_debug_real_relocate(gpointer data, - HgMemRelocateInfo *info) -{ - HgRender *render = data; - - if (render->u.debug.data) { - if ((gsize)render->u.debug.data >= info->start && - (gsize)render->u.debug.data <= info->end) { - render->u.debug.data = (gpointer)((gsize)render->u.debug.data + info->diff); - } - } -} - -/* - * Public Functions - */ -HgRender * -hg_render_eofill_new(HgMemPool *pool, - HgMatrix *ctm, - HgPathNode *path, - const HgColor *color) -{ - HgRender *retval; - - g_return_val_if_fail (pool != NULL, NULL); - g_return_val_if_fail (path != NULL, NULL); - g_return_val_if_fail (color != NULL, NULL); - - retval = hg_mem_alloc_with_flags(pool, sizeof (HgRender), - HG_FL_HGOBJECT); - HG_OBJECT_INIT_STATE (&retval->object); - HG_OBJECT_SET_STATE (&retval->object, hg_mem_pool_get_default_access_mode(pool)); - hg_object_set_vtable(&retval->object, &__hg_render_fill_vtable); - - retval->u.type = HG_RENDER_EOFILL; - memcpy(&retval->u.fill.mtx, ctm, sizeof (HgMatrix)); - retval->u.fill.path = path; - memcpy(&retval->u.fill.color, color, sizeof (HgColor)); - - return retval; -} - -HgRender * -hg_render_fill_new(HgMemPool *pool, - HgMatrix *ctm, - HgPathNode *path, - const HgColor *color) -{ - HgRender *retval; - - g_return_val_if_fail (pool != NULL, NULL); - g_return_val_if_fail (path != NULL, NULL); - g_return_val_if_fail (color != NULL, NULL); - - retval = hg_mem_alloc_with_flags(pool, sizeof (HgRender), - HG_FL_HGOBJECT); - HG_OBJECT_INIT_STATE (&retval->object); - HG_OBJECT_SET_STATE (&retval->object, hg_mem_pool_get_default_access_mode(pool)); - hg_object_set_vtable(&retval->object, &__hg_render_fill_vtable); - - retval->u.type = HG_RENDER_FILL; - memcpy(&retval->u.fill.mtx, ctm, sizeof (HgMatrix)); - retval->u.fill.path = path; - memcpy(&retval->u.fill.color, color, sizeof (HgColor)); - - return retval; -} - -HgRender * -hg_render_stroke_new(HgMemPool *pool, - HgMatrix *ctm, - HgPathNode *path, - const HgColor *color, - gdouble line_width, - gint line_cap, - gint line_join, - gdouble miter_limit, - gdouble dashline_offset, - HgArray *dashline_pattern) -{ - HgRender *retval; - - g_return_val_if_fail (pool != NULL, NULL); - g_return_val_if_fail (path != NULL, NULL); - g_return_val_if_fail (color != NULL, NULL); - g_return_val_if_fail (dashline_pattern != NULL, NULL); - - retval = hg_mem_alloc_with_flags(pool, sizeof (HgRender), - HG_FL_HGOBJECT); - HG_OBJECT_INIT_STATE (&retval->object); - HG_OBJECT_SET_STATE (&retval->object, hg_mem_pool_get_default_access_mode(pool)); - hg_object_set_vtable(&retval->object, &__hg_render_stroke_vtable); - - retval->u.type = HG_RENDER_STROKE; - memcpy(&retval->u.stroke.mtx, ctm, sizeof (HgMatrix)); - retval->u.stroke.path = path; - memcpy(&retval->u.stroke.color, color, sizeof (HgColor)); - retval->u.stroke.line_width = line_width; - retval->u.stroke.line_cap = line_cap; - retval->u.stroke.line_join = line_join; - retval->u.stroke.miter_limit = miter_limit; - retval->u.stroke.dashline_offset = dashline_offset; - retval->u.stroke.dashline_pattern = hg_object_copy((HgObject *)dashline_pattern); - - return retval; -} - -/* debugging renderer */ -HgRender * -hg_render_debug_new(HgMemPool *pool, - HgDebugFunc func, - gpointer data) -{ - HgRender *retval; - - g_return_val_if_fail (pool != NULL, NULL); - g_return_val_if_fail (func != NULL, NULL); - - retval = hg_mem_alloc_with_flags(pool, sizeof (HgRender), - HG_FL_HGOBJECT); - HG_OBJECT_INIT_STATE (&retval->object); - HG_OBJECT_SET_STATE (&retval->object, hg_mem_pool_get_default_access_mode(pool)); - hg_object_set_vtable(&retval->object, &__hg_render_debug_vtable); - - retval->u.type = HG_RENDER_DEBUG; - retval->u.debug.func = func; - retval->u.debug.data = data; - - return retval; -} diff --git a/hieroglyph/hgrender.h b/hieroglyph/hgrender.h deleted file mode 100644 index 6f8d0d4..0000000 --- a/hieroglyph/hgrender.h +++ /dev/null @@ -1,56 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* - * hgrender.h - * Copyright (C) 2006 Akira TAGOH - * - * Authors: - * Akira TAGOH <at@gclab.org> - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - */ -#ifndef __HG_RENDER_H__ -#define __HG_RENDER_H__ - -#include <hieroglyph/hgtypes.h> - -G_BEGIN_DECLS - -HgRender *hg_render_eofill_new(HgMemPool *pool, - HgMatrix *ctm, - HgPathNode *path, - const HgColor *color); -HgRender *hg_render_fill_new (HgMemPool *pool, - HgMatrix *ctm, - HgPathNode *path, - const HgColor *color); -HgRender *hg_render_stroke_new(HgMemPool *pool, - HgMatrix *ctm, - HgPathNode *path, - const HgColor *color, - gdouble line_width, - gint line_cap, - gint line_join, - gdouble miter_limit, - gdouble dashline_offset, - HgArray *dashline_pattern); -HgRender *hg_render_debug_new (HgMemPool *pool, - HgDebugFunc func, - gpointer data); - - -G_END_DECLS - -#endif /* __HG_RENDER_H__ */ diff --git a/hieroglyph/hgstack.c b/hieroglyph/hgstack.c index 489e2d7..3f69006 100644 --- a/hieroglyph/hgstack.c +++ b/hieroglyph/hgstack.c @@ -1,10 +1,10 @@ /* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ /* * hgstack.c - * Copyright (C) 2005-2006 Akira TAGOH + * Copyright (C) 2005-2007 Akira TAGOH * * Authors: - * Akira TAGOH <at@gclab.org> + * Akira TAGOH <akira@tagoh.org> * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -22,307 +22,197 @@ * Boston, MA 02111-1307, USA. */ #ifdef HAVE_CONFIG_H -#include <config.h> +#include "config.h" #endif #include <stdlib.h> +#include <string.h> +#include <hieroglyph/hgobject.h> +#include <hieroglyph/vm.h> #include "hgstack.h" -#include "hglog.h" -#include "hgmem.h" -#include "hgfile.h" -#include "hgstring.h" -#include "hgvaluenode.h" - - -struct _HieroGlyphStack { - HgObject object; - GList *stack; - GList *last_stack; - guint max_depth; - guint current_depth; - gboolean use_validator; -}; - - -static void _hg_stack_real_free (gpointer data); -static void _hg_stack_real_set_flags(gpointer data, - guint flags); -static void _hg_stack_real_relocate (gpointer data, - HgMemRelocateInfo *info); -static gpointer _hg_stack_real_dup (gpointer data); - - -static HgObjectVTable __hg_stack_vtable = { - .free = _hg_stack_real_free, - .set_flags = _hg_stack_real_set_flags, - .relocate = _hg_stack_real_relocate, - .dup = _hg_stack_real_dup, - .copy = NULL, - .to_string = NULL, -}; + /* - * Private Functions + * private functions */ -static void -_hg_stack_real_free(gpointer data) -{ - HgStack *stack = data; - - g_list_free(stack->stack); -} - -static void -_hg_stack_real_set_flags(gpointer data, - guint flags) -{ - HgStack *stack = data; - GList *list; - HgMemObject *obj; - - for (list = stack->stack; list != NULL; list = g_list_next(list)) { - hg_mem_get_object__inline(list->data, obj); - if (obj == NULL) { - hg_log_warning("Invalid object %p to be marked: HgValueNode in stack.", list->data); - } else { - if (!hg_mem_is_flags__inline(obj, flags)) - hg_mem_set_flags__inline(obj, flags, TRUE); - } - } -} - -static void -_hg_stack_real_relocate(gpointer data, - HgMemRelocateInfo *info) -{ - HgStack *stack = data; - GList *list; - - for (list = stack->stack; list != NULL; list = g_list_next(list)) { - if ((gsize)list->data >= info->start && - (gsize)list->data <= info->end) { - list->data = (gpointer)((gsize)list->data + info->diff); - } - } -} - -static gpointer -_hg_stack_real_dup(gpointer data) -{ - HgStack *stack = data, *retval; - HgMemObject *obj; - - hg_mem_get_object__inline(data, obj); - if (obj == NULL) - return NULL; - - retval = hg_stack_new(obj->pool, stack->max_depth); - if (retval == NULL) { - hg_log_warning("Failed to duplicate a stack."); - return NULL; - } - retval->stack = g_list_copy(stack->stack); - retval->last_stack = g_list_last(retval->stack); - - return retval; -} /* - * Public Functions + * public functions */ -HgStack * -hg_stack_new(HgMemPool *pool, - guint max_depth) +hg_stack_t * +hg_stack_new(hg_vm_t *vm, + gsize depth) { - HgStack *retval; - - g_return_val_if_fail (pool != NULL, NULL); - g_return_val_if_fail (max_depth > 0, NULL); - - retval = hg_mem_alloc_with_flags(pool, sizeof (HgStack), - HG_FL_HGOBJECT); - if (retval == NULL) { - hg_log_warning("Failed to create a stack."); - return NULL; + hg_stack_t *retval; + hg_stackdata_t *data; + + hg_return_val_if_fail (vm != NULL, NULL); + hg_return_val_if_fail (depth > 0, NULL); + + retval = hg_vm_malloc(vm, hg_n_alignof (sizeof (hg_stack_t) + sizeof (hg_stackdata_t) * (depth + 1))); + if (retval != NULL) { + retval->stack_depth = depth; + retval->current_depth = depth; + data = (hg_stackdata_t *)retval->data; + memset(data, 0, sizeof (hg_stackdata_t) * (depth + 1)); + data[depth].next = &data[depth-1]; + retval->stack_top = &data[depth]; } - HG_OBJECT_INIT_STATE (&retval->object); - hg_object_set_vtable(&retval->object, &__hg_stack_vtable); - retval->current_depth = 0; - retval->max_depth = max_depth; - retval->stack = NULL; - retval->last_stack = NULL; - retval->use_validator = TRUE; return retval; } void -_hg_stack_use_stack_validator(HgStack *stack, - gboolean flag) -{ - g_return_if_fail (stack != NULL); - - stack->use_validator = flag; -} - -guint -hg_stack_depth(HgStack *stack) +hg_stack_free(hg_vm_t *vm, + hg_stack_t *stack) { - g_return_val_if_fail (stack != NULL, 0); + hg_return_if_fail (stack != NULL); - return stack->current_depth; + hg_vm_mfree(vm, stack); } gboolean -_hg_stack_push(HgStack *stack, - HgValueNode *node) +hg_stack_push(hg_stack_t *stack, + hg_object_t *object) { - GList *list; + hg_stackdata_t *data, *prev; - g_return_val_if_fail (stack != NULL, FALSE); - g_return_val_if_fail (node != NULL, FALSE); + hg_return_val_if_fail (stack != NULL, FALSE); + hg_return_val_if_fail (object != NULL, FALSE); - list = g_list_alloc(); - list->data = node; - if (stack->stack == NULL) { - stack->stack = stack->last_stack = list; + if (stack->current_depth == 0) + return FALSE; + prev = data = stack->stack_top; + hg_return_val_if_fail (data->next != NULL, FALSE); + + stack->current_depth--; + data = data->next; + data->data = object; + if (data->prev == NULL) + data->prev = prev; + if (stack->current_depth > 0) { + if (data->next == NULL) + data->next = &data[-1]; } else { - stack->last_stack->next = list; - list->prev = stack->last_stack; - stack->last_stack = list; + data->next = NULL; } - stack->current_depth++; + stack->stack_top = data; return TRUE; } -gboolean -hg_stack_push(HgStack *stack, - HgValueNode *node) +hg_object_t * +hg_stack_pop(hg_stack_t *stack) { - g_return_val_if_fail (stack != NULL, FALSE); - g_return_val_if_fail (node != NULL, FALSE); + hg_object_t *retval; + hg_stackdata_t *data; - if (stack->use_validator && - stack->current_depth >= stack->max_depth) - return FALSE; + hg_return_val_if_fail (stack != NULL, NULL); + hg_return_val_if_fail (stack->stack_depth > stack->current_depth, NULL); - return _hg_stack_push(stack, node); + data = stack->stack_top; + retval = data->data; + stack->stack_top = data->prev; + stack->current_depth++; + + return retval; } -HgValueNode * -hg_stack_pop(HgStack *stack) +void +hg_stack_clear(hg_stack_t *stack) { - HgValueNode *retval; - GList *list; + hg_stackdata_t *data; - g_return_val_if_fail (stack != NULL, NULL); + hg_return_if_fail (stack != NULL); - if (stack->last_stack == NULL) - return NULL; - - list = stack->last_stack; - stack->last_stack = list->prev; - if (list->prev) { - list->prev->next = NULL; - list->prev = NULL; - } - if (stack->stack == list) { - stack->stack = NULL; - } - retval = list->data; - g_list_free_1(list); - stack->current_depth--; - - return retval; + stack->current_depth = stack->stack_depth; + data = (hg_stackdata_t *)stack->data; + stack->stack_top = &data[stack->stack_depth]; } -void -hg_stack_clear(HgStack *stack) +gsize +hg_stack_length(hg_stack_t *stack) { - g_return_if_fail (stack != NULL); + hg_return_val_if_fail (stack != NULL, 0); - g_list_free(stack->stack); - stack->stack = NULL; - stack->current_depth = 0; + return stack->stack_depth - stack->current_depth; } -HgValueNode * -hg_stack_index(HgStack *stack, - guint index_from_top) +hg_object_t * +hg_stack_index(hg_stack_t *stack, + gsize index) { - GList *list; + hg_stackdata_t *data; - g_return_val_if_fail (stack != NULL, NULL); - g_return_val_if_fail (index_from_top < stack->current_depth, NULL); + hg_return_val_if_fail (stack != NULL, NULL); + hg_return_val_if_fail (index < (stack->stack_depth - stack->current_depth), NULL); - for (list = stack->last_stack; index_from_top > 0; list = g_list_previous(list), index_from_top--); + for (data = stack->stack_top; index > 0; data = data->prev, index--); - return list->data; + return data->data; } -void -hg_stack_roll(HgStack *stack, - guint n_block, - gint32 n_times) +gboolean +hg_stack_roll(hg_stack_t *stack, + gsize n_block, + gssize n_times) { - GList *notargeted_before, *notargeted_after, *beginning, *ending; - gint32 n, i; + hg_stackdata_t *before, *after, *beginning, *ending; + gsize n, i; - g_return_if_fail (stack != NULL); - g_return_if_fail (n_block <= stack->current_depth); + hg_return_val_if_fail (stack != NULL, FALSE); + hg_return_val_if_fail (n_block <= (stack->stack_depth - stack->current_depth), FALSE); if (n_block == 0 || - n_times == 0) - return; + n_times == 0) { + /* This case is the same to do nothing */ + return TRUE; + } n = abs(n_times) % n_block; - if (n != 0) { - /* find the place that isn't targeted for roll */ - for (notargeted_before = stack->last_stack, i = n_block; - i > 0; - notargeted_before = g_list_previous(notargeted_before), i--); - if (!notargeted_before) - notargeted_after = stack->stack; - else - notargeted_after = notargeted_before->next; - /* try to find the place to cut off */ - if (n_times > 0) { - for (beginning = stack->last_stack; n > 1; beginning = g_list_previous(beginning), n--); - ending = beginning->prev; - } else { - for (ending = notargeted_after; n > 1; ending = g_list_next(ending), n--); - beginning = ending->next; - } - stack->last_stack->next = notargeted_after; - stack->last_stack->next->prev = stack->last_stack; - if (notargeted_before) { - notargeted_before->next = beginning; - notargeted_before->next->prev = notargeted_before; - } else { - stack->stack = beginning; - stack->stack->prev = NULL; - } - stack->last_stack = ending; - stack->last_stack->next = NULL; + if (n == 0) { + /* This case is the same to do nothing */ + return TRUE; + } + + /* find a place where isn't targetted for roll */ + for (before = stack->stack_top, i = n_block; + i > 0; + before = before->prev, i--); + after = before->next; + /* try to find the place where cutting off */ + if (n_times > 0) { + for (beginning = stack->stack_top; n > 1; beginning = beginning->prev, n--); + ending = beginning->prev; + } else { + for (ending = after; n > 1; ending = ending->next, n--); + beginning = ending->next; } + ending->next = stack->stack_top->next; + stack->stack_top->next = after; + stack->stack_top->next->prev = stack->stack_top; + before->next = beginning; + before->next->prev = before; + stack->stack_top = ending; + + return TRUE; } void -hg_stack_dump(HgStack *stack, - HgFileObject *file) +hg_stack_dump(hg_vm_t *vm, + hg_stack_t *stack) { - GList *l; - HgValueNode *node; - - g_return_if_fail (stack != NULL); - - hg_file_object_printf(file, " address| type|content\n"); - hg_file_object_printf(file, "----------+-------+-------------------------------\n"); - for (l = stack->stack; l != NULL; l = g_list_next(l)) { - node = l->data; - hg_value_node_debug_print(file, - HG_DEBUG_DUMP, - HG_VALUE_GET_VALUE_TYPE (node), - stack, node, NULL); + gsize i; + hg_stackdata_t *data; + gchar *p; + + hg_return_if_fail (vm != NULL); + hg_return_if_fail (stack != NULL); + + for (i = 0, data = stack->stack_top; + i < (stack->stack_depth - stack->current_depth); + i++, data = data->prev) { + p = hg_object_dump(data->data, TRUE); + printf("%d: %s\n", i + 1, p); + g_free(p); } } diff --git a/hieroglyph/hgstack.h b/hieroglyph/hgstack.h index 89ca889..ef09b18 100644 --- a/hieroglyph/hgstack.h +++ b/hieroglyph/hgstack.h @@ -1,10 +1,10 @@ /* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ /* * hgstack.h - * Copyright (C) 2005-2006 Akira TAGOH + * Copyright (C) 2005-2007 Akira TAGOH * * Authors: - * Akira TAGOH <at@gclab.org> + * Akira TAGOH <akira@tagoh.org> * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -21,35 +21,31 @@ * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ -#ifndef __HG_STACK_H__ -#define __HG_STACK_H__ +#ifndef __HIEROGLYPH_HGSTACK_H__ +#define __HIEROGLYPH_HGSTACK_H__ #include <hieroglyph/hgtypes.h> -G_BEGIN_DECLS - -HgStack *hg_stack_new (HgMemPool *pool, - guint max_depth); -guint hg_stack_depth(HgStack *stack); -gboolean hg_stack_push (HgStack *stack, - HgValueNode *node); -HgValueNode *hg_stack_pop (HgStack *stack); -void hg_stack_clear(HgStack *stack); -HgValueNode *hg_stack_index(HgStack *stack, - guint index_from_top); -void hg_stack_roll (HgStack *stack, - guint n_block, - gint32 n_times); -void hg_stack_dump (HgStack *stack, - HgFileObject *file); +G_BEGIN_DECLS -/* internal use */ -void _hg_stack_use_stack_validator(HgStack *stack, - gboolean flag); -gboolean _hg_stack_push (HgStack *stack, - HgValueNode *node); +hg_stack_t *hg_stack_new (hg_vm_t *vm, + gsize depth) G_GNUC_WARN_UNUSED_RESULT; +void hg_stack_free (hg_vm_t *vm, + hg_stack_t *stack); +gboolean hg_stack_push (hg_stack_t *stack, + hg_object_t *object); +hg_object_t *hg_stack_pop (hg_stack_t *stack); +void hg_stack_clear (hg_stack_t *stack); +gsize hg_stack_length(hg_stack_t *stack); +hg_object_t *hg_stack_index (hg_stack_t *stack, + gsize index); +gboolean hg_stack_roll (hg_stack_t *stack, + gsize n_block, + gssize n_times); +void hg_stack_dump (hg_vm_t *vm, + hg_stack_t *stack); G_END_DECLS -#endif /* __HG_STACK_H__ */ +#endif /* __HIEROGLYPH_HGSTACK_H__ */ diff --git a/hieroglyph/hgstring.c b/hieroglyph/hgstring.c index ef3ad02..8171e21 100644 --- a/hieroglyph/hgstring.c +++ b/hieroglyph/hgstring.c @@ -1,10 +1,10 @@ /* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ /* * hgstring.c - * Copyright (C) 2005-2006 Akira TAGOH + * Copyright (C) 2005-2007 Akira TAGOH * * Authors: - * Akira TAGOH <at@gclab.org> + * Akira TAGOH <akira@tagoh.org> * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -22,605 +22,112 @@ * Boston, MA 02111-1307, USA. */ #ifdef HAVE_CONFIG_H -#include <config.h> +#include "config.h" #endif -#include <ctype.h> -#include <stdio.h> #include <string.h> +#include <hieroglyph/hgobject.h> #include "hgstring.h" -#include "hglog.h" -#include "hgmem.h" -#define HG_STRING_ALLOC_SIZE 256 -#define HG_STRING_MAX_SIZE 65535 /* defined as PostScript spec */ - -struct _HieroGlyphString { - HgObject object; - gchar *strings; - gchar *current; - gint32 allocated_size; - guint16 length; - guint16 substring_offset; - gboolean is_fixed_size : 1; -}; - - -static void _hg_string_real_set_flags(gpointer data, - guint flags); -static void _hg_string_real_relocate (gpointer data, - HgMemRelocateInfo *info); -static gpointer _hg_string_real_to_string(gpointer data); - - -static HgObjectVTable __hg_string_vtable = { - .free = NULL, - .set_flags = _hg_string_real_set_flags, - .relocate = _hg_string_real_relocate, - .dup = NULL, - .copy = NULL, - .to_string = _hg_string_real_to_string, -}; /* - * Private Functions + * private functions */ -static void -_hg_string_real_set_flags(gpointer data, - guint flags) -{ - HgString *string = data; - HgMemObject *obj; - - if (string->strings) { - /* down a restorable bit */ - flags &= ~HG_FL_RESTORABLE; - hg_mem_get_object__inline(string->strings, obj); - if (obj == NULL) { - hg_log_warning("[BUG] Invalid object %p to be marked: String", string->strings); - } else { -#ifdef DEBUG_GC - G_STMT_START { - if ((flags & HG_MEMOBJ_MARK_AGE_MASK) != 0) { - g_print("%s: marking string %p\n", __FUNCTION__, obj); - } - } G_STMT_END; -#endif /* DEBUG_GC */ - if (!hg_mem_is_flags__inline(obj, flags)) - hg_mem_add_flags__inline(obj, flags, TRUE); - } - } -} - -static void -_hg_string_real_relocate(gpointer data, - HgMemRelocateInfo *info) -{ - HgString *string = data; - - if ((gsize)string->strings >= info->start && - (gsize)string->strings <= info->end) { - string->strings = (gchar *)((gsize)string->strings + info->diff); - string->current = (gchar *)((gsize)string->strings + sizeof (gchar) * string->substring_offset); - } -} - -static gpointer -_hg_string_real_to_string(gpointer data) -{ - HgString *retval, *str = data; - HgMemObject *obj; - guint i; - gchar buffer[8]; - - hg_mem_get_object__inline(data, obj); - if (obj == NULL) - return NULL; - retval = hg_string_new(obj->pool, -1); - if (retval == NULL) - return NULL; - if (!hg_object_is_readable(data)) { - hg_string_append(retval, "-string-", 8); - hg_string_fix_string_size(retval); - - return retval; - } - for (i = 0; i < str->allocated_size; i++) { - if (isprint(str->current[i])) { - hg_string_append_c(retval, str->current[i]); - } else { - switch (str->current[i]) { - case '\n': - hg_string_append(retval, "\\n", 2); - break; - case '\r': - hg_string_append(retval, "\\r", 2); - break; - case '\t': - hg_string_append(retval, "\\t", 2); - break; - case '\b': - hg_string_append(retval, "\\b", 2); - break; - case '\f': - hg_string_append(retval, "\\f", 2); - break; - default: - snprintf(buffer, 8, "%04o", str->current[i] & 0xff); - hg_string_append_c(retval, '\\'); - hg_string_append(retval, buffer, -1); - break; - } - } - } - hg_string_fix_string_size(retval); - - return retval; -} /* - * Public Functions + * public functions */ -HgString * -hg_string_new(HgMemPool *pool, - gint32 n_prealloc) +hg_object_t * +hg_object_string_sized_new(hg_vm_t *vm, + guint16 length) { - HgString *retval; + hg_object_t *retval; + hg_stringdata_t *data; - g_return_val_if_fail (pool != NULL, NULL); - g_return_val_if_fail (n_prealloc < HG_STRING_MAX_SIZE + 1, NULL); - - retval = hg_mem_alloc_with_flags(pool, - sizeof (HgString), - HG_FL_HGOBJECT | HG_FL_COMPLEX); - if (retval == NULL) { - hg_log_warning("Failed to create a string."); - return NULL; - } - HG_OBJECT_INIT_STATE (&retval->object); - HG_OBJECT_SET_STATE (&retval->object, hg_mem_pool_get_default_access_mode(pool)); - hg_object_set_vtable(&retval->object, &__hg_string_vtable); + hg_return_val_if_fail (vm != NULL, NULL); - if (n_prealloc < 0) { - retval->allocated_size = HG_STRING_ALLOC_SIZE; - retval->is_fixed_size = FALSE; - } else { - retval->allocated_size = n_prealloc; - retval->is_fixed_size = TRUE; - } - retval->length = 0; - retval->substring_offset = 0; - /* initialize this first to avoid a warning message */ - retval->strings = NULL; - retval->strings = hg_mem_alloc(pool, sizeof (gchar) * (retval->allocated_size + 1)); - retval->current = retval->strings; - if (retval->strings == NULL) { - hg_mem_free(retval); - hg_log_warning("Failed to create a string."); - return NULL; + retval = hg_object_sized_new(vm, hg_n_alignof (sizeof (hg_stringdata_t) + length + 1)); + if (retval != NULL) { + HG_OBJECT_GET_TYPE (retval) = HG_OBJECT_TYPE_STRING; + HG_OBJECT_STRING (retval)->length = length; + HG_OBJECT_STRING (retval)->real_length = length; + data = HG_OBJECT_STRING_DATA (retval); + if (length > 0) + data->string = (gpointer)data->data; + else + data->string = NULL; } return retval; } -guint -hg_string_length(HgString *string) -{ - g_return_val_if_fail (string != NULL, 0); - g_return_val_if_fail (hg_object_is_readable((HgObject *)string), 0); - - return string->length; -} - -guint -hg_string_maxlength(HgString *string) -{ - g_return_val_if_fail (string != NULL, 0); - g_return_val_if_fail (hg_object_is_readable((HgObject *)string), 0); - - return string->allocated_size; -} - -gboolean -hg_string_clear(HgString *string) -{ - g_return_val_if_fail (string != NULL, FALSE); - g_return_val_if_fail (hg_object_is_readable((HgObject *)string), FALSE); - g_return_val_if_fail (hg_object_is_writable((HgObject *)string), FALSE); - - string->length = 0; - string->current[0] = 0; - - return TRUE; -} - -gboolean -hg_string_append_c(HgString *string, - gchar c) -{ - g_return_val_if_fail (string != NULL, FALSE); - g_return_val_if_fail (string->strings == string->current, FALSE); - g_return_val_if_fail (hg_object_is_readable((HgObject *)string), FALSE); - g_return_val_if_fail (hg_object_is_writable((HgObject *)string), FALSE); - - if (string->length < string->allocated_size) { - string->current[string->length++] = c; - } else if (!string->is_fixed_size) { - /* max string size is 65535 */ - g_return_val_if_fail (string->allocated_size < HG_STRING_MAX_SIZE, FALSE); - /* resize */ - gpointer p = hg_mem_resize(string->strings, string->allocated_size + HG_STRING_ALLOC_SIZE + 1); - - if (p == NULL) { - hg_log_warning("Failed to resize a string."); - return FALSE; - } - string->current = string->strings = p; - string->allocated_size += HG_STRING_ALLOC_SIZE; - string->strings[string->length++] = c; - } - - return TRUE; -} - -gboolean -hg_string_append(HgString *string, - const gchar *str, - gint length) -{ - gint i; - - g_return_val_if_fail (string != NULL, FALSE); - g_return_val_if_fail (str != NULL, FALSE); - g_return_val_if_fail (string->strings == string->current, FALSE); - g_return_val_if_fail (hg_object_is_readable((HgObject *)string), FALSE); - g_return_val_if_fail (hg_object_is_writable((HgObject *)string), FALSE); - - if (length < 0) - length = strlen(str); - if (!string->is_fixed_size && - (string->length + length) >= string->allocated_size) { - /* max string size is 65535 */ - g_return_val_if_fail ((string->length + length) < HG_STRING_MAX_SIZE, FALSE); - /* resize */ - gsize n_unit = (string->length + length + HG_STRING_ALLOC_SIZE + 1) / HG_STRING_ALLOC_SIZE; - gpointer p = hg_mem_resize(string->strings, n_unit * HG_STRING_ALLOC_SIZE); - - if (p == NULL) { - hg_log_warning("Failed to resize a string."); - return FALSE; - } - string->current = string->strings = p; - string->allocated_size = n_unit * HG_STRING_ALLOC_SIZE; - } - for (i = 0; i < length && string->length < string->allocated_size; i++) { - string->strings[string->length++] = str[i]; - } - string->strings[string->length] = 0; - - return TRUE; -} - -gboolean -hg_string_insert_c(HgString *string, - gchar c, - guint index) -{ - guint i; - - g_return_val_if_fail (string != NULL, FALSE); - g_return_val_if_fail (index < string->allocated_size, FALSE); - g_return_val_if_fail (hg_object_is_readable((HgObject *)string), FALSE); - g_return_val_if_fail (hg_object_is_writable((HgObject *)string), FALSE); - - string->current[index] = c; - /* update null-terminated string length */ - for (i = 0; i < string->allocated_size; i++) { - if (string->current[i] == 0) { - string->length = i; - return TRUE; - } - } - string->length = string->allocated_size; - - return TRUE; -} - -gboolean -hg_string_erase(HgString *string, - guint pos, - guint length) -{ - guint i, j; - - g_return_val_if_fail (string != NULL, FALSE); - g_return_val_if_fail (pos < string->length, FALSE); - g_return_val_if_fail ((pos + length) <= string->length, FALSE); - - for (i = pos, j = (pos + length); j < string->length; i++, j++) { - string->current[j] = string->current[i]; - } - string->length -= length; - - return TRUE; -} - -gboolean -hg_string_concat(HgString *string1, - HgString *string2) -{ - g_return_val_if_fail (string1 != NULL, FALSE); - g_return_val_if_fail (string2 != NULL, FALSE); - g_return_val_if_fail (hg_object_is_readable((HgObject *)string1), FALSE); - g_return_val_if_fail (hg_object_is_writable((HgObject *)string1), FALSE); - g_return_val_if_fail (hg_object_is_readable((HgObject *)string2), FALSE); - - return hg_string_append(string1, string2->current, string2->length); -} - -gchar -hg_string_index(HgString *string, - guint index) -{ - g_return_val_if_fail (string != NULL, 0); - g_return_val_if_fail (string->length > index, 0); - g_return_val_if_fail (hg_object_is_readable((HgObject *)string), FALSE); - - return string->current[index]; -} - -gchar * -hg_string_get_string(HgString *string) -{ - g_return_val_if_fail (string != NULL, NULL); - g_return_val_if_fail (hg_object_is_readable((HgObject *)string), FALSE); - - if (string->strings == string->current) { - /* don't break strings on sub-string */ - string->current[string->length] = 0; - } - - return string->current; -} - -gboolean -hg_string_fix_string_size(HgString *string) +hg_object_t * +hg_object_string_new(hg_vm_t *vm, + const gchar *value) { - g_return_val_if_fail (string != NULL, FALSE); - g_return_val_if_fail (hg_object_is_readable((HgObject *)string), FALSE); + hg_object_t *retval; + gchar *string; + gsize size; - if (!string->is_fixed_size) { - gpointer p; + hg_return_val_if_fail (vm != NULL, NULL); + hg_return_val_if_fail (value != NULL, NULL); - p = hg_mem_resize(string->strings, string->length + 1); - if (p == NULL) { - hg_log_warning("Failed to resize a string."); - return FALSE; - } - string->strings = p; - string->allocated_size = string->length; - string->is_fixed_size = TRUE; + size = strlen(value); + retval = hg_object_string_sized_new(vm, size); + if (retval != NULL) { + string = HG_OBJECT_STRING_DATA (retval)->string; + memcpy(string, value, size); } - return TRUE; -} - -gboolean -hg_string_compare(const HgString *a, - const HgString *b) -{ - g_return_val_if_fail (a != NULL, FALSE); - g_return_val_if_fail (b != NULL, FALSE); - g_return_val_if_fail (hg_object_is_readable((HgObject *)a), FALSE); - g_return_val_if_fail (hg_object_is_readable((HgObject *)b), FALSE); - - if (a->length != b->length) - return FALSE; - - return memcmp(a->current, b->current, a->length) == 0; -} - -gboolean -hg_string_ncompare(const HgString *a, - const HgString *b, - guint length) -{ - g_return_val_if_fail (a != NULL, FALSE); - g_return_val_if_fail (b != NULL, FALSE); - g_return_val_if_fail (hg_object_is_readable((HgObject *)a), FALSE); - g_return_val_if_fail (hg_object_is_readable((HgObject *)b), FALSE); - - if (length > a->length) - return FALSE; - return memcmp(a->current, b->current, length) == 0; -} - -gboolean -hg_string_compare_with_raw(const HgString *a, - const gchar *b, - gint length) -{ - g_return_val_if_fail (a != NULL, FALSE); - g_return_val_if_fail (b != NULL, FALSE); - g_return_val_if_fail (hg_object_is_readable((HgObject *)a), FALSE); - - if (length < 0) - length = strlen(b); - if (length > a->length) - return FALSE; - - return memcmp(a->current, b, length) == 0; -} - -gboolean -hg_string_compare_offset_later(const HgString *a, - const HgString *b, - guint offset1, - guint offset2) -{ - g_return_val_if_fail (a != NULL, FALSE); - g_return_val_if_fail (b != NULL, FALSE); - g_return_val_if_fail (hg_object_is_readable((HgObject *)a), FALSE); - g_return_val_if_fail (hg_object_is_readable((HgObject *)b), FALSE); - g_return_val_if_fail (offset1 <= a->length, FALSE); - g_return_val_if_fail (offset2 <= b->length, FALSE); - - return memcmp(a->current + offset1, b->current + offset2, a->length - offset1) == 0; -} - -gboolean -hg_string_ncompare_offset_later(const HgString *a, - const HgString *b, - guint offset1, - guint offset2, - guint length) -{ - g_return_val_if_fail (a != NULL, FALSE); - g_return_val_if_fail (b != NULL, FALSE); - g_return_val_if_fail (hg_object_is_readable((HgObject *)a), FALSE); - g_return_val_if_fail (hg_object_is_readable((HgObject *)b), FALSE); - g_return_val_if_fail (offset1 <= a->length, FALSE); - g_return_val_if_fail (offset2 <= b->length, FALSE); - - if (length > (a->length - offset1)) - return FALSE; - return memcmp(a->current + offset1, b->current + offset2, length) == 0; + return retval; } -HgString * -hg_string_make_substring(HgMemPool *pool, - HgString *string, - guint start_index, - guint end_index) +hg_object_t * +hg_object_string_substring_new(hg_vm_t *vm, + hg_object_t *object, + guint16 start_index, + guint16 length) { - HgString *retval; + hg_object_t *retval; + gchar *p; - g_return_val_if_fail (pool != NULL, NULL); + hg_return_val_if_fail (vm != NULL, NULL); + hg_return_val_if_fail (object != NULL, NULL); + hg_return_val_if_fail (HG_OBJECT_IS_STRING (object), NULL); + hg_return_val_if_fail (HG_OBJECT_STRING (object)->real_length > start_index, NULL); + hg_return_val_if_fail (HG_OBJECT_STRING (object)->real_length >= (start_index + length), NULL); - retval = hg_string_new(pool, 0); - if (end_index > HG_STRING_MAX_SIZE) { - /* makes an empty string */ - } else { - if (!hg_string_copy_as_substring(string, retval, start_index, end_index)) - return NULL; + retval = hg_object_string_sized_new(vm, 0); + if (retval != NULL) { + p = HG_OBJECT_STRING_DATA (object)->string; + HG_OBJECT_STRING_DATA (retval)->string = &p[start_index]; + HG_OBJECT_STRING (retval)->real_length = length; } return retval; } gboolean -hg_string_copy_as_substring(HgString *src, - HgString *dest, - guint start_index, - guint end_index) -{ - g_return_val_if_fail (src != NULL, FALSE); - g_return_val_if_fail (dest != NULL, FALSE); - g_return_val_if_fail (start_index < src->allocated_size, FALSE); - g_return_val_if_fail (end_index < src->allocated_size, FALSE); - g_return_val_if_fail (start_index <= end_index, FALSE); - - /* destroy the unnecessary destination strings */ - hg_mem_free(dest->strings); - /* make a sub-string */ - dest->strings = src->strings; - dest->current = (gpointer)((gsize)dest->strings + src->substring_offset + start_index); - dest->allocated_size = dest->length = end_index - start_index + 1; - dest->is_fixed_size = TRUE; - dest->substring_offset = start_index; - - return TRUE; -} - -gboolean -hg_string_convert_from_integer(HgString *string, - gint32 num, - guint radix, - gboolean is_lower) +hg_object_string_compare(hg_object_t *object1, + hg_object_t *object2) { - static const gchar *template_upper = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"; - static const gchar *template_lower = "0123456789abcdefghijklmnopqrstuvwxyz"; - const gchar *template; - gchar buf[40]; /* should be enough */ - gint i = 0, j; - guint32 unum = (guint32)num; - guint maxlength; - gboolean minus = FALSE; + guint16 i; + gchar *p1, *p2; - g_return_val_if_fail (string != NULL, FALSE); - g_return_val_if_fail (radix >= 2 && radix <= 36, FALSE); + hg_return_val_if_fail (object1 != NULL, FALSE); + hg_return_val_if_fail (object2 != NULL, FALSE); + hg_return_val_if_fail (HG_OBJECT_IS_STRING (object1), FALSE); + hg_return_val_if_fail (HG_OBJECT_IS_STRING (object2), FALSE); - if (radix == 10 && num < 0) { - unum = (guint32)((num - 1) ^ G_MAXUINT32); - minus = (num < 0 ? TRUE : FALSE); - } - maxlength = hg_string_maxlength(string); - if (is_lower) - template = template_lower; - else - template = template_upper; - do { - buf[i++] = template[unum % radix]; - unum /= radix; - } while (unum != 0); - if (i > maxlength) + if (HG_OBJECT_STRING (object1)->real_length != HG_OBJECT_STRING (object2)->real_length) return FALSE; - hg_string_clear(string); - if (minus) - hg_string_append_c(string, '-'); - for (j = 0; j < i; j++) { - hg_string_append_c(string, buf[i - 1 - j]); + + p1 = HG_OBJECT_STRING_DATA (object1)->string; + p2 = HG_OBJECT_STRING_DATA (object2)->string; + for (i = 0; i < HG_OBJECT_STRING (object1)->real_length; i++) { + if (p1[i] != p2[i]) + return FALSE; } return TRUE; } - -void -hg_string_append_printf(HgString *string, - const gchar *format, - ...) -{ - va_list ap; - - va_start(ap, format); - hg_string_append_vprintf(string, format, ap); - va_end(ap); -} - -void -hg_string_append_vprintf(HgString *string, - const gchar *format, - va_list va_args) -{ - gchar *buffer; - - g_return_if_fail (string != NULL); - g_return_if_fail (format != NULL); - g_return_if_fail (hg_object_is_readable((HgObject *)string)); - g_return_if_fail (hg_object_is_writable((HgObject *)string)); - - buffer = g_strdup_vprintf(format, va_args); - hg_string_append(string, buffer, strlen(buffer)); - g_free(buffer); -} - -/* HgObject */ -HgString * -hg_object_to_string(HgObject *object) -{ - HgString *retval; - HgMemObject *obj; - const HgObjectVTable const *vtable; - - g_return_val_if_fail (object != NULL, NULL); - - if ((vtable = hg_object_get_vtable(object)) != NULL && - vtable->to_string) - return vtable->to_string(object); - - hg_mem_get_object__inline(object, obj); - retval = hg_string_new(obj->pool, 16); - hg_string_append(retval, "--nostringval--", -1); - - return retval; -} diff --git a/hieroglyph/hgstring.h b/hieroglyph/hgstring.h index 4c9e058..b062573 100644 --- a/hieroglyph/hgstring.h +++ b/hieroglyph/hgstring.h @@ -1,10 +1,10 @@ /* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ /* * hgstring.h - * Copyright (C) 2005-2006 Akira TAGOH + * Copyright (C) 2007 Akira TAGOH * * Authors: - * Akira TAGOH <at@gclab.org> + * Akira TAGOH <akira@tagoh.org> * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -21,75 +21,25 @@ * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ -#ifndef __HG_STRING_H__ -#define __HG_STRING_H__ +#ifndef __HIEROGLYPH_HGSTRING_H__ +#define __HIEROGLYPH_HGSTRING_H__ #include <hieroglyph/hgtypes.h> -G_BEGIN_DECLS - -HgString *hg_string_new (HgMemPool *pool, - gint32 n_prealloc); -guint hg_string_length (HgString *string); -guint hg_string_maxlength (HgString *string); -gboolean hg_string_clear (HgString *string); -gboolean hg_string_append_c (HgString *string, - gchar c); -gboolean hg_string_append (HgString *string, - const gchar *str, - gint length); -void hg_string_append_printf (HgString *string, - const gchar *format, - ...); -void hg_string_append_vprintf (HgString *string, - const gchar *format, - va_list va_args); -gboolean hg_string_insert_c (HgString *string, - gchar c, - guint index); -gboolean hg_string_concat (HgString *string1, - HgString *string2); -gchar hg_string_index (HgString *string, - guint index); -gboolean hg_string_erase (HgString *string, - guint pos, - guint length); -gchar *hg_string_get_string (HgString *string); -gboolean hg_string_fix_string_size (HgString *string); -gboolean hg_string_compare (const HgString *a, - const HgString *b); -gboolean hg_string_ncompare (const HgString *a, - const HgString *b, - guint length); -gboolean hg_string_compare_with_raw (const HgString *a, - const gchar *b, - gint length); -gboolean hg_string_compare_offset_later (const HgString *a, - const HgString *b, - guint offset1, - guint offset2); -gboolean hg_string_ncompare_offset_later(const HgString *a, - const HgString *b, - guint offset1, - guint offset2, - guint length); -HgString *hg_string_make_substring (HgMemPool *pool, - HgString *string, - guint start_index, - guint end_index); -gboolean hg_string_copy_as_substring (HgString *src, - HgString *dest, - guint start_index, - guint end_index); -gboolean hg_string_convert_from_integer (HgString *string, - gint32 num, - guint radix, - gboolean is_lower); +G_BEGIN_DECLS -/* HgObject */ -HgString *hg_object_to_string(HgObject *object); +hg_object_t *hg_object_string_sized_new (hg_vm_t *vm, + guint16 length); +hg_object_t *hg_object_string_new (hg_vm_t *vm, + const gchar *value); +hg_object_t *hg_object_string_substring_new(hg_vm_t *vm, + hg_object_t *object, + guint16 start_index, + guint16 length); +gboolean hg_object_string_compare (hg_object_t *object1, + hg_object_t *object2); G_END_DECLS -#endif /* __HG_STRING_H__ */ +#endif /* __HIEROGLYPH_HGSTRING_H__ */ diff --git a/hieroglyph/hgtypes.h b/hieroglyph/hgtypes.h index 19aa092..452768c 100644 --- a/hieroglyph/hgtypes.h +++ b/hieroglyph/hgtypes.h @@ -1,10 +1,10 @@ /* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ /* * hgtypes.h - * Copyright (C) 2005-2006 Akira TAGOH + * Copyright (C) 2005-2007 Akira TAGOH * * Authors: - * Akira TAGOH <at@gclab.org> + * Akira TAGOH <akira@tagoh.org> * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -21,596 +21,791 @@ * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ -#ifndef __HG_TYPES_H__ -#define __HG_TYPES_H__ +#ifndef __HIEROGLYPH__HGTYPES_H__ +#define __HIEROGLYPH__HGTYPES_H__ -#include <sys/unistd.h> +#include <errno.h> #include <hieroglyph/hgmacros.h> + G_BEGIN_DECLS -/* hgarray.h */ -typedef struct _HieroGlyphArray HgArray; -/* hgdict.h */ -typedef struct _HieroGlyphDict HgDict; -/* hgfile.h */ -typedef struct _HieroGlyphFileObject HgFileObject; -typedef struct _HieroGlyphFileObjectCallback HgFileObjectCallback; -/* hggraphics.h */ -typedef struct _HieroGlyphGraphics HgGraphics; -typedef struct _HieroGlyphGraphicState HgGraphicState; -/* hglineedit.h */ -typedef struct _HieroGlyphLineEdit HgLineEdit; -typedef struct _HieroGlyphLineEditVTable HgLineEditVTable; -/* hglist.h */ -typedef struct _HieroGlyphList HgList; -typedef struct _HieroGlyphListIter *HgListIter; -/* hglog.h */ -/* hgmem.h */ -typedef struct _HieroGlyphAllocatorVTable HgAllocatorVTable; -typedef struct _HieroGlyphAllocator HgAllocator; -typedef struct _HieroGlyphMemRelocateInfo HgMemRelocateInfo; -typedef struct _HieroGlyphMemObject HgMemObject; -typedef struct _HieroGlyphHeap HgHeap; -typedef struct _HieroGlyphMemPool HgMemPool; -typedef struct _HieroGlyphObjectVTable HgObjectVTable; -typedef struct _HieroGlyphObject HgObject; -typedef struct _HieroGlyphMemSnapshot HgMemSnapshot; -/* operator.h */ -typedef struct _HieroGlyphOperator HgOperator; -/* hgplugins.h */ -typedef struct _HieroGlyphPluginVTable HgPluginVTable; -typedef struct _HieroGlyphPlugin HgPlugin; -/* hgstack.h */ -typedef struct _HieroGlyphStack HgStack; -/* hgstring.h */ -typedef struct _HieroGlyphString HgString; -/* hgvaluenode.h */ -typedef struct _HieroGlyphValueNodeTypeInfo HgValueNodeTypeInfo; -typedef struct _HieroGlyphValueNode HgValueNode; -typedef struct _HieroGlyphValueNodePointer HgValueNodePointer; -typedef struct _HieroGlyphValueNodeBoolean HgValueNodeBoolean; -typedef struct _HieroGlyphValueNodeInteger HgValueNodeInteger; -typedef struct _HieroGlyphValueNodeReal HgValueNodeReal; -typedef struct _HieroGlyphValueNodeName HgValueNodeName; -typedef struct _HieroGlyphValueNodeArray HgValueNodeArray; -typedef struct _HieroGlyphValueNodeString HgValueNodeString; -typedef struct _HieroGlyphValueNodeDict HgValueNodeDict; -typedef struct _HieroGlyphValueNodeNull HgValueNodeNull; -typedef struct _HieroGlyphValueNodeOperator HgValueNodeOperator; -typedef struct _HieroGlyphValueNodeMark HgValueNodeMark; -typedef struct _HieroGlyphValueNodeFile HgValueNodeFile; -typedef struct _HieroGlyphValueNodeSnapshot HgValueNodeSnapshot; -typedef struct _HieroGlyphValueNodePlugin HgValueNodePlugin; -/* vm.h */ -typedef struct _HieroGlyphVirtualMachine HgVM; - -typedef struct _HieroGlyphColor HgColor; -typedef struct _HieroGlyphRenderFill HgRenderFill; -typedef struct _HieroGlyphRenderStroke HgRenderStroke; -typedef struct _HieroGlyphRenderDebug HgRenderDebug; -typedef struct _HieroGlyphRender HgRender; -typedef struct _HieroGlyphPage HgPage; -typedef struct _HieroGlyphPathNode HgPathNode; -typedef struct _HieroGlyphPath HgPath; -typedef struct _HieroGlyphPathBBox HgPathBBox; -typedef struct _HieroGlyphMatrix HgMatrix; -typedef struct _HieroGlyphDeviceVTable HgDeviceVTable; -typedef struct _HieroGlyphDevice HgDevice; - -typedef gboolean (*HgCompareFunc) (gconstpointer a, - gconstpointer b); -typedef gboolean (*HgTraverseFunc) (gpointer key, - gpointer val, - gpointer data); -typedef void (*HgDebugFunc) (gpointer data); -typedef HgAllocatorVTable * (*HgAllocatorTypeFunc) (void); -typedef HgPlugin * (*HgPluginNewFunc) (HgMemPool *pool); -typedef gboolean (*HgOperatorFunc) (HgOperator *op, - gpointer vm); - -typedef enum { - HG_MEM_GLOBAL = 1 << 0, /* without this, that means the local pool */ - HG_MEM_RESIZABLE = 1 << 1, -} HgMemPoolTypes; - -/* 32bit variables */ -typedef enum { - HG_FL_RESTORABLE = 1 << 0, /* no infect */ - HG_FL_COMPLEX = 1 << 1, /* no infect */ - HG_FL_LOCK = 1 << 2, /* no infect */ - HG_FL_COPYING = 1 << 3, /* no infect */ - HG_FL_DEAD = 1 << 4, /* no infect */ - HG_FL_HGOBJECT = 1 << 7, /* mark for HgObject */ - HG_FL_SNAPSHOT1 = 1 << 8, /* reserved for age of snapshot */ - HG_FL_SNAPSHOT2 = 1 << 9, /* reserved for age of snapshot */ - HG_FL_SNAPSHOT3 = 1 << 10, /* reserved for age of snapshot */ - HG_FL_SNAPSHOT4 = 1 << 11, /* reserved for age of snapshot */ - HG_FL_SNAPSHOT5 = 1 << 12, /* reserved for age of snapshot */ - HG_FL_SNAPSHOT6 = 1 << 13, /* reserved for age of snapshot */ - HG_FL_SNAPSHOT7 = 1 << 14, /* reserved for age of snapshot */ - HG_FL_SNAPSHOT8 = 1 << 15, /* reserved for age of snapshot */ - HG_FL_MARK1 = 1 << 16, /* infect all child objects - reserved for age of mark */ - HG_FL_MARK2 = 1 << 17, /* infect all child objects - reserved for age of mark */ - HG_FL_MARK3 = 1 << 18, /* infect all child objects - reserved for age of mark */ - HG_FL_MARK4 = 1 << 19, /* infect all child objects - reserved for age of mark */ - HG_FL_MARK5 = 1 << 20, /* infect all child objects - reserved for age of mark */ - HG_FL_MARK6 = 1 << 21, /* infect all child objects - reserved for age of mark */ - HG_FL_MARK7 = 1 << 22, /* infect all child objects - reserved for age of mark */ - HG_FL_MARK8 = 1 << 23, /* infect all child objects - reserved for age of mark */ - HG_FL_RESERVED1 = 1 << 24, /* reserved for heap id */ - HG_FL_RESERVED2 = 1 << 25, /* reserved for heap id */ - HG_FL_RESERVED3 = 1 << 26, /* reserved for heap id */ - HG_FL_RESERVED4 = 1 << 27, /* reserved for heap id */ - HG_FL_RESERVED5 = 1 << 28, /* reserved for heap id */ - HG_FL_RESERVED6 = 1 << 29, /* reserved for heap id */ - HG_FL_RESERVED7 = 1 << 30, /* reserved for heap id */ - HG_FL_RESERVED8 = 1 << 31, /* reserved for heap id */ - HG_FL_END -} HgMemFlags; - -typedef enum { - HG_ST_READABLE = 1 << 0, - HG_ST_WRITABLE = 1 << 1, - HG_ST_EXECUTABLE = 1 << 2, - HG_ST_EXECUTEONLY = 1 << 3, - HG_ST_ACCESSIBLE = 1 << 4, - HG_ST_RESERVED1 = 1 << 16, /* reserved for object-specific data */ - HG_ST_RESERVED2 = 1 << 17, /* reserved for object-specific data */ - HG_ST_RESERVED3 = 1 << 18, /* reserved for object-specific data */ - HG_ST_RESERVED4 = 1 << 19, /* reserved for object-specific data */ - HG_ST_RESERVED5 = 1 << 20, /* reserved for object-specific data */ - HG_ST_RESERVED6 = 1 << 21, /* reserved for object-specific data */ - HG_ST_RESERVED7 = 1 << 22, /* reserved for object-specific data */ - HG_ST_RESERVED8 = 1 << 23, /* reserved for object-specific data */ - HG_ST_RESERVED9 = 1 << 24, /* reserved for vtable ID */ - HG_ST_RESERVED10 = 1 << 25, /* reserved for vtable ID */ - HG_ST_RESERVED11 = 1 << 26, /* reserved for vtable ID */ - HG_ST_RESERVED12 = 1 << 27, /* reserved for vtable ID */ - HG_ST_RESERVED13 = 1 << 28, /* reserved for vtable ID */ - HG_ST_RESERVED14 = 1 << 29, /* reserved for vtable ID */ - HG_ST_RESERVED15 = 1 << 30, /* reserved for vtable ID */ - HG_ST_RESERVED16 = 1 << 31, /* reserved for vtable ID */ - HG_ST_END -} HgObjectStateFlags; - -typedef enum { - HG_DEBUG_GC_MARK = 0, - HG_DEBUG_GC_ALREADYMARK, - HG_DEBUG_GC_UNMARK, - HG_DEBUG_DUMP, -} HgDebugStateType; - -typedef enum { - HG_TYPE_VALUE_BOOLEAN = 1, - HG_TYPE_VALUE_INTEGER, - HG_TYPE_VALUE_REAL, - HG_TYPE_VALUE_NAME, - HG_TYPE_VALUE_ARRAY, - HG_TYPE_VALUE_STRING, - HG_TYPE_VALUE_DICT, - HG_TYPE_VALUE_NULL, - HG_TYPE_VALUE_OPERATOR, - HG_TYPE_VALUE_MARK, - HG_TYPE_VALUE_FILE, - HG_TYPE_VALUE_SNAPSHOT, - HG_TYPE_VALUE_PLUGIN, - HG_TYPE_VALUE_END -} HgValueType; - -typedef enum { - HG_FILE_TYPE_FILE = 1, +/** + * typedefs + */ +typedef struct hg_object_header_s hg_object_header_t; +typedef gint32 hg_integer_t; +typedef gfloat hg_real_t; +typedef struct hg_name_s hg_name_t; +typedef struct hg_encoding_name_s hg_encoding_name_t; +typedef gboolean hg_boolean_t; +typedef struct hg_string_s hg_string_t; +typedef struct hg_stringdata_s hg_stringdata_t; +typedef struct hg_array_s hg_array_t; +typedef struct hg_arraydata_s hg_arraydata_t; +typedef struct hg_dict_s hg_dict_t; +typedef struct hg_dictdata_s hg_dictdata_t; +typedef struct hg_file_s hg_file_t; +typedef struct hg_filedata_s hg_filedata_t; +typedef struct hg_filetable_s hg_filetable_t; +typedef enum hg_filetype_e hg_filetype_t; +typedef enum hg_filemode_e hg_filemode_t; +typedef enum hg_filepos_e hg_filepos_t; +typedef struct hg_operator_s hg_operator_t; +typedef struct hg_operatordata_s hg_operatordata_t; +typedef union hg_attribute_u hg_attribute_t; +typedef struct _hg_object_s _hg_object_t; +typedef struct hg_object_s hg_object_t; +typedef enum hg_object_type_e hg_object_type_t; +typedef enum hg_stack_type_e hg_stack_type_t; +typedef struct hg_stackdata_s hg_stackdata_t; +typedef struct hg_stack_s hg_stack_t; +typedef enum hg_error_e hg_error_t; +typedef enum hg_system_encoding_e hg_system_encoding_t; +typedef enum hg_emulation_type_e hg_emulation_type_t; +typedef struct hg_vm_s hg_vm_t; + +typedef gboolean (* hg_operator_func_t) (hg_vm_t *vm, + hg_object_t *data); + + +/** + * Structures + */ +struct hg_object_header_s { + guchar token_type; + guint16 n_objects; + guint32 total_length; +}; +struct hg_name_s { + guint16 reserved1; + guint16 length; +}; +struct hg_encoding_name_s { + gint16 representation; + guint16 index; +}; +struct hg_string_s { + guint16 length; + guint16 real_length; +}; +struct hg_array_s { + guint16 length; + guint16 real_length; +}; +struct hg_dict_s { + guint16 length; + guint16 used; +}; +struct hg_file_s { + guint16 reserved1; + guint16 reserved2; +}; +struct hg_operator_s { + guint16 length; + guint16 reserved1; +}; +struct hg_operatordata_s { + hg_operator_func_t func; + gchar *name[]; +}; +union hg_attribute_u { + struct { + guint8 is_accessible:1; /* flagging off this bit means noaccess */ + guint8 is_readable:1; /* flagging off this bit means readonly */ + guint8 is_executeonly:1; /* flagging on this bit means executeonly */ + guint8 is_locked:1; /* flagging on this bit means the object is locked. */ + guint8 reserved4:1; + guint8 reserved5:1; + guint8 is_global:1; /* flagging on this bit means the object was allocated at the global memory */ + guint8 is_checked:1; /* for checking the circular reference */ + } bit; + guint8 attributes; +}; +struct _hg_object_s { + hg_attribute_t attr; + union { + struct { + guint is_executable:1; + guint object_type:7; + } v; + guchar type; + } t; + union { + hg_integer_t integer; + hg_real_t real; + hg_name_t name; + hg_encoding_name_t encoding; + hg_boolean_t boolean; + hg_string_t string; + hg_array_t array; + hg_dict_t dict; + hg_file_t file; + hg_operator_t operator; + } v; +}; +struct hg_object_s { + hg_object_header_t header; + _hg_object_t object; + gpointer data[]; +}; + +struct hg_arraydata_s { + gchar name[256]; + gpointer array; + gpointer data[]; +}; +struct hg_stringdata_s { + gpointer string; + gpointer data[]; +}; +struct hg_dictdata_s { + hg_object_t *key; + hg_object_t *value; +}; +enum hg_filetype_e { + HG_FILE_TYPE_FILE_IO = 1, + HG_FILE_TYPE_MMAPPED_IO, HG_FILE_TYPE_BUFFER, HG_FILE_TYPE_STDIN, HG_FILE_TYPE_STDOUT, HG_FILE_TYPE_STDERR, - HG_FILE_TYPE_STATEMENT_EDIT, - HG_FILE_TYPE_LINE_EDIT, - HG_FILE_TYPE_BUFFER_WITH_CALLBACK, + HG_FILE_TYPE_LINEEDIT, + HG_FILE_TYPE_STATEMENTEDIT, + HG_FILE_TYPE_CALLBACK, HG_FILE_TYPE_END -} HgFileType; - -typedef enum { +}; +enum hg_filemode_e { HG_FILE_MODE_READ = 1 << 0, HG_FILE_MODE_WRITE = 1 << 1, HG_FILE_MODE_READWRITE = 1 << 2 -} HgFileModeType; - -typedef enum { - HG_FILE_POS_BEGIN = SEEK_SET, - HG_FILE_POS_CURRENT = SEEK_CUR, - HG_FILE_POS_END = SEEK_END -} HgFilePosType; - -/* hglog.h */ -typedef enum { - HG_LOG_TYPE_INFO = 0, - HG_LOG_TYPE_DEBUG = 1, - HG_LOG_TYPE_WARNING = 2, - HG_LOG_TYPE_ERROR = 3, -} HgLogType; - -typedef enum { - HG_PAGE_4A0 = 1, - HG_PAGE_2A0 = 2, - - HG_PAGE_A0 = 10, - HG_PAGE_A1 = 11, - HG_PAGE_A2 = 12, - HG_PAGE_A3 = 13, - HG_PAGE_A4 = 14, - HG_PAGE_A5 = 15, - HG_PAGE_A6 = 16, - HG_PAGE_A7 = 17, - - HG_PAGE_B0 = 20, - HG_PAGE_B1 = 21, - HG_PAGE_B2 = 22, - HG_PAGE_B3 = 23, - HG_PAGE_B4 = 24, - HG_PAGE_B5 = 25, - HG_PAGE_B6 = 26, - HG_PAGE_B7 = 27, - - HG_PAGE_JIS_B0 = 30, - HG_PAGE_JIS_B1 = 31, - HG_PAGE_JIS_B2 = 32, - HG_PAGE_JIS_B3 = 33, - HG_PAGE_JIS_B4 = 34, - HG_PAGE_JIS_B5 = 35, - HG_PAGE_JIS_B6 = 36, - - HG_PAGE_C0 = 40, - HG_PAGE_C1 = 41, - HG_PAGE_C2 = 42, - HG_PAGE_C3 = 43, - HG_PAGE_C4 = 44, - HG_PAGE_C5 = 45, - HG_PAGE_C6 = 46, - HG_PAGE_C7 = 47, - - HG_PAGE_LETTER = 50, - HG_PAGE_LEGAL = 51, - - HG_PAGE_JAPAN_POSTCARD = 60, -} HgPageSize; - -typedef enum { - HG_PATH_SETBBOX = 0, - HG_PATH_MOVETO, - HG_PATH_RMOVETO, - HG_PATH_LINETO, - HG_PATH_RLINETO, - HG_PATH_CURVETO, - HG_PATH_RCURVETO, - HG_PATH_ARC, - HG_PATH_ARCN, - HG_PATH_ARCT, - HG_PATH_CLOSE, - HG_PATH_UCACHE, - - HG_PATH_MATRIX = 50, -} HgPathType; - -typedef enum { - HG_RENDER_EOFILL = 1, - HG_RENDER_FILL, - HG_RENDER_STROKE, - HG_RENDER_DEBUG, -} HgRenderType; - -typedef enum { - HG_PLUGIN_EXTENSION = 1, - HG_PLUGIN_DEVICE, - HG_PLUGIN_END, -} HgPluginType; - -struct _HieroGlyphAllocatorVTable { - gboolean (* initialize) (HgMemPool *pool, - gsize prealloc); - gboolean (* destroy) (HgMemPool *pool); - gboolean (* resize_pool) (HgMemPool *pool, - gsize size); - gpointer (* alloc) (HgMemPool *pool, - gsize size, - guint flags); - void (* free) (HgMemPool *pool, - gpointer data); - gpointer (* resize) (HgMemObject *object, - gsize size); - gsize (* get_size) (HgMemObject *object); - void (* set_flags) (HgMemObject *object, - guint flags); - gboolean (* garbage_collection) (HgMemPool *pool); - void (* gc_mark) (HgMemPool *pool); - gboolean (* is_safe_object) (HgMemPool *pool, - HgMemObject *object); - HgMemSnapshot * (* save_snapshot) (HgMemPool *pool); - gboolean (* restore_snapshot) (HgMemPool *pool, - HgMemSnapshot *snapshot, - guint adjuster); -}; - -struct _HieroGlyphAllocator { - gpointer private; - gboolean used; - const HgAllocatorVTable *vtable; -}; - -struct _HieroGlyphMemRelocateInfo { - gsize diff; - gsize start; - gsize end; -}; - -struct _HieroGlyphMemObject { - gint32 magic; - gpointer subid; - HgMemPool *pool; - guint32 flags; - gpointer data[]; -}; - -struct _HieroGlyphObjectVTable { - void (* free) (gpointer data); - void (* set_flags) (gpointer data, - guint flags); - void (* relocate) (gpointer data, - HgMemRelocateInfo *info); - gpointer (* dup) (gpointer data); - gpointer (* copy) (gpointer data); - gpointer (* to_string) (gpointer data); -}; - -struct _HieroGlyphObject { - guint32 state; -}; - -struct _HieroGlyphValueNodeTypeInfo { - guint type_id; - gchar *name; - gsize struct_size; -}; - -struct _HieroGlyphValueNode { - HgObject object; -}; - -struct _HieroGlyphValueNodeBoolean { - HgValueNode node; - gboolean value; -}; - -struct _HieroGlyphValueNodeInteger { - HgValueNode node; - gint32 value; -}; - -struct _HieroGlyphValueNodeReal { - HgValueNode node; - gdouble value; -}; - -struct _HieroGlyphValueNodePointer { - HgValueNode node; - gpointer value; -}; - -struct _HieroGlyphValueNodeName { - HgValueNode node; - gchar *value; -}; - -struct _HieroGlyphValueNodeArray { - HgValueNode node; - HgArray *value; -}; - -struct _HieroGlyphValueNodeString { - HgValueNode node; - HgString *value; -}; - -struct _HieroGlyphValueNodeDict { - HgValueNode node; - HgDict *value; -}; - -struct _HieroGlyphValueNodeOperator { - HgValueNode node; - gpointer value; }; - -struct _HieroGlyphValueNodeNull { - HgValueNode node; - gpointer value; -}; - -struct _HieroGlyphValueNodeMark { - HgValueNode node; - gpointer value; -}; - -struct _HieroGlyphValueNodeFile { - HgValueNode node; - HgFileObject *value; -}; - -struct _HieroGlyphValueNodeSnapshot { - HgValueNode node; - HgMemSnapshot *value; -}; - -struct _HieroGlyphValueNodePlugin { - HgValueNode node; - HgPlugin *value; -}; - -struct _HieroGlyphFileObjectCallback { - gsize (* read) (gpointer user_data, - gpointer buffer, - gsize size, - gsize n); - gsize (* write) (gpointer user_data, - gconstpointer buffer, - gsize size, - gsize n); - gchar (* getc) (gpointer user_data); - gboolean (* flush) (gpointer user_data); - gssize (* seek) (gpointer user_data, - gssize offset, - HgFilePosType whence); - void (* close) (gpointer user_data); - gboolean (* is_closed) (gpointer user_data); - gboolean (* is_eof) (gpointer user_data); - void (* clear_eof) (gpointer uesr_data); - gint (* get_error_code) (gpointer user_data); -}; - -struct _HieroGlyphColor { - gboolean is_rgb; - union { - struct { - gdouble r; - gdouble g; - gdouble b; - } rgb; - struct { - gdouble h; - gdouble s; - gdouble v; - } hsv; - } is; -}; - -struct _HieroGlyphMatrix { - gdouble xx; - gdouble yx; - gdouble xy; - gdouble yy; - gdouble x0; - gdouble y0; -}; - -struct _HieroGlyphRenderFill { - HgRenderType type; - HgMatrix mtx; - HgPathNode *path; - HgColor color; -}; - -struct _HieroGlyphRenderStroke { - HgRenderType type; - HgMatrix mtx; - HgPathNode *path; - HgColor color; - gdouble line_width; - gint line_cap; - gint line_join; - gdouble miter_limit; - gdouble dashline_offset; - HgArray *dashline_pattern; -}; - -struct _HieroGlyphRenderDebug { - HgRenderType type; - HgDebugFunc func; - gpointer data; -}; - -struct _HieroGlyphRender { - HgObject object; +enum hg_filepos_e { + HG_FILE_SEEK_SET = SEEK_SET, + HG_FILE_SEEK_CUR = SEEK_CUR, + HG_FILE_SEEK_END = SEEK_END +}; +struct hg_filetable_s { + gboolean (* open) (gpointer user_data, + error_t *error); + gsize (* read) (gpointer user_data, + gpointer buffer, + gsize size, + gsize n, + error_t *error); + gsize (* write) (gpointer user_data, + gconstpointer buffer, + gsize size, + gsize n, + error_t *error); + gboolean (* flush) (gpointer user_data, + error_t *error); + gssize (* seek) (gpointer user_data, + gssize offset, + hg_filepos_t whence, + error_t *error); + void (* close) (gpointer user_data, + error_t *error); + gboolean (* is_closed) (gpointer user_data); + gboolean (* is_eof) (gpointer user_data); + void (* clear_eof) (gpointer user_data); +}; +struct hg_filedata_s { union { - HgRenderType type; - HgRenderFill fill; - HgRenderStroke stroke; - HgRenderDebug debug; - } u; -}; - -struct _HieroGlyphPage { - gdouble width; - gdouble height; - GList *node; - GList *last_node; -}; - -struct _HieroGlyphPathNode { - HgObject object; - HgPathType type; - gdouble x; - gdouble y; - HgPathNode *prev; - HgPathNode *next; -}; - -struct _HieroGlyphPath { - HgObject object; - HgPathNode *node; - HgPathNode *last_node; -}; - -struct _HieroGlyphPathBBox { - gdouble llx; - gdouble lly; - gdouble urx; - gdouble ury; -}; - -struct _HieroGlyphLineEditVTable { - gchar * (* get_line) (HgLineEdit *lineedit, - const gchar *prompt); - void (* add_history) (HgLineEdit *lineedit, - const gchar *strings); - void (* load_history) (HgLineEdit *lineedit, - const gchar *filename); - void (* save_history) (HgLineEdit *lineedit, - const gchar *filename); -}; - -struct _HieroGlyphGraphicState { - HgObject object; - - /* device independent parameters */ - HgMatrix ctm; - HgMatrix snapshot_matrix; - gdouble x; - gdouble y; - HgPath *path; - HgPath *clip_path; - /* FIXME: clip path stack */ - HgArray *color_space; - HgColor color; - HgDict *font; - gdouble line_width; - gint line_cap; - gint line_join; - gdouble miter_limit; - gdouble dashline_offset; - HgArray *dashline_pattern; - gboolean stroke_correction; - - /* device dependent parameters */ - HgDict *color_rendering; - gboolean over_printing; - HgArray *black_generator; - HgArray *black_corrector; - HgArray *transfer; - /* FIXME: halftone */ - gdouble smoothing; - gdouble shading; - gpointer device; -}; - -struct _HieroGlyphGraphics { - HgObject object; - HgMemPool *pool; - HgPage *current_page; - GList *pages; - HgGraphicState *current_gstate; - GList *gstate_stack; + gpointer buffer; + hg_filetable_t *table; + } v; + gint fd; + gsize filesize; + gsize current_position; + gsize current_line; + hg_filetype_t iotype; + hg_filemode_t mode; + gsize filename_length; + gchar *filename[]; +}; + +enum hg_object_type_e { + HG_OBJECT_TYPE_NULL = 0, + HG_OBJECT_TYPE_INTEGER, + HG_OBJECT_TYPE_REAL, + HG_OBJECT_TYPE_NAME, + HG_OBJECT_TYPE_BOOLEAN, + HG_OBJECT_TYPE_STRING, + HG_OBJECT_TYPE_EVAL, + HG_OBJECT_TYPE_ARRAY = 9, + HG_OBJECT_TYPE_MARK, + /* extended for hieroglyph */ + HG_OBJECT_TYPE_DICT = 65, + HG_OBJECT_TYPE_FILE, + HG_OBJECT_TYPE_OPERATOR, + HG_OBJECT_TYPE_END = (1 << 7) - 1 +}; + +enum hg_stack_type_e { + HG_STACK_TYPE_OSTACK, + HG_STACK_TYPE_ESTACK, + HG_STACK_TYPE_DSTACK, + HG_STACK_TYPE_END +}; +struct hg_stackdata_s { + gpointer data; + hg_stackdata_t *next; + hg_stackdata_t *prev; +}; +struct hg_stack_s { + hg_stackdata_t *stack_top; + gsize stack_depth; + gsize current_depth; + gpointer data[]; +}; + +enum hg_error_e { + HG_e_dictfull = 1, + HG_e_dictstackoverflow, + HG_e_dictstackunderflow, + HG_e_execstackoverflow, + HG_e_handleerror, + HG_e_interrupt, + HG_e_invalidaccess, + HG_e_invalidexit, + HG_e_invalidfileaccess, + HG_e_invalidfont, + HG_e_invalidrestore, + HG_e_ioerror, + HG_e_limitcheck, + HG_e_nocurrentpoint, + HG_e_rangecheck, + HG_e_stackoverflow, + HG_e_stackunderflow, + HG_e_syntaxerror, + HG_e_timeout, + HG_e_typecheck, + HG_e_undefined, + HG_e_undefinedfilename, + HG_e_undefinedresult, + HG_e_unmatchedmark, + HG_e_unregistered, + HG_e_VMerror, + HG_e_configurationerror, + HG_e_undefinedresource, + HG_e_END, +}; + +enum hg_system_encoding_e { + HG_enc_abs = 0, + HG_enc_add, + HG_enc_aload, + HG_enc_anchorsearch, + HG_enc_and, + HG_enc_arc, + HG_enc_arcn, + HG_enc_arct, + HG_enc_arcto, + HG_enc_array, + + HG_enc_ashow, + HG_enc_astore, + HG_enc_awidthshow, + HG_enc_begin, + HG_enc_bind, + HG_enc_bitshift, + HG_enc_ceiling, + HG_enc_charpath, + HG_enc_clear, + HG_enc_cleartomark, + + HG_enc_clip, + HG_enc_clippath, + HG_enc_closepath, + HG_enc_concat, + HG_enc_concatmatrix, + HG_enc_copy, + HG_enc_count, + HG_enc_counttomark, + HG_enc_currentcmykcolor, + HG_enc_currentdash, + + HG_enc_currentdict, + HG_enc_currentfile, + HG_enc_currentfont, + HG_enc_currentgray, + HG_enc_currentgstate, + HG_enc_currenthsbcolor, + HG_enc_currentlinecap, + HG_enc_currentlinejoin, + HG_enc_currentlinewidth, + HG_enc_currentmatrix, + + HG_enc_currentpoint, + HG_enc_currentrgbcolor, + HG_enc_currentshared, + HG_enc_curveto, + HG_enc_cvi, + HG_enc_cvlit, + HG_enc_cvn, + HG_enc_cvr, + HG_enc_cvrs, + HG_enc_cvs, + + HG_enc_cvx, + HG_enc_def, + HG_enc_defineusername, + HG_enc_dict, + HG_enc_div, + HG_enc_dtransform, + HG_enc_dup, + HG_enc_end, + HG_enc_eoclip, + HG_enc_eofill, + + HG_enc_eoviewclip, + HG_enc_eq, + HG_enc_exch, + HG_enc_exec, + HG_enc_exit, + HG_enc_file, + HG_enc_fill, + HG_enc_findfont, + HG_enc_flattenpath, + HG_enc_floor, + + HG_enc_flush, + HG_enc_flushfile, + HG_enc_for, + HG_enc_forall, + HG_enc_ge, + HG_enc_get, + HG_enc_getinterval, + HG_enc_grestore, + HG_enc_gsave, + HG_enc_gstate, + + HG_enc_gt, + HG_enc_identmatrix, + HG_enc_idiv, + HG_enc_idtransform, + HG_enc_if, + HG_enc_ifelse, + HG_enc_image, + HG_enc_imagemask, + HG_enc_index, + HG_enc_ineofill, + + HG_enc_infill, + HG_enc_initviewclip, + HG_enc_inueofill, + HG_enc_inufill, + HG_enc_invertmatrix, + HG_enc_itransform, + HG_enc_known, + HG_enc_le, + HG_enc_length, + HG_enc_lineto, + + HG_enc_load, + HG_enc_loop, + HG_enc_lt, + HG_enc_makefont, + HG_enc_matrix, + HG_enc_maxlength, + HG_enc_mod, + HG_enc_moveto, + HG_enc_mul, + HG_enc_ne, + + HG_enc_neg, + HG_enc_newpath, + HG_enc_not, + HG_enc_null, + HG_enc_or, + HG_enc_pathbbox, + HG_enc_pathforall, + HG_enc_pop, + HG_enc_print, + HG_enc_printobject, + + HG_enc_put, + HG_enc_putinterval, + HG_enc_rcurveto, + HG_enc_read, + HG_enc_readhexstring, + HG_enc_readline, + HG_enc_readstring, + HG_enc_rectclip, + HG_enc_rectfill, + HG_enc_rectstroke, + + HG_enc_rectviewclip, + HG_enc_repeat, + HG_enc_restore, + HG_enc_rlineto, + HG_enc_rmoveto, + HG_enc_roll, + HG_enc_rotate, + HG_enc_round, + HG_enc_save, + HG_enc_scale, + + HG_enc_scalefont, + HG_enc_search, + HG_enc_selectfont, + HG_enc_setbbox, + HG_enc_setcachedevice, + HG_enc_setcachedevice2, + HG_enc_setcharwidth, + HG_enc_setcmykcolor, + HG_enc_setdash, + HG_enc_setfont, + + HG_enc_setgray, + HG_enc_setgstate, + HG_enc_sethsbcolor, + HG_enc_setlinecap, + HG_enc_setlinejoin, + HG_enc_setlinewidth, + HG_enc_setmatrix, + HG_enc_setrgbcolor, + HG_enc_setshared, + HG_enc_shareddict, + + HG_enc_show, + HG_enc_showpage, + HG_enc_stop, + HG_enc_stopped, + HG_enc_store, + HG_enc_string, + HG_enc_stringwidth, + HG_enc_stroke, + HG_enc_strokepath, + HG_enc_sub, + + HG_enc_systemdict, + HG_enc_token, + HG_enc_transform, + HG_enc_translate, + HG_enc_truncate, + HG_enc_type, + HG_enc_uappend, + HG_enc_ucache, + HG_enc_ueofill, + HG_enc_ufill, + + HG_enc_undef, + HG_enc_upath, + HG_enc_userdict, + HG_enc_ustroke, + HG_enc_viewclip, + HG_enc_viewclippath, + HG_enc_where, + HG_enc_widthshow, + HG_enc_write, + HG_enc_writehexstring, + + HG_enc_writeobject, + HG_enc_writestring, + HG_enc_wtranslation, + HG_enc_xor, + HG_enc_xshow, + HG_enc_xyshow, + HG_enc_yshow, + HG_enc_FontDirectory, + HG_enc_SharedFontDirectory, + HG_enc_Courier, + + HG_enc_Courier_Bold, + HG_enc_Courier_BoldOblique, + HG_enc_Courier_Oblique, + HG_enc_Helvetica, + HG_enc_Helvetica_Bold, + HG_enc_Helvetica_BoldOblique, + HG_enc_Helvetica_Oblique, + HG_enc_Symbol, + HG_enc_Times_Bold, + HG_enc_Times_BoldItalic, + + HG_enc_Times_Italic, + HG_enc_Times_Roman, + HG_enc_execuserobject, + HG_enc_currentcolor, + HG_enc_currentcolorspace, + HG_enc_currentglobal, + HG_enc_execform, + HG_enc_filter, + HG_enc_findresource, + HG_enc_globaldict, + + HG_enc_makepattern, + HG_enc_setcolor, + HG_enc_setcolorspace, + HG_enc_setglobal, + HG_enc_setpagedevice, + HG_enc_setpattern, + + HG_enc_sym_eq = 256, + HG_enc_sym_eqeq, + HG_enc_ISOLatin1Encoding, + HG_enc_StandardEncoding, + + HG_enc_sym_left_square_bracket, + HG_enc_sym_right_square_bracket, + HG_enc_atan, + HG_enc_banddevice, + HG_enc_bytesavailable, + HG_enc_cachestatus, + HG_enc_closefile, + HG_enc_colorimage, + HG_enc_condition, + HG_enc_copypage, + + HG_enc_cos, + HG_enc_countdictstack, + HG_enc_countexecstack, + HG_enc_cshow, + HG_enc_currentblackgeneration, + HG_enc_currentcacheparams, + HG_enc_currentcolorscreen, + HG_enc_currentcolortransfer, + HG_enc_currentcontext, + HG_enc_currentflat, + + HG_enc_currenthalftone, + HG_enc_currenthalftonephase, + HG_enc_currentmiterlimit, + HG_enc_currentobjectformat, + HG_enc_currentpacking, + HG_enc_currentscreen, + HG_enc_currentstrokeadjust, + HG_enc_currenttransfer, + HG_enc_currentundercolorremoval, + HG_enc_defaultmatrix, + + HG_enc_definefont, + HG_enc_deletefile, + HG_enc_detach, + HG_enc_deviceinfo, + HG_enc_dictstack, + HG_enc_echo, + HG_enc_erasepage, + HG_enc_errordict, + HG_enc_execstack, + HG_enc_executeonly, + + HG_enc_exp, + HG_enc_false, + HG_enc_filenameforall, + HG_enc_fileposition, + HG_enc_fork, + HG_enc_framedevice, + HG_enc_grestoreall, + HG_enc_handleerror, + HG_enc_initclip, + HG_enc_initgraphics, + + HG_enc_initmatrix, + HG_enc_instroke, + HG_enc_inustroke, + HG_enc_join, + HG_enc_kshow, + HG_enc_ln, + HG_enc_lock, + HG_enc_log, + HG_enc_mark, + HG_enc_monitor, + + HG_enc_noaccess, + HG_enc_notify, + HG_enc_nulldevice, + HG_enc_packedarray, + HG_enc_quit, + HG_enc_rand, + HG_enc_rcheck, + HG_enc_readonly, + HG_enc_realtime, + HG_enc_renamefile, + + HG_enc_renderbands, + HG_enc_resetfile, + HG_enc_reversepath, + HG_enc_rootfont, + HG_enc_rrand, + HG_enc_run, + HG_enc_scheck, + HG_enc_setblackgeneration, + HG_enc_setcachelimit, + HG_enc_setcacheparams, + + HG_enc_setcolorscreen, + HG_enc_setcolortransfer, + HG_enc_setfileposition, + HG_enc_setflat, + HG_enc_sethalftone, + HG_enc_sethalftonephase, + HG_enc_setmiterlimit, + HG_enc_setobjectformat, + HG_enc_setpacking, + HG_enc_setscreen, + + HG_enc_setstrokeadjust, + HG_enc_settransfer, + HG_enc_setucacheparams, + HG_enc_setundercolorremoval, + HG_enc_sin, + HG_enc_sqrt, + HG_enc_srand, + HG_enc_stack, + HG_enc_status, + HG_enc_statusdict, + + HG_enc_true, + HG_enc_ucachestatus, + HG_enc_undefinefont, + HG_enc_usertime, + HG_enc_ustrokepath, + HG_enc_version, + HG_enc_vmreclaim, + HG_enc_vmstatus, + HG_enc_wait, + HG_enc_wcheck, + + HG_enc_xcheck, + HG_enc_yield, + HG_enc_defineuserobject, + HG_enc_undefineuserobject, + HG_enc_UserObjects, + HG_enc_cleardictstack, + HG_enc_A, + HG_enc_B, + HG_enc_C, + HG_enc_D, + + HG_enc_E, + HG_enc_F, + HG_enc_G, + HG_enc_H, + HG_enc_I, + HG_enc_J, + HG_enc_K, + HG_enc_L, + HG_enc_M, + HG_enc_N, + + HG_enc_O, + HG_enc_P, + HG_enc_Q, + HG_enc_R, + HG_enc_S, + HG_enc_T, + HG_enc_U, + HG_enc_V, + HG_enc_W, + HG_enc_X, + + HG_enc_Y, + HG_enc_Z, + HG_enc_a, + HG_enc_b, + HG_enc_c, + HG_enc_d, + HG_enc_e, + HG_enc_f, + HG_enc_g, + HG_enc_h, + + HG_enc_i, + HG_enc_j, + HG_enc_k, + HG_enc_l, + HG_enc_m, + HG_enc_n, + HG_enc_o, + HG_enc_p, + HG_enc_q, + HG_enc_r, + + HG_enc_s, + HG_enc_t, + HG_enc_u, + HG_enc_v, + HG_enc_w, + HG_enc_x, + HG_enc_y, + HG_enc_z, + HG_enc_setvmthreshold, + HG_enc_sym_begin_dict_mark, + + HG_enc_sym_end_dict_mark, + HG_enc_currentcolorrendering, + HG_enc_currentdevparams, + HG_enc_currentoverprint, + HG_enc_currentpagedevice, + HG_enc_currentsystemparams, + HG_enc_currentuserparams, + HG_enc_defineresource, + HG_enc_findencoding, + HG_enc_gcheck, + + HG_enc_glyphshow, + HG_enc_languagelevel, + HG_enc_product, + HG_enc_pstack, + HG_enc_resourceforall, + HG_enc_resourcestatus, + HG_enc_revision, + HG_enc_serialnumber, + HG_enc_setcolorrendering, + HG_enc_setdevparams, + + HG_enc_setoverprint, + HG_enc_setsystemparams, + HG_enc_setuserparams, + HG_enc_startjob, + HG_enc_undefineresource, + HG_enc_GlobalFontDirectory, + HG_enc_ASCII85Decode, + HG_enc_ASCII85Encode, + HG_enc_ASCIIHexDecode, + HG_enc_ASCIIHexEncode, + + HG_enc_CCITTFaxDecode, + HG_enc_CCITTFaxEncode, + HG_enc_DCTDecode, + HG_enc_DCTEncode, + HG_enc_LZWDecode, + HG_enc_LZWEncode, + HG_enc_NullEncode, + HG_enc_RunLengthDecode, + HG_enc_RunLengthEncode, + HG_enc_SubFileDecode, + + HG_enc_CIEBasedA, + HG_enc_CIEBasedABC, + HG_enc_DeviceCMYK, + HG_enc_DeviceGray, + HG_enc_DeviceRGB, + HG_enc_Indexed, + HG_enc_Pattern, + HG_enc_Separation, + HG_enc_CIEBasedDEF, + HG_enc_CIEBasedDEFG, + + HG_enc_DeviceN, + + HG_enc_POSTSCRIPT_RESERVED_END, + + HG_enc_END +}; +enum hg_emulation_type_e { + HG_EMU_BEGIN, + HG_EMU_PS_LEVEL_1, + HG_EMU_PS_LEVEL_2, + HG_EMU_PS_LEVEL_3, + HG_EMU_END +}; + +struct hg_vm_s { }; G_END_DECLS -#endif /* __HG_TYPES_H__ */ +#endif /* __HIEROGLYPH__HGTYPES_H__ */ diff --git a/hieroglyph/hgvaluenode.c b/hieroglyph/hgvaluenode.c deleted file mode 100644 index dc49a82..0000000 --- a/hieroglyph/hgvaluenode.c +++ /dev/null @@ -1,855 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* - * hgvaluenode.c - * Copyright (C) 2006 Akira TAGOH - * - * Authors: - * Akira TAGOH <at@gclab.org> - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - */ -#ifdef HAVE_CONFIG_H -#include <config.h> -#endif - -#include <math.h> -#include <string.h> -#include "hgvaluenode.h" -#include "hgallocator-bfit.h" -#include "hgarray.h" -#include "hgbtree.h" -#include "hgdict.h" -#include "hgfile.h" -#include "hglog.h" -#include "hgmem.h" -#include "hgstring.h" - -#define BTREE_N_NODE 3 - -static void _hg_value_node_real_set_flags(gpointer data, - guint flags); -static void _hg_value_node_real_relocate (gpointer data, - HgMemRelocateInfo *info); -static gpointer _hg_value_node_real_dup (gpointer data); -static gpointer _hg_value_node_real_copy (gpointer data); -static gpointer _hg_value_node_real_to_string(gpointer data); - - -static HgObjectVTable __hg_value_node_vtable = { - .free = NULL, - .set_flags = _hg_value_node_real_set_flags, - .relocate = _hg_value_node_real_relocate, - .dup = _hg_value_node_real_dup, - .copy = _hg_value_node_real_copy, - .to_string = _hg_value_node_real_to_string, -}; -static HgBTree *__hg_value_node_type_tree = NULL; -static HgAllocator *__hg_value_node_allocator = NULL; -static HgMemPool *__hg_value_node_mem_pool = NULL; -static gboolean __hg_value_node_is_initialized = FALSE; - - -/* - * Private Functions - */ -static gboolean -_hg_value_node_register_type(const HgValueNodeTypeInfo *info) -{ - g_return_val_if_fail (__hg_value_node_is_initialized, FALSE); - - if (hg_btree_find(__hg_value_node_type_tree, GUINT_TO_POINTER (info->type_id))) { - hg_log_warning("type_id %d already registered.", info->type_id); - return FALSE; - } - hg_btree_add(__hg_value_node_type_tree, - GUINT_TO_POINTER (info->type_id), - GSIZE_TO_POINTER (info)); - - return TRUE; -} - -static void -_hg_value_node_real_set_flags(gpointer data, - guint flags) -{ - HgValueNode *node = data; - HgMemObject *obj = NULL; - - switch (HG_VALUE_GET_VALUE_TYPE (node)) { - case HG_TYPE_VALUE_BOOLEAN: - case HG_TYPE_VALUE_INTEGER: - case HG_TYPE_VALUE_REAL: - /* nothing to do */ - break; - case HG_TYPE_VALUE_NAME: - case HG_TYPE_VALUE_ARRAY: - case HG_TYPE_VALUE_STRING: - case HG_TYPE_VALUE_DICT: - case HG_TYPE_VALUE_OPERATOR: - case HG_TYPE_VALUE_FILE: - case HG_TYPE_VALUE_SNAPSHOT: - case HG_TYPE_VALUE_PLUGIN: - if (((HgValueNodePointer *)node)->value) { - hg_mem_get_object__inline(((HgValueNodePointer *)node)->value, obj); - if (obj == NULL) { - hg_log_warning("[BUG] Invalid object %p with node type %d", - ((HgValueNodePointer *)node)->value, - HG_VALUE_GET_VALUE_TYPE (node)); - } - } - break; - case HG_TYPE_VALUE_NULL: - case HG_TYPE_VALUE_MARK: - break; - default: - hg_log_warning("Unknown node type %d to set flags", HG_VALUE_GET_VALUE_TYPE (node)); - break; - } - - if (obj != NULL) { -#ifdef DEBUG_GC - G_STMT_START { - if ((flags & HG_MEMOBJ_MARK_AGE_MASK) != 0) { - if (!hg_mem_is_flags__inline(obj, flags)) { - hg_value_node_debug_print(__hg_file_stderr, HG_DEBUG_GC_MARK, 0, NULL, node, NULL); - } else { - hg_value_node_debug_print(__hg_file_stderr, HG_DEBUG_GC_ALREADYMARK, 0, NULL, node, NULL); - } - } - } G_STMT_END; -#endif /* DEBUG_GC */ - if (!hg_mem_is_flags__inline(obj, flags)) - hg_mem_add_flags__inline(obj, flags, TRUE); - } -} - -static void -_hg_value_node_real_relocate(gpointer data, - HgMemRelocateInfo *info) -{ - HgValueNode *node = data; - - switch (HG_VALUE_GET_VALUE_TYPE (node)) { - case HG_TYPE_VALUE_BOOLEAN: - case HG_TYPE_VALUE_INTEGER: - case HG_TYPE_VALUE_REAL: - /* nothing to do */ - break; - case HG_TYPE_VALUE_NAME: - case HG_TYPE_VALUE_ARRAY: - case HG_TYPE_VALUE_STRING: - case HG_TYPE_VALUE_DICT: - case HG_TYPE_VALUE_FILE: - case HG_TYPE_VALUE_SNAPSHOT: - case HG_TYPE_VALUE_PLUGIN: - if ((gsize)((HgValueNodePointer *)node)->value >= info->start && - (gsize)((HgValueNodePointer *)node)->value <= info->end) { - ((HgValueNodePointer *)node)->value = (gpointer)((gsize)((HgValueNodePointer *)node)->value + info->diff); - } - break; - case HG_TYPE_VALUE_OPERATOR: - case HG_TYPE_VALUE_NULL: - case HG_TYPE_VALUE_MARK: - break; - default: - hg_log_warning("Unknown node type %d to be relocated", HG_VALUE_GET_VALUE_TYPE (node)); - break; - } -} - -static gpointer -_hg_value_node_real_dup(gpointer data) -{ - HgValueNode *node = data, *retval; - HgMemObject *obj; - - hg_mem_get_object__inline(node, obj); - if (obj == NULL) - return NULL; - - if (HG_VALUE_GET_VALUE_TYPE (node) == HG_TYPE_VALUE_NULL || - HG_VALUE_GET_VALUE_TYPE (node) == HG_TYPE_VALUE_MARK) { - return node; - } - retval = hg_value_node_new(obj->pool, HG_VALUE_GET_VALUE_TYPE (node)); - if (retval == NULL) { - hg_log_warning("Failed to duplicate a node."); - return NULL; - } - HG_OBJECT_SET_STATE (&retval->object, HG_OBJECT_GET_STATE (&node->object)); - switch (HG_VALUE_GET_VALUE_TYPE (node)) { - case HG_TYPE_VALUE_BOOLEAN: - HG_VALUE_SET_BOOLEAN (retval, HG_VALUE_GET_BOOLEAN (node)); - break; - case HG_TYPE_VALUE_INTEGER: - HG_VALUE_SET_INTEGER (retval, HG_VALUE_GET_INTEGER (node)); - break; - case HG_TYPE_VALUE_REAL: - HG_VALUE_SET_REAL (retval, HG_VALUE_GET_REAL (node)); - break; - case HG_TYPE_VALUE_NAME: - HG_VALUE_SET_NAME (retval, HG_VALUE_GET_NAME (node)); - break; - case HG_TYPE_VALUE_ARRAY: - HG_VALUE_SET_ARRAY (retval, HG_VALUE_GET_ARRAY (node)); - break; - case HG_TYPE_VALUE_STRING: - HG_VALUE_SET_STRING (retval, HG_VALUE_GET_STRING (node)); - break; - case HG_TYPE_VALUE_DICT: - HG_VALUE_SET_DICT (retval, HG_VALUE_GET_DICT (node)); - break; - case HG_TYPE_VALUE_FILE: - HG_VALUE_SET_FILE (retval, HG_VALUE_GET_FILE (node)); - break; - case HG_TYPE_VALUE_OPERATOR: - HG_VALUE_SET_OPERATOR (retval, HG_VALUE_GET_OPERATOR (node)); - break; - case HG_TYPE_VALUE_SNAPSHOT: - HG_VALUE_SET_SNAPSHOT (retval, HG_VALUE_GET_SNAPSHOT (node)); - break; - case HG_TYPE_VALUE_PLUGIN: - HG_VALUE_SET_PLUGIN (retval, HG_VALUE_GET_PLUGIN (node)); - break; - default: - hg_log_warning("Unknown node type %d to be duplicated", HG_VALUE_GET_VALUE_TYPE (node)); - hg_mem_free(retval); - return NULL; - } - - return retval; -} - -static gpointer -_hg_value_node_real_copy(gpointer data) -{ - HgValueNode *node = data, *retval; - HgMemObject *obj; - gpointer p; - -#define _copy_object(_node, _type, _obj) \ - G_STMT_START { \ - p = hg_object_copy((HgObject *)(_obj)); \ - if (p == NULL) \ - return NULL; \ - HG_VALUE_SET_ ## _type (_node, p); \ - } G_STMT_END - - hg_mem_get_object__inline(node, obj); - if (obj == NULL) - return NULL; - - if (HG_VALUE_GET_VALUE_TYPE (node) == HG_TYPE_VALUE_NULL || - HG_VALUE_GET_VALUE_TYPE (node) == HG_TYPE_VALUE_MARK) { - return node; - } - retval = hg_value_node_new(obj->pool, HG_VALUE_GET_VALUE_TYPE (node)); - if (retval == NULL) { - hg_log_warning("Failed to duplicate a node."); - return NULL; - } - HG_OBJECT_SET_STATE (&retval->object, HG_OBJECT_GET_STATE (&node->object)); - switch (HG_VALUE_GET_VALUE_TYPE (node)) { - case HG_TYPE_VALUE_BOOLEAN: - HG_VALUE_SET_BOOLEAN (retval, HG_VALUE_GET_BOOLEAN (node)); - break; - case HG_TYPE_VALUE_INTEGER: - HG_VALUE_SET_INTEGER (retval, HG_VALUE_GET_INTEGER (node)); - break; - case HG_TYPE_VALUE_REAL: - HG_VALUE_SET_REAL (retval, HG_VALUE_GET_REAL (node)); - break; - case HG_TYPE_VALUE_NAME: - _copy_object (retval, NAME, HG_VALUE_GET_NAME (node)); - break; - case HG_TYPE_VALUE_ARRAY: - _copy_object (retval, ARRAY, HG_VALUE_GET_ARRAY (node)); - break; - case HG_TYPE_VALUE_STRING: - _copy_object (retval, STRING, HG_VALUE_GET_STRING (node)); - break; - case HG_TYPE_VALUE_DICT: - _copy_object (retval, DICT, HG_VALUE_GET_DICT (node)); - break; - case HG_TYPE_VALUE_FILE: - _copy_object (retval, FILE, HG_VALUE_GET_FILE (node)); - break; - case HG_TYPE_VALUE_OPERATOR: - _copy_object (retval, OPERATOR, HG_VALUE_GET_OPERATOR (node)); - break; - case HG_TYPE_VALUE_SNAPSHOT: - _copy_object (retval, SNAPSHOT, HG_VALUE_GET_SNAPSHOT (node)); - break; - case HG_TYPE_VALUE_PLUGIN: - _copy_object (retval, PLUGIN, HG_VALUE_GET_PLUGIN (node)); - break; - default: - hg_log_warning("Unknown node type %d to be duplicated", HG_VALUE_GET_VALUE_TYPE (node)); - hg_mem_free(retval); - return NULL; - } - -#undef _copy_object - - return retval; -} - -static gpointer -_hg_value_node_real_to_string(gpointer data) -{ - HgValueNode *node = data; - HgMemObject *obj; - HgString *retval, *str = NULL; - HgArray *array; - gchar *tmp, start, end; - const gchar *name; - size_t len; - - hg_mem_get_object__inline(data, obj); - if (obj == NULL) - return NULL; - retval = hg_string_new(obj->pool, -1); - if (retval == NULL) - return NULL; - switch (HG_VALUE_GET_VALUE_TYPE (node)) { - case HG_TYPE_VALUE_BOOLEAN: - if (HG_VALUE_GET_BOOLEAN (node) == TRUE) - hg_string_append(retval, "true", -1); - else - hg_string_append(retval, "false", -1); - break; - case HG_TYPE_VALUE_INTEGER: - tmp = g_strdup_printf("%d", HG_VALUE_GET_INTEGER (node)); - hg_string_append(retval, tmp, -1); - g_free(tmp); - break; - case HG_TYPE_VALUE_REAL: - tmp = g_strdup_printf("%f", HG_VALUE_GET_REAL (node)); - if (tmp != NULL) { - len = strlen(tmp); - while (len > 1 && tmp[len - 1] == '0') - len--; - if (tmp[len - 1] == '.') - len++; - hg_string_append(retval, tmp, len); - g_free(tmp); - } - break; - case HG_TYPE_VALUE_NAME: - if (!hg_object_is_executable((HgObject *)node)) - hg_string_append_c(retval, '/'); - hg_string_append(retval, HG_VALUE_GET_NAME (node), -1); - break; - case HG_TYPE_VALUE_ARRAY: - if (hg_object_is_executable((HgObject *)node)) { - start = '{'; - end = '}'; - } else { - start = '['; - end = ']'; - } - if (hg_object_is_readable((HgObject *)node)) { - str = hg_object_to_string((HgObject *)HG_VALUE_GET_ARRAY (node)); - if (str == NULL) { - hg_mem_free(retval); - return NULL; - } - hg_string_append_c(retval, start); - hg_string_concat(retval, str); - hg_string_append_c(retval, end); - } else { - array = HG_VALUE_GET_ARRAY (node); - if ((name = hg_array_get_name(array)) != NULL) { - hg_string_append(retval, "--", 2); - hg_string_append(retval, name, -1); - hg_string_append(retval, "--", 2); - } else { - hg_string_append(retval, "-array-", -1); - } - } - break; - case HG_TYPE_VALUE_STRING: - if (hg_object_is_readable((HgObject *)node)) { - str = hg_object_to_string((HgObject *)HG_VALUE_GET_STRING (node)); - if (str == NULL) { - hg_mem_free(retval); - return NULL; - } - hg_string_append_c(retval, '('); - hg_string_concat(retval, str); - hg_string_append_c(retval, ')'); - } else { - hg_string_append(retval, "-string-", -1); - } - break; - case HG_TYPE_VALUE_DICT: - case HG_TYPE_VALUE_FILE: - case HG_TYPE_VALUE_OPERATOR: - case HG_TYPE_VALUE_SNAPSHOT: - case HG_TYPE_VALUE_PLUGIN: - str = hg_object_to_string((HgObject *)((HgValueNodePointer *)node)->value); - if (str == NULL) { - hg_mem_free(retval); - return NULL; - } - hg_string_concat(retval, str); - break; - case HG_TYPE_VALUE_NULL: - hg_string_append(retval, "null", -1); - break; - case HG_TYPE_VALUE_MARK: - hg_string_append(retval, "-mark-", -1); - break; - default: - hg_log_warning("Unknown node type %d to be converted to string.", - HG_VALUE_GET_VALUE_TYPE (node)); - break; - } - if (str) - hg_mem_free(str); - hg_string_fix_string_size(retval); - - return retval; -} - -/* - * Public Functions - */ -void -hg_value_node_init(void) -{ - hg_mem_init(); -#ifdef DEBUG - hg_file_init(); -#endif /* DEBUG */ - - if (!__hg_value_node_is_initialized) { - __hg_value_node_allocator = hg_allocator_new(hg_allocator_bfit_get_vtable()); - __hg_value_node_mem_pool = hg_mem_pool_new(__hg_value_node_allocator, - "Memory pool for HgValueNode", - 1024, HG_MEM_GLOBAL); // | HG_MEM_RESIZABLE); - - __hg_value_node_type_tree = hg_btree_new(__hg_value_node_mem_pool, - BTREE_N_NODE); - hg_mem_pool_add_root_node(__hg_value_node_mem_pool, __hg_value_node_type_tree); - hg_btree_allow_marking(__hg_value_node_type_tree, FALSE); - - __hg_value_node_is_initialized = TRUE; - - /* register the reserved type IDs */ -#define _register_type(_t, _s) \ - G_STMT_START { \ - static HgValueNodeTypeInfo type_info = { \ - .name = # _t, \ - .type_id = HG_TYPE_VALUE_ ## _t, \ - .struct_size = sizeof (HgValueNode ## _s), \ - }; \ - \ - _hg_value_node_register_type(&type_info); \ - } G_STMT_END - - _register_type(BOOLEAN, Boolean); - _register_type(INTEGER, Integer); - _register_type(REAL, Real); - _register_type(NAME, Name); - _register_type(ARRAY, Array); - _register_type(STRING, String); - _register_type(DICT, Dict); - _register_type(NULL, Null); - _register_type(OPERATOR, Operator); - _register_type(MARK, Mark); - _register_type(FILE, File); - _register_type(SNAPSHOT, Snapshot); - _register_type(PLUGIN, Plugin); - } -} - -void -hg_value_node_finalize(void) -{ - if (__hg_value_node_is_initialized) { - hg_mem_pool_destroy(__hg_value_node_mem_pool); - hg_allocator_destroy(__hg_value_node_allocator); -#ifdef DEBUG - hg_file_finalize(); -#endif /* DEBUG */ - - __hg_value_node_is_initialized = FALSE; - } -} - -gboolean -hg_value_node_register_type(const HgValueNodeTypeInfo *info) -{ - g_return_val_if_fail (info != NULL, FALSE); - g_return_val_if_fail (info->type_id > HG_TYPE_VALUE_END, FALSE); - - return _hg_value_node_register_type(info); -} - -const gchar * -hg_value_node_get_type_name(guint type_id) -{ - HgValueNodeTypeInfo *info; - - g_return_val_if_fail (__hg_value_node_is_initialized, NULL); - - if ((info = hg_btree_find(__hg_value_node_type_tree, - GUINT_TO_POINTER (type_id))) == NULL) { - hg_log_warning("Unknown type ID %d. Failed to get a type name.", - type_id); - return NULL; - } - - return info->name; -} - -HgValueNode * -hg_value_node_new(HgMemPool *pool, - guint type_id) -{ - HgValueNode *retval; - HgValueNodeTypeInfo *info; - - g_return_val_if_fail (pool != NULL, NULL); - g_return_val_if_fail (__hg_value_node_is_initialized, NULL); - - if ((info = hg_btree_find(__hg_value_node_type_tree, - GUINT_TO_POINTER (type_id))) == NULL) { - hg_log_warning("Unknown type ID %d. Failed to create a HgValueNode.", type_id); - return NULL; - } - retval = hg_mem_alloc_with_flags(pool, info->struct_size, - HG_FL_HGOBJECT | HG_FL_RESTORABLE); - if (retval == NULL) { - hg_log_warning("Failed to create a node."); - return NULL; - } - HG_OBJECT_INIT_STATE (&retval->object); - HG_OBJECT_SET_STATE (&retval->object, hg_mem_pool_get_default_access_mode(pool)); - hg_object_set_vtable(&retval->object, &__hg_value_node_vtable); - - return retval; -} - -gsize -hg_value_node_get_hash(const HgValueNode *node) -{ - gsize retval = 0; - -#define _get_hash(_node, _type) \ - (gsize)HG_VALUE_GET_ ## _type (_node); - - switch (HG_VALUE_GET_VALUE_TYPE (node)) { - case HG_TYPE_VALUE_BOOLEAN: - retval = HG_VALUE_GET_BOOLEAN (node); - break; - case HG_TYPE_VALUE_INTEGER: - retval = HG_VALUE_GET_INTEGER (node); - break; - case HG_TYPE_VALUE_REAL: - retval = HG_VALUE_GET_REAL (node); - break; - case HG_TYPE_VALUE_NAME: - G_STMT_START { - gchar *name = HG_VALUE_GET_NAME (node), *p; - - for (p = name; *p != 0; p++) { - retval = (retval << 5) - retval + *p; - } - } G_STMT_END; - break; - case HG_TYPE_VALUE_STRING: - G_STMT_START { - HgString *string = HG_VALUE_GET_STRING (node); - guint len = hg_string_length(string), i; - gchar c; - - for (i = 0; i < len; i++) { - c = hg_string_index(string, i); - retval = (retval << 5) - retval + c; - } - } G_STMT_END; - break; - case HG_TYPE_VALUE_ARRAY: - retval = _get_hash(node, ARRAY); - break; - case HG_TYPE_VALUE_DICT: - retval = _get_hash(node, DICT); - break; - case HG_TYPE_VALUE_NULL: - retval = _get_hash(node, NULL); - break; - case HG_TYPE_VALUE_OPERATOR: - retval = _get_hash(node, OPERATOR); - break; - case HG_TYPE_VALUE_MARK: - retval = _get_hash(node, MARK); - break; - case HG_TYPE_VALUE_FILE: - retval = _get_hash(node, FILE); - break; - case HG_TYPE_VALUE_SNAPSHOT: - retval = _get_hash(node, SNAPSHOT); - break; - case HG_TYPE_VALUE_PLUGIN: - retval = _get_hash(node, PLUGIN); - break; - default: - hg_log_warning("[BUG] Unknown node type %d to generate hash", - HG_VALUE_GET_VALUE_TYPE (node)); - break; - } - -#undef _get_hash - - return retval; -} - -gboolean -hg_value_node_compare(const HgValueNode *a, - const HgValueNode *b) -{ - gboolean retval = FALSE; - - g_return_val_if_fail (a != NULL, FALSE); - g_return_val_if_fail (b != NULL, FALSE); - -#define _compare(_a, _b, _type) \ - (HG_VALUE_GET_ ## _type (_a) == HG_VALUE_GET_ ## _type (_b)) - - if (HG_VALUE_GET_VALUE_TYPE (a) != HG_VALUE_GET_VALUE_TYPE (b)) - return FALSE; - switch (HG_VALUE_GET_VALUE_TYPE (a)) { - case HG_TYPE_VALUE_BOOLEAN: - retval = (HG_VALUE_GET_BOOLEAN (a) == HG_VALUE_GET_BOOLEAN (b)); - break; - case HG_TYPE_VALUE_INTEGER: - retval = (HG_VALUE_GET_INTEGER (a) == HG_VALUE_GET_INTEGER (b)); - break; - case HG_TYPE_VALUE_REAL: - retval = HG_VALUE_REAL_SIMILAR (HG_VALUE_GET_REAL (a), HG_VALUE_GET_REAL (b)); - break; - case HG_TYPE_VALUE_NAME: - retval = (strcmp(HG_VALUE_GET_NAME (a), HG_VALUE_GET_NAME (b)) == 0); - break; - case HG_TYPE_VALUE_STRING: - retval = hg_string_compare(HG_VALUE_GET_STRING (a), HG_VALUE_GET_STRING (b)); - break; - case HG_TYPE_VALUE_ARRAY: - retval = _compare (a, b, ARRAY); - break; - case HG_TYPE_VALUE_DICT: - retval = _compare (a, b, DICT); - break; - case HG_TYPE_VALUE_FILE: - retval = _compare (a, b, FILE); - break; - case HG_TYPE_VALUE_OPERATOR: - retval = _compare (a, b, OPERATOR); - break; - case HG_TYPE_VALUE_SNAPSHOT: - retval = _compare (a, b, SNAPSHOT); - break; - case HG_TYPE_VALUE_PLUGIN: - retval = _compare (a, b, PLUGIN); - break; - case HG_TYPE_VALUE_NULL: - case HG_TYPE_VALUE_MARK: - retval = TRUE; - break; - default: - hg_log_warning("[BUG] Unknown node type is given to compare: %d", - HG_VALUE_GET_VALUE_TYPE (a)); - break; - } - -#undef _compare - - return retval; -} - -gboolean -hg_value_node_compare_content(const HgValueNode *a, - const HgValueNode *b, - guint attributes_mask) -{ - gboolean retval = FALSE; - - g_return_val_if_fail (a != NULL, FALSE); - g_return_val_if_fail (b != NULL, FALSE); - -#define _compare(_a, _b, _type) \ - (HG_VALUE_GET_ ## _type (_a) == HG_VALUE_GET_ ## _type (_b)) - - if (HG_VALUE_GET_VALUE_TYPE (a) != HG_VALUE_GET_VALUE_TYPE (b)) - return FALSE; - switch (HG_VALUE_GET_VALUE_TYPE (a)) { - case HG_TYPE_VALUE_BOOLEAN: - retval = (HG_VALUE_GET_BOOLEAN (a) == HG_VALUE_GET_BOOLEAN (b)); - break; - case HG_TYPE_VALUE_INTEGER: - retval = (HG_VALUE_GET_INTEGER (a) == HG_VALUE_GET_INTEGER (b)); - break; - case HG_TYPE_VALUE_REAL: - retval = HG_VALUE_REAL_SIMILAR (HG_VALUE_GET_REAL (a), HG_VALUE_GET_REAL (b)); - break; - case HG_TYPE_VALUE_NAME: - retval = (strcmp(HG_VALUE_GET_NAME (a), HG_VALUE_GET_NAME (b)) == 0); - break; - case HG_TYPE_VALUE_STRING: - retval = hg_string_compare(HG_VALUE_GET_STRING (a), HG_VALUE_GET_STRING (b)); - break; - case HG_TYPE_VALUE_ARRAY: - retval = hg_array_compare(HG_VALUE_GET_ARRAY (a), - HG_VALUE_GET_ARRAY (b), - attributes_mask); - break; - case HG_TYPE_VALUE_DICT: - retval = hg_dict_compare(HG_VALUE_GET_DICT (a), - HG_VALUE_GET_DICT (b), - attributes_mask); - break; - case HG_TYPE_VALUE_FILE: - retval = _compare (a, b, FILE); - break; - case HG_TYPE_VALUE_OPERATOR: - retval = _compare (a, b, OPERATOR); - break; - case HG_TYPE_VALUE_SNAPSHOT: - retval = _compare (a, b, SNAPSHOT); - break; - case HG_TYPE_VALUE_PLUGIN: - retval = _compare (a, b, PLUGIN); - break; - case HG_TYPE_VALUE_NULL: - case HG_TYPE_VALUE_MARK: - retval = TRUE; - break; - default: - hg_log_warning("[BUG] Unknown node type is given to compare: %d", - HG_VALUE_GET_VALUE_TYPE (a)); - break; - } - -#undef _compare - -#define _state_comp(_a_, _b_, _mask_) \ - ((hg_object_get_state((HgObject *)(_a_)) & (_mask_)) == \ - (hg_object_get_state((HgObject *)(_b_)) & (_mask_))) - - retval &= _state_comp(a, b, attributes_mask); - -#undef _state_comp - - return retval; -} - -void -hg_value_node_debug_print(HgFileObject *file, - HgDebugStateType type, - HgValueType vtype, - gpointer parent, - gpointer self, - gpointer extrainfo) -{ - const gchar *value[] = { - "node", - "boolean", - "integer", - "real", - "name", - "array", - "string", - "dict", - "null", - "pointer", - "mark", - "file", - "save", - }; - const gchar *dict_info[] = {"DictNode", "Key", "Val"}; - gchar *info = NULL; - HgMemObject *obj; - - hg_mem_get_object__inline(self, obj); - switch (vtype) { - case 0: - if (HG_VALUE_GET_VALUE_TYPE ((HgValueNode *)self) == HG_TYPE_VALUE_NAME) { - info = g_strdup_printf("[type: %s %p (%s)]", - value[HG_VALUE_GET_VALUE_TYPE ((HgValueNode *)self)], - HG_VALUE_GET_NAME (self), - (gchar *)HG_VALUE_GET_NAME (self)); - } else { - info = g_strdup_printf("[type: %s %p]", - value[HG_VALUE_GET_VALUE_TYPE ((HgValueNode *)self)], - ((HgValueNodePointer *)self)->value); - } - break; - case HG_TYPE_VALUE_BOOLEAN: - info = g_strdup_printf("%s", (HG_VALUE_GET_BOOLEAN (self) ? "true" : "false")); - break; - case HG_TYPE_VALUE_INTEGER: - info = g_strdup_printf("%d", HG_VALUE_GET_INTEGER (self)); - break; - case HG_TYPE_VALUE_REAL: - info = g_strdup_printf("%f", HG_VALUE_GET_REAL (self)); - break; - case HG_TYPE_VALUE_NAME: - info = g_strdup((gchar *)HG_VALUE_GET_NAME (self)); - break; - case HG_TYPE_VALUE_ARRAY: - if (GPOINTER_TO_UINT (extrainfo) == G_MAXUINT) - info = g_strdup("[base]"); - else - info = g_strdup_printf("[%d]", GPOINTER_TO_UINT (extrainfo)); - break; - case HG_TYPE_VALUE_STRING: - break; - case HG_TYPE_VALUE_DICT: - info = g_strdup_printf("[%s]", dict_info[GPOINTER_TO_UINT (extrainfo)]); - break; - case HG_TYPE_VALUE_NULL: - break; - case HG_TYPE_VALUE_OPERATOR: - info = g_strdup_printf("[%s]", (gchar *)extrainfo); - break; - case HG_TYPE_VALUE_MARK: - case HG_TYPE_VALUE_FILE: - case HG_TYPE_VALUE_SNAPSHOT: - case HG_TYPE_VALUE_PLUGIN: - default: - break; - } - switch (type) { - case HG_DEBUG_GC_MARK: - hg_file_object_printf(file, "MARK: age: %d [type: %s] parent: %p -- %p %s\n", HG_MEMOBJ_GET_MARK_AGE (obj), value[vtype], parent, self, (info ? info : "")); - break; - case HG_DEBUG_GC_ALREADYMARK: - hg_file_object_printf(file, "MARK[already]: age: %d [type: %s] parent: %p -- %p %s\n", HG_MEMOBJ_GET_MARK_AGE (obj), value[vtype], parent, self, (info ? info : "")); - break; - case HG_DEBUG_GC_UNMARK: - hg_file_object_printf(file, "UNMARK: [type: %s] parent: %p -- %p %s\n", value[vtype], parent, self, (info ? info : "")); - break; - case HG_DEBUG_DUMP: - hg_file_object_printf(file, "%8p|%7s|%s\n", self, value[vtype], (info ? info : "")); - break; - default: - break; - } - if (info) - g_free(info); -} diff --git a/hieroglyph/hgvaluenode.h b/hieroglyph/hgvaluenode.h deleted file mode 100644 index fd24e89..0000000 --- a/hieroglyph/hgvaluenode.h +++ /dev/null @@ -1,244 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* - * hgvaluenode.h - * Copyright (C) 2006 Akira TAGOH - * - * Authors: - * Akira TAGOH <at@gclab.org> - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - */ -#ifndef __HG_VALUE_NODE_H__ -#define __HG_VALUE_NODE_H__ - -#include <math.h> -#include <string.h> -#include <hieroglyph/hgtypes.h> - -G_BEGIN_DECLS - -#define HG_VALUE_GET_VALUE_TYPE(_obj) ((HgValueType)HG_OBJECT_GET_USER_DATA (&(_obj)->object)) -#define HG_VALUE_SET_VALUE_TYPE(_obj, _type) (HG_OBJECT_SET_USER_DATA (&(_obj)->object, (_type))) - -#define HG_VALUE_SET_VALUE_NODE(_obj, _type, _klass, _val) \ - G_STMT_START { \ - if ((_obj)) { \ - HG_VALUE_SET_VALUE_TYPE ((_obj), (_type)); \ - ((HgValueNode ## _klass *)(_obj))->value = (_val); \ - } \ - } G_STMT_END -#define HG_VALUE_SET_BOOLEAN(_obj, _val) \ - HG_VALUE_SET_VALUE_NODE (_obj, HG_TYPE_VALUE_BOOLEAN, Boolean, _val); \ - hg_value_node_restorable(_obj) -#define HG_VALUE_SET_INTEGER(_obj, _val) \ - HG_VALUE_SET_VALUE_NODE (_obj, HG_TYPE_VALUE_INTEGER, Integer, _val); \ - hg_value_node_restorable(_obj) -#define HG_VALUE_SET_REAL(_obj, _val) \ - HG_VALUE_SET_VALUE_NODE (_obj, HG_TYPE_VALUE_REAL, Real, _val); \ - hg_value_node_restorable(_obj) -#define HG_VALUE_SET_NAME(_obj, _val) \ - HG_VALUE_SET_VALUE_NODE (_obj, HG_TYPE_VALUE_NAME, Name, _val); \ - hg_value_node_unrestorable(_obj) -#define HG_VALUE_SET_NAME_STATIC(_pool, _obj, _val) \ - G_STMT_START { \ - size_t __hg_value_name_length = strlen(_val); \ - gchar *__hg_value_name_static = hg_mem_alloc(_pool, __hg_value_name_length + 1); \ - memcpy(__hg_value_name_static, (_val), __hg_value_name_length); \ - HG_VALUE_SET_VALUE_NODE (_obj, HG_TYPE_VALUE_NAME, Name, __hg_value_name_static); \ - hg_value_node_unrestorable(_obj); \ - } G_STMT_END -#define HG_VALUE_SET_ARRAY(_obj, _val) \ - HG_VALUE_SET_VALUE_NODE (_obj, HG_TYPE_VALUE_ARRAY, Array, _val); \ - hg_value_node_restorable(_obj); \ - hg_value_node_inherit_complex(_obj, _val) -#define HG_VALUE_SET_STRING(_obj, _val) \ - HG_VALUE_SET_VALUE_NODE (_obj, HG_TYPE_VALUE_STRING, String, _val); \ - hg_value_node_unrestorable(_obj); \ - hg_value_node_inherit_complex(_obj, _val) -#define HG_VALUE_SET_DICT(_obj, _val) \ - HG_VALUE_SET_VALUE_NODE (_obj, HG_TYPE_VALUE_DICT, Dict, _val); \ - hg_value_node_restorable(_obj); \ - hg_value_node_inherit_complex(_obj, _val) -#define HG_VALUE_SET_NULL(_obj, _val) \ - HG_VALUE_SET_VALUE_NODE (_obj, HG_TYPE_VALUE_NULL, Null, _val); \ - hg_value_node_restorable(_obj) -#define HG_VALUE_SET_OPERATOR(_obj, _val) \ - HG_VALUE_SET_VALUE_NODE (_obj, HG_TYPE_VALUE_OPERATOR, Operator, _val); \ - hg_value_node_restorable(_obj); \ - hg_value_node_inherit_complex(_obj, _val) -#define HG_VALUE_SET_MARK(_obj) \ - HG_VALUE_SET_VALUE_NODE (_obj, HG_TYPE_VALUE_MARK, Mark, NULL); \ - hg_value_node_restorable(_obj) -#define HG_VALUE_SET_FILE(_obj, _val) \ - HG_VALUE_SET_VALUE_NODE (_obj, HG_TYPE_VALUE_FILE, File, _val); \ - hg_value_node_unrestorable(_obj); \ - hg_value_node_inherit_complex(_obj, _val) -#define HG_VALUE_SET_SNAPSHOT(_obj, _val) \ - HG_VALUE_SET_VALUE_NODE (_obj, HG_TYPE_VALUE_SNAPSHOT, Snapshot, _val); \ - hg_value_node_unrestorable(_obj); \ - hg_value_node_inherit_complex(_obj, _val) -#define HG_VALUE_SET_PLUGIN(_obj, _val) \ - HG_VALUE_SET_VALUE_NODE (_obj, HG_TYPE_VALUE_PLUGIN, Plugin, _val); \ - hg_value_node_unrestorable(_obj); \ - hg_value_node_inherit_complex(_obj, _val) - -#define HG_VALUE_MAKE_VALUE_NODE(_pool, _obj, _type, _sym, _val) \ - G_STMT_START { \ - (_obj) = hg_value_node_new((_pool), (_type)); \ - HG_VALUE_SET_VALUE_NODE (_obj, _type, _sym, _val); \ - } G_STMT_END -#define HG_VALUE_MAKE_VALUE_NODE_WITH_SAME_POOL(_obj, _type, _sym, _val) \ - G_STMT_START { \ - HgMemObject *__hg_value_node_obj; \ - \ - hg_mem_get_object__inline((_val), __hg_value_node_obj); \ - if (__hg_value_node_obj) { \ - HG_VALUE_MAKE_VALUE_NODE (__hg_value_node_obj->pool, \ - _obj, _type, \ - _sym, _val); \ - } else { \ - (_obj) = NULL; \ - } \ - } G_STMT_END -#define HG_VALUE_MAKE_BOOLEAN(_pool, _obj, _val) \ - HG_VALUE_MAKE_VALUE_NODE (_pool, _obj, HG_TYPE_VALUE_BOOLEAN, Boolean, _val) -#define HG_VALUE_MAKE_INTEGER(_pool, _obj, _val) \ - HG_VALUE_MAKE_VALUE_NODE (_pool, _obj, HG_TYPE_VALUE_INTEGER, Integer, _val) -#define HG_VALUE_MAKE_REAL(_pool, _obj, _val) \ - HG_VALUE_MAKE_VALUE_NODE (_pool, _obj, HG_TYPE_VALUE_REAL, Real, _val) -#define HG_VALUE_MAKE_NAME(_obj, _val) \ - HG_VALUE_MAKE_VALUE_NODE_WITH_SAME_POOL (_obj, HG_TYPE_VALUE_NAME, Name, _val) -#define HG_VALUE_MAKE_NAME_STATIC(_pool, _obj, _val) \ - G_STMT_START { \ - size_t __hg_value_name_length = strlen(_val); \ - gchar *__hg_value_name_static = hg_mem_alloc((_pool), __hg_value_name_length + 1); \ - memcpy(__hg_value_name_static, (_val), __hg_value_name_length); \ - __hg_value_name_static[__hg_value_name_length] = 0; \ - HG_VALUE_MAKE_VALUE_NODE ((_pool), (_obj), HG_TYPE_VALUE_NAME, Name, __hg_value_name_static); \ - } G_STMT_END -#define HG_VALUE_MAKE_ARRAY(_obj, _val) \ - HG_VALUE_MAKE_VALUE_NODE_WITH_SAME_POOL (_obj, HG_TYPE_VALUE_ARRAY, Array, _val); \ - hg_value_node_inherit_complex(_obj, _val) -#define HG_VALUE_MAKE_STRING(_obj, _val) \ - HG_VALUE_MAKE_VALUE_NODE_WITH_SAME_POOL (_obj, HG_TYPE_VALUE_STRING, String, _val); \ - hg_value_node_inherit_complex(_obj, _val) -#define HG_VALUE_MAKE_DICT(_obj, _val) \ - HG_VALUE_MAKE_VALUE_NODE_WITH_SAME_POOL (_obj, HG_TYPE_VALUE_DICT, Dict, _val); \ - hg_value_node_inherit_complex(_obj, _val) -#define HG_VALUE_MAKE_NULL(_pool, _obj, _val) \ - HG_VALUE_MAKE_VALUE_NODE (_pool, _obj, HG_TYPE_VALUE_NULL, Null, _val) -#define HG_VALUE_MAKE_OPERATOR(_obj, _val) \ - HG_VALUE_MAKE_VALUE_NODE_WITH_SAME_POOL (_obj, HG_TYPE_VALUE_OPERATOR, Operator, _val); \ - hg_value_node_inherit_complex(_obj, _val) -#define HG_VALUE_MAKE_MARK(_pool, _obj) \ - HG_VALUE_MAKE_VALUE_NODE (_pool, _obj, HG_TYPE_VALUE_MARK, Mark, NULL) -#define HG_VALUE_MAKE_FILE(_obj, _val) \ - HG_VALUE_MAKE_VALUE_NODE_WITH_SAME_POOL (_obj, HG_TYPE_VALUE_FILE, File, _val); \ - hg_value_node_inherit_complex(_obj, _val) -#define HG_VALUE_MAKE_SNAPSHOT(_obj, _val) \ - HG_VALUE_MAKE_VALUE_NODE_WITH_SAME_POOL (_obj, HG_TYPE_VALUE_SNAPSHOT, Snapshot, _val); \ - hg_value_node_inherit_complex(_obj, _val) -#define HG_VALUE_MAKE_PLUGIN(_obj, _val) \ - HG_VALUE_MAKE_VALUE_NODE_WITH_SAME_POOL (_obj, HG_TYPE_VALUE_PLUGIN, Plugin, _val); \ - hg_value_node_inherit_complex(_obj, _val) - -#define HG_VALUE_GET_VALUE_NODE(_obj, _type) (((HgValueNode ## _type *)(_obj))->value) -#define HG_VALUE_GET_BOOLEAN(_obj) HG_VALUE_GET_VALUE_NODE (_obj, Boolean) -#define HG_VALUE_GET_INTEGER(_obj) HG_VALUE_GET_VALUE_NODE (_obj, Integer) -#define HG_VALUE_GET_INTEGER_FROM_REAL(_obj) (gint32)HG_VALUE_GET_VALUE_NODE (_obj, Real) -#define HG_VALUE_GET_REAL(_obj) HG_VALUE_GET_VALUE_NODE (_obj, Real) -#define HG_VALUE_GET_REAL_FROM_INTEGER(_obj) (gdouble)HG_VALUE_GET_VALUE_NODE (_obj, Integer) -#define HG_VALUE_GET_NAME(_obj) HG_VALUE_GET_VALUE_NODE (_obj, Name) -#define HG_VALUE_GET_ARRAY(_obj) HG_VALUE_GET_VALUE_NODE (_obj, Array) -#define HG_VALUE_GET_STRING(_obj) HG_VALUE_GET_VALUE_NODE (_obj, String) -#define HG_VALUE_GET_DICT(_obj) HG_VALUE_GET_VALUE_NODE (_obj, Dict) -#define HG_VALUE_GET_NULL(_obj) HG_VALUE_GET_VALUE_NODE (_obj, Null) -#define HG_VALUE_GET_OPERATOR(_obj) HG_VALUE_GET_VALUE_NODE (_obj, Operator) -#define HG_VALUE_GET_MARK(_obj) HG_VALUE_GET_VALUE_NODE (_obj, Mark) -#define HG_VALUE_GET_FILE(_obj) HG_VALUE_GET_VALUE_NODE (_obj, File) -#define HG_VALUE_GET_SNAPSHOT(_obj) HG_VALUE_GET_VALUE_NODE (_obj, Snapshot) -#define HG_VALUE_GET_PLUGIN(_obj) HG_VALUE_GET_VALUE_NODE (_obj, Plugin) - -#define HG_VALUE_IS(_obj, _type) (HG_OBJECT_GET_USER_DATA (&(_obj)->object) == (_type)) -#define HG_IS_VALUE_BOOLEAN(_obj) HG_VALUE_IS (_obj, HG_TYPE_VALUE_BOOLEAN) -#define HG_IS_VALUE_INTEGER(_obj) HG_VALUE_IS (_obj, HG_TYPE_VALUE_INTEGER) -#define HG_IS_VALUE_REAL(_obj) HG_VALUE_IS (_obj, HG_TYPE_VALUE_REAL) -#define HG_IS_VALUE_NAME(_obj) HG_VALUE_IS (_obj, HG_TYPE_VALUE_NAME) -#define HG_IS_VALUE_ARRAY(_obj) HG_VALUE_IS (_obj, HG_TYPE_VALUE_ARRAY) -#define HG_IS_VALUE_STRING(_obj) HG_VALUE_IS (_obj, HG_TYPE_VALUE_STRING) -#define HG_IS_VALUE_DICT(_obj) HG_VALUE_IS (_obj, HG_TYPE_VALUE_DICT) -#define HG_IS_VALUE_NULL(_obj) HG_VALUE_IS (_obj, HG_TYPE_VALUE_NULL) -#define HG_IS_VALUE_OPERATOR(_obj) HG_VALUE_IS (_obj, HG_TYPE_VALUE_OPERATOR) -#define HG_IS_VALUE_MARK(_obj) HG_VALUE_IS (_obj, HG_TYPE_VALUE_MARK) -#define HG_IS_VALUE_FILE(_obj) HG_VALUE_IS (_obj, HG_TYPE_VALUE_FILE) -#define HG_IS_VALUE_SNAPSHOT(_obj) HG_VALUE_IS (_obj, HG_TYPE_VALUE_SNAPSHOT) -#define HG_IS_VALUE_PLUGIN(_obj) HG_VALUE_IS (_obj, HG_TYPE_VALUE_PLUGIN) - -/* this is not stricter checking though, we may not need that precision */ -#define HG_VALUE_REAL_SIMILAR(_x, _y) (fabs((_x) - (_y)) <= DBL_EPSILON) - -#define hg_value_node_restorable(_node) \ - G_STMT_START { \ - HgMemObject *__obj__; \ - hg_mem_get_object__inline((_node), __obj__); \ - hg_mem_restorable(__obj__); \ - } G_STMT_END -#define hg_value_node_unrestorable(_node) \ - G_STMT_START { \ - HgMemObject *__obj__; \ - hg_mem_get_object__inline((_node), __obj__); \ - hg_mem_unrestorable(__obj__); \ - } G_STMT_END -#define hg_value_node_is_restorable(_node) \ - hg_mem_is_restorable(hg_mem_get_object__inline_nocheck(_node)) -#define hg_value_node_inherit_complex(_node, _hobj) \ - G_STMT_START { \ - HgMemObject *__obj__, *__obj2__; \ - hg_mem_get_object__inline((_node), __obj__); \ - hg_mem_get_object__inline((_hobj), __obj2__); \ - if (hg_mem_is_complex_mark(__obj2__)) { \ - hg_mem_complex_mark(__obj__); \ - } else { \ - hg_mem_complex_unmark(__obj__); \ - } \ - } G_STMT_END -#define hg_value_node_has_complex_object(_node) \ - hg_mem_is_complex_mark(hg_mem_get_object__inline_nocheck(_node)) - -void hg_value_node_init (void); -void hg_value_node_finalize (void); -gboolean hg_value_node_register_type (const HgValueNodeTypeInfo *info); -const gchar *hg_value_node_get_type_name (guint type_id); - -HgValueNode *hg_value_node_new (HgMemPool *pool, - guint type_id); -gsize hg_value_node_get_hash (const HgValueNode *node); -gboolean hg_value_node_compare (const HgValueNode *a, - const HgValueNode *b); -gboolean hg_value_node_compare_content(const HgValueNode *a, - const HgValueNode *b, - guint attributes_mask); - -void hg_value_node_debug_print (HgFileObject *file, - HgDebugStateType type, - HgValueType vtype, - gpointer parent, - gpointer self, - gpointer extrainfo); - -G_END_DECLS - -#endif /* __HG_VALUE_NODE_H__ */ diff --git a/hieroglyph/iarray.c b/hieroglyph/iarray.c deleted file mode 100644 index 1fdd8e0..0000000 --- a/hieroglyph/iarray.c +++ /dev/null @@ -1,223 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* - * iarray.c - * Copyright (C) 2006 Akira TAGOH - * - * Authors: - * Akira TAGOH <at@gclab.org> - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - */ -#ifdef HAVE_CONFIG_H -#include <config.h> -#endif - -#include "iarray.h" -#include "hglog.h" -#include "hgmem.h" - -#define HG_INT_ARRAY_ALLOC_SIZE 256 - -struct _HieroGlyphIntArray { - HgObject object; - gint32 *arrays; - guint n_arrays; - gint32 allocated_arrays; - gboolean is_fixed_size; -}; - - -static void _hg_int_array_real_set_flags(gpointer data, - guint flags); -static void _hg_int_array_real_relocate (gpointer data, - HgMemRelocateInfo *info); - - -static HgObjectVTable __hg_int_array_vtable = { - .free = NULL, - .set_flags = _hg_int_array_real_set_flags, - .relocate = _hg_int_array_real_relocate, - .dup = NULL, - .copy = NULL, - .to_string = NULL, -}; - -/* - * Private Functions - */ -static void -_hg_int_array_real_set_flags(gpointer data, - guint flags) -{ - HgIntArray *iarray = data; - HgMemObject *obj; - - if (iarray->arrays) { - hg_mem_get_object__inline(iarray->arrays, obj); - if (obj == NULL) { - hg_log_warning("[BUG] Invalid object %p to be marked: IntArray", iarray->arrays); - } else { - if (!hg_mem_is_flags__inline(obj, flags)) - hg_mem_add_flags__inline(obj, flags, TRUE); - } - } -} - -static void -_hg_int_array_real_relocate(gpointer data, - HgMemRelocateInfo *info) -{ - HgIntArray *iarray = data; - - if ((gsize)iarray->arrays >= info->start && - (gsize)iarray->arrays <= info->end) { - iarray->arrays = (gint32 *)((gsize)iarray->arrays + info->diff); - } -} - -/* - * Public Functions - */ -HgIntArray * -hg_int_array_new(HgMemPool *pool, - gint32 num) -{ - HgIntArray *retval; - - g_return_val_if_fail (pool != NULL, NULL); - - retval = hg_mem_alloc_with_flags(pool, - sizeof (HgIntArray), - HG_FL_HGOBJECT | HG_FL_COMPLEX); - if (retval == NULL) - return NULL; - - HG_OBJECT_INIT_STATE (&retval->object); - HG_OBJECT_SET_STATE (&retval->object, hg_mem_pool_get_default_access_mode(pool)); - hg_object_set_vtable(&retval->object, &__hg_int_array_vtable); - - retval->n_arrays = 0; - if (num < 0) { - retval->allocated_arrays = HG_INT_ARRAY_ALLOC_SIZE; - retval->is_fixed_size = FALSE; - } else { - retval->allocated_arrays = num; - retval->is_fixed_size = TRUE; - } - /* initialize arrays with NULL first to avoid a crash - * when the alloc size is too big and GC is necessary to be ran. - */ - retval->arrays = NULL; - retval->arrays = hg_mem_alloc(pool, sizeof (gint32) * retval->allocated_arrays); - if (retval->arrays == NULL) - return NULL; - - return retval; -} - -gboolean -hg_int_array_append(HgIntArray *iarray, - gint32 i) -{ - HgMemObject *obj; - - g_return_val_if_fail (iarray != NULL, FALSE); - g_return_val_if_fail (hg_object_is_readable((HgObject *)iarray), FALSE); - g_return_val_if_fail (hg_object_is_writable((HgObject *)iarray), FALSE); - - hg_mem_get_object__inline(iarray, obj); - g_return_val_if_fail (obj != NULL, FALSE); - - if (!iarray->is_fixed_size && - iarray->n_arrays >= iarray->allocated_arrays) { - gpointer p = hg_mem_resize(iarray->arrays, - sizeof (gint32) * (iarray->allocated_arrays + HG_INT_ARRAY_ALLOC_SIZE)); - - if (p == NULL) { - hg_log_warning("Failed to resize an int array."); - return FALSE; - } else { - iarray->arrays = p; - iarray->allocated_arrays += HG_INT_ARRAY_ALLOC_SIZE; - } - } - if (iarray->n_arrays < iarray->allocated_arrays) { - iarray->arrays[iarray->n_arrays++] = i; - } else { - return FALSE; - } - - return TRUE; -} - -gboolean -hg_int_array_replace(HgIntArray *iarray, - gint32 i, - guint index) -{ - HgMemObject *obj; - - g_return_val_if_fail (iarray != NULL, FALSE); - g_return_val_if_fail (index < iarray->n_arrays, FALSE); - g_return_val_if_fail (hg_object_is_readable((HgObject *)iarray), FALSE); - g_return_val_if_fail (hg_object_is_writable((HgObject *)iarray), FALSE); - - hg_mem_get_object__inline(iarray, obj); - g_return_val_if_fail (obj != NULL, FALSE); - - iarray->arrays[index] = i; - - return TRUE; -} - -gboolean -hg_int_array_remove(HgIntArray *iarray, - guint index) -{ - guint i; - - g_return_val_if_fail (iarray != NULL, FALSE); - g_return_val_if_fail (index < iarray->n_arrays, FALSE); - g_return_val_if_fail (hg_object_is_readable((HgObject *)iarray), FALSE); - g_return_val_if_fail (hg_object_is_writable((HgObject *)iarray), FALSE); - - for (i = index; i <= iarray->n_arrays - 1; i++) { - iarray->arrays[i] = iarray->arrays[i + 1]; - } - iarray->n_arrays--; - - return TRUE; -} - -gint32 -hg_int_array_index(const HgIntArray *iarray, - guint index) -{ - g_return_val_if_fail (iarray != NULL, 0); - g_return_val_if_fail (index < iarray->n_arrays, 0); - g_return_val_if_fail (hg_object_is_readable((HgObject *)iarray), 0); - - return iarray->arrays[index]; -} - -guint -hg_int_array_length(HgIntArray *iarray) -{ - g_return_val_if_fail (iarray != NULL, 0); - g_return_val_if_fail (hg_object_is_readable((HgObject *)iarray), 0); - - return iarray->n_arrays; -} diff --git a/hieroglyph/iarray.h b/hieroglyph/iarray.h deleted file mode 100644 index 9cea689..0000000 --- a/hieroglyph/iarray.h +++ /dev/null @@ -1,51 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* - * iarray.h - * Copyright (C) 2006 Akira TAGOH - * - * Authors: - * Akira TAGOH <at@gclab.org> - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - */ -#ifndef __HG_INT_ARRAY_H__ -#define __HG_INT_ARRAY_H__ - -#include <hieroglyph/hgtypes.h> - -G_BEGIN_DECLS - -typedef struct _HieroGlyphIntArray HgIntArray; - -#define hg_int_array_free(obj) hg_mem_free(obj) - -HgIntArray *hg_int_array_new (HgMemPool *pool, - gint32 num); -gboolean hg_int_array_append (HgIntArray *array, - gint32 i); -gboolean hg_int_array_replace(HgIntArray *array, - gint32 i, - guint index); -gboolean hg_int_array_remove (HgIntArray *array, - guint index); -gint32 hg_int_array_index (const HgIntArray *array, - guint index); -guint hg_int_array_length (HgIntArray *array); - - -G_END_DECLS - -#endif /* __HG_INT_ARRAY_H__ */ diff --git a/hieroglyph/ibtree.c b/hieroglyph/ibtree.c deleted file mode 100644 index 9ac41f4..0000000 --- a/hieroglyph/ibtree.c +++ /dev/null @@ -1,704 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* - * ibtree.c - * Copyright (C) 2006 Akira TAGOH - * - * Authors: - * Akira TAGOH <at@gclab.org> - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - */ -#ifdef HAVE_CONFIG_H -#include <config.h> -#endif - -#include "ibtree.h" -#include "hglog.h" - - -static HgBTreePage *hg_btree_page_new (HgBTree *tree); -static void hg_btree_page_destroy (HgBTree *tree, - HgBTreePage *page); -static void hg_btree_page_free (HgBTreePage *page); -static gboolean hg_btree_page_insert (HgBTree *tree, - HgBTreePage *page, - gpointer *key, - gpointer *val, - gboolean replace, - HgBTreePage **newpage); -static void hg_btree_page_insert_data (HgBTree *tree, - HgBTreePage *page, - gpointer *key, - gpointer *val, - guint pos, - HgBTreePage **newpage); -static void hg_btree_page_blance (HgBTree *tree, - HgBTreePage *page, - gpointer *key, - gpointer *val, - guint pos, - HgBTreePage **newpage); -static gboolean hg_btree_page_remove (HgBTree *tree, - HgBTreePage *page, - gpointer *key, - gpointer *val, - gboolean *need_restore); -static gboolean hg_btree_page_remove_data (HgBTree *tree, - HgBTreePage *page, - guint pos); -static gboolean hg_btree_page_restore (HgBTree *tree, - HgBTreePage *page, - guint pos); -static void hg_btree_page_restore_right_blance(HgBTree *tree, - HgBTreePage *page, - guint pos); -static void hg_btree_page_restore_left_blance (HgBTree *tree, - HgBTreePage *page, - guint pos); -static gboolean hg_btree_page_combine (HgBTree *tree, - HgBTreePage *page, - guint pos); - - -/* - * Private Functions - */ -static HgBTreePage * -hg_btree_page_new(HgBTree *tree) -{ - HgBTreePage *retval; - - retval = g_new(HgBTreePage, 1); - retval->n_data = 0; - retval->key = g_new(gpointer, tree->page_size * 2); - retval->val = g_new(gpointer, tree->page_size * 2); - retval->page = g_new(HgBTreePage *, tree->page_size * 2 + 1); - - return retval; -} - -static void -hg_btree_page_destroy(HgBTree *tree, HgBTreePage *page) -{ - guint i; - - if (page != NULL) { - for (i = 0; i < page->n_data; i++) { - hg_btree_page_destroy(tree, page->page[i]); - if (tree->key_destroy_func) - tree->key_destroy_func(page->key[i]); - if (tree->val_destroy_func) - tree->val_destroy_func(page->val[i]); - } - hg_btree_page_destroy(tree, page->page[page->n_data]); - hg_btree_page_free(page); - } -} - -static void -hg_btree_page_free(HgBTreePage *page) -{ - g_free(page->key); - g_free(page->val); - g_free(page->page); - g_free(page); -} - -static gboolean -hg_btree_page_insert(HgBTree *tree, - HgBTreePage *page, - gpointer *key, - gpointer *val, - gboolean replace, - HgBTreePage **newpage) -{ - guint i; - gboolean retval; - - if (page == NULL) { - *newpage = NULL; - return FALSE; - } - if (page->key[page->n_data - 1] >= *key) { - for (i = 0; i < page->n_data && page->key[i] < *key; i++); - if (i < page->n_data && page->key[i] == *key) { - if (replace) { - if (tree->val_destroy_func) - tree->val_destroy_func(page->val[i]); - page->key[i] = *key; - page->val[i] = *val; - } - return TRUE; - } - } else { - i = page->n_data; - } - retval = hg_btree_page_insert(tree, page->page[i], key, val, replace, newpage); - if (!retval) { - if (page->n_data < tree->page_size * 2) { - hg_btree_page_insert_data(tree, page, key, val, i, newpage); - retval = TRUE; - } else { - hg_btree_page_blance(tree, page, key, val, i, newpage); - retval = FALSE; - } - } - return retval; -} - -static void -hg_btree_page_insert_data(HgBTree *tree, - HgBTreePage *page, - gpointer *key, - gpointer *val, - guint pos, - HgBTreePage **newpage) -{ - guint i; - - for (i = page->n_data; i > pos; i--) { - page->key[i] = page->key[i - 1]; - page->val[i] = page->val[i - 1]; - page->page[i + 1] = page->page[i]; - } - page->key[pos] = *key; - page->val[pos] = *val; - page->page[pos + 1] = *newpage; - page->n_data++; -} - -static void -hg_btree_page_blance(HgBTree *tree, - HgBTreePage *page, - gpointer *key, - gpointer *val, - guint pos, - HgBTreePage **newpage) -{ - guint i, size; - HgBTreePage *new; - - if (pos <= tree->page_size) - size = tree->page_size; - else - size = tree->page_size + 1; - new = hg_btree_page_new(tree); - if (new == NULL) { - hg_log_warning("Failed to allocate a memory."); - return; - } - for (i = size + 1; i <= tree->page_size * 2; i++) { - new->key[i - size - 1] = page->key[i - 1]; - new->val[i - size - 1] = page->val[i - 1]; - new->page[i - size] = page->page[i]; - } - new->n_data = tree->page_size * 2 - size; - page->n_data = size; - if (pos <= tree->page_size) - hg_btree_page_insert_data(tree, page, key, val, pos, newpage); - else - hg_btree_page_insert_data(tree, new, key, val, pos - size, newpage); - *key = page->key[page->n_data - 1]; - *val = page->val[page->n_data - 1]; - new->page[0] = page->page[page->n_data]; - page->n_data--; - *newpage = new; -} - -static gboolean -hg_btree_page_remove(HgBTree *tree, - HgBTreePage *page, - gpointer *key, - gpointer *val, - gboolean *need_restore) -{ - HgBTreePage *p; - guint i; - gboolean removed = FALSE; - - if (page == NULL) - return FALSE; - if (page->key[page->n_data - 1] >= *key) - for (i = 0; i < page->n_data && page->key[i] < *key; i++); - else - i = page->n_data; - if (i < page->n_data && page->key[i] == *key) { - removed = TRUE; - if (tree->key_destroy_func) - tree->key_destroy_func(page->key[i]); - if (tree->val_destroy_func) - tree->val_destroy_func(page->val[i]); - if ((p = page->page[i + 1]) != NULL) { - while (p->page[0] != NULL) - p = p->page[0]; - page->key[i] = *key = p->key[0]; - page->val[i] = *val = p->val[0]; - removed = hg_btree_page_remove(tree, page->page[i + 1], key, val, need_restore); - if (*need_restore) - *need_restore = hg_btree_page_restore(tree, page, i + 1); - } else { - *need_restore = hg_btree_page_remove_data(tree, page, i); - } - } else { - removed = hg_btree_page_remove(tree, page->page[i], key, val, need_restore); - if (*need_restore) - *need_restore = hg_btree_page_restore(tree, page, i); - } - - return removed; -} - -static gboolean -hg_btree_page_remove_data(HgBTree *tree, - HgBTreePage *page, - guint pos) -{ - while (++pos < page->n_data) { - page->key[pos - 1] = page->key[pos]; - page->val[pos - 1] = page->val[pos]; - page->page[pos] = page->page[pos + 1]; - } - - return --(page->n_data) < tree->page_size; -} - -static gboolean -hg_btree_page_restore(HgBTree *tree, - HgBTreePage *page, - guint pos) -{ - if (pos > 0) { - if (page->page[pos - 1]->n_data > tree->page_size) - hg_btree_page_restore_right_blance(tree, page, pos); - else - return hg_btree_page_combine(tree, page, pos); - } else { - if (page->page[1]->n_data > tree->page_size) - hg_btree_page_restore_left_blance(tree, page, 1); - else - return hg_btree_page_combine(tree, page, 1); - } - return FALSE; -} - -static void -hg_btree_page_restore_right_blance(HgBTree *tree, - HgBTreePage *page, - guint pos) -{ - guint i; - HgBTreePage *left, *right; - - left = page->page[pos - 1]; - right = page->page[pos]; - - for (i = right->n_data; i > 0; i--) { - right->key[i] = right->key[i - 1]; - right->val[i] = right->val[i - 1]; - right->page[i + 1] = right->page[i]; - } - right->page[1] = right->page[0]; - right->n_data++; - right->key[0] = page->key[pos - 1]; - right->val[0] = page->val[pos - 1]; - page->key[pos - 1] = left->key[left->n_data - 1]; - page->val[pos - 1] = left->val[left->n_data - 1]; - right->page[0] = left->page[left->n_data]; - left->n_data--; -} - -static void -hg_btree_page_restore_left_blance(HgBTree *tree, - HgBTreePage *page, - guint pos) -{ - guint i; - HgBTreePage *left, *right; - - left = page->page[pos - 1]; - right = page->page[pos]; - left->n_data++; - left->key[left->n_data - 1] = page->key[pos - 1]; - left->val[left->n_data - 1] = page->val[pos - 1]; - left->page[left->n_data] = right->page[0]; - page->key[pos - 1] = right->key[0]; - page->val[pos - 1] = right->val[0]; - right->page[0] = right->page[1]; - right->n_data--; - for (i = 1; i <= right->n_data; i++) { - right->key[i - 1] = right->key[i]; - right->val[i - 1] = right->val[i]; - right->page[i] = right->page[i + 1]; - } -} - -static gboolean -hg_btree_page_combine(HgBTree *tree, - HgBTreePage *page, - guint pos) -{ - guint i; - HgBTreePage *left, *right; - gboolean need_restore; - - left = page->page[pos - 1]; - right = page->page[pos]; - left->n_data++; - left->key[left->n_data - 1] = page->key[pos - 1]; - left->val[left->n_data - 1] = page->val[pos - 1]; - left->page[left->n_data] = right->page[0]; - for (i = 1; i <= right->n_data; i++) { - left->n_data++; - left->key[left->n_data - 1] = right->key[i - 1]; - left->val[left->n_data - 1] = right->val[i - 1]; - left->page[left->n_data] = right->page[i]; - } - need_restore = hg_btree_page_remove_data(tree, page, pos - 1); - hg_btree_page_free(right); - - return need_restore; -} - -static void -hg_btree_page_foreach(HgBTreePage *page, - HgTraverseFunc func, - gpointer data) -{ - if (page != NULL) { - guint i; - - for (i = 0; i < page->n_data; i++) { - hg_btree_page_foreach(page->page[i], func, data); - if (!func(page->key[i], page->val[i], data)) - return; - } - hg_btree_page_foreach(page->page[page->n_data], func, data); - } -} - -static gboolean -hg_btree_page_get_iter(HgBTreePage *page, - guint *sequence, - HgBTreeIter iter, - gboolean valid_stamp) -{ - gboolean retval = FALSE; - - if (page != NULL) { - guint i; - - for (i = 0; i < page->n_data; i++) { - retval = hg_btree_page_get_iter(page->page[i], sequence, iter, valid_stamp); - if (retval) { - return retval; - } else { - if (valid_stamp) { - if (*sequence == iter->seq) { - iter->key = page->key[i]; - iter->val = page->val[i]; - iter->seq++; - - return TRUE; - } - } else { - if (iter->key == page->key[i]) { - iter->seq = *sequence; - - return TRUE; - } else if (page->key[i] > iter->key) { - iter->seq = *sequence - 1; - - return TRUE; - } - } - (*sequence)++; - } - } - retval = hg_btree_page_get_iter(page->page[page->n_data], sequence, iter, valid_stamp); - } - - return retval; -} - -static gboolean -_hg_btree_count_traverse(gpointer key, - gpointer val, - gpointer data) -{ - guint *len = data; - - (*len)++; - - return TRUE; -} - -/* - * Public Functions - */ -HgBTree * -_hg_btree_new(guint page_size) -{ - return _hg_btree_new_full(page_size, NULL, NULL); -} - -HgBTree * -_hg_btree_new_full(guint page_size, - GDestroyNotify key_destroy_func, - GDestroyNotify val_destroy_func) -{ - HgBTree *retval; - - retval = g_new(HgBTree, 1); - retval->page_size = page_size; - retval->root = NULL; - retval->key_destroy_func = key_destroy_func; - retval->val_destroy_func = val_destroy_func; - - return retval; -} - -void -_hg_btree_destroy(HgBTree *tree) -{ - g_return_if_fail (tree != NULL); - - hg_btree_page_destroy(tree, tree->root); - g_free(tree); -} - -void -_hg_btree_add(HgBTree *tree, - gpointer key, - gpointer val) -{ - gboolean inserted; - HgBTreePage *page, *newpage = NULL; - gpointer pkey, pval; - - g_return_if_fail (tree != NULL); - - pkey = key; - pval = val; - inserted = hg_btree_page_insert(tree, tree->root, &pkey, &pval, FALSE, &newpage); - if (!inserted) { - page = hg_btree_page_new(tree); - page->n_data = 1; - page->key[0] = pkey; - page->val[0] = pval; - page->page[0] = tree->root; - page->page[1] = newpage; - tree->root = page; - } -} - -void -_hg_btree_replace(HgBTree *tree, - gpointer key, - gpointer val) -{ - gboolean inserted; - HgBTreePage *page, *newpage = NULL; - gpointer pkey, pval; - - g_return_if_fail (tree != NULL); - - pkey = key; - pval = val; - inserted = hg_btree_page_insert(tree, tree->root, &pkey, &pval, TRUE, &newpage); - if (!inserted) { - page = hg_btree_page_new(tree); - page->n_data = 1; - page->key[0] = pkey; - page->val[0] = pval; - page->page[0] = tree->root; - page->page[1] = newpage; - tree->root = page; - } -} - -void -_hg_btree_remove(HgBTree *tree, - gpointer key) -{ - HgBTreePage *page; - gboolean removed, need_restore = FALSE; - gpointer pkey, pval = NULL; - - g_return_if_fail (tree != NULL); - - pkey = key; - removed = hg_btree_page_remove(tree, tree->root, &pkey, &pval, &need_restore); - if (removed) { - if (tree->root->n_data == 0) { - page = tree->root; - tree->root = tree->root->page[0]; - hg_btree_page_free(page); - } - } -} - -gpointer -_hg_btree_find(HgBTree *tree, - gpointer key) -{ - HgBTreePage *page; - guint i; - - g_return_val_if_fail (tree != NULL, NULL); - - page = tree->root; - while (page != NULL) { - if (page->key[page->n_data - 1] >= key) { - for (i = 0; i < page->n_data && page->key[i] < key; i++); - if (i < page->n_data && page->key[i] == key) - return page->val[i]; - } else { - i = page->n_data; - } - page = page->page[i]; - } - - return NULL; -} - -gpointer -_hg_btree_find_near(HgBTree *tree, - gpointer key) -{ - HgBTreePage *page, *prev = NULL; - guint i = 0, prev_pos = 0; - - g_return_val_if_fail (tree != NULL, NULL); - - page = tree->root; - while (page != NULL) { - if (page->key[page->n_data - 1] >= key) { - for (i = 0; i < page->n_data && page->key[i] < key; i++); - if (i < page->n_data && page->key[i] == key) - return page->val[i]; - prev = page; - prev_pos = i; - } else { - i = page->n_data; - } - page = page->page[i]; - } - if (prev) { - if (prev_pos < prev->n_data) { - /* prev->val[i - 1] should be less than key */ - return prev->val[prev_pos]; - } - /* no items is bigger than key found. */ - } - - return NULL; -} - -void -_hg_btree_foreach(HgBTree *tree, - HgTraverseFunc func, - gpointer data) -{ - g_return_if_fail (tree != NULL); - g_return_if_fail (func != NULL); - - hg_btree_page_foreach(tree->root, func, data); -} - -HgBTreeIter -_hg_btree_iter_new(void) -{ - HgBTreeIter iter = g_new(struct _HieroGlyphBTreeIter, 1); - - iter->id = NULL; - iter->stamp = NULL; - iter->seq = 0; - iter->key = NULL; - iter->val = NULL; - - return iter; -} - -gboolean -_hg_btree_get_iter_first(HgBTree *tree, - HgBTreeIter iter) -{ - guint sequence = 0; - - g_return_val_if_fail (tree != NULL, FALSE); - g_return_val_if_fail (iter != NULL, FALSE); - - iter->id = tree; - iter->stamp = tree->root; - iter->seq = 0; - - return hg_btree_page_get_iter(tree->root, &sequence, iter, TRUE); -} - -gboolean -_hg_btree_get_iter_next(HgBTree *tree, - HgBTreeIter iter) -{ - guint sequence = 0; - - g_return_val_if_fail (tree != NULL, FALSE); - g_return_val_if_fail (iter != NULL, FALSE); - g_return_val_if_fail (iter->id == tree, FALSE); - g_return_val_if_fail (iter->stamp == tree->root, FALSE); - - return hg_btree_page_get_iter(tree->root, &sequence, iter, TRUE); -} - -gboolean -_hg_btree_is_iter_valid(HgBTree *tree, - HgBTreeIter iter) -{ - g_return_val_if_fail (tree != NULL, FALSE); - g_return_val_if_fail (iter != NULL, FALSE); - g_return_val_if_fail (iter->id == tree, FALSE); - - return iter->stamp == tree->root; -} - -gboolean -_hg_btree_update_iter(HgBTree *tree, - HgBTreeIter iter) -{ - gboolean retval; - guint sequence = 0; - - g_return_val_if_fail (tree != NULL, FALSE); - g_return_val_if_fail (iter != NULL, FALSE); - g_return_val_if_fail (iter->id == tree, FALSE); - - retval = hg_btree_page_get_iter(tree->root, &sequence, iter, FALSE); - if (retval) { - iter->seq++; - iter->stamp = tree->root; - } - - return retval; -} - -guint -_hg_btree_length(HgBTree *tree) -{ - guint retval = 0; - - hg_btree_foreach(tree, _hg_btree_count_traverse, &retval); - - return retval; -} diff --git a/hieroglyph/ibtree.h b/hieroglyph/ibtree.h deleted file mode 100644 index 5c8a4ad..0000000 --- a/hieroglyph/ibtree.h +++ /dev/null @@ -1,110 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* - * ibtree.h - * Copyright (C) 2006 Akira TAGOH - * - * Authors: - * Akira TAGOH <at@gclab.org> - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - */ -#ifndef __HG_BTREE_H__ -#define __HG_BTREE_H__ - -#include <hieroglyph/hgtypes.h> - -G_BEGIN_DECLS - -typedef struct _HieroGlyphBTreePage HgBTreePage; -typedef struct _HieroGlyphBTree HgBTree; -typedef struct _HieroGlyphBTreeIter *HgBTreeIter; - -struct _HieroGlyphBTreeIter { - gpointer id; - gpointer stamp; - guint seq; - gpointer key; - gpointer val; -}; - -struct _HieroGlyphBTreePage { - guint n_data; - gpointer *key; - gpointer *val; - HgBTreePage **page; -}; - -struct _HieroGlyphBTree { - HgBTreePage *root; - guint page_size; - GDestroyNotify key_destroy_func; - GDestroyNotify val_destroy_func; -}; - - -#define hg_btree_new _hg_btree_new -#define hg_btree_new_full _hg_btree_new_full -#define hg_btree_destroy _hg_btree_destroy -#define hg_btree_add _hg_btree_add -#define hg_btree_replace _hg_btree_replace -#define hg_btree_remove _hg_btree_remove -#define hg_btree_find _hg_btree_find -#define hg_btree_find_near _hg_btree_find_near -#define hg_btree_foreach _hg_btree_foreach -#define hg_btree_length _hg_btree_length -#define hg_btree_iter_new _hg_btree_iter_new -#define hg_btree_iter_free g_free -#define hg_btree_get_iter_first _hg_btree_get_iter_first -#define hg_btree_get_iter_next _hg_btree_get_iter_next -#define hg_btree_is_iter_valid _hg_btree_is_iter_valid -#define hg_btree_update_iter _hg_btree_update_iter - - -HgBTree *hg_btree_new (guint page_size); -HgBTree *hg_btree_new_full (guint page_size, - GDestroyNotify key_destroy_func, - GDestroyNotify val_destroy_func); -void hg_btree_destroy (HgBTree *tree); -void hg_btree_add (HgBTree *tree, - gpointer key, - gpointer val); -void hg_btree_replace (HgBTree *tree, - gpointer key, - gpointer val); -void hg_btree_remove (HgBTree *tree, - gpointer key); -gpointer hg_btree_find (HgBTree *tree, - gpointer key); -gpointer hg_btree_find_near(HgBTree *tree, - gpointer key); -void hg_btree_foreach (HgBTree *tree, - HgTraverseFunc func, - gpointer data); -guint hg_btree_length (HgBTree *tree); -/* iterator */ -HgBTreeIter hg_btree_iter_new (void); -gboolean hg_btree_get_iter_first(HgBTree *tree, - HgBTreeIter iter); -gboolean hg_btree_get_iter_next (HgBTree *tree, - HgBTreeIter iter); -gboolean hg_btree_is_iter_valid (HgBTree *tree, - HgBTreeIter iter); -gboolean hg_btree_update_iter (HgBTree *tree, - HgBTreeIter iter); - -G_END_DECLS - -#endif /* __HG_BTREE_H__ */ diff --git a/hieroglyph/ilist.c b/hieroglyph/ilist.c deleted file mode 100644 index 998d6ae..0000000 --- a/hieroglyph/ilist.c +++ /dev/null @@ -1,456 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* - * ilist.c - * Copyright (C) 2006 Akira TAGOH - * - * Authors: - * Akira TAGOH <at@gclab.org> - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - */ -#ifdef HAVE_CONFIG_H -#include <config.h> -#endif - -#include "ilist.h" -#include "hglog.h" - -/* - * Most code are duplicate from HgList. - * big difference are whether HgMemPool is used or not. - * this is for internal, where can't depends on it. - */ -enum { - HG_LIST_MASK_UNUSED = 1 << 0, - HG_LIST_MASK_LAST_NODE = 1 << 1, - HG_LIST_MASK_OBJECT_NODE = 1 << 2, -}; - -struct _HieroGlyphList { - HgList *prev; - HgList *next; - gpointer data; - guint state; -}; - -struct _HieroGlyphListIter { - HgList *top; - HgList *last; - HgList *current; -}; - -#define hg_list_next(_list) ((_list)->next) -#define hg_list_previous(_list) ((_list)->prev) - -#define HG_LIST_GET_USER_DATA(_obj, _mask) \ - ((_obj)->state & _mask) -#define HG_LIST_SET_USER_DATA(_obj, _mask, _flag) \ - if (_flag) { \ - ((_obj)->state = (HG_LIST_GET_USER_DATA (_obj, 0xff & ~(_mask)) | \ - _mask)); \ - } else { \ - ((_obj)->state = (HG_LIST_GET_USER_DATA (_obj, 0xff & ~(_mask)) & \ - ~(_mask))); \ - } -#define HG_LIST_SET_UNUSED(_obj, _flag) \ - HG_LIST_SET_USER_DATA (_obj, HG_LIST_MASK_UNUSED, _flag) -#define HG_LIST_IS_UNUSED(_obj) \ - (HG_LIST_GET_USER_DATA (_obj, HG_LIST_MASK_UNUSED) != 0) -#define HG_LIST_SET_LAST_NODE(_obj, _flag) \ - HG_LIST_SET_USER_DATA (_obj, HG_LIST_MASK_LAST_NODE, _flag) -#define HG_LIST_IS_LAST_NODE(_obj) \ - (HG_LIST_GET_USER_DATA (_obj, HG_LIST_MASK_LAST_NODE) != 0) -#define HG_LIST_SET_OBJECT_NODE(_obj, _flag) \ - HG_LIST_SET_USER_DATA (_obj, HG_LIST_MASK_OBJECT_NODE, _flag) -#define HG_LIST_IS_OBJECT_NODE(_obj) \ - (HG_LIST_GET_USER_DATA (_obj, HG_LIST_MASK_OBJECT_NODE) != 0) - - -/* - * Private Functions - */ -static HgList * -_hg_list_get_last_node(HgList *list) -{ - HgList *tmp = list; - - g_return_val_if_fail (list != NULL, NULL); - - /* assume that the initial position may be the top node */ - while (tmp) { - if (HG_LIST_IS_UNUSED (tmp)) { - /* validate node */ - if (hg_list_next(tmp) != NULL || - hg_list_previous(tmp) != NULL) { - /* found incomplete node */ - hg_log_warning("[BUG] incomplete HgList node %p found.", tmp); - } else { - /* this can be used as the last node */ - return tmp; - } - } else { - if (HG_LIST_IS_LAST_NODE (tmp)) { - return tmp; - } - } - tmp = hg_list_previous(tmp); - /* validate node */ - if (tmp == list) { - /* detected the circular reference */ - hg_log_warning("[BUG] Circular reference happened without the last node mark: %p", - list); - /* workaround */ - return hg_list_previous(list); - } - } - - return NULL; -} - -static HgList * -_hg_list_get_top_node(HgList *list) -{ - HgList *retval; - - g_return_val_if_fail (list != NULL, NULL); - - retval = _hg_list_get_last_node(list); - if (retval != NULL) { - retval = hg_list_next(retval); - } - - return retval; -} - -HgList * -_hg_list_real_append(HgList *list, - gpointer data, - gboolean is_object) -{ - HgList *tmp, *last, *top; - - g_return_val_if_fail (list != NULL, NULL); - - if ((last = _hg_list_get_last_node(list)) != NULL) { - if (!HG_LIST_IS_UNUSED (last)) { - tmp = hg_list_new(); - top = hg_list_next(last); - hg_list_next(tmp) = top; - hg_list_next(last) = tmp; - hg_list_previous(top) = tmp; - hg_list_previous(tmp) = last; - HG_LIST_SET_LAST_NODE (last, FALSE); - list = top; - } else { - tmp = list; - hg_list_next(tmp) = tmp; - hg_list_previous(tmp) = tmp; - } - tmp->data = data; - HG_LIST_SET_LAST_NODE (tmp, TRUE); - HG_LIST_SET_UNUSED (tmp, FALSE); - HG_LIST_SET_OBJECT_NODE (tmp, is_object); - } - - return list; -} - -HgList * -_hg_list_real_prepend(HgList *list, - gpointer data, - gboolean is_object) -{ - HgList *tmp, *last, *top; - - g_return_val_if_fail (list != NULL, NULL); - - if ((top = _hg_list_get_top_node(list)) != NULL) { - if (!HG_LIST_IS_UNUSED (top)) { - tmp = hg_list_new(); - last = hg_list_previous(top); - hg_list_next(last) = tmp; - hg_list_next(tmp) = top; - hg_list_previous(top) = tmp; - hg_list_previous(tmp) = last; - list = tmp; - } else { - tmp = list; - hg_list_next(tmp) = tmp; - hg_list_previous(tmp) = tmp; - } - tmp->data = data; - HG_LIST_SET_UNUSED (tmp, FALSE); - HG_LIST_SET_OBJECT_NODE (tmp, is_object); - } - - return list; -} - -static void -_hg_list_iter_real_set_data(HgListIter iter, - gpointer data, - gboolean is_object) -{ - g_return_if_fail (iter != NULL); - - iter->current->data = data; - HG_LIST_SET_OBJECT_NODE (iter->current, is_object); -} - -/* - * Public Functions - */ -HgList * -_hg_list_new() -{ - HgList *retval; - - retval = g_new(HgList, 1); - if (retval == NULL) - return NULL; - - HG_LIST_SET_UNUSED (retval, TRUE); - hg_list_next(retval) = NULL; - hg_list_previous(retval) = NULL; - retval->data = NULL; - - return retval; -} - -void -_hg_list_free(HgList *list) -{ - HgList *tmp; - - /* break the loop to detect the end of list. */ - if (hg_list_previous(list)) - hg_list_next(hg_list_previous(list)) = NULL; - while (list) { - tmp = hg_list_next(list); - g_free(list); - list = tmp; - } -} - -HgList * -_hg_list_append(HgList *list, - gpointer data) -{ - return _hg_list_real_append(list, data, FALSE); -} - -HgList * -_hg_list_prepend(HgList *list, - gpointer data) -{ - return _hg_list_real_prepend(list, data, FALSE); -} - -guint -_hg_list_length(HgList *list) -{ - guint retval = 0; - HgList *l = list; - - g_return_val_if_fail (list != NULL, 0); - - do { - l = hg_list_next(l); - retval++; - } while (l && l != list); - - /* validate node */ - if (l == NULL) { - hg_log_warning("[BUG] no loop detected in HgList %p", list); - } - - return retval; -} - -HgList * -_hg_list_remove(HgList *list, - gpointer data) -{ - HgListIter iter; - - g_return_val_if_fail (list != NULL, NULL); - - iter = hg_list_iter_new(list); - do { - if (hg_list_iter_get_data(iter) == data) { - list = hg_list_iter_delete_link(iter); - break; - } - } while (hg_list_get_iter_next(list, iter)); - hg_list_iter_free(iter); - - return list; -} - -HgList * -_hg_list_first(HgList *list) -{ - return _hg_list_get_top_node(list); -} - -HgList * -_hg_list_last(HgList *list) -{ - return _hg_list_get_last_node(list); -} - -/* iterators */ -HgListIter -_hg_list_iter_new(HgList *list) -{ - HgListIter iter; - - g_return_val_if_fail (list != NULL, NULL); - g_return_val_if_fail (hg_list_previous(list) != NULL, NULL); - g_return_val_if_fail (HG_LIST_IS_LAST_NODE (hg_list_previous(list)), NULL); - - iter = g_new(struct _HieroGlyphListIter, 1); - if (iter == NULL) - return NULL; - - iter->top = list; - iter->last = hg_list_previous(list); - iter->current = list; - - return iter; -} - -gboolean -_hg_list_get_iter_first(HgList *list, - HgListIter iter) -{ - g_return_val_if_fail (list != NULL, FALSE); - g_return_val_if_fail (iter != NULL, FALSE); - g_return_val_if_fail (iter->top == list, FALSE); - g_return_val_if_fail (iter->last == hg_list_previous(list), FALSE); - - iter->current = iter->top; - - return TRUE; -} - -gboolean -_hg_list_get_iter_next(HgList *list, - HgListIter iter) -{ - g_return_val_if_fail (list != NULL, FALSE); - g_return_val_if_fail (iter != NULL, FALSE); - g_return_val_if_fail (iter->top == list, FALSE); - g_return_val_if_fail (iter->last == hg_list_previous(list), FALSE); - - iter->current = hg_list_next(iter->current); - if (iter->current == iter->top) - return FALSE; - - return TRUE; -} - -gpointer -_hg_list_iter_get_data(HgListIter iter) -{ - g_return_val_if_fail (iter != NULL, NULL); - - return iter->current->data; -} - -void -_hg_list_iter_set_data(HgListIter iter, - gpointer data) -{ - _hg_list_iter_real_set_data(iter, data, FALSE); -} - -HgList * -_hg_list_iter_delete_link(HgListIter iter) -{ - HgList *list, *next, *prev; - - g_return_val_if_fail (iter != NULL, NULL); - - prev = hg_list_previous(iter->current); - next = hg_list_next(iter->current); - hg_list_next(prev) = next; - hg_list_previous(next) = prev; - - if (HG_LIST_IS_LAST_NODE (iter->current)) { - HG_LIST_SET_LAST_NODE (iter->current, FALSE); - HG_LIST_SET_LAST_NODE (prev, TRUE); - HG_LIST_SET_UNUSED (iter->current, TRUE); - } - hg_list_next(iter->current) = NULL; - hg_list_previous(iter->current) = NULL; - if (iter->current == next) - iter->top = NULL; - else if (iter->current == iter->top) - iter->top = next; - hg_list_free(iter->current); - list = iter->top; - iter->current = prev; - - return list; -} - -HgListIter -_hg_list_find_iter(HgList *list, - gconstpointer data) -{ - gpointer p; - HgListIter iter; - - g_return_val_if_fail (list != NULL, NULL); - - iter = hg_list_iter_new(list); - while (iter) { - p = hg_list_iter_get_data(iter); - if (p == data) - return iter; - if (!hg_list_get_iter_next(list, iter)) - break; - } - if (iter) - hg_list_iter_free(iter); - - return NULL; -} - -HgListIter -_hg_list_find_iter_custom(HgList *list, - gconstpointer data, - HgCompareFunc func) -{ - gpointer p; - HgListIter iter; - - g_return_val_if_fail (list != NULL, NULL); - - iter = hg_list_iter_new(list); - while (iter) { - p = hg_list_iter_get_data(iter); - if (func(p, data)) - return iter; - if (!hg_list_get_iter_next(list, iter)) - break; - } - if (iter) - hg_list_iter_free(iter); - - return NULL; -} diff --git a/hieroglyph/ilist.h b/hieroglyph/ilist.h deleted file mode 100644 index 3844e4f..0000000 --- a/hieroglyph/ilist.h +++ /dev/null @@ -1,81 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* - * ilist.h - * Copyright (C) 2006 Akira TAGOH - * - * Authors: - * Akira TAGOH <at@gclab.org> - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - */ -#ifndef __HG_LIST_H__ -#define __HG_LIST_H__ - -#include <hieroglyph/hgtypes.h> - -G_BEGIN_DECLS - -#define hg_list_new(pool) _hg_list_new() -#define hg_list_free _hg_list_free -#define hg_list_append _hg_list_append -#define hg_list_prepend _hg_list_prepend -#define hg_list_length _hg_list_length -#define hg_list_remove _hg_list_remove -#define hg_list_first _hg_list_first -#define hg_list_last _hg_list_last - -#define hg_list_iter_new _hg_list_iter_new -#define hg_list_get_iter_first _hg_list_get_iter_first -#define hg_list_get_iter_next _hg_list_get_iter_next -#define hg_list_find_iter _hg_list_find_iter -#define hg_list_find_iter_custom _hg_list_find_iter_custom -#define hg_list_iter_get_data _hg_list_iter_get_data -#define hg_list_iter_set_data _hg_list_iter_set_data -#define hg_list_iter_delete_link _hg_list_iter_delete_link -#define hg_list_iter_free g_free - -HgList *_hg_list_new (); - -void hg_list_free (HgList *list); -HgList *hg_list_append (HgList *list, - gpointer data); -HgList *hg_list_prepend (HgList *list, - gpointer data); -guint hg_list_length (HgList *list); -HgList *hg_list_remove (HgList *list, - gpointer data); -HgList *hg_list_first (HgList *list); -HgList *hg_list_last (HgList *list); - -HgListIter hg_list_iter_new (HgList *list); -gboolean hg_list_get_iter_first (HgList *list, - HgListIter iter); -gboolean hg_list_get_iter_next (HgList *list, - HgListIter iter); -HgListIter hg_list_find_iter (HgList *list, - gconstpointer data); -HgListIter hg_list_find_iter_custom(HgList *list, - gconstpointer data, - HgCompareFunc func); -gpointer hg_list_iter_get_data (HgListIter iter); -void hg_list_iter_set_data (HgListIter iter, - gpointer data); -HgList *hg_list_iter_delete_link(HgListIter iter); - - -G_END_DECLS - -#endif /* __HG_LIST_H__ */ diff --git a/hieroglyph/operator-private.h b/hieroglyph/operator-private.h deleted file mode 100644 index 17d39d0..0000000 --- a/hieroglyph/operator-private.h +++ /dev/null @@ -1,72 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* - * operator-private.h - * Copyright (C) 2006 Akira TAGOH - * - * Authors: - * Akira TAGOH <at@gclab.org> - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - */ -#ifndef __HG_OPERATOR_PRIVATE_H__ -#define __HG_OPERATOR_PRIVATE_H__ - -#include <hieroglyph/hgtypes.h> - -G_BEGIN_DECLS - - -#define DEFUNC_OP(func) \ - static gboolean \ - _hg_operator_op_##func(HgOperator *op, \ - gpointer data) \ - { \ - HgVM *vm = data; \ - gboolean retval = FALSE; -#define DEFUNC_OP_END \ - return retval; \ - } -#define DEFUNC_UNIMPLEMENTED_OP(func) \ - static gboolean \ - _hg_operator_op_##func(HgOperator *op, \ - gpointer data) \ - { \ - g_warning("%s isn't yet implemented.", __PRETTY_FUNCTION__); \ - \ - return FALSE; \ - } -#define _hg_operator_build_operator(vm, pool, sdict, name, func, ret_op) \ - hg_operator_build_operator__inline(_hg_operator_op_, vm, pool, sdict, name, func, ret_op) -#define BUILD_OP(vm, pool, sdict, name, func) \ - G_STMT_START { \ - HgOperator *__hg_op; \ - \ - _hg_operator_build_operator(vm, pool, sdict, name, func, __hg_op); \ - if (__hg_op != NULL) { \ - __hg_operator_list[HG_op_##name] = __hg_op; \ - } \ - } G_STMT_END -#define BUILD_OP_(vm, pool, sdict, name, func) \ - G_STMT_START { \ - HgOperator *__hg_op; \ - \ - _hg_operator_build_operator(vm, pool, sdict, name, func, __hg_op); \ - } G_STMT_END - - -G_END_DECLS - -#endif /* __HG_OPERATOR_PRIVATE_H__ */ diff --git a/hieroglyph/operator.c b/hieroglyph/operator.c deleted file mode 100644 index 214096b..0000000 --- a/hieroglyph/operator.c +++ /dev/null @@ -1,8116 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* - * operator.c - * Copyright (C) 2005-2006 Akira TAGOH - * - * Authors: - * Akira TAGOH <at@gclab.org> - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - */ -#ifdef HAVE_CONFIG_H -#include <config.h> -#endif - -#include <math.h> -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <sys/stat.h> -#include "operator.h" -#include "operator-private.h" -#include "version.h" -#include "hgmem.h" -#include "hgarray.h" -#include "hgdebug.h" -#include "hgdict.h" -#include "hgfile.h" -#include "hglineedit.h" -#include "hglog.h" -#include "hgmatrix.h" -#include "hgpath.h" -#include "hgstack.h" -#include "hgstring.h" -#include "hgvaluenode.h" -#include "hggraphics.h" -#include "scanner.h" -#include "vm.h" - - -struct _HieroGlyphOperator { - HgObject object; - gchar *name; - HgOperatorFunc operator; -}; - - -static void _hg_operator_real_set_flags(gpointer data, - guint flags); -static void _hg_operator_real_relocate (gpointer data, - HgMemRelocateInfo *info); -static gpointer _hg_operator_real_to_string(gpointer data); - - -static HgObjectVTable __hg_operator_vtable = { - .free = NULL, - .set_flags = _hg_operator_real_set_flags, - .relocate = _hg_operator_real_relocate, - .dup = NULL, - .copy = NULL, - .to_string = _hg_operator_real_to_string, -}; -HgOperator *__hg_operator_list[HG_op_END]; - -/* - * Operators - */ -/* level 1 */ -DEFUNC_OP (private_arraytomark) -G_STMT_START -{ - /* %arraytomark is the same as {counttomark array astore exch pop} */ - while (1) { - retval = hg_operator_invoke(__hg_operator_list[HG_op_counttomark], vm); - if (!retval) - break; - retval = hg_operator_invoke(__hg_operator_list[HG_op_array], vm); - if (!retval) - break; - retval = hg_operator_invoke(__hg_operator_list[HG_op_astore], vm); - if (!retval) - break; - retval = hg_operator_invoke(__hg_operator_list[HG_op_exch], vm); - if (!retval) - break; - retval = hg_operator_invoke(__hg_operator_list[HG_op_pop], vm); - break; - } -} G_STMT_END; -DEFUNC_OP_END - -DEFUNC_OP (private_dicttomark) -G_STMT_START -{ - HgStack *ostack = hg_vm_get_ostack(vm); - guint depth = hg_stack_depth(ostack), i, j; - HgMemPool *pool = hg_vm_get_current_pool(vm); - HgValueNode *node, *key, *val; - HgDict *dict; - - while (1) { - for (i = 0; i < depth; i++) { - node = hg_stack_index(ostack, i); - if (HG_IS_VALUE_MARK (node)) { - if ((i % 2) != 0) { - _hg_operator_set_error(vm, op, VM_e_rangecheck); - break; - } - dict = hg_dict_new(pool, i / 2); - if (dict == NULL) { - _hg_operator_set_error(vm, op, VM_e_VMerror); - break; - } - for (j = 1; j <= i; j += 2) { - key = hg_stack_index(ostack, i - j); - val = hg_stack_index(ostack, i - j - 1); - if (!hg_mem_pool_is_own_object(pool, key) || - !hg_mem_pool_is_own_object(pool, val)) { - _hg_operator_set_error(vm, op, VM_e_invalidaccess); - return retval; - } - if (!hg_dict_insert(pool, dict, key, val)) { - _hg_operator_set_error(vm, op, VM_e_VMerror); - return retval; - } - } - for (j = 0; j <= i; j++) - hg_stack_pop(ostack); - HG_VALUE_MAKE_DICT (node, dict); - if (node == NULL) { - _hg_operator_set_error(vm, op, VM_e_VMerror); - break; - } - retval = hg_stack_push(ostack, node); - /* it must be true */ - break; - } - } - if (i == depth) { - _hg_operator_set_error(vm, op, VM_e_unmatchedmark); - break; - } - break; - } -} G_STMT_END; -DEFUNC_OP_END - -DEFUNC_OP (private_for_pos_int_continue) -G_STMT_START -{ - HgStack *ostack = hg_vm_get_ostack(vm); - HgStack *estack = hg_vm_get_estack(vm); - HgValueNode *nself, *nproc, *nlimit, *ninc, *nini, *node; - gint32 iini, iinc, ilimit; - - while (1) { - nself = hg_stack_index(estack, 0); - nproc = hg_stack_index(estack, 1); - nlimit = hg_stack_index(estack, 2); - ninc = hg_stack_index(estack, 3); - nini = hg_stack_index(estack, 4); - - ilimit = HG_VALUE_GET_INTEGER (nlimit); - iinc = HG_VALUE_GET_INTEGER (ninc); - iini = HG_VALUE_GET_INTEGER (nini); - if ((iinc > 0 && iini > ilimit) || - (iinc < 0 && iini < ilimit)) { - hg_stack_pop(estack); - hg_stack_pop(estack); - hg_stack_pop(estack); - hg_stack_pop(estack); - hg_stack_pop(estack); - retval = hg_stack_push(estack, nself); - break; - } - HG_VALUE_SET_INTEGER (nini, iini + iinc); - HG_VALUE_MAKE_INTEGER (hg_vm_get_current_pool(vm), node, iini); - if (node == NULL) { - _hg_operator_set_error(vm, op, VM_e_VMerror); - break; - } - retval = hg_stack_push(ostack, node); - if (!retval) { - _hg_operator_set_error(vm, op, VM_e_stackoverflow); - break; - } - node = hg_object_copy((HgObject *)nproc); - if (node == NULL) { - _hg_operator_set_error(vm, op, VM_e_VMerror); - break; - } - hg_stack_push(estack, node); - retval = hg_stack_push(estack, nself); /* dummy */ - if (!retval) - _hg_operator_set_error(vm, op, VM_e_stackoverflow); - break; - } -} G_STMT_END; -DEFUNC_OP_END - -DEFUNC_OP (private_for_pos_real_continue) -G_STMT_START -{ - HgStack *ostack = hg_vm_get_ostack(vm); - HgStack *estack = hg_vm_get_estack(vm); - HgValueNode *nself, *nproc, *nlimit, *ninc, *nini, *node; - gdouble dini, dinc, dlimit; - - while (1) { - nself = hg_stack_index(estack, 0); - nproc = hg_stack_index(estack, 1); - nlimit = hg_stack_index(estack, 2); - ninc = hg_stack_index(estack, 3); - nini = hg_stack_index(estack, 4); - - dlimit = HG_VALUE_GET_REAL (nlimit); - dinc = HG_VALUE_GET_REAL (ninc); - dini = HG_VALUE_GET_REAL (nini); - if ((dinc > 0.0 && dini > dlimit) || - (dinc < 0.0 && dini < dlimit)) { - hg_stack_pop(estack); - hg_stack_pop(estack); - hg_stack_pop(estack); - hg_stack_pop(estack); - hg_stack_pop(estack); - retval = hg_stack_push(estack, nself); - break; - } - HG_VALUE_SET_REAL (nini, dini + dinc); - HG_VALUE_MAKE_REAL (hg_vm_get_current_pool(vm), node, dini); - if (node == NULL) { - _hg_operator_set_error(vm, op, VM_e_VMerror); - break; - } - retval = hg_stack_push(ostack, node); - if (!retval) { - _hg_operator_set_error(vm, op, VM_e_stackoverflow); - break; - } - node = hg_object_copy((HgObject *)nproc); - if (node == NULL) { - _hg_operator_set_error(vm, op, VM_e_VMerror); - break; - } - hg_stack_push(estack, node); - retval = hg_stack_push(estack, nself); /* dummy */ - if (!retval) - _hg_operator_set_error(vm, op, VM_e_stackoverflow); - break; - } -} G_STMT_END; -DEFUNC_OP_END - -DEFUNC_OP (private_forall_array_continue) -G_STMT_START -{ - HgStack *ostack = hg_vm_get_ostack(vm); - HgStack *estack = hg_vm_get_estack(vm); - HgValueNode *nself, *nproc, *nval, *nn, *copy_proc, *node; - HgArray *array; - gint32 i; - - while (1) { - nself = hg_stack_index(estack, 0); - nproc = hg_stack_index(estack, 1); - nval = hg_stack_index(estack, 2); - nn = hg_stack_index(estack, 3); - - array = HG_VALUE_GET_ARRAY (nval); - i = HG_VALUE_GET_INTEGER (nn); - if (hg_array_length(array) <= i) { - hg_stack_pop(estack); - hg_stack_pop(estack); - hg_stack_pop(estack); - hg_stack_pop(estack); - retval = hg_stack_push(estack, nself); /* dummy */ - /* it must be true */ - break; - } - HG_VALUE_SET_INTEGER (nn, i + 1); - node = hg_array_index(array, i); - copy_proc = hg_object_copy((HgObject *)nproc); - if (copy_proc == NULL) { - _hg_operator_set_error(vm, op, VM_e_VMerror); - break; - } - retval = hg_stack_push(ostack, node); - if (!retval) { - _hg_operator_set_error(vm, op, VM_e_stackoverflow); - break; - } - hg_stack_push(estack, copy_proc); - retval = hg_stack_push(estack, nself); /* dummy */ - if (!retval) - _hg_operator_set_error(vm, op, VM_e_stackoverflow); - break; - } -} G_STMT_END; -DEFUNC_OP_END - -DEFUNC_OP (private_forall_dict_continue) -G_STMT_START -{ - HgStack *ostack = hg_vm_get_ostack(vm); - HgStack *estack = hg_vm_get_estack(vm); - HgValueNode *nself, *nproc, *nval, *nn, *copy_proc, *key, *val; - HgDict *dict; - - while (1) { - nself = hg_stack_index(estack, 0); - nproc = hg_stack_index(estack, 1); - nval = hg_stack_index(estack, 2); - nn = hg_stack_index(estack, 3); - - dict = HG_VALUE_GET_DICT (nval); - if (!hg_dict_first(dict, &key, &val)) { - hg_stack_pop(estack); - hg_stack_pop(estack); - hg_stack_pop(estack); - hg_stack_pop(estack); - retval = hg_stack_push(estack, nself); /* dummy */ - /* it must be true */ - break; - } - hg_dict_remove(dict, key); - copy_proc = hg_object_copy((HgObject *)nproc); - if (copy_proc == NULL) { - _hg_operator_set_error(vm, op, VM_e_VMerror); - break; - } - hg_stack_push(ostack, key); - retval = hg_stack_push(ostack, val); - if (!retval) { - _hg_operator_set_error(vm, op, VM_e_stackoverflow); - break; - } - hg_stack_push(estack, copy_proc); - retval = hg_stack_push(estack, nself); /* dummy */ - if (!retval) - _hg_operator_set_error(vm, op, VM_e_stackoverflow); - break; - } -} G_STMT_END; -DEFUNC_OP_END - -DEFUNC_OP (private_forall_string_continue) -G_STMT_START -{ - HgStack *ostack = hg_vm_get_ostack(vm); - HgStack *estack = hg_vm_get_estack(vm); - HgValueNode *nself, *nproc, *nval, *nn, *copy_proc, *node; - HgString *string; - gint32 i; - gchar c; - - while (1) { - nself = hg_stack_index(estack, 0); - nproc = hg_stack_index(estack, 1); - nval = hg_stack_index(estack, 2); - nn = hg_stack_index(estack, 3); - - string = HG_VALUE_GET_STRING (nval); - i = HG_VALUE_GET_INTEGER (nn); - if (hg_string_maxlength(string) <= i) { - hg_stack_pop(estack); - hg_stack_pop(estack); - hg_stack_pop(estack); - hg_stack_pop(estack); - retval = hg_stack_push(estack, nself); /* dummy */ - /* it must be true */ - break; - } - HG_VALUE_SET_INTEGER (nn, i + 1); - c = hg_string_index(string, i); - HG_VALUE_MAKE_INTEGER (hg_vm_get_current_pool(vm), node, c); - copy_proc = hg_object_copy((HgObject *)nproc); - if (copy_proc == NULL) { - _hg_operator_set_error(vm, op, VM_e_VMerror); - break; - } - retval = hg_stack_push(ostack, node); - if (!retval) { - _hg_operator_set_error(vm, op, VM_e_stackoverflow); - break; - } - hg_stack_push(estack, copy_proc); - retval = hg_stack_push(estack, nself); /* dummy */ - if (!retval) - _hg_operator_set_error(vm, op, VM_e_stackoverflow); - break; - } -} G_STMT_END; -DEFUNC_OP_END - -DEFUNC_OP (private_loop_continue) -G_STMT_START -{ - HgStack *estack = hg_vm_get_estack(vm); - HgValueNode *nself, *nproc, *node; - - while (1) { - nself = hg_stack_index(estack, 0); - nproc = hg_stack_index(estack, 1); - - node = hg_object_copy((HgObject *)nproc); - if (node == NULL) { - _hg_operator_set_error(vm, op, VM_e_VMerror); - break; - } - hg_stack_push(estack, node); - retval = hg_stack_push(estack, nself); /* dummy */ - if (!retval) - _hg_operator_set_error(vm, op, VM_e_execstackoverflow); - break; - } -} G_STMT_END; -DEFUNC_OP_END - -DEFUNC_OP (private_repeat_continue) -G_STMT_START -{ - HgStack *estack = hg_vm_get_estack(vm); - HgValueNode *nself, *nproc, *nn, *node; - gint32 n; - - while (1) { - nself = hg_stack_index(estack, 0); - nproc = hg_stack_index(estack, 1); - nn = hg_stack_index(estack, 2); - - n = HG_VALUE_GET_INTEGER (nn); - if (n > 0) { - HG_VALUE_SET_INTEGER (nn, n - 1); - node = hg_object_copy((HgObject *)nproc); - if (node == NULL) { - _hg_operator_set_error(vm, op, VM_e_VMerror); - break; - } - hg_stack_push(estack, node); - retval = hg_stack_push(estack, nself); /* dummy */ - if (!retval) - _hg_operator_set_error(vm, op, VM_e_execstackoverflow); - break; - } - hg_stack_pop(estack); - hg_stack_pop(estack); - hg_stack_pop(estack); - retval = hg_stack_push(estack, nself); - /* it must be true */ - break; - } -} G_STMT_END; -DEFUNC_OP_END - -DEFUNC_OP (private_stopped_continue) -G_STMT_START -{ - HgStack *ostack = hg_vm_get_ostack(vm); - HgDict *error = hg_vm_get_dict_error(vm); - HgValueNode *node, *node2, *name; - HgMemPool *pool = hg_vm_get_current_pool(vm); - - name = hg_vm_get_name_node(vm, ".isstop"); - node = hg_dict_lookup(error, name); - if (node != NULL && - HG_IS_VALUE_BOOLEAN (node) && - HG_VALUE_GET_BOOLEAN (node) == TRUE) { - HG_VALUE_MAKE_BOOLEAN (pool, node2, TRUE); - HG_VALUE_SET_BOOLEAN (node, FALSE); - hg_dict_insert(pool, error, name, node); - hg_vm_clear_error(vm); - } else { - HG_VALUE_MAKE_BOOLEAN (pool, node2, FALSE); - } - retval = hg_stack_push(ostack, node2); - if (!retval) - _hg_operator_set_error(vm, op, VM_e_stackoverflow); -} G_STMT_END; -DEFUNC_OP_END - -DEFUNC_UNIMPLEMENTED_OP (private_findfont); -DEFUNC_UNIMPLEMENTED_OP (private_definefont); - -DEFUNC_OP (private_stringcvs) -G_STMT_START -{ - HgStack *ostack = hg_vm_get_ostack(vm); - guint depth = hg_stack_depth(ostack); - HgMemPool *pool = hg_vm_get_current_pool(vm); - HgValueNode *node; - HgString *hs; - - while (1) { - if (depth < 1) { - _hg_operator_set_error(vm, op, VM_e_stackunderflow); - break; - } - node = hg_stack_index(ostack, 0); - switch (HG_VALUE_GET_VALUE_TYPE (node)) { - case HG_TYPE_VALUE_BOOLEAN: - case HG_TYPE_VALUE_INTEGER: - case HG_TYPE_VALUE_REAL: - hs = hg_object_to_string((HgObject *)node); - break; - case HG_TYPE_VALUE_NAME: - hs = hg_string_new(pool, -1); - if (hs == NULL) { - _hg_operator_set_error(vm, op, VM_e_VMerror); - return retval; - } - hg_string_append(hs, HG_VALUE_GET_NAME (node), -1); - break; - case HG_TYPE_VALUE_STRING: - G_STMT_START { - if (hg_object_is_readable((HgObject *)node)) { - HgString *tmp = HG_VALUE_GET_STRING (node); - - hs = hg_string_new(pool, -1); - hg_string_append(hs, hg_string_get_string(tmp), - hg_string_maxlength(tmp)); - } else { - hs = hg_object_to_string((HgObject *)node); - } - } G_STMT_END; - break; - case HG_TYPE_VALUE_OPERATOR: - hs = hg_string_new(pool, -1); - if (hs == NULL) { - _hg_operator_set_error(vm, op, VM_e_VMerror); - return retval; - } - hg_string_append(hs, - hg_operator_get_name(HG_VALUE_GET_OPERATOR (node)), - -1); - break; - default: - hs = hg_string_new(pool, 16); - if (hs == NULL) { - _hg_operator_set_error(vm, op, VM_e_VMerror); - return retval; - } - hg_string_append(hs, "--nostringval--", -1); - break; - } - if (hs == NULL) { - _hg_operator_set_error(vm, op, VM_e_VMerror); - break; - } - hg_string_fix_string_size(hs); - HG_VALUE_MAKE_STRING (node, hs); - if (node == NULL) { - _hg_operator_set_error(vm, op, VM_e_VMerror); - break; - } - hg_stack_pop(ostack); - retval = hg_stack_push(ostack, node); - /* it must be true */ - break; - } -} G_STMT_END; -DEFUNC_OP_END - -DEFUNC_UNIMPLEMENTED_OP (private_undefinefont); - -DEFUNC_OP (private_write_eqeq_only) -G_STMT_START -{ - HgStack *ostack = hg_vm_get_ostack(vm); - guint depth = hg_stack_depth(ostack); - HgValueNode *n1, *n2; - HgFileObject *file; - HgString *hs; - - while (1) { - if (depth < 2) { - _hg_operator_set_error(vm, op, VM_e_stackunderflow); - break; - } - n2 = hg_stack_index(ostack, 0); - n1 = hg_stack_index(ostack, 1); - if (!HG_IS_VALUE_FILE (n1)) { - _hg_operator_set_error(vm, op, VM_e_typecheck); - break; - } - file = HG_VALUE_GET_FILE (n1); - hs = hg_object_to_string((HgObject *)n2); - if (hs == NULL) { - _hg_operator_set_error(vm, op, VM_e_VMerror); - break; - } else { - hg_file_object_write(file, - hg_string_get_string(hs), - sizeof (gchar), - hg_string_maxlength(hs)); - } - hg_stack_pop(ostack); - hg_stack_pop(ostack); - retval = TRUE; - break; - } -} G_STMT_END; -DEFUNC_OP_END - -DEFUNC_OP (abs) -G_STMT_START -{ - HgStack *ostack = hg_vm_get_ostack(vm); - HgValueNode *n, *node; - guint depth = hg_stack_depth(ostack); - HgMemPool *pool = hg_vm_get_current_pool(vm); - - while (1) { - if (depth < 1) { - _hg_operator_set_error(vm, op, VM_e_stackunderflow); - break; - } - n = hg_stack_index(ostack, 0); - if (HG_IS_VALUE_INTEGER (n)) { - HG_VALUE_MAKE_INTEGER (pool, node, abs(HG_VALUE_GET_INTEGER (n))); - } else if (HG_IS_VALUE_REAL (n)) { - HG_VALUE_MAKE_REAL (pool, node, fabs(HG_VALUE_GET_REAL (n))); - } else { - _hg_operator_set_error(vm, op, VM_e_typecheck); - break; - } - if (node == NULL) { - _hg_operator_set_error(vm, op, VM_e_VMerror); - break; - } - hg_stack_pop(ostack); - retval = hg_stack_push(ostack, node); - /* it must be true */ - break; - } -} G_STMT_END; -DEFUNC_OP_END - -DEFUNC_OP (add) -G_STMT_START -{ - HgStack *ostack = hg_vm_get_ostack(vm); - HgValueNode *n1, *n2; - HgMemPool *pool = hg_vm_get_current_pool(vm); - guint depth = hg_stack_depth(ostack); - gboolean integer = TRUE; - gdouble d1, d2, dr; - - while (1) { - if (depth < 2) { - _hg_operator_set_error(vm, op, VM_e_stackunderflow); - break; - } - n2 = hg_stack_index(ostack, 0); - n1 = hg_stack_index(ostack, 1); - if (HG_IS_VALUE_INTEGER (n1)) - d1 = HG_VALUE_GET_REAL_FROM_INTEGER (n1); - else if (HG_IS_VALUE_REAL (n1)) { - d1 = HG_VALUE_GET_REAL (n1); - integer = FALSE; - } else { - _hg_operator_set_error(vm, op, VM_e_typecheck); - break; - } - if (HG_IS_VALUE_INTEGER (n2)) - d2 = HG_VALUE_GET_REAL_FROM_INTEGER (n2); - else if (HG_IS_VALUE_REAL (n2)) { - d2 = HG_VALUE_GET_REAL (n2); - integer = FALSE; - } else { - _hg_operator_set_error(vm, op, VM_e_typecheck); - break; - } - dr = d1 + d2; - if (integer && dr <= G_MAXINT32 && dr >= G_MININT32) { - HG_VALUE_MAKE_INTEGER (pool, n1, (gint32)dr); - } else { - HG_VALUE_MAKE_REAL (pool, n1, dr); - } - if (n1 == NULL) { - _hg_operator_set_error(vm, op, VM_e_VMerror); - break; - } - hg_stack_pop(ostack); - hg_stack_pop(ostack); - retval = hg_stack_push(ostack, n1); - /* it must be true */ - break; - } -} G_STMT_END; -DEFUNC_OP_END - -DEFUNC_OP (aload) -G_STMT_START -{ - HgStack *ostack = hg_vm_get_ostack(vm); - guint depth = hg_stack_depth(ostack), len, i; - HgValueNode *narray; - HgArray *array; - - while (1) { - if (depth < 1) { - _hg_operator_set_error(vm, op, VM_e_stackunderflow); - break; - } - narray = hg_stack_index(ostack, 0); - if (!HG_IS_VALUE_ARRAY (narray)) { - _hg_operator_set_error(vm, op, VM_e_typecheck); - break; - } - if (!hg_object_is_readable((HgObject *)narray)) { - _hg_operator_set_error(vm, op, VM_e_invalidaccess); - break; - } - hg_stack_pop(ostack); - array = HG_VALUE_GET_ARRAY (narray); - len = hg_array_length(array); - for (i = 0; i < len; i++) { - hg_stack_push(ostack, hg_array_index(array, i)); - } - retval = hg_stack_push(ostack, narray); - if (!retval) - _hg_operator_set_error(vm, op, VM_e_stackoverflow); - break; - } -} G_STMT_END; -DEFUNC_OP_END - -DEFUNC_OP (and) -G_STMT_START -{ - HgStack *ostack = hg_vm_get_ostack(vm); - guint depth = hg_stack_depth(ostack); - HgValueNode *n1, *n2; - HgMemPool *pool = hg_vm_get_current_pool(vm); - - while (1) { - if (depth < 2) { - _hg_operator_set_error(vm, op, VM_e_stackunderflow); - break; - } - n2 = hg_stack_index(ostack, 0); - n1 = hg_stack_index(ostack, 1); - if (HG_IS_VALUE_BOOLEAN (n1) && - HG_IS_VALUE_BOOLEAN (n2)) { - gboolean result = HG_VALUE_GET_BOOLEAN (n1) & HG_VALUE_GET_BOOLEAN (n2); - - HG_VALUE_MAKE_BOOLEAN (pool, n1, result); - if (n1 == NULL) { - _hg_operator_set_error(vm, op, VM_e_VMerror); - break; - } - } else if (HG_IS_VALUE_INTEGER (n1) && - HG_IS_VALUE_INTEGER (n2)) { - gint32 result = HG_VALUE_GET_INTEGER (n1) & HG_VALUE_GET_INTEGER (n2); - - HG_VALUE_MAKE_INTEGER (pool, n1, result); - if (n1 == NULL) { - _hg_operator_set_error(vm, op, VM_e_VMerror); - break; - } - } else { - _hg_operator_set_error(vm, op, VM_e_typecheck); - break; - } - hg_stack_pop(ostack); - hg_stack_pop(ostack); - retval = hg_stack_push(ostack, n1); - /* it must be true */ - break; - } -} G_STMT_END; -DEFUNC_OP_END - -DEFUNC_OP (arc) -G_STMT_START -{ - HgStack *ostack = hg_vm_get_ostack(vm); - guint depth = hg_stack_depth(ostack); - HgValueNode *nx, *ny, *nr, *nangle1, *nangle2; - gdouble dx, dy, dr, dangle1, dangle2; - - while (1) { - if (depth < 5) { - _hg_operator_set_error(vm, op, VM_e_stackunderflow); - break; - } - nangle2 = hg_stack_index(ostack, 0); - nangle1 = hg_stack_index(ostack, 1); - nr = hg_stack_index(ostack, 2); - ny = hg_stack_index(ostack, 3); - nx = hg_stack_index(ostack, 4); - if (HG_IS_VALUE_INTEGER (nx)) { - dx = HG_VALUE_GET_REAL_FROM_INTEGER (nx); - } else if (HG_IS_VALUE_REAL (nx)) { - dx = HG_VALUE_GET_REAL (nx); - } else { - _hg_operator_set_error(vm, op, VM_e_typecheck); - break; - } - if (HG_IS_VALUE_INTEGER (ny)) { - dy = HG_VALUE_GET_REAL_FROM_INTEGER (ny); - } else if (HG_IS_VALUE_REAL (ny)) { - dy = HG_VALUE_GET_REAL (ny); - } else { - _hg_operator_set_error(vm, op, VM_e_typecheck); - break; - } - if (HG_IS_VALUE_INTEGER (nr)) { - dr = HG_VALUE_GET_REAL_FROM_INTEGER (nr); - } else if (HG_IS_VALUE_REAL (nr)) { - dr = HG_VALUE_GET_REAL (nr); - } else { - _hg_operator_set_error(vm, op, VM_e_typecheck); - break; - } - if (HG_IS_VALUE_INTEGER (nangle1)) { - dangle1 = HG_VALUE_GET_REAL_FROM_INTEGER (nangle1); - } else if (HG_IS_VALUE_REAL (nangle1)) { - dangle1 = HG_VALUE_GET_REAL (nangle1); - } else { - _hg_operator_set_error(vm, op, VM_e_typecheck); - break; - } - if (HG_IS_VALUE_INTEGER (nangle2)) { - dangle2 = HG_VALUE_GET_REAL_FROM_INTEGER (nangle2); - } else if (HG_IS_VALUE_REAL (nangle2)) { - dangle2 = HG_VALUE_GET_REAL (nangle2); - } else { - _hg_operator_set_error(vm, op, VM_e_typecheck); - break; - } - retval = hg_graphic_state_path_arc(hg_graphics_get_state(hg_vm_get_graphics(vm)), - dx, dy, dr, - dangle1 * (2 * M_PI / 360), - dangle2 * (2 * M_PI / 360)); - if (!retval) { - _hg_operator_set_error(vm, op, VM_e_VMerror); - break; - } - hg_stack_pop(ostack); - hg_stack_pop(ostack); - hg_stack_pop(ostack); - hg_stack_pop(ostack); - hg_stack_pop(ostack); - break; - } -} G_STMT_END; -DEFUNC_OP_END - -DEFUNC_UNIMPLEMENTED_OP (arcn); -DEFUNC_UNIMPLEMENTED_OP (arcto); - -DEFUNC_OP (array) -G_STMT_START -{ - HgStack *ostack = hg_vm_get_ostack(vm); - guint depth = hg_stack_depth(ostack); - HgValueNode *node, *n; - HgMemPool *pool = hg_vm_get_current_pool(vm); - gint32 size, i; - HgArray *array; - - while (1) { - if (depth < 1) { - _hg_operator_set_error(vm, op, VM_e_stackunderflow); - break; - } - node = hg_stack_index(ostack, 0); - if (!HG_IS_VALUE_INTEGER (node)) { - _hg_operator_set_error(vm, op, VM_e_typecheck); - break; - } - size = HG_VALUE_GET_INTEGER (node); - if (size < 0 || size > 65535) { - _hg_operator_set_error(vm, op, VM_e_rangecheck); - break; - } - array = hg_array_new(pool, size); - if (array == NULL) { - _hg_operator_set_error(vm, op, VM_e_VMerror); - break; - } - n = hg_dict_lookup_with_string(hg_vm_get_dict_systemdict(vm), "null"); - if (n == NULL) { - _hg_operator_set_error(vm, op, VM_e_VMerror); - return FALSE; - } - for (i = 0; i < size; i++) { - hg_array_append(array, n); - } - HG_VALUE_MAKE_ARRAY (node, array); - if (node == NULL) { - _hg_operator_set_error(vm, op, VM_e_VMerror); - break; - } - hg_stack_pop(ostack); - retval = hg_stack_push(ostack, node); - /* it must be true */ - break; - } -} G_STMT_END; -DEFUNC_OP_END - -DEFUNC_UNIMPLEMENTED_OP (ashow); - -DEFUNC_OP (astore) -G_STMT_START -{ - HgStack *ostack = hg_vm_get_ostack(vm); - guint depth = hg_stack_depth(ostack), len, i; - HgValueNode *node, *narray; - HgArray *array; - HgMemObject *obj; - - while (1) { - if (depth < 1) { - _hg_operator_set_error(vm, op, VM_e_stackunderflow); - break; - } - narray = hg_stack_index(ostack, 0); - if (!HG_IS_VALUE_ARRAY (narray)) { - _hg_operator_set_error(vm, op, VM_e_typecheck); - break; - } - if (!hg_object_is_writable((HgObject *)narray)) { - _hg_operator_set_error(vm, op, VM_e_invalidaccess); - break; - } - array = HG_VALUE_GET_ARRAY (narray); - len = hg_array_length(array); - if (depth < (len + 1)) { - _hg_operator_set_error(vm, op, VM_e_stackunderflow); - break; - } - hg_mem_get_object__inline(array, obj); - for (i = 0; i < len; i++) { - node = hg_stack_index(ostack, len - i); - if (!hg_mem_pool_is_own_object(obj->pool, node)) { - _hg_operator_set_error(vm, op, VM_e_invalidaccess); - return FALSE; - } - hg_array_replace(array, node, i); - } - for (i = 0; i <= len; i++) - hg_stack_pop(ostack); - retval = hg_stack_push(ostack, narray); - /* it must be true */ - break; - } -} G_STMT_END; -DEFUNC_OP_END - -DEFUNC_OP (atan) -G_STMT_START -{ - HgStack *ostack = hg_vm_get_ostack(vm); - guint depth = hg_stack_depth(ostack); - HgValueNode *n1, *n2, *node; - gdouble d1, d2, result; - - while (1) { - if (depth < 2) { - _hg_operator_set_error(vm, op, VM_e_stackunderflow); - break; - } - n2 = hg_stack_index(ostack, 0); - n1 = hg_stack_index(ostack, 1); - if (HG_IS_VALUE_INTEGER (n1)) { - d1 = HG_VALUE_GET_REAL_FROM_INTEGER (n1); - } else if (HG_IS_VALUE_REAL (n1)) { - d1 = HG_VALUE_GET_REAL (n1); - } else { - _hg_operator_set_error(vm, op, VM_e_typecheck); - break; - } - if (HG_IS_VALUE_INTEGER (n2)) { - d2 = HG_VALUE_GET_REAL_FROM_INTEGER (n2); - } else if (HG_IS_VALUE_REAL (n2)) { - d2 = HG_VALUE_GET_REAL (n2); - } else { - _hg_operator_set_error(vm, op, VM_e_typecheck); - break; - } - if (HG_VALUE_REAL_SIMILAR (d1, 0) && HG_VALUE_REAL_SIMILAR (d2, 0)) { - _hg_operator_set_error(vm, op, VM_e_undefinedresult); - break; - } - result = atan2(d1, d2) / (2 * M_PI / 360); - if (result < 0) - result = 360.0 + result; - HG_VALUE_MAKE_REAL (hg_vm_get_current_pool(vm), - node, result); - if (node == NULL) { - _hg_operator_set_error(vm, op, VM_e_VMerror); - break; - } - hg_stack_pop(ostack); - hg_stack_pop(ostack); - retval = hg_stack_push(ostack, node); - /* it must be true */ - break; - } -} G_STMT_END; -DEFUNC_OP_END - -DEFUNC_UNIMPLEMENTED_OP (awidthshow); - -DEFUNC_OP (begin) -G_STMT_START -{ - HgStack *ostack = hg_vm_get_ostack(vm); - HgStack *dstack = hg_vm_get_dstack(vm); - guint depth = hg_stack_depth(ostack); - HgValueNode *node; - HgDict *dict; - - while (1) { - if (depth < 1) { - _hg_operator_set_error(vm, op, VM_e_stackunderflow); - break; - } - node = hg_stack_index(ostack, 0); - if (!HG_IS_VALUE_DICT (node)) { - _hg_operator_set_error(vm, op, VM_e_typecheck); - break; - } - dict = HG_VALUE_GET_DICT (node); - if (!hg_object_is_readable((HgObject *)dict)) { - _hg_operator_set_error(vm, op, VM_e_invalidaccess); - break; - } - retval = hg_stack_push(dstack, node); - if (!retval) { - _hg_operator_set_error(vm, op, VM_e_dictstackoverflow); - break; - } - hg_stack_pop(ostack); - break; - } -} G_STMT_END; -DEFUNC_OP_END - -DEFUNC_OP (bind) -G_STMT_START -{ - HgStack *ostack = hg_vm_get_ostack(vm); - guint length = hg_stack_depth(ostack), array_len, i; - HgValueNode *n, *node; - HgArray *array; - - while (1) { - if (length < 1) { - _hg_operator_set_error(vm, op, VM_e_stackunderflow); - break; - } - n = hg_stack_index(ostack, 0); - if (!HG_IS_VALUE_ARRAY (n)) { - _hg_operator_set_error(vm, op, VM_e_typecheck); - break; - } - node = hg_dict_lookup_with_string(hg_vm_get_dict_statusdict(vm), "%initialized"); - if (node != NULL && HG_VALUE_GET_BOOLEAN (node) != FALSE) { - if (!hg_object_is_writable((HgObject *)n)) { - /* just ignore it */ - retval = TRUE; - break; - } - } - array = HG_VALUE_GET_ARRAY (n); - array_len = hg_array_length(array); - for (i = 0; i < array_len; i++) { - n = hg_array_index(array, i); - if (hg_object_is_executable((HgObject *)n)) { - if (HG_IS_VALUE_ARRAY (n)) { - if (!hg_stack_push(ostack, n)) { - _hg_operator_set_error(vm, op, VM_e_stackoverflow); - } else { - _hg_operator_op_bind(op, vm); - hg_stack_pop(ostack); - } - } else if (HG_IS_VALUE_NAME (n)) { - node = hg_vm_lookup(vm, n); - if (node != NULL && HG_IS_VALUE_OPERATOR (node)) { - hg_array_replace_forcibly(array, node, i, TRUE); - } - } - } - } - retval = TRUE; - break; - } -} G_STMT_END; -DEFUNC_OP_END - -DEFUNC_OP (bitshift) -G_STMT_START -{ - HgStack *ostack = hg_vm_get_ostack(vm); - guint depth = hg_stack_depth(ostack); - HgValueNode *n1, *n2, *result; - HgMemPool *pool = hg_vm_get_current_pool(vm); - gint32 i1, i2; - - while (1) { - if (depth < 2) { - _hg_operator_set_error(vm, op, VM_e_stackunderflow); - break; - } - n2 = hg_stack_index(ostack, 0); - n1 = hg_stack_index(ostack, 1); - if (!HG_IS_VALUE_INTEGER (n1) || - !HG_IS_VALUE_INTEGER (n2)) { - _hg_operator_set_error(vm, op, VM_e_typecheck); - break; - } - i1 = HG_VALUE_GET_INTEGER (n1); - i2 = HG_VALUE_GET_INTEGER (n2); - if (i2 < 0) { - HG_VALUE_MAKE_INTEGER (pool, result, i1 >> abs(i2)); - } else { - HG_VALUE_MAKE_INTEGER (pool, result, i1 << i2); - } - hg_stack_pop(ostack); - hg_stack_pop(ostack); - retval = hg_stack_push(ostack, result); - /* it must be true */ - break; - } -} G_STMT_END; -DEFUNC_OP_END - -DEFUNC_OP (bytesavailable) -G_STMT_START -{ - HgStack *ostack = hg_vm_get_ostack(vm); - guint depth = hg_stack_depth(ostack); - HgMemPool *pool = hg_vm_get_current_pool(vm); - HgValueNode *n; - HgFileObject *file; - gint32 result; - gssize cur_pos; - - while (1) { - if (depth < 1) { - _hg_operator_set_error(vm, op, VM_e_stackunderflow); - break; - } - n = hg_stack_index(ostack, 0); - if (!HG_IS_VALUE_FILE (n)) { - _hg_operator_set_error(vm, op, VM_e_typecheck); - break; - } - if (!hg_object_is_readable((HgObject *)n)) { - _hg_operator_set_error(vm, op, VM_e_invalidaccess); - break; - } - file = HG_VALUE_GET_FILE (n); - if (!hg_file_object_is_readable(file)) { - _hg_operator_set_error(vm, op, VM_e_invalidaccess); - break; - } - cur_pos = hg_file_object_seek(file, 0, HG_FILE_POS_CURRENT); - result = hg_file_object_seek(file, 0, HG_FILE_POS_END); - hg_file_object_seek(file, cur_pos, HG_FILE_POS_BEGIN); - HG_VALUE_MAKE_INTEGER (pool, n, result); - hg_stack_pop(ostack); - retval = hg_stack_push(ostack, n); - /* it must be true */ - break; - } -} G_STMT_END; -DEFUNC_OP_END - -DEFUNC_UNIMPLEMENTED_OP (cachestatus); - -DEFUNC_OP (ceiling) -G_STMT_START -{ - HgStack *ostack = hg_vm_get_ostack(vm); - guint depth = hg_stack_depth(ostack); - HgMemPool *pool = hg_vm_get_current_pool(vm); - HgValueNode *n; - gdouble result; - - while (1) { - if (depth < 1) { - _hg_operator_set_error(vm, op, VM_e_stackunderflow); - break; - } - n = hg_stack_index(ostack, 0); - if (HG_IS_VALUE_INTEGER (n)) { - /* nothing to do */ - retval = TRUE; - } else if (HG_IS_VALUE_REAL (n)) { - result = ceil(HG_VALUE_GET_REAL (n)); - HG_VALUE_MAKE_REAL (pool, n, result); - hg_stack_pop(ostack); - retval = hg_stack_push(ostack, n); - /* it must be true */ - } else { - _hg_operator_set_error(vm, op, VM_e_typecheck); - } - break; - } -} G_STMT_END; -DEFUNC_OP_END - -DEFUNC_UNIMPLEMENTED_OP (charpath); - -DEFUNC_OP (clear) -G_STMT_START -{ - HgStack *ostack = hg_vm_get_ostack(vm); - - hg_stack_clear(ostack); - retval = TRUE; -} G_STMT_END; -DEFUNC_OP_END - -DEFUNC_OP (cleardictstack) -G_STMT_START -{ - HgStack *dstack = hg_vm_get_dstack(vm); - guint depth = hg_stack_depth(dstack); - gint i = 0; - HgVMEmulationType type = hg_vm_get_emulation_level(vm); - - switch (type) { - case VM_EMULATION_LEVEL_1: - i = depth - 2; - break; - case VM_EMULATION_LEVEL_2: - i = depth - 3; - break; - default: - hg_log_warning("Unknown emulation level %d\n", type); - break; - } - if (i < 0) { - _hg_operator_set_error(vm, op, VM_e_VMerror); - } else { - for (; i > 0; i--) - hg_stack_pop(dstack); - retval = TRUE; - } -} G_STMT_END; -DEFUNC_OP_END - -DEFUNC_OP (cleartomark) -G_STMT_START -{ - HgStack *ostack = hg_vm_get_ostack(vm); - guint depth = hg_stack_depth(ostack), i, j; - HgValueNode *node; - - for (i = 0; i < depth; i++) { - node = hg_stack_index(ostack, i); - if (HG_IS_VALUE_MARK (node)) { - for (j = 0; j <= i; j++) { - hg_stack_pop(ostack); - } - retval = TRUE; - break; - } - } - if (i == depth) - _hg_operator_set_error(vm, op, VM_e_unmatchedmark); -} G_STMT_END; -DEFUNC_OP_END - -DEFUNC_UNIMPLEMENTED_OP (clip); - -DEFUNC_OP (clippath) -G_STMT_START -{ - retval = hg_graphic_state_path_from_clip(hg_graphics_get_state(hg_vm_get_graphics(vm))); - if (!retval) - _hg_operator_set_error(vm, op, VM_e_VMerror); -} G_STMT_END; -DEFUNC_OP_END - -DEFUNC_OP (closefile) -G_STMT_START -{ - HgStack *ostack = hg_vm_get_ostack(vm); - guint depth = hg_stack_depth(ostack); - HgValueNode *n; - HgFileObject *file; - - while (1) { - if (depth < 1) { - _hg_operator_set_error(vm, op, VM_e_stackunderflow); - break; - } - n = hg_stack_index(ostack, 0); - if (!HG_IS_VALUE_FILE (n)) { - _hg_operator_set_error(vm, op, VM_e_typecheck); - break; - } - if (!hg_object_is_readable((HgObject *)n)) { - _hg_operator_set_error(vm, op, VM_e_invalidaccess); - break; - } - file = HG_VALUE_GET_FILE (n); - if (hg_file_object_is_writable(file)) { - if (!hg_object_is_writable((HgObject *)file)) { - _hg_operator_set_error(vm, op, VM_e_invalidaccess); - break; - } - hg_file_object_flush(file); - } - hg_file_object_close(file); - hg_stack_pop(ostack); - retval = TRUE; - break; - } -} G_STMT_END; -DEFUNC_OP_END - -DEFUNC_OP (closepath) -G_STMT_START -{ - retval = hg_graphic_state_path_close(hg_graphics_get_state(hg_vm_get_graphics(vm))); - if (!retval) - _hg_operator_set_error(vm, op, VM_e_VMerror); -} G_STMT_END; -DEFUNC_OP_END - -DEFUNC_OP (concat) -G_STMT_START -{ - HgStack *ostack = hg_vm_get_ostack(vm); - guint depth = hg_stack_depth(ostack), i; - HgValueNode *node; - HgMemPool *pool = hg_vm_get_current_pool(vm); - HgArray *matrix; - gdouble dmatrix[6]; - HgMatrix *mtx, *new_ctm; - HgGraphicState *gstate = hg_graphics_get_state(hg_vm_get_graphics(vm)); - - while (1) { - if (depth < 1) { - _hg_operator_set_error(vm, op, VM_e_stackunderflow); - break; - } - node = hg_stack_index(ostack, 0); - if (!HG_IS_VALUE_ARRAY (node)) { - _hg_operator_set_error(vm, op, VM_e_typecheck); - break; - } - if (!hg_object_is_readable((HgObject *)node)) { - _hg_operator_set_error(vm, op, VM_e_invalidaccess); - break; - } - matrix = HG_VALUE_GET_ARRAY (node); - if (hg_array_length(matrix) != 6) { - _hg_operator_set_error(vm, op, VM_e_rangecheck); - break; - } - for (i = 0; i < 6; i++) { - node = hg_array_index(matrix, i); - if (HG_IS_VALUE_INTEGER (node)) { - dmatrix[i] = HG_VALUE_GET_REAL_FROM_INTEGER (node); - } else if (HG_IS_VALUE_REAL (node)) { - dmatrix[i] = HG_VALUE_GET_REAL (node); - } else { - _hg_operator_set_error(vm, op, VM_e_typecheck); - break; - } - } - if (i == 6) { - mtx = hg_matrix_new(pool, - dmatrix[0], dmatrix[1], dmatrix[2], - dmatrix[3], dmatrix[4], dmatrix[5]); - if (mtx == NULL) { - _hg_operator_set_error(vm, op, VM_e_VMerror); - break; - } - new_ctm = hg_matrix_multiply(pool, mtx, &gstate->ctm); - if (new_ctm == NULL) { - _hg_operator_set_error(vm, op, VM_e_VMerror); - break; - } - memcpy(&gstate->ctm, new_ctm, sizeof (HgMatrix)); - hg_mem_free(mtx); - hg_mem_free(new_ctm); - retval = hg_path_matrix(gstate->path, - gstate->ctm.xx, gstate->ctm.yx, - gstate->ctm.xy, gstate->ctm.yy, - gstate->ctm.x0, gstate->ctm.y0); - if (!retval) { - _hg_operator_set_error(vm, op, VM_e_VMerror); - break; - } - hg_stack_pop(ostack); - } - break; - } -} G_STMT_END; -DEFUNC_OP_END - -DEFUNC_OP (concatmatrix) -G_STMT_START -{ - HgStack *ostack = hg_vm_get_ostack(vm); - guint depth = hg_stack_depth(ostack), i; - HgValueNode *n1, *n2, *n3, *node; - HgArray *m1, *m2, *m3; - gdouble d1[6], d2[6]; - HgMatrix *mtx1, *mtx2, *mtx3; - HgMemPool *pool = hg_vm_get_current_pool(vm); - HgMemObject *obj; - - while (1) { - if (depth < 3) { - _hg_operator_set_error(vm, op, VM_e_stackunderflow); - break; - } - n3 = hg_stack_index(ostack, 0); - n2 = hg_stack_index(ostack, 1); - n1 = hg_stack_index(ostack, 2); - if (!HG_IS_VALUE_ARRAY (n1) || - !HG_IS_VALUE_ARRAY (n2) || - !HG_IS_VALUE_ARRAY (n3)) { - _hg_operator_set_error(vm, op, VM_e_typecheck); - break; - } - if (!hg_object_is_readable((HgObject *)n1) || - !hg_object_is_readable((HgObject *)n2) || - !hg_object_is_writable((HgObject *)n3)) { - _hg_operator_set_error(vm, op, VM_e_invalidaccess); - break; - } - m1 = HG_VALUE_GET_ARRAY (n1); - m2 = HG_VALUE_GET_ARRAY (n2); - m3 = HG_VALUE_GET_ARRAY (n3); - if (hg_array_length(m1) != 6 || - hg_array_length(m2) != 6 || - hg_array_length(m3) != 6) { - _hg_operator_set_error(vm, op, VM_e_rangecheck); - break; - } - for (i = 0; i < 6; i++) { - node = hg_array_index(m1, i); - if (HG_IS_VALUE_INTEGER (node)) { - d1[i] = HG_VALUE_GET_REAL_FROM_INTEGER (node); - } else if (HG_IS_VALUE_REAL (node)) { - d1[i] = HG_VALUE_GET_REAL (node); - } else { - _hg_operator_set_error(vm, op, VM_e_typecheck); - break; - } - node = hg_array_index(m2, i); - if (HG_IS_VALUE_INTEGER (node)) { - d2[i] = HG_VALUE_GET_REAL_FROM_INTEGER (node); - } else if (HG_IS_VALUE_REAL (node)) { - d2[i] = HG_VALUE_GET_REAL (node); - } else { - _hg_operator_set_error(vm, op, VM_e_typecheck); - break; - } - } - mtx1 = hg_matrix_new(pool, d1[0], d1[1], d1[2], d1[3], d1[4], d1[5]); - mtx2 = hg_matrix_new(pool, d2[0], d2[1], d2[2], d2[3], d2[4], d2[5]); - if (mtx1 == NULL || mtx2 == NULL) { - _hg_operator_set_error(vm, op, VM_e_VMerror); - break; - } - mtx3 = hg_matrix_multiply(pool, mtx1, mtx2); - hg_mem_get_object__inline(m3, obj); - HG_VALUE_MAKE_REAL (obj->pool, node, mtx3->xx); - hg_array_replace(m3, node, 0); - HG_VALUE_MAKE_REAL (obj->pool, node, mtx3->yx); - hg_array_replace(m3, node, 1); - HG_VALUE_MAKE_REAL (obj->pool, node, mtx3->xy); - hg_array_replace(m3, node, 2); - HG_VALUE_MAKE_REAL (obj->pool, node, mtx3->yy); - hg_array_replace(m3, node, 3); - HG_VALUE_MAKE_REAL (obj->pool, node, mtx3->x0); - hg_array_replace(m3, node, 4); - HG_VALUE_MAKE_REAL (obj->pool, node, mtx3->y0); - hg_array_replace(m3, node, 5); - hg_mem_free(mtx1); - hg_mem_free(mtx2); - hg_mem_free(mtx3); - hg_stack_pop(ostack); - hg_stack_pop(ostack); - hg_stack_pop(ostack); - retval = hg_stack_push(ostack, n3); - /* it must be true */ - break; - } -} G_STMT_END; -DEFUNC_OP_END - -static gboolean -_hg_operator_copy__traverse_dict(gpointer key, - gpointer val, - gpointer data) -{ - HgValueNode *nkey = key, *nval = val, *nnkey, *nnval; - HgDict *dict = data; - HgMemObject *obj; - - hg_mem_get_object__inline(key, obj); - nnkey = hg_object_dup((HgObject *)nkey); - nnval = hg_object_dup((HgObject *)nval); - hg_dict_insert(obj->pool, dict, nnkey, nnval); - - return TRUE; -} - -DEFUNC_OP (copy) -G_STMT_START -{ - HgStack *ostack = hg_vm_get_ostack(vm); - guint depth = hg_stack_depth(ostack); - HgValueNode *node, *n2, *dup_node; - - while (1) { - if (depth < 1) { - _hg_operator_set_error(vm, op, VM_e_stackunderflow); - break; - } - node = hg_stack_index(ostack, 0); - if (HG_IS_VALUE_INTEGER (node)) { - /* stack copy */ - guint32 i, n = HG_VALUE_GET_INTEGER (node); - - if (n < 0 || n >= depth) { - _hg_operator_set_error(vm, op, VM_e_rangecheck); - break; - } - hg_stack_pop(ostack); - for (i = 0; i < n; i++) { - node = hg_stack_index(ostack, n - 1); - dup_node = hg_object_dup((HgObject *)node); - retval = hg_stack_push(ostack, dup_node); - if (!retval) { - _hg_operator_set_error(vm, op, VM_e_stackoverflow); - break; - } - } - if (n == 0) - retval = TRUE; - } else { - if (depth < 2) { - _hg_operator_set_error(vm, op, VM_e_stackunderflow); - break; - } - n2 = hg_stack_index(ostack, 1); - if (HG_IS_VALUE_ARRAY (node) && - HG_IS_VALUE_ARRAY (n2)) { - HgArray *a1, *a2; - guint len1, len2, i; - - if (!hg_object_is_writable((HgObject *)node) || - !hg_object_is_readable((HgObject *)n2)) { - _hg_operator_set_error(vm, op, VM_e_invalidaccess); - break; - } - a2 = HG_VALUE_GET_ARRAY (node); - a1 = HG_VALUE_GET_ARRAY (n2); - len1 = hg_array_length(a1); - len2 = hg_array_length(a2); - if (len1 > len2) { - _hg_operator_set_error(vm, op, VM_e_rangecheck); - break; - } - for (i = 0; i < len1; i++) { - node = hg_array_index(a1, i); - dup_node = hg_object_dup((HgObject *)node); - if (dup_node == NULL) { - _hg_operator_set_error(vm, op, VM_e_VMerror); - return retval; - } - hg_array_replace(a2, dup_node, i); - } - if (len2 > len1) { - HgMemObject *obj; - - hg_mem_get_object__inline(a2, obj); - /* need to make a subarray for that */ - a2 = hg_array_make_subarray(obj->pool, a2, 0, len1 - 1); - } - HG_VALUE_MAKE_ARRAY (dup_node, a2); - } else if (HG_IS_VALUE_DICT (node) && - HG_IS_VALUE_DICT (n2)) { - HgDict *d1, *d2; - HgVMEmulationType type = hg_vm_get_emulation_level(vm); - - d2 = HG_VALUE_GET_DICT (node); - d1 = HG_VALUE_GET_DICT (n2); - if (!hg_object_is_readable((HgObject *)d1) || - !hg_object_is_writable((HgObject *)d2)) { - _hg_operator_set_error(vm, op, VM_e_invalidaccess); - break; - } - if (type == VM_EMULATION_LEVEL_1) { - if (hg_dict_length(d2) != 0 || - hg_dict_maxlength(d1) != hg_dict_maxlength(d2)) { - _hg_operator_set_error(vm, op, VM_e_rangecheck); - break; - } - } - hg_dict_traverse(d1, _hg_operator_copy__traverse_dict, d2); - HG_VALUE_MAKE_DICT (dup_node, d2); - } else if (HG_IS_VALUE_STRING (node) && - HG_IS_VALUE_STRING (n2)) { - HgString *s1, *s2; - guint len1, mlen1, mlen2, i; - gchar c; - - if (!hg_object_is_writable((HgObject *)node) || - !hg_object_is_readable((HgObject *)n2)) { - _hg_operator_set_error(vm, op, VM_e_invalidaccess); - break; - } - s2 = HG_VALUE_GET_STRING (node); - s1 = HG_VALUE_GET_STRING (n2); - len1 = hg_string_length(s1); - mlen1 = hg_string_maxlength(s1); - mlen2 = hg_string_maxlength(s2); - if (mlen1 > mlen2) { - _hg_operator_set_error(vm, op, VM_e_rangecheck); - break; - } - for (i = 0; i < len1; i++) { - c = hg_string_index(s1, i); - hg_string_insert_c(s2, c, i); - } - if (mlen2 > mlen1) { - HgMemObject *obj; - - hg_mem_get_object__inline(s2, obj); - /* need to make a substring for that */ - s2 = hg_string_make_substring(obj->pool, s2, 0, len1 - 1); - } - HG_VALUE_MAKE_STRING (dup_node, s2); - } else { - _hg_operator_set_error(vm, op, VM_e_typecheck); - break; - } - hg_stack_pop(ostack); - hg_stack_pop(ostack); - retval = hg_stack_push(ostack, dup_node); - /* it must be true */ - } - break; - } -} G_STMT_END; -DEFUNC_OP_END - -DEFUNC_UNIMPLEMENTED_OP (copypage); - -DEFUNC_OP (cos) -G_STMT_START -{ - HgStack *ostack = hg_vm_get_ostack(vm); - guint depth = hg_stack_depth(ostack); - HgValueNode *node; - gdouble d; - - while (1) { - if (depth < 1) { - _hg_operator_set_error(vm, op, VM_e_stackunderflow); - break; - } - node = hg_stack_index(ostack, 0); - if (HG_IS_VALUE_INTEGER (node)) { - d = HG_VALUE_GET_REAL_FROM_INTEGER (node); - } else if (HG_IS_VALUE_REAL (node)) { - d = HG_VALUE_GET_REAL (node); - } else { - _hg_operator_set_error(vm, op, VM_e_typecheck); - break; - } - HG_VALUE_MAKE_REAL (hg_vm_get_current_pool(vm), - node, - cos(d / 180 * M_PI)); - if (node == NULL) { - _hg_operator_set_error(vm, op, VM_e_VMerror); - break; - } - hg_stack_pop(ostack); - retval = hg_stack_push(ostack, node); - /* it must be true */ - break; - } -} G_STMT_END; -DEFUNC_OP_END - -DEFUNC_OP (count) -G_STMT_START -{ - HgStack *ostack = hg_vm_get_ostack(vm); - guint depth = hg_stack_depth(ostack); - HgValueNode *node; - - HG_VALUE_MAKE_INTEGER (hg_vm_get_current_pool(vm), node, depth); - if (node == NULL) { - _hg_operator_set_error(vm, op, VM_e_VMerror); - } else { - retval = hg_stack_push(ostack, node); - if (!retval) - _hg_operator_set_error(vm, op, VM_e_stackoverflow); - } -} G_STMT_END; -DEFUNC_OP_END - -DEFUNC_OP (countdictstack) -G_STMT_START -{ - HgStack *ostack = hg_vm_get_ostack(vm); - HgStack *dstack = hg_vm_get_dstack(vm); - guint ddepth = hg_stack_depth(dstack); - HgValueNode *node; - - HG_VALUE_MAKE_INTEGER (hg_vm_get_current_pool(vm), node, ddepth); - if (node == NULL) { - _hg_operator_set_error(vm, op, VM_e_VMerror); - } else { - retval = hg_stack_push(ostack, node); - if (!retval) - _hg_operator_set_error(vm, op, VM_e_stackoverflow); - } -} G_STMT_END; -DEFUNC_OP_END - -DEFUNC_OP (countexecstack) -G_STMT_START -{ - HgStack *ostack = hg_vm_get_ostack(vm); - HgStack *estack = hg_vm_get_estack(vm); - guint edepth = hg_stack_depth(estack); - HgValueNode *node; - - HG_VALUE_MAKE_INTEGER (hg_vm_get_current_pool(vm), node, edepth); - if (node == NULL) { - _hg_operator_set_error(vm, op, VM_e_VMerror); - } else { - retval = hg_stack_push(ostack, node); - if (!retval) - _hg_operator_set_error(vm, op, VM_e_stackoverflow); - } -} G_STMT_END; -DEFUNC_OP_END - -DEFUNC_OP (counttomark) -G_STMT_START -{ - HgStack *ostack = hg_vm_get_ostack(vm); - guint depth = hg_stack_depth(ostack); - HgValueNode *node = NULL; - HgMemPool *pool = hg_vm_get_current_pool(vm); - gint32 i; - - for (i = 0; i < depth; i++) { - node = hg_stack_index(ostack, i); - if (HG_IS_VALUE_MARK (node)) { - HG_VALUE_MAKE_INTEGER (pool, node, i); - break; - } - } - if (i == depth || node == NULL) { - _hg_operator_set_error(vm, op, VM_e_unmatchedmark); - } else { - retval = hg_stack_push(ostack, node); - if (!retval) - _hg_operator_set_error(vm, op, VM_e_stackoverflow); - } -} G_STMT_END; -DEFUNC_OP_END - -DEFUNC_UNIMPLEMENTED_OP (currentdash); - -DEFUNC_OP (currentdict) -G_STMT_START -{ - HgStack *ostack = hg_vm_get_ostack(vm); - HgStack *dstack = hg_vm_get_dstack(vm); - HgValueNode *node, *dup_node; - - node = hg_stack_index(dstack, 0); - dup_node = hg_object_dup((HgObject *)node); - if (dup_node == NULL) { - _hg_operator_set_error(vm, op, VM_e_VMerror); - } else { - retval = hg_stack_push(ostack, dup_node); - if (!retval) - _hg_operator_set_error(vm, op, VM_e_stackoverflow); - } -} G_STMT_END; -DEFUNC_OP_END - -DEFUNC_OP (currentfile) -G_STMT_START -{ - HgStack *ostack = hg_vm_get_ostack(vm); - HgStack *estack = hg_vm_get_estack(vm); - guint edepth = hg_stack_depth(estack), i; - HgValueNode *n; - HgFileObject *file = NULL; - HgMemPool *pool = hg_vm_get_current_pool(vm); - - for (i = 0; i < edepth; i++) { - n = hg_stack_index(estack, i); - if (HG_IS_VALUE_FILE (n)) { - file = HG_VALUE_GET_FILE (n); - break; - } - } - if (file == NULL) { - /* make an invalid file object */ - file = hg_file_object_new(pool, HG_FILE_TYPE_BUFFER, HG_FILE_MODE_READ, "%invalid", "", 0); - } - HG_VALUE_MAKE_FILE (n, file); - if (n == NULL) { - _hg_operator_set_error(vm, op, VM_e_VMerror); - } else { - retval = hg_stack_push(ostack, n); - if (!retval) - _hg_operator_set_error(vm, op, VM_e_stackoverflow); - } -} G_STMT_END; -DEFUNC_OP_END - -DEFUNC_UNIMPLEMENTED_OP (currentflat); -DEFUNC_UNIMPLEMENTED_OP (currentfont); -DEFUNC_UNIMPLEMENTED_OP (currentgray); -DEFUNC_UNIMPLEMENTED_OP (currenthsbcolor); -DEFUNC_UNIMPLEMENTED_OP (currentlinecap); -DEFUNC_UNIMPLEMENTED_OP (currentlinejoin); -DEFUNC_UNIMPLEMENTED_OP (currentlinewidth); - -DEFUNC_OP (currentmatrix) -G_STMT_START -{ - HgStack *ostack = hg_vm_get_ostack(vm); - guint depth = hg_stack_depth(ostack); - HgValueNode *node; - HgArray *array; - HgGraphicState *gstate = hg_graphics_get_state(hg_vm_get_graphics(vm)); - - while (1) { - if (depth < 1) { - _hg_operator_set_error(vm, op, VM_e_stackunderflow); - break; - } - node = hg_stack_index(ostack, 0); - if (!HG_IS_VALUE_ARRAY (node)) { - _hg_operator_set_error(vm, op, VM_e_typecheck); - break; - } - if (!hg_object_is_readable((HgObject *)node) || - !hg_object_is_writable((HgObject *)node)) { - _hg_operator_set_error(vm, op, VM_e_invalidaccess); - break; - } - array = HG_VALUE_GET_ARRAY (node); - if (hg_array_length(array) != 6) { - _hg_operator_set_error(vm, op, VM_e_rangecheck); - break; - } - node = hg_array_index(array, 0); - HG_VALUE_SET_REAL (node, gstate->ctm.xx); - node = hg_array_index(array, 1); - HG_VALUE_SET_REAL (node, gstate->ctm.yx); - node = hg_array_index(array, 2); - HG_VALUE_SET_REAL (node, gstate->ctm.xy); - node = hg_array_index(array, 3); - HG_VALUE_SET_REAL (node, gstate->ctm.yy); - node = hg_array_index(array, 4); - HG_VALUE_SET_REAL (node, gstate->ctm.x0); - node = hg_array_index(array, 5); - HG_VALUE_SET_REAL (node, gstate->ctm.y0); - retval = TRUE; - break; - } -} G_STMT_END; -DEFUNC_OP_END - -DEFUNC_UNIMPLEMENTED_OP (currentmiterlimit); - -DEFUNC_OP (currentpoint) -G_STMT_START -{ - HgStack *ostack = hg_vm_get_ostack(vm); - HgGraphicState *gstate = hg_graphics_get_state(hg_vm_get_graphics(vm)); - HgMemPool *pool = hg_vm_get_current_pool(vm); - HgValueNode *node; - gdouble dx, dy; - - while (1) { - if (!hg_path_compute_current_point(gstate->path, &dx, &dy)) { - _hg_operator_set_error(vm, op, VM_e_nocurrentpoint); - break; - } - HG_VALUE_MAKE_REAL (pool, node, dx); - hg_stack_push(ostack, node); - HG_VALUE_MAKE_REAL (pool, node, dy); - retval = hg_stack_push(ostack, node); - if (!retval) - _hg_operator_set_error(vm, op, VM_e_stackoverflow); - break; - } -} G_STMT_END; -DEFUNC_OP_END - -DEFUNC_UNIMPLEMENTED_OP (currentrgbcolor); -DEFUNC_UNIMPLEMENTED_OP (currentscreen); -DEFUNC_UNIMPLEMENTED_OP (currenttransfer); - -DEFUNC_OP (curveto) -G_STMT_START -{ - HgStack *ostack = hg_vm_get_ostack(vm); - guint depth = hg_stack_depth(ostack); - HgValueNode *nx1, *ny1, *nx2, *ny2, *nx3, *ny3; - gdouble dx1, dy1, dx2, dy2, dx3, dy3, dx, dy; - HgGraphicState *gstate = hg_graphics_get_state(hg_vm_get_graphics(vm)); - - while (1) { - if (depth < 6) { - _hg_operator_set_error(vm, op, VM_e_stackunderflow); - break; - } - ny3 = hg_stack_index(ostack, 0); - nx3 = hg_stack_index(ostack, 1); - ny2 = hg_stack_index(ostack, 2); - nx2 = hg_stack_index(ostack, 3); - ny1 = hg_stack_index(ostack, 4); - nx1 = hg_stack_index(ostack, 5); - if (HG_IS_VALUE_INTEGER (nx1)) { - dx1 = HG_VALUE_GET_REAL_FROM_INTEGER (nx1); - } else if (HG_IS_VALUE_REAL (nx1)) { - dx1 = HG_VALUE_GET_REAL (nx1); - } else { - _hg_operator_set_error(vm, op, VM_e_typecheck); - break; - } - if (HG_IS_VALUE_INTEGER (ny1)) { - dy1 = HG_VALUE_GET_REAL_FROM_INTEGER (ny1); - } else if (HG_IS_VALUE_REAL (ny1)) { - dy1 = HG_VALUE_GET_REAL (ny1); - } else { - _hg_operator_set_error(vm, op, VM_e_typecheck); - break; - } - if (HG_IS_VALUE_INTEGER (nx2)) { - dx2 = HG_VALUE_GET_REAL_FROM_INTEGER (nx2); - } else if (HG_IS_VALUE_REAL (nx2)) { - dx2 = HG_VALUE_GET_REAL (nx2); - } else { - _hg_operator_set_error(vm, op, VM_e_typecheck); - break; - } - if (HG_IS_VALUE_INTEGER (ny2)) { - dy2 = HG_VALUE_GET_REAL_FROM_INTEGER (ny2); - } else if (HG_IS_VALUE_REAL (ny2)) { - dy2 = HG_VALUE_GET_REAL (ny2); - } else { - _hg_operator_set_error(vm, op, VM_e_typecheck); - break; - } - if (HG_IS_VALUE_INTEGER (nx3)) { - dx3 = HG_VALUE_GET_REAL_FROM_INTEGER (nx3); - } else if (HG_IS_VALUE_REAL (nx3)) { - dx3 = HG_VALUE_GET_REAL (nx3); - } else { - _hg_operator_set_error(vm, op, VM_e_typecheck); - break; - } - if (HG_IS_VALUE_INTEGER (ny3)) { - dy3 = HG_VALUE_GET_REAL_FROM_INTEGER (ny3); - } else if (HG_IS_VALUE_REAL (ny3)) { - dy3 = HG_VALUE_GET_REAL (ny3); - } else { - _hg_operator_set_error(vm, op, VM_e_typecheck); - break; - } - if (!hg_path_compute_current_point(gstate->path, &dx, &dy)) { - _hg_operator_set_error(vm, op, VM_e_nocurrentpoint); - break; - } - retval = hg_graphic_state_path_curveto(gstate, - dx1, dy1, - dx2, dy2, - dx3, dy3); - if (!retval) { - _hg_operator_set_error(vm, op, VM_e_VMerror); - break; - } - - hg_stack_pop(ostack); - hg_stack_pop(ostack); - hg_stack_pop(ostack); - hg_stack_pop(ostack); - hg_stack_pop(ostack); - hg_stack_pop(ostack); - break; - } -} G_STMT_END; -DEFUNC_OP_END - -DEFUNC_OP (cvi) -G_STMT_START -{ - HgStack *ostack = hg_vm_get_ostack(vm); - HgStack *estack = hg_vm_get_estack(vm); - guint depth = hg_stack_depth(ostack); - HgValueNode *node, *self; - HgMemPool *pool = hg_vm_get_current_pool(vm); - - while (1) { - if (depth < 1) { - _hg_operator_set_error(vm, op, VM_e_stackunderflow); - break; - } - node = hg_stack_index(ostack, 0); - if (HG_IS_VALUE_INTEGER (node)) { - /* nothing to do here */ - } else if (HG_IS_VALUE_REAL (node)) { - gdouble d = HG_VALUE_GET_REAL (node); - - if (d > G_MAXINT32 || d < G_MININT32) { - _hg_operator_set_error(vm, op, VM_e_rangecheck); - break; - } - HG_VALUE_MAKE_INTEGER (pool, node, (gint32)d); - } else if (HG_IS_VALUE_STRING (node)) { - HgString *str; - HgValueNode *n; - HgFileObject *file; - - if (!hg_object_is_readable((HgObject *)node)) { - _hg_operator_set_error(vm, op, VM_e_invalidaccess); - break; - } - str = HG_VALUE_GET_STRING (node); - file = hg_file_object_new(pool, - HG_FILE_TYPE_BUFFER, - HG_FILE_MODE_READ, - "--%cvi--", - hg_string_get_string(str), - hg_string_maxlength(str)); - n = hg_scanner_get_object(vm, file); - if (n == NULL) { - if (!hg_vm_has_error(vm)) { - _hg_operator_set_error(vm, op, VM_e_syntaxerror); - } else { - /* --token-- should be there in the top of ostack. - * stacks self again to correct the error place. - */ - /* XXX */ - hg_stack_push(estack, self); - } - break; - } else if (HG_IS_VALUE_INTEGER (n)) { - HG_VALUE_MAKE_INTEGER (pool, node, HG_VALUE_GET_INTEGER (n)); - } else if (HG_IS_VALUE_REAL (n)) { - gdouble d = HG_VALUE_GET_REAL (n); - - if (d >= G_MAXINT) { - _hg_operator_set_error(vm, op, VM_e_rangecheck); - break; - } - HG_VALUE_MAKE_INTEGER (pool, node, (gint32)d); - } else { - _hg_operator_set_error(vm, op, VM_e_typecheck); - break; - } - hg_mem_free(n); - } else { - _hg_operator_set_error(vm, op, VM_e_typecheck); - break; - } - if (node == NULL) { - _hg_operator_set_error(vm, op, VM_e_VMerror); - break; - } - hg_stack_pop(ostack); - retval = hg_stack_push(ostack, node); - /* it must be true */ - break; - } -} G_STMT_END; -DEFUNC_OP_END - -DEFUNC_OP (cvlit) -G_STMT_START -{ - HgStack *ostack = hg_vm_get_ostack(vm); - guint depth = hg_stack_depth(ostack); - HgValueNode *node; - - while (1) { - if (depth < 1) { - _hg_operator_set_error(vm, op, VM_e_stackunderflow); - break; - } - node = hg_stack_index(ostack, 0); - hg_object_inexecutable((HgObject *)node); - retval = TRUE; - break; - } -} G_STMT_END; -DEFUNC_OP_END - -DEFUNC_OP (cvn) -G_STMT_START -{ - HgStack *ostack = hg_vm_get_ostack(vm); - guint depth = hg_stack_depth(ostack); - HgValueNode *n1, *n2; - HgString *hs; - - while (1) { - if (depth < 1) { - _hg_operator_set_error(vm, op, VM_e_stackunderflow); - break; - } - n1 = hg_stack_index(ostack, 0); - if (!HG_IS_VALUE_STRING (n1)) { - _hg_operator_set_error(vm, op, VM_e_typecheck); - break; - } - if (!hg_object_is_readable((HgObject *)n1)) { - _hg_operator_set_error(vm, op, VM_e_invalidaccess); - break; - } - hs = HG_VALUE_GET_STRING (n1); - HG_VALUE_MAKE_NAME (n2, hg_string_get_string(hs)); - if (n2 == NULL) { - _hg_operator_set_error(vm, op, VM_e_VMerror); - break; - } - if (hg_object_is_executable((HgObject *)n1)) - hg_object_executable((HgObject *)n2); - if (hg_object_is_executeonly((HgObject *)n1)) - hg_object_executeonly((HgObject *)n2); - hg_stack_pop(ostack); - retval = hg_stack_push(ostack, n2); - /* it must be true */ - break; - } -} G_STMT_END; -DEFUNC_OP_END - -DEFUNC_OP (cvr) -G_STMT_START -{ - HgStack *ostack = hg_vm_get_ostack(vm); - HgStack *estack = hg_vm_get_estack(vm); - guint depth = hg_stack_depth(ostack); - HgValueNode *node, *self; - HgMemPool *pool = hg_vm_get_current_pool(vm); - - while (1) { - if (depth < 1) { - _hg_operator_set_error(vm, op, VM_e_stackunderflow); - break; - } - node = hg_stack_index(ostack, 0); - if (HG_IS_VALUE_REAL (node)) { - /* nothing to do here */ - } else if (HG_IS_VALUE_INTEGER (node)) { - gint32 i = HG_VALUE_GET_INTEGER (node); - - HG_VALUE_MAKE_REAL (pool, node, (gdouble)i); - } else if (HG_IS_VALUE_STRING (node)) { - HgString *str; - HgValueNode *n; - HgFileObject *file; - - if (!hg_object_is_readable((HgObject *)node)) { - _hg_operator_set_error(vm, op, VM_e_invalidaccess); - break; - } - str = HG_VALUE_GET_STRING (node); - file = hg_file_object_new(pool, - HG_FILE_TYPE_BUFFER, - HG_FILE_MODE_READ, - "--%cvr--", - hg_string_get_string(str), - hg_string_maxlength(str)); - n = hg_scanner_get_object(vm, file); - if (n == NULL) { - if (!hg_vm_has_error(vm)) { - _hg_operator_set_error(vm, op, VM_e_syntaxerror); - } else { - /* --token-- should be there in the top of ostack. - * stacks self again to correct the error place. - */ - /* XXX */ - hg_stack_push(estack, self); - } - break; - } else if (HG_IS_VALUE_REAL (n)) { - HG_VALUE_MAKE_REAL (pool, node, HG_VALUE_GET_REAL (n)); - } else if (HG_IS_VALUE_INTEGER (n)) { - gint32 i = HG_VALUE_GET_INTEGER (n); - - HG_VALUE_MAKE_REAL (pool, node, (gdouble)i); - } else { - _hg_operator_set_error(vm, op, VM_e_typecheck); - break; - } - hg_mem_free(n); - } else { - _hg_operator_set_error(vm, op, VM_e_typecheck); - break; - } - if (node == NULL) { - _hg_operator_set_error(vm, op, VM_e_VMerror); - break; - } - hg_stack_pop(ostack); - retval = hg_stack_push(ostack, node); - /* it must be true */ - break; - } -} G_STMT_END; -DEFUNC_OP_END - -DEFUNC_OP (cvrs) -G_STMT_START -{ - HgStack *ostack = hg_vm_get_ostack(vm); - guint depth = hg_stack_depth(ostack); - HgValueNode *n1, *n2, *n3; - gint32 radix; - HgString *s, *sresult; - gboolean is_real = FALSE; - - while (1) { - if (depth < 3) { - _hg_operator_set_error(vm, op, VM_e_stackunderflow); - break; - } - n3 = hg_stack_index(ostack, 0); - n2 = hg_stack_index(ostack, 1); - n1 = hg_stack_index(ostack, 2); - if (HG_IS_VALUE_REAL (n1)) { - is_real = TRUE; - } else if (!HG_IS_VALUE_INTEGER (n1)) { - _hg_operator_set_error(vm, op, VM_e_typecheck); - break; - } - if (!HG_IS_VALUE_INTEGER (n2) || - !HG_IS_VALUE_STRING (n3)) { - _hg_operator_set_error(vm, op, VM_e_typecheck); - break; - } - radix = HG_VALUE_GET_INTEGER (n2); - if (radix < 2 || radix > 36) { - _hg_operator_set_error(vm, op, VM_e_rangecheck); - break; - } - if (!hg_object_is_writable((HgObject *)n3)) { - _hg_operator_set_error(vm, op, VM_e_invalidaccess); - break; - } - s = HG_VALUE_GET_STRING (n3); - if (radix == 10 && is_real) { - HgString *stmp = hg_object_to_string((HgObject *)n1); - gchar *str; - - if (stmp == NULL) { - _hg_operator_set_error(vm, op, VM_e_VMerror); - break; - } - if (hg_string_length(stmp) > hg_string_maxlength(s)) { - hg_mem_free(stmp); - _hg_operator_set_error(vm, op, VM_e_rangecheck); - break; - } - str = hg_string_get_string(stmp); - hg_string_clear(s); - hg_string_append(s, str, hg_string_length(stmp)); - hg_mem_free(stmp); - } else if (is_real) { - if (!hg_string_convert_from_integer(s, - HG_VALUE_GET_INTEGER_FROM_REAL (n1), - radix, FALSE)) { - _hg_operator_set_error(vm, op, VM_e_rangecheck); - break; - } - } else { - if (!hg_string_convert_from_integer(s, - HG_VALUE_GET_INTEGER (n1), - radix, FALSE)) { - _hg_operator_set_error(vm, op, VM_e_rangecheck); - break; - } - } - if (hg_string_maxlength(s) > hg_string_length(s)) { - HgMemObject *obj; - - hg_mem_get_object__inline(s, obj); - sresult = hg_string_make_substring(obj->pool, s, 0, hg_string_length(s) - 1); - } else { - sresult = s; - } - HG_VALUE_MAKE_STRING (n1, sresult); - hg_stack_pop(ostack); - hg_stack_pop(ostack); - hg_stack_pop(ostack); - retval = hg_stack_push(ostack, n1); - /* it must be true */ - break; - } -} G_STMT_END; -DEFUNC_OP_END - -DEFUNC_OP (cvx) -G_STMT_START -{ - HgStack *ostack = hg_vm_get_ostack(vm); - guint depth = hg_stack_depth(ostack); - HgValueNode *node; - - while (1) { - if (depth < 1) { - _hg_operator_set_error(vm, op, VM_e_stackunderflow); - break; - } - node = hg_stack_index(ostack, 0); - hg_object_executable((HgObject *)node); - retval = TRUE; - break; - } -} G_STMT_END; -DEFUNC_OP_END - -DEFUNC_OP (def) -G_STMT_START -{ - HgStack *ostack = hg_vm_get_ostack(vm); - HgStack *dstack = hg_vm_get_dstack(vm); - guint odepth = hg_stack_depth(ostack); - HgValueNode *nd, *nk, *nv; - HgDict *dict; - HgMemObject *obj; - - while (1) { - if (odepth < 2) { - _hg_operator_set_error(vm, op, VM_e_stackunderflow); - break; - } - nv = hg_stack_index(ostack, 0); - nk = hg_stack_index(ostack, 1); - nd = hg_stack_index(dstack, 0); - dict = HG_VALUE_GET_DICT (nd); - hg_mem_get_object__inline(dict, obj); - if (!hg_object_is_writable((HgObject *)dict) || - !hg_mem_pool_is_own_object(obj->pool, nk) || - !hg_mem_pool_is_own_object(obj->pool, nv)) { - _hg_operator_set_error(vm, op, VM_e_invalidaccess); - break; - } - if (hg_vm_get_emulation_level(vm) == VM_EMULATION_LEVEL_1 && - hg_dict_length(dict) == hg_dict_maxlength(dict) && - hg_dict_lookup(dict, nk) == NULL) { - _hg_operator_set_error(vm, op, VM_e_dictfull); - break; - } - retval = hg_dict_insert(hg_vm_get_current_pool(vm), - dict, nk, nv); - hg_stack_pop(ostack); - hg_stack_pop(ostack); - break; - } -} G_STMT_END; -DEFUNC_OP_END - -DEFUNC_UNIMPLEMENTED_OP (defaultmatrix); - -DEFUNC_OP (dict) -G_STMT_START -{ - HgStack *ostack = hg_vm_get_ostack(vm); - guint depth = hg_stack_depth(ostack); - HgValueNode *node; - HgMemPool *pool = hg_vm_get_current_pool(vm); - HgDict *dict; - gint32 n_dict; - - while (1) { - if (depth < 1) { - _hg_operator_set_error(vm, op, VM_e_stackunderflow); - break; - } - node = hg_stack_index(ostack, 0); - if (!HG_IS_VALUE_INTEGER (node)) { - _hg_operator_set_error(vm, op, VM_e_typecheck); - break; - } - n_dict = HG_VALUE_GET_INTEGER (node); - if (n_dict < 0) { - _hg_operator_set_error(vm, op, VM_e_rangecheck); - break; - } - if (n_dict > 65535) { - _hg_operator_set_error(vm, op, VM_e_limitcheck); - break; - } - dict = hg_dict_new(pool, n_dict); - if (dict == NULL) { - _hg_operator_set_error(vm, op, VM_e_VMerror); - break; - } - HG_VALUE_MAKE_DICT (node, dict); - if (node == NULL) { - _hg_operator_set_error(vm, op, VM_e_VMerror); - break; - } - hg_stack_pop(ostack); - retval = hg_stack_push(ostack, node); - /* it must be true */ - break; - } -} G_STMT_END; -DEFUNC_OP_END - -DEFUNC_OP (dictstack) -G_STMT_START -{ - HgStack *ostack = hg_vm_get_ostack(vm); - HgStack *dstack = hg_vm_get_dstack(vm); - guint depth = hg_stack_depth(ostack); - guint ddepth = hg_stack_depth(dstack); - guint len, i; - HgValueNode *node, *dup_node; - HgArray *array; - - while (1) { - if (depth < 1) { - _hg_operator_set_error(vm, op, VM_e_stackunderflow); - break; - } - node = hg_stack_index(ostack, 0); - if (!HG_IS_VALUE_ARRAY (node)) { - _hg_operator_set_error(vm, op, VM_e_typecheck); - break; - } - if (!hg_object_is_writable((HgObject *)node)) { - _hg_operator_set_error(vm, op, VM_e_invalidaccess); - break; - } - array = HG_VALUE_GET_ARRAY (node); - len = hg_array_length(array); - if (ddepth > len) { - _hg_operator_set_error(vm, op, VM_e_rangecheck); - break; - } - for (i = 0; i < ddepth; i++) { - node = hg_stack_index(dstack, ddepth - i - 1); - dup_node = hg_object_dup((HgObject *)node); - hg_array_replace(array, dup_node, i); - } - if (ddepth != len) { - HgMemObject *obj; - - hg_mem_get_object__inline(array, obj); - if (obj == NULL) { - _hg_operator_set_error(vm, op, VM_e_VMerror); - break; - } - array = hg_array_make_subarray(obj->pool, array, 0, ddepth - 1); - HG_VALUE_MAKE_ARRAY (node, array); - hg_stack_pop(ostack); - retval = hg_stack_push(ostack, node); - /* it must be true */ - } else { - retval = TRUE; - } - break; - } -} G_STMT_END; -DEFUNC_OP_END - -DEFUNC_OP (div) -G_STMT_START -{ - HgStack *ostack = hg_vm_get_ostack(vm); - HgValueNode *n1, *n2; - HgMemPool *pool = hg_vm_get_current_pool(vm); - gdouble d1, d2; - guint depth = hg_stack_depth(ostack); - - while (1) { - if (depth < 2) { - _hg_operator_set_error(vm, op, VM_e_stackunderflow); - break; - } - n2 = hg_stack_index(ostack, 0); - n1 = hg_stack_index(ostack, 1); - if (HG_IS_VALUE_INTEGER (n1)) - d1 = HG_VALUE_GET_REAL_FROM_INTEGER (n1); - else if (HG_IS_VALUE_REAL (n1)) { - d1 = HG_VALUE_GET_REAL (n1); - } else { - _hg_operator_set_error(vm, op, VM_e_typecheck); - break; - } - if (HG_IS_VALUE_INTEGER (n2)) - d2 = HG_VALUE_GET_REAL_FROM_INTEGER (n2); - else if (HG_IS_VALUE_REAL (n2)) { - d2 = HG_VALUE_GET_REAL (n2); - } else { - _hg_operator_set_error(vm, op, VM_e_typecheck); - break; - } - if (HG_VALUE_REAL_SIMILAR(d2, 0)) { - _hg_operator_set_error(vm, op, VM_e_undefinedresult); - break; - } - HG_VALUE_MAKE_REAL (pool, n1, d1 / d2); - if (n1 == NULL) { - _hg_operator_set_error(vm, op, VM_e_VMerror); - break; - } - hg_stack_pop(ostack); - hg_stack_pop(ostack); - retval = hg_stack_push(ostack, n1); - /* it must be true */ - break; - } -} G_STMT_END; -DEFUNC_OP_END - -DEFUNC_UNIMPLEMENTED_OP (dtransform); - -DEFUNC_OP (dup) -G_STMT_START -{ - HgStack *ostack = hg_vm_get_ostack(vm); - guint depth = hg_stack_depth(ostack); - HgValueNode *node, *dup_node; - - while (1) { - if (depth < 1) { - _hg_operator_set_error(vm, op, VM_e_stackunderflow); - break; - } - node = hg_stack_index(ostack, 0); - dup_node = hg_object_dup((HgObject *)node); - if (dup_node == NULL) { - _hg_operator_set_error(vm, op, VM_e_VMerror); - } else { - retval = hg_stack_push(ostack, dup_node); - if (!retval) - _hg_operator_set_error(vm, op, VM_e_stackoverflow); - } - break; - } -} G_STMT_END; -DEFUNC_OP_END - -DEFUNC_UNIMPLEMENTED_OP (echo); -DEFUNC_UNIMPLEMENTED_OP (eexec); - -DEFUNC_OP (end) -G_STMT_START -{ - HgStack *dstack = hg_vm_get_dstack(vm); - guint depth = hg_stack_depth(dstack); - HgVMEmulationType type = hg_vm_get_emulation_level(vm); - - while (1) { - if ((type >= VM_EMULATION_LEVEL_2 && depth <= 3) || - (type == VM_EMULATION_LEVEL_1 && depth <= 2)) { - _hg_operator_set_error(vm, op, VM_e_dictstackunderflow); - break; - } - hg_stack_pop(dstack); - retval = TRUE; - break; - } -} G_STMT_END; -DEFUNC_OP_END - -DEFUNC_UNIMPLEMENTED_OP (eoclip); - -DEFUNC_OP (eofill) -G_STMT_START -{ - retval = hg_graphics_render_eofill(hg_vm_get_graphics(vm)); - if (!retval) - _hg_operator_set_error(vm, op, VM_e_VMerror); -} G_STMT_END; -DEFUNC_OP_END - -DEFUNC_OP (eq) -G_STMT_START -{ - HgStack *ostack = hg_vm_get_ostack(vm); - guint depth = hg_stack_depth(ostack); - HgValueNode *n1, *n2; - HgMemPool *pool = hg_vm_get_current_pool(vm); - gboolean result; - - while (1) { - if (depth < 2) { - _hg_operator_set_error(vm, op, VM_e_stackunderflow); - break; - } - n2 = hg_stack_index(ostack, 0); - n1 = hg_stack_index(ostack, 1); - if (((HG_IS_VALUE_NAME (n1) || HG_IS_VALUE_STRING (n1)) && - !hg_object_is_readable((HgObject *)n1)) || - ((HG_IS_VALUE_NAME (n2) || HG_IS_VALUE_STRING (n2)) && - !hg_object_is_readable((HgObject *)n2))) { - _hg_operator_set_error(vm, op, VM_e_invalidaccess); - break; - } - result = hg_value_node_compare(n1, n2); - if (!result) { - if ((HG_IS_VALUE_NAME (n1) || HG_IS_VALUE_STRING (n1)) && - (HG_IS_VALUE_NAME (n2) || HG_IS_VALUE_STRING (n2))) { - gchar *str1, *str2; - - if (HG_IS_VALUE_NAME (n1)) - str1 = HG_VALUE_GET_NAME (n1); - else - str1 = hg_string_get_string(HG_VALUE_GET_STRING (n1)); - if (HG_IS_VALUE_NAME (n2)) - str2 = HG_VALUE_GET_NAME (n2); - else - str2 = hg_string_get_string(HG_VALUE_GET_STRING (n2)); - if (str1 != NULL && str2 != NULL) - result = (strcmp(str1, str2) == 0); - } else if ((HG_IS_VALUE_INTEGER (n1) || HG_IS_VALUE_REAL (n1)) && - (HG_IS_VALUE_INTEGER (n2) || HG_IS_VALUE_REAL (n2))) { - gdouble d1; - - if (HG_IS_VALUE_INTEGER (n1)) - d1 = HG_VALUE_GET_REAL_FROM_INTEGER (n1); - else - d1 = HG_VALUE_GET_REAL (n1); - if (HG_IS_VALUE_INTEGER (n2)) - result = HG_VALUE_REAL_SIMILAR (d1, HG_VALUE_GET_REAL_FROM_INTEGER (n2)); - else - result = HG_VALUE_REAL_SIMILAR (d1, HG_VALUE_GET_REAL (n2)); - } - } - HG_VALUE_MAKE_BOOLEAN (pool, n1, result); - if (n1 == NULL) { - _hg_operator_set_error(vm, op, VM_e_VMerror); - break; - } - hg_stack_pop(ostack); - hg_stack_pop(ostack); - retval = hg_stack_push(ostack, n1); - /* it must be true */ - break; - } -} G_STMT_END; -DEFUNC_OP_END - -DEFUNC_UNIMPLEMENTED_OP (erasepage); - -DEFUNC_OP (exch) -G_STMT_START -{ - HgStack *ostack = hg_vm_get_ostack(vm); - guint depth = hg_stack_depth(ostack); - HgValueNode *n1, *n2; - - while (1) { - if (depth < 2) { - _hg_operator_set_error(vm, op, VM_e_stackunderflow); - break; - } - n2 = hg_stack_pop(ostack); - n1 = hg_stack_pop(ostack); - hg_stack_push(ostack, n2); - retval = hg_stack_push(ostack, n1); - /* it must be true */ - break; - } -} G_STMT_END; -DEFUNC_OP_END - -DEFUNC_OP (exec) -G_STMT_START -{ - HgStack *ostack = hg_vm_get_ostack(vm); - HgStack *estack = hg_vm_get_estack(vm); - guint depth = hg_stack_depth(ostack); - HgValueNode *node, *self, *tmp, *slnode, *scnode; - - while (1) { - if (depth < 1) { - _hg_operator_set_error(vm, op, VM_e_stackunderflow); - break; - } - node = hg_stack_index(ostack, 0); - if (hg_object_is_executable((HgObject *)node)) { - if (!hg_object_is_executeonly((HgObject *)node) && - !hg_object_is_readable((HgObject *)node)) { - _hg_operator_set_error(vm, op, VM_e_invalidaccess); - break; - } - self = hg_stack_pop(estack); - /* save the current security level */ - HG_VALUE_MAKE_INTEGER (hg_vm_get_current_pool(vm), - slnode, - hg_vm_get_security_level(vm)); - hg_stack_push(estack, slnode); - scnode = hg_dict_lookup_with_string(hg_vm_get_dict_systemdict(vm), - "%rollback_securitylevel"); - hg_stack_push(estack, scnode); - tmp = hg_object_copy((HgObject *)node); - if (tmp) - hg_stack_push(estack, tmp); - retval = hg_stack_push(estack, self); - if (!tmp || !slnode) - _hg_operator_set_error(vm, op, VM_e_VMerror); - else if (!retval) - _hg_operator_set_error(vm, op, VM_e_execstackoverflow); - else - hg_stack_pop(ostack); - } else { - retval = TRUE; - } - break; - } -} G_STMT_END; -DEFUNC_OP_END - -DEFUNC_OP (execstack) -G_STMT_START -{ - HgStack *ostack = hg_vm_get_ostack(vm); - HgStack *estack = hg_vm_get_estack(vm); - guint depth = hg_stack_depth(ostack); - guint edepth = hg_stack_depth(estack); - guint len, i; - HgValueNode *node, *dup_node; - HgArray *array; - - while (1) { - if (depth < 1) { - _hg_operator_set_error(vm, op, VM_e_stackunderflow); - break; - } - node = hg_stack_index(ostack, 0); - if (!HG_IS_VALUE_ARRAY (node)) { - _hg_operator_set_error(vm, op, VM_e_typecheck); - break; - } - if (!hg_object_is_writable((HgObject *)node)) { - _hg_operator_set_error(vm, op, VM_e_invalidaccess); - break; - } - array = HG_VALUE_GET_ARRAY (node); - len = hg_array_length(array); - if (edepth > len) { - _hg_operator_set_error(vm, op, VM_e_rangecheck); - break; - } - /* don't include the last node. it's a node for this call */ - for (i = 0; i < edepth - 1; i++) { - node = hg_stack_index(estack, edepth - i - 1); - dup_node = hg_object_dup((HgObject *)node); - hg_array_replace(array, dup_node, i); - } - if (edepth != (len + 1)) { - HgMemObject *obj; - - hg_mem_get_object__inline(array, obj); - if (obj == NULL) { - _hg_operator_set_error(vm, op, VM_e_VMerror); - break; - } - array = hg_array_make_subarray(obj->pool, array, 0, edepth - 2); - HG_VALUE_MAKE_ARRAY (node, array); - hg_stack_pop(ostack); - retval = hg_stack_push(ostack, node); - /* it must be true */ - } else { - retval = TRUE; - } - break; - } -} G_STMT_END; -DEFUNC_OP_END - -DEFUNC_OP (executeonly) -G_STMT_START -{ - HgStack *ostack = hg_vm_get_ostack(vm); - guint depth = hg_stack_depth(ostack); - HgValueNode *node; - - while (1) { - if (depth < 1) { - _hg_operator_set_error(vm, op, VM_e_stackunderflow); - break; - } - node = hg_stack_index(ostack, 0); - if (!HG_IS_VALUE_ARRAY (node) && - !HG_IS_VALUE_FILE (node) && - !HG_IS_VALUE_STRING (node)) { - _hg_operator_set_error(vm, op, VM_e_typecheck); - break; - } - if (!hg_object_is_executeonly((HgObject *)node) && - !hg_object_is_readable((HgObject *)node)) { - _hg_operator_set_error(vm, op, VM_e_invalidaccess); - break; - } - hg_object_executeonly((HgObject *)node); - retval = TRUE; - break; - } -} G_STMT_END; -DEFUNC_OP_END - -/* almost code is shared to _hg_operator_op_private_hg_exit */ -DEFUNC_OP (exit) -G_STMT_START -{ - HgStack *estack = hg_vm_get_estack(vm); - guint depth = hg_stack_depth(estack), i, j; - const gchar *name; - HgValueNode *node; - - for (i = 0; i < depth; i++) { - node = hg_stack_index(estack, i); - if (HG_IS_VALUE_OPERATOR (node)) { - /* target operators are: - * cshow filenameforall for forall kshow loop pathforall - * repeat resourceforall - */ - name = hg_operator_get_name(HG_VALUE_GET_OPERATOR (node)); - if (strcmp(name, "%for_pos_int_continue") == 0 || - strcmp(name, "%for_pos_real_continue") == 0) { - /* drop down ini inc limit proc in estack */ - hg_stack_pop(estack); - hg_stack_pop(estack); - hg_stack_pop(estack); - hg_stack_pop(estack); - } else if (strcmp(name, "%loop_continue") == 0) { - /* drop down proc in estack */ - hg_stack_pop(estack); - } else if (strcmp(name, "%repeat_continue") == 0) { - /* drop down n proc in estack */ - hg_stack_pop(estack); - hg_stack_pop(estack); - } else if (strcmp(name, "%forall_array_continue") == 0 || - strcmp(name, "%forall_dict_continue") == 0 || - strcmp(name, "%forall_string_continue") == 0) { - /* drop down n val proc in estack */ - hg_stack_pop(estack); - hg_stack_pop(estack); - hg_stack_pop(estack); - } else if (strcmp(name, "%stopped_continue") == 0) { - _hg_operator_set_error(vm, op, VM_e_invalidexit); - break; - } else { - continue; - } - for (j = 0; j < i; j++) - hg_stack_pop(estack); - retval = TRUE; - break; - } else if (HG_IS_VALUE_FILE (node)) { - _hg_operator_set_error(vm, op, VM_e_invalidexit); - break; - } - } - if (i == depth) - _hg_operator_set_error(vm, op, VM_e_invalidexit); -} G_STMT_END; -DEFUNC_OP_END - -DEFUNC_OP (exp) -G_STMT_START -{ - HgStack *ostack = hg_vm_get_ostack(vm); - guint depth = hg_stack_depth(ostack); - HgValueNode *n1, *n2; - HgMemPool *pool = hg_vm_get_current_pool(vm); - gdouble base, exponent, result; - - while (1) { - if (depth < 2) { - _hg_operator_set_error(vm, op, VM_e_stackunderflow); - break; - } - n2 = hg_stack_index(ostack, 0); - n1 = hg_stack_index(ostack, 1); - if (HG_IS_VALUE_INTEGER (n1)) { - base = HG_VALUE_GET_REAL_FROM_INTEGER (n1); - } else if (HG_IS_VALUE_REAL (n1)) { - base = HG_VALUE_GET_REAL (n1); - } else { - _hg_operator_set_error(vm, op, VM_e_typecheck); - break; - } - if (HG_IS_VALUE_INTEGER (n2)) { - exponent = HG_VALUE_GET_REAL_FROM_INTEGER (n2); - } else if (HG_IS_VALUE_REAL (n2)) { - exponent = HG_VALUE_GET_REAL (n2); - } else { - _hg_operator_set_error(vm, op, VM_e_typecheck); - break; - } - if (HG_VALUE_REAL_SIMILAR (base, 0.0) && - HG_VALUE_REAL_SIMILAR (exponent, 0.0)) { - _hg_operator_set_error(vm, op, VM_e_undefinedresult); - break; - } - result = pow(base, exponent); - HG_VALUE_MAKE_REAL (pool, n1, result); - if (n1 == NULL) { - _hg_operator_set_error(vm, op, VM_e_VMerror); - break; - } - hg_stack_pop(ostack); - hg_stack_pop(ostack); - retval = hg_stack_push(ostack, n1); - /* it must be true */ - break; - } -} G_STMT_END; -DEFUNC_OP_END - -static HgFileType -_hg_operator_get_file_type(const gchar *p) -{ - HgFileType retval; - - if (p == NULL || *p == 0) - retval = 0; - else if (strcmp(p, "%stdin") == 0) - retval = HG_FILE_TYPE_STDIN; - else if (strcmp(p, "%stdout") == 0) - retval = HG_FILE_TYPE_STDOUT; - else if (strcmp(p, "%stderr") == 0) - retval = HG_FILE_TYPE_STDERR; - else if (strcmp(p, "%statementedit") == 0) - retval = HG_FILE_TYPE_STATEMENT_EDIT; - else if (strcmp(p, "%lineedit") == 0) - retval = HG_FILE_TYPE_LINE_EDIT; - else - retval = HG_FILE_TYPE_FILE; - - return retval; -} - -static guint -_hg_operator_get_file_mode(const gchar *p) -{ - guint retval; - - if (p == NULL || *p == 0) - retval = 0; - else if (strcmp(p, "r+") == 0) - retval = HG_FILE_MODE_READ | HG_FILE_MODE_READWRITE; - else if (strcmp(p, "r") == 0) - retval = HG_FILE_MODE_READ; - else if (strcmp(p, "w+") == 0) - retval = HG_FILE_MODE_WRITE | HG_FILE_MODE_READWRITE; - else if (strcmp(p, "w") == 0) - retval = HG_FILE_MODE_WRITE; - else if (strcmp(p, "a+") == 0) - retval = HG_FILE_MODE_READ | HG_FILE_MODE_WRITE | HG_FILE_MODE_READWRITE; - else if (strcmp(p, "a") == 0) - retval = HG_FILE_MODE_READ | HG_FILE_MODE_WRITE; - else - retval = 0; - - return retval; -} - -DEFUNC_OP (file) -G_STMT_START -{ - HgStack *ostack = hg_vm_get_ostack(vm); - guint depth = hg_stack_depth(ostack), file_mode; - HgValueNode *n1, *n2; - HgMemPool *pool = hg_vm_get_current_pool(vm); - gchar *s1 = NULL, *s2 = NULL; - HgFileObject *file = NULL; - HgFileType file_type; - - while (1) { - if (depth < 2) { - _hg_operator_set_error(vm, op, VM_e_stackunderflow); - break; - } - n2 = hg_stack_index(ostack, 0); - n1 = hg_stack_index(ostack, 1); - if (!HG_IS_VALUE_STRING (n1) || !HG_IS_VALUE_STRING (n2)) { - _hg_operator_set_error(vm, op, VM_e_typecheck); - break; - } - - if (!hg_object_is_readable((HgObject *)n1) || - !hg_object_is_readable((HgObject *)n2)) { - _hg_operator_set_error(vm, op, VM_e_invalidaccess); - break; - } - s1 = hg_string_get_string(HG_VALUE_GET_STRING (n1)); - s2 = hg_string_get_string(HG_VALUE_GET_STRING (n2)); - file_type = _hg_operator_get_file_type(s1); - file_mode = _hg_operator_get_file_mode(s2); - - if (file_type == HG_FILE_TYPE_FILE) { - file = hg_file_object_new(pool, file_type, file_mode, s1); - if (hg_file_object_has_error(file)) { - _hg_operator_set_error_from_file(vm, op, file); - break; - } - } else if (file_type == HG_FILE_TYPE_STDIN) { - if (file_mode != HG_FILE_MODE_READ) { - _hg_operator_set_error(vm, op, VM_e_invalidfileaccess); - break; - } - file = hg_vm_get_io(vm, VM_IO_STDIN); - } else if (file_type == HG_FILE_TYPE_STDOUT) { - if (file_mode != HG_FILE_MODE_WRITE) { - _hg_operator_set_error(vm, op, VM_e_invalidfileaccess); - break; - } - file = hg_vm_get_io(vm, VM_IO_STDOUT); - } else if (file_type == HG_FILE_TYPE_STDERR) { - if (file_mode != HG_FILE_MODE_WRITE) { - _hg_operator_set_error(vm, op, VM_e_invalidfileaccess); - break; - } - file = hg_vm_get_io(vm, VM_IO_STDERR); - } else if (file_type == HG_FILE_TYPE_STATEMENT_EDIT) { - if (file_mode != HG_FILE_MODE_READ) { - _hg_operator_set_error(vm, op, VM_e_invalidfileaccess); - break; - } - file = hg_file_object_new(pool, file_type, hg_vm_get_line_editor(vm)); - if (file == NULL) { - _hg_operator_set_error(vm, op, VM_e_undefinedfilename); - break; - } - if (hg_file_object_has_error(file)) { - _hg_operator_set_error_from_file(vm, op, file); - break; - } - } else if (file_type == HG_FILE_TYPE_LINE_EDIT) { - if (file_mode != HG_FILE_MODE_READ) { - _hg_operator_set_error(vm, op, VM_e_invalidfileaccess); - break; - } - file = hg_file_object_new(pool, file_type, hg_vm_get_line_editor(vm)); - if (file == NULL) { - _hg_operator_set_error(vm, op, VM_e_undefinedfilename); - break; - } - if (hg_file_object_has_error(file)) { - _hg_operator_set_error_from_file(vm, op, file); - break; - } - } else { - hg_log_warning("unknown open type: %d", file_type); - } - if (file == NULL) { - _hg_operator_set_error(vm, op, VM_e_VMerror); - break; - } - hg_stack_pop(ostack); - hg_stack_pop(ostack); - HG_VALUE_MAKE_FILE (n1, file); - if (n1 == NULL) { - _hg_operator_set_error(vm, op, VM_e_VMerror); - break; - } - retval = hg_stack_push(ostack, n1); - /* it must be true */ - break; - } -} G_STMT_END; -DEFUNC_OP_END - -DEFUNC_OP (fill) -G_STMT_START -{ - retval = hg_graphics_render_fill(hg_vm_get_graphics(vm)); - if (!retval) - _hg_operator_set_error(vm, op, VM_e_VMerror); -} G_STMT_END; -DEFUNC_OP_END - -DEFUNC_UNIMPLEMENTED_OP (flattenpath); - -DEFUNC_OP (flush) -G_STMT_START -{ - (void)vm; /* dummy to stop an warning */ - /* FIXME: buffering isn't supported. */ - sync(); - retval = TRUE; -} G_STMT_END; -DEFUNC_OP_END - -DEFUNC_OP (flushfile) -G_STMT_START -{ - HgStack *ostack = hg_vm_get_ostack(vm); - guint depth = hg_stack_depth(ostack); - HgValueNode *n; - HgFileObject *file; - - while (1) { - if (depth < 1) { - _hg_operator_set_error(vm, op, VM_e_stackunderflow); - break; - } - n = hg_stack_index(ostack, 0); - if (!HG_IS_VALUE_FILE (n)) { - _hg_operator_set_error(vm, op, VM_e_typecheck); - break; - } - file = HG_VALUE_GET_FILE (n); - hg_file_object_flush(file); - hg_stack_pop(ostack); - retval = TRUE; - break; - } -} G_STMT_END; -DEFUNC_OP_END - -DEFUNC_UNIMPLEMENTED_OP (fontdirectory); - -DEFUNC_OP (for) -G_STMT_START -{ - HgStack *ostack = hg_vm_get_ostack(vm); - HgStack *estack = hg_vm_get_estack(vm); - guint odepth = hg_stack_depth(ostack); - HgValueNode *nini, *ninc, *nlimit, *nproc, *node, *self; - gboolean fint = TRUE; - - while (1) { - if (odepth < 4) { - _hg_operator_set_error(vm, op, VM_e_stackunderflow); - break; - } - nproc = hg_stack_index(ostack, 0); - nlimit = hg_stack_index(ostack, 1); - ninc = hg_stack_index(ostack, 2); - nini = hg_stack_index(ostack, 3); - if (!HG_IS_VALUE_ARRAY (nproc)) { - _hg_operator_set_error(vm, op, VM_e_typecheck); - break; - } - if (!hg_object_is_executable((HgObject *)nproc) || - (!hg_object_is_readable((HgObject *)nproc) && - !hg_object_is_executeonly((HgObject *)nproc))) { - _hg_operator_set_error(vm, op, VM_e_invalidaccess); - break; - } - if (HG_IS_VALUE_REAL (nlimit) || - HG_IS_VALUE_REAL (ninc) || - HG_IS_VALUE_REAL (nini)) - fint = FALSE; - if (HG_IS_VALUE_REAL (nlimit)) { - /* nothing to do */ - } else if (HG_IS_VALUE_INTEGER (nlimit)) { - if (!fint) - HG_VALUE_SET_REAL (nlimit, HG_VALUE_GET_INTEGER (nlimit)); - } else { - _hg_operator_set_error(vm, op, VM_e_typecheck); - break; - } - if (HG_IS_VALUE_REAL (ninc)) { - /* nothing to do */ - } else if (HG_IS_VALUE_INTEGER (ninc)) { - if (!fint) - HG_VALUE_SET_REAL (ninc, HG_VALUE_GET_INTEGER (ninc)); - } else { - _hg_operator_set_error(vm, op, VM_e_typecheck); - break; - } - if (HG_IS_VALUE_REAL (nini)) { - /* nothing to do */ - } else if (HG_IS_VALUE_INTEGER (nini)) { - if (!fint) - HG_VALUE_SET_REAL (nini, HG_VALUE_GET_INTEGER (nini)); - } else { - _hg_operator_set_error(vm, op, VM_e_typecheck); - break; - } - - self = hg_stack_pop(estack); - hg_stack_push(estack, nini); - hg_stack_push(estack, ninc); - hg_stack_push(estack, nlimit); - hg_stack_push(estack, nproc); - if (fint) - node = hg_dict_lookup_with_string(hg_vm_get_dict_systemdict(vm), - "%for_pos_int_continue"); - else - node = hg_dict_lookup_with_string(hg_vm_get_dict_systemdict(vm), - "%for_pos_real_continue"); - hg_stack_push(estack, node); - retval = hg_stack_push(estack, self); /* dummy */ - if (!retval) { - _hg_operator_set_error(vm, op, VM_e_execstackoverflow); - break; - } - - hg_stack_pop(ostack); - hg_stack_pop(ostack); - hg_stack_pop(ostack); - hg_stack_pop(ostack); - break; - } -} G_STMT_END; -DEFUNC_OP_END - -DEFUNC_OP (forall) -G_STMT_START -{ - HgStack *ostack = hg_vm_get_ostack(vm); - HgStack *estack = hg_vm_get_estack(vm); - guint depth = hg_stack_depth(ostack); - HgValueNode *node, *nval, *nproc, *nn, *self; - HgMemPool *pool = hg_vm_get_current_pool(vm); - - while (1) { - if (depth < 2) { - _hg_operator_set_error(vm, op, VM_e_stackunderflow); - break; - } - nproc = hg_stack_index(ostack, 0); - nval = hg_stack_index(ostack, 1); - if (!HG_IS_VALUE_ARRAY (nproc)) { - _hg_operator_set_error(vm, op, VM_e_typecheck); - break; - } - if (!hg_object_is_executable((HgObject *)nproc) || - (!hg_object_is_readable((HgObject *)nproc) && - !hg_object_is_executeonly((HgObject *)nproc)) || - !hg_object_is_readable((HgObject *)nval)) { - _hg_operator_set_error(vm, op, VM_e_invalidaccess); - break; - } - if (HG_IS_VALUE_ARRAY (nval)) { - node = hg_dict_lookup_with_string(hg_vm_get_dict_systemdict(vm), - "%forall_array_continue"); - HG_VALUE_MAKE_INTEGER (pool, nn, 0); - } else if (HG_IS_VALUE_DICT (nval)) { - HgDict *dict = HG_VALUE_GET_DICT (nval); - - if (!hg_object_is_readable((HgObject *)dict)) { - _hg_operator_set_error(vm, op, VM_e_invalidaccess); - break; - } - node = hg_dict_lookup_with_string(hg_vm_get_dict_systemdict(vm), - "%forall_dict_continue"); - HG_VALUE_SET_DICT (nval, hg_object_dup((HgObject *)dict)); - HG_VALUE_MAKE_INTEGER (pool, nn, 0); - } else if (HG_IS_VALUE_STRING (nval)) { - node = hg_dict_lookup_with_string(hg_vm_get_dict_systemdict(vm), - "%forall_string_continue"); - HG_VALUE_MAKE_INTEGER (pool, nn, 0); - } else { - _hg_operator_set_error(vm, op, VM_e_typecheck); - break; - } - self = hg_stack_pop(estack); - hg_stack_push(estack, nn); - hg_stack_push(estack, nval); - hg_stack_push(estack, nproc); - hg_stack_push(estack, node); - retval = hg_stack_push(estack, self); /* dummy */ - if (!retval) { - _hg_operator_set_error(vm, op, VM_e_execstackoverflow); - break; - } - hg_stack_pop(ostack); - hg_stack_pop(ostack); - break; - } -} G_STMT_END; -DEFUNC_OP_END - -DEFUNC_OP (ge) -G_STMT_START -{ - HgStack *ostack = hg_vm_get_ostack(vm); - guint depth = hg_stack_depth(ostack); - HgValueNode *n1, *n2; - HgMemPool *pool = hg_vm_get_current_pool(vm); - gboolean result; - - while (1) { - if (depth < 2) { - _hg_operator_set_error(vm, op, VM_e_stackunderflow); - break; - } - n2 = hg_stack_index(ostack, 0); - n1 = hg_stack_index(ostack, 1); - if ((HG_IS_VALUE_INTEGER (n1) || HG_IS_VALUE_REAL (n1)) && - (HG_IS_VALUE_INTEGER (n2) || HG_IS_VALUE_REAL (n2))) { - gdouble d1; - - if (HG_IS_VALUE_INTEGER (n1)) - d1 = HG_VALUE_GET_REAL_FROM_INTEGER (n1); - else - d1 = HG_VALUE_GET_REAL (n1); - if (HG_IS_VALUE_INTEGER (n2)) - result = d1 >= HG_VALUE_GET_REAL_FROM_INTEGER (n2); - else - result = d1 >= HG_VALUE_GET_REAL (n2); - } else if (HG_IS_VALUE_STRING (n1) && - HG_IS_VALUE_STRING (n2)) { - HgString *s1, *s2; - - if (!hg_object_is_readable((HgObject *)n1) || - !hg_object_is_readable((HgObject *)n2)) { - _hg_operator_set_error(vm, op, VM_e_invalidaccess); - break; - } - s1 = HG_VALUE_GET_STRING (n1); - s2 = HG_VALUE_GET_STRING (n2); - result = (strcmp(hg_string_get_string(s1), hg_string_get_string(s2)) >= 0); - } else { - _hg_operator_set_error(vm, op, VM_e_typecheck); - break; - } - hg_stack_pop(ostack); - hg_stack_pop(ostack); - HG_VALUE_MAKE_BOOLEAN (pool, n1, result); - if (n1 == NULL) { - _hg_operator_set_error(vm, op, VM_e_VMerror); - break; - } - retval = hg_stack_push(ostack, n1); - /* it must be true */ - break; - } -} G_STMT_END; -DEFUNC_OP_END - -DEFUNC_OP (get) -G_STMT_START -{ - HgStack *ostack = hg_vm_get_ostack(vm); - guint depth = hg_stack_depth(ostack), len; - HgValueNode *n1, *n2, *node = NULL; - HgMemPool *pool = hg_vm_get_current_pool(vm); - HgArray *array; - HgDict *dict; - HgString *string; - gint32 index; - - while (1) { - if (depth < 2) { - _hg_operator_set_error(vm, op, VM_e_stackunderflow); - break; - } - n2 = hg_stack_index(ostack, 0); - n1 = hg_stack_index(ostack, 1); - if (HG_IS_VALUE_ARRAY (n1)) { - if (!hg_object_is_readable((HgObject *)n1)) { - _hg_operator_set_error(vm, op, VM_e_invalidaccess); - break; - } - if (!HG_IS_VALUE_INTEGER (n2)) { - _hg_operator_set_error(vm, op, VM_e_typecheck); - break; - } - index = HG_VALUE_GET_INTEGER (n2); - array = HG_VALUE_GET_ARRAY (n1); - len = hg_array_length(array); - if (index < 0 || index >= len) { - _hg_operator_set_error(vm, op, VM_e_rangecheck); - break; - } - node = hg_array_index(array, index); - } else if (HG_IS_VALUE_DICT (n1)) { - dict = HG_VALUE_GET_DICT (n1); - if (!hg_object_is_readable((HgObject *)dict)) { - _hg_operator_set_error(vm, op, VM_e_invalidaccess); - break; - } - node = hg_dict_lookup(dict, n2); - if (node == NULL) { - _hg_operator_set_error(vm, op, VM_e_undefined); - break; - } - } else if (HG_IS_VALUE_STRING (n1)) { - if (!hg_object_is_readable((HgObject *)n1)) { - _hg_operator_set_error(vm, op, VM_e_invalidaccess); - break; - } - if (!HG_IS_VALUE_INTEGER (n2)) { - _hg_operator_set_error(vm, op, VM_e_typecheck); - break; - } - index = HG_VALUE_GET_INTEGER (n2); - string = HG_VALUE_GET_STRING (n1); - len = hg_string_maxlength(string); - if (index < 0 || index >= len) { - _hg_operator_set_error(vm, op, VM_e_rangecheck); - break; - } - HG_VALUE_MAKE_INTEGER (pool, n1, hg_string_index(string, index)); - if (n1 == NULL) { - _hg_operator_set_error(vm, op, VM_e_VMerror); - break; - } - node = n1; - } else { - _hg_operator_set_error(vm, op, VM_e_typecheck); - break; - } - hg_stack_pop(ostack); - hg_stack_pop(ostack); - retval = hg_stack_push(ostack, node); - /* it must be true */ - break; - } -} G_STMT_END; -DEFUNC_OP_END - -DEFUNC_OP (getinterval) -G_STMT_START -{ - HgStack *ostack = hg_vm_get_ostack(vm); - guint depth = hg_stack_depth(ostack); - HgValueNode *n1, *n2, *n3; - HgMemObject *obj; - gint32 index, count; - - while (1) { - if (depth < 3) { - _hg_operator_set_error(vm, op, VM_e_stackunderflow); - break; - } - n3 = hg_stack_index(ostack, 0); - n2 = hg_stack_index(ostack, 1); - n1 = hg_stack_index(ostack, 2); - if (!HG_IS_VALUE_INTEGER (n2) || - !HG_IS_VALUE_INTEGER (n3)) { - _hg_operator_set_error(vm, op, VM_e_typecheck); - break; - } - index = HG_VALUE_GET_INTEGER (n2); - count = HG_VALUE_GET_INTEGER (n3); - if (!hg_object_is_readable((HgObject *)n1)) { - _hg_operator_set_error(vm, op, VM_e_invalidaccess); - break; - } - if (HG_IS_VALUE_ARRAY (n1)) { - HgArray *array = HG_VALUE_GET_ARRAY (n1), *subarray; - guint len = hg_array_length(array); - - if (index >= len || - (len - index) < count) { - _hg_operator_set_error(vm, op, VM_e_rangecheck); - break; - } - hg_mem_get_object__inline(array, obj); - subarray = hg_array_make_subarray(obj->pool, array, index, index + count - 1); - HG_VALUE_MAKE_ARRAY (n1, subarray); - } else if (HG_IS_VALUE_STRING (n1)) { - HgString *string = HG_VALUE_GET_STRING (n1), *substring; - guint len = hg_string_maxlength(string); - - if (index >= len || - (len - index) < count) { - _hg_operator_set_error(vm, op, VM_e_rangecheck); - break; - } - hg_mem_get_object__inline(string, obj); - substring = hg_string_make_substring(obj->pool, string, index, index + count - 1); - HG_VALUE_MAKE_STRING (n1, substring); - } else { - _hg_operator_set_error(vm, op, VM_e_typecheck); - break; - } - hg_stack_pop(ostack); - hg_stack_pop(ostack); - hg_stack_pop(ostack); - retval = hg_stack_push(ostack, n1); - /* it must be true */ - break; - } -} G_STMT_END; -DEFUNC_OP_END - -DEFUNC_OP (grestore) -G_STMT_START -{ - retval = hg_graphics_restore(hg_vm_get_graphics(vm)); - if (!retval) - _hg_operator_set_error(vm, op, VM_e_VMerror); -} G_STMT_END; -DEFUNC_OP_END - -DEFUNC_UNIMPLEMENTED_OP (grestoreall); - -DEFUNC_OP (gsave) -G_STMT_START -{ - retval = hg_graphics_save(hg_vm_get_graphics(vm)); - if (!retval) - _hg_operator_set_error(vm, op, VM_e_VMerror); -} G_STMT_END; -DEFUNC_OP_END - -DEFUNC_OP (gt) -G_STMT_START -{ - HgStack *ostack = hg_vm_get_ostack(vm); - guint depth = hg_stack_depth(ostack); - HgValueNode *n1, *n2; - HgMemPool *pool = hg_vm_get_current_pool(vm); - gboolean result; - - while (1) { - if (depth < 2) { - _hg_operator_set_error(vm, op, VM_e_stackunderflow); - break; - } - n2 = hg_stack_index(ostack, 0); - n1 = hg_stack_index(ostack, 1); - if ((HG_IS_VALUE_INTEGER (n1) || HG_IS_VALUE_REAL (n1)) && - (HG_IS_VALUE_INTEGER (n2) || HG_IS_VALUE_REAL (n2))) { - gdouble d1; - - if (HG_IS_VALUE_INTEGER (n1)) - d1 = HG_VALUE_GET_REAL_FROM_INTEGER (n1); - else - d1 = HG_VALUE_GET_REAL (n1); - if (HG_IS_VALUE_INTEGER (n2)) - result = d1 > HG_VALUE_GET_REAL_FROM_INTEGER (n2); - else - result = d1 > HG_VALUE_GET_REAL (n2); - } else if (HG_IS_VALUE_STRING (n1) && - HG_IS_VALUE_STRING (n2)) { - HgString *s1, *s2; - - if (!hg_object_is_readable((HgObject *)n1) || - !hg_object_is_readable((HgObject *)n2)) { - _hg_operator_set_error(vm, op, VM_e_invalidaccess); - break; - } - s1 = HG_VALUE_GET_STRING (n1); - s2 = HG_VALUE_GET_STRING (n2); - result = (strcmp(hg_string_get_string(s1), hg_string_get_string(s2)) > 0); - } else { - _hg_operator_set_error(vm, op, VM_e_typecheck); - break; - } - hg_stack_pop(ostack); - hg_stack_pop(ostack); - HG_VALUE_MAKE_BOOLEAN (pool, n1, result); - if (n1 == NULL) { - _hg_operator_set_error(vm, op, VM_e_VMerror); - break; - } - retval = hg_stack_push(ostack, n1); - /* it must be true */ - break; - } -} G_STMT_END; -DEFUNC_OP_END - -DEFUNC_OP (identmatrix) -G_STMT_START -{ - HgStack *ostack = hg_vm_get_ostack(vm); - guint depth = hg_stack_depth(ostack); - HgValueNode *n, *node; - HgArray *array; - guint i; - gdouble d[6] = {1.0, .0, .0, 1.0, .0, .0}; - HgMemObject *obj; - - while (1) { - if (depth < 1) { - _hg_operator_set_error(vm, op, VM_e_stackunderflow); - break; - } - n = hg_stack_index(ostack, 0); - if (!HG_IS_VALUE_ARRAY (n)) { - _hg_operator_set_error(vm, op, VM_e_typecheck); - break; - } - if (!hg_object_is_writable((HgObject *)n)) { - _hg_operator_set_error(vm, op, VM_e_invalidaccess); - break; - } - array = HG_VALUE_GET_ARRAY (n); - if (hg_array_length(array) != 6) { - _hg_operator_set_error(vm, op, VM_e_rangecheck); - break; - } - hg_mem_get_object__inline(array, obj); - for (i = 0; i < 6; i++) { - HG_VALUE_MAKE_REAL (obj->pool, node, d[i]); - if (node == NULL) { - _hg_operator_set_error(vm, op, VM_e_VMerror); - break; - } - hg_array_replace(array, node, i); - } - retval = TRUE; - break; - } -} G_STMT_END; -DEFUNC_OP_END - -DEFUNC_OP (idiv) -G_STMT_START -{ - HgStack *ostack = hg_vm_get_ostack(vm); - HgValueNode *n1, *n2; - HgMemPool *pool = hg_vm_get_current_pool(vm); - gint32 i1, i2; - guint depth = hg_stack_depth(ostack); - - while (1) { - if (depth < 2) { - _hg_operator_set_error(vm, op, VM_e_stackunderflow); - break; - } - n2 = hg_stack_index(ostack, 0); - n1 = hg_stack_index(ostack, 1); - if (!HG_IS_VALUE_INTEGER (n1) || - !HG_IS_VALUE_INTEGER (n2)) { - _hg_operator_set_error(vm, op, VM_e_typecheck); - break; - } - i1 = HG_VALUE_GET_INTEGER (n1); - i2 = HG_VALUE_GET_INTEGER (n2); - if (i2 == 0) { - _hg_operator_set_error(vm, op, VM_e_undefinedresult); - break; - } - HG_VALUE_MAKE_INTEGER (pool, n1, i1 / i2); - if (n1 == NULL) { - _hg_operator_set_error(vm, op, VM_e_VMerror); - break; - } - hg_stack_pop(ostack); - hg_stack_pop(ostack); - retval = hg_stack_push(ostack, n1); - /* it must be true */ - break; - } -} G_STMT_END; -DEFUNC_OP_END - -DEFUNC_UNIMPLEMENTED_OP (idtransform); - -DEFUNC_OP (if) -G_STMT_START -{ - HgStack *ostack = hg_vm_get_ostack(vm); - HgStack *estack = hg_vm_get_estack(vm); - guint depth = hg_stack_depth(ostack); - HgValueNode *nflag, *nif, *self, *node; - - while (1) { - if (depth < 2) { - _hg_operator_set_error(vm, op, VM_e_stackunderflow); - break; - } - nif = hg_stack_index(ostack, 0); - nflag = hg_stack_index(ostack, 1); - if (!HG_IS_VALUE_ARRAY (nif) || - !HG_IS_VALUE_BOOLEAN (nflag)) { - _hg_operator_set_error(vm, op, VM_e_typecheck); - break; - } - if (!hg_object_is_executable((HgObject *)nif) || - (!hg_object_is_readable((HgObject *)nif) && - !hg_object_is_executeonly((HgObject *)nif))) { - _hg_operator_set_error(vm, op, VM_e_invalidaccess); - break; - } - self = hg_stack_pop(estack); - if (HG_VALUE_GET_BOOLEAN (nflag)) { - node = hg_object_copy((HgObject *)nif); - retval = hg_stack_push(estack, node); - if (!retval) { - _hg_operator_set_error(vm, op, VM_e_execstackoverflow); - break; - } - } - hg_stack_pop(ostack); - hg_stack_pop(ostack); - retval = hg_stack_push(estack, self); /* dummy */ - if (!retval) - _hg_operator_set_error(vm, op, VM_e_execstackoverflow); - break; - } -} G_STMT_END; -DEFUNC_OP_END - -DEFUNC_OP (ifelse) -G_STMT_START -{ - HgStack *ostack = hg_vm_get_ostack(vm); - HgStack *estack = hg_vm_get_estack(vm); - guint depth = hg_stack_depth(ostack); - HgValueNode *nflag, *nif, *nelse, *self, *node; - - while (1) { - if (depth < 3) { - _hg_operator_set_error(vm, op, VM_e_stackunderflow); - break; - } - nelse = hg_stack_index(ostack, 0); - nif = hg_stack_index(ostack, 1); - nflag = hg_stack_index(ostack, 2); - if (!HG_IS_VALUE_ARRAY (nelse) || - !HG_IS_VALUE_ARRAY (nif) || - !HG_IS_VALUE_BOOLEAN (nflag)) { - _hg_operator_set_error(vm, op, VM_e_typecheck); - break; - } - if (!hg_object_is_executable((HgObject *)nif) || - !hg_object_is_executable((HgObject *)nelse) || - (!hg_object_is_readable((HgObject *)nif) && - !hg_object_is_executeonly((HgObject *)nif)) || - (!hg_object_is_readable((HgObject *)nelse) && - !hg_object_is_executeonly((HgObject *)nelse))) { - _hg_operator_set_error(vm, op, VM_e_invalidaccess); - break; - } - self = hg_stack_pop(estack); - if (HG_VALUE_GET_BOOLEAN (nflag)) { - node = hg_object_copy((HgObject *)nif); - retval = hg_stack_push(estack, node); - if (!retval) { - _hg_operator_set_error(vm, op, VM_e_execstackoverflow); - break; - } - } else { - node = hg_object_copy((HgObject *)nelse); - retval = hg_stack_push(estack, node); - if (!retval) { - _hg_operator_set_error(vm, op, VM_e_execstackoverflow); - break; - } - } - hg_stack_pop(ostack); - hg_stack_pop(ostack); - hg_stack_pop(ostack); - retval = hg_stack_push(estack, self); /* dummy */ - if (!retval) - _hg_operator_set_error(vm, op, VM_e_execstackoverflow); - break; - } -} G_STMT_END; -DEFUNC_OP_END - -DEFUNC_UNIMPLEMENTED_OP (image); -DEFUNC_UNIMPLEMENTED_OP (imagemask); - -DEFUNC_OP (index) -G_STMT_START -{ - HgStack *ostack = hg_vm_get_ostack(vm); - guint depth = hg_stack_depth(ostack); - HgValueNode *n1, *node; - gint32 i; - - while (1) { - if (depth < 1) { - _hg_operator_set_error(vm, op, VM_e_stackunderflow); - break; - } - n1 = hg_stack_index(ostack, 0); - if (!HG_IS_VALUE_INTEGER (n1)) { - _hg_operator_set_error(vm, op, VM_e_typecheck); - break; - } - i = HG_VALUE_GET_INTEGER (n1); - if (i < 0 || (i + 1) >= depth) { - _hg_operator_set_error(vm, op, VM_e_rangecheck); - break; - } - node = hg_stack_index(ostack, i + 1); - hg_stack_pop(ostack); - retval = hg_stack_push(ostack, node); - if (!retval) - _hg_operator_set_error(vm, op, VM_e_stackoverflow); - break; - } -} G_STMT_END; -DEFUNC_OP_END - -DEFUNC_OP (initclip) -G_STMT_START -{ - retval = hg_graphics_initclip(hg_vm_get_graphics(vm)); - if (!retval) - _hg_operator_set_error(vm, op, VM_e_VMerror); -} G_STMT_END; -DEFUNC_OP_END - -DEFUNC_OP (initgraphics) -G_STMT_START -{ - retval = hg_graphics_init(hg_vm_get_graphics(vm)); -} G_STMT_END; -DEFUNC_OP_END - -DEFUNC_UNIMPLEMENTED_OP (initmatrix); -DEFUNC_UNIMPLEMENTED_OP (internaldict); -DEFUNC_UNIMPLEMENTED_OP (invertmatrix); -DEFUNC_UNIMPLEMENTED_OP (itransform); - -DEFUNC_OP (known) -G_STMT_START -{ - HgStack *ostack = hg_vm_get_ostack(vm); - guint depth = hg_stack_depth(ostack); - HgValueNode *ndict, *node; - HgMemPool *pool = hg_vm_get_current_pool(vm); - HgDict *dict; - - while (1) { - if (depth < 2) { - _hg_operator_set_error(vm, op, VM_e_stackunderflow); - break; - } - node = hg_stack_index(ostack, 0); - ndict = hg_stack_index(ostack, 1); - if (!HG_IS_VALUE_DICT (ndict)) { - _hg_operator_set_error(vm, op, VM_e_typecheck); - break; - } - dict = HG_VALUE_GET_DICT (ndict); - if (!hg_object_is_readable((HgObject *)dict)) { - _hg_operator_set_error(vm, op, VM_e_invalidaccess); - break; - } - if (hg_dict_lookup(dict, node) != NULL) { - HG_VALUE_MAKE_BOOLEAN (pool, node, TRUE); - } else { - HG_VALUE_MAKE_BOOLEAN (pool, node, FALSE); - } - hg_stack_pop(ostack); - hg_stack_pop(ostack); - retval = hg_stack_push(ostack, node); - /* it must be true */ - break; - } -} G_STMT_END; -DEFUNC_OP_END - -DEFUNC_UNIMPLEMENTED_OP (kshow); - -DEFUNC_OP (le) -G_STMT_START -{ - HgStack *ostack = hg_vm_get_ostack(vm); - guint depth = hg_stack_depth(ostack); - HgValueNode *n1, *n2; - HgMemPool *pool = hg_vm_get_current_pool(vm); - gboolean result; - - while (1) { - if (depth < 2) { - _hg_operator_set_error(vm, op, VM_e_stackunderflow); - break; - } - n2 = hg_stack_index(ostack, 0); - n1 = hg_stack_index(ostack, 1); - if ((HG_IS_VALUE_INTEGER (n1) || HG_IS_VALUE_REAL (n1)) && - (HG_IS_VALUE_INTEGER (n2) || HG_IS_VALUE_REAL (n2))) { - gdouble d1; - - if (HG_IS_VALUE_INTEGER (n1)) - d1 = HG_VALUE_GET_REAL_FROM_INTEGER (n1); - else - d1 = HG_VALUE_GET_REAL (n1); - if (HG_IS_VALUE_INTEGER (n2)) - result = d1 <= HG_VALUE_GET_REAL_FROM_INTEGER (n2); - else - result = d1 <= HG_VALUE_GET_REAL (n2); - } else if (HG_IS_VALUE_STRING (n1) && - HG_IS_VALUE_STRING (n2)) { - HgString *s1, *s2; - - if (!hg_object_is_readable((HgObject *)n1) || - !hg_object_is_readable((HgObject *)n2)) { - _hg_operator_set_error(vm, op, VM_e_invalidaccess); - break; - } - s1 = HG_VALUE_GET_STRING (n1); - s2 = HG_VALUE_GET_STRING (n2); - result = (strcmp(hg_string_get_string(s1), hg_string_get_string(s2)) <= 0); - } else { - _hg_operator_set_error(vm, op, VM_e_typecheck); - break; - } - hg_stack_pop(ostack); - hg_stack_pop(ostack); - HG_VALUE_MAKE_BOOLEAN (pool, n1, result); - if (n1 == NULL) { - _hg_operator_set_error(vm, op, VM_e_VMerror); - break; - } - retval = hg_stack_push(ostack, n1); - /* it must be true */ - break; - } -} G_STMT_END; -DEFUNC_OP_END - -DEFUNC_OP (length) -G_STMT_START -{ - HgStack *ostack = hg_vm_get_ostack(vm); - guint depth = hg_stack_depth(ostack); - HgValueNode *node; - HgMemPool *pool = hg_vm_get_current_pool(vm); - - while (1) { - if (depth < 1) { - _hg_operator_set_error(vm, op, VM_e_stackunderflow); - break; - } - node = hg_stack_index(ostack, 0); - if (!hg_object_is_readable((HgObject *)node)) { - _hg_operator_set_error(vm, op, VM_e_invalidaccess); - break; - } - if (HG_IS_VALUE_ARRAY (node)) { - HgArray *array = HG_VALUE_GET_ARRAY (node); - - HG_VALUE_MAKE_INTEGER (pool, node, hg_array_length(array)); - } else if (HG_IS_VALUE_DICT (node)) { - HgDict *dict = HG_VALUE_GET_DICT (node); - - HG_VALUE_MAKE_INTEGER (pool, node, hg_dict_length(dict)); - } else if (HG_IS_VALUE_STRING (node)) { - HgString *string = HG_VALUE_GET_STRING (node); - - HG_VALUE_MAKE_INTEGER (pool, node, hg_string_maxlength(string)); - } else if (HG_IS_VALUE_NAME (node)) { - gchar *name = HG_VALUE_GET_NAME (node); - - HG_VALUE_MAKE_INTEGER (pool, node, strlen(name)); - } else { - _hg_operator_set_error(vm, op, VM_e_typecheck); - break; - } - hg_stack_pop(ostack); - retval = hg_stack_push(ostack, node); - /* it must be true */ - break; - } -} G_STMT_END; -DEFUNC_OP_END - -DEFUNC_OP (lineto) -G_STMT_START -{ - HgStack *ostack = hg_vm_get_ostack(vm); - guint depth = hg_stack_depth(ostack); - HgValueNode *nx, *ny; - HgGraphicState *gstate = hg_graphics_get_state(hg_vm_get_graphics(vm)); - gdouble dx, dy, d; - - while (1) { - if (depth < 2) { - _hg_operator_set_error(vm, op, VM_e_stackunderflow); - break; - } - ny = hg_stack_index(ostack, 0); - nx = hg_stack_index(ostack, 1); - if (HG_IS_VALUE_INTEGER (nx)) - dx = HG_VALUE_GET_REAL_FROM_INTEGER (nx); - else if (HG_IS_VALUE_REAL (nx)) - dx = HG_VALUE_GET_REAL (nx); - else { - _hg_operator_set_error(vm, op, VM_e_typecheck); - break; - } - if (HG_IS_VALUE_INTEGER (ny)) - dy = HG_VALUE_GET_REAL_FROM_INTEGER (ny); - else if (HG_IS_VALUE_REAL (ny)) - dy = HG_VALUE_GET_REAL (ny); - else { - _hg_operator_set_error(vm, op, VM_e_typecheck); - break; - } - if (!hg_path_compute_current_point(gstate->path, &d, &d)) { - _hg_operator_set_error(vm, op, VM_e_nocurrentpoint); - break; - } - retval = hg_graphic_state_path_lineto(gstate, dx, dy); - if (!retval) { - _hg_operator_set_error(vm, op, VM_e_VMerror); - break; - } - hg_stack_pop(ostack); - hg_stack_pop(ostack); - break; - } -} G_STMT_END; -DEFUNC_OP_END - -DEFUNC_OP (ln) -G_STMT_START -{ - HgStack *ostack = hg_vm_get_ostack(vm); - guint depth = hg_stack_depth(ostack); - HgValueNode *n; - gdouble d; - HgMemPool *pool = hg_vm_get_current_pool(vm); - - while (1) { - if (depth < 1) { - _hg_operator_set_error(vm, op, VM_e_stackunderflow); - break; - } - n = hg_stack_index(ostack, 0); - if (HG_IS_VALUE_INTEGER (n)) { - d = HG_VALUE_GET_REAL_FROM_INTEGER (n); - } else if (HG_IS_VALUE_REAL (n)) { - d = HG_VALUE_GET_REAL (n); - } else { - _hg_operator_set_error(vm, op, VM_e_typecheck); - break; - } - HG_VALUE_MAKE_REAL (pool, n, log(d)); - if (n == NULL) { - _hg_operator_set_error(vm, op, VM_e_VMerror); - break; - } - hg_stack_pop(ostack); - retval = hg_stack_push(ostack, n); - /* it must be true */ - break; - } -} G_STMT_END; -DEFUNC_OP_END - -DEFUNC_OP (log) -G_STMT_START -{ - HgStack *ostack = hg_vm_get_ostack(vm); - guint depth = hg_stack_depth(ostack); - HgValueNode *n; - gdouble d; - HgMemPool *pool = hg_vm_get_current_pool(vm); - - while (1) { - if (depth < 1) { - _hg_operator_set_error(vm, op, VM_e_stackunderflow); - break; - } - n = hg_stack_index(ostack, 0); - if (HG_IS_VALUE_INTEGER (n)) { - d = HG_VALUE_GET_REAL_FROM_INTEGER (n); - } else if (HG_IS_VALUE_REAL (n)) { - d = HG_VALUE_GET_REAL (n); - } else { - _hg_operator_set_error(vm, op, VM_e_typecheck); - break; - } - HG_VALUE_MAKE_REAL (pool, n, log10(d)); - if (n == NULL) { - _hg_operator_set_error(vm, op, VM_e_VMerror); - break; - } - hg_stack_pop(ostack); - retval = hg_stack_push(ostack, n); - /* it must be true */ - break; - } -} G_STMT_END; -DEFUNC_OP_END - -DEFUNC_OP (loop) -G_STMT_START -{ - HgStack *ostack = hg_vm_get_ostack(vm); - HgStack *estack = hg_vm_get_estack(vm); - guint depth = hg_stack_depth(ostack); - HgValueNode *self, *nproc, *node; - - while (1) { - if (depth < 1) { - _hg_operator_set_error(vm, op, VM_e_stackunderflow); - break; - } - nproc = hg_stack_index(ostack, 0); - if (!HG_IS_VALUE_ARRAY (nproc)) { - _hg_operator_set_error(vm, op, VM_e_typecheck); - break; - } - if (!hg_object_is_executable((HgObject *)nproc) || - (!hg_object_is_readable((HgObject *)nproc) && - !hg_object_is_executeonly((HgObject *)nproc))) { - _hg_operator_set_error(vm, op, VM_e_invalidaccess); - break; - } - self = hg_stack_pop(estack); - hg_stack_push(estack, nproc); - node = hg_dict_lookup_with_string(hg_vm_get_dict_systemdict(vm), - "%loop_continue"); - hg_stack_push(estack, node); - retval = hg_stack_push(estack, self); /* dummy */ - if (!retval) { - _hg_operator_set_error(vm, op, VM_e_execstackoverflow); - break; - } - - hg_stack_pop(ostack); - break; - } -} G_STMT_END; -DEFUNC_OP_END - -DEFUNC_OP (lt) -G_STMT_START -{ - HgStack *ostack = hg_vm_get_ostack(vm); - guint depth = hg_stack_depth(ostack); - HgValueNode *n1, *n2; - HgMemPool *pool = hg_vm_get_current_pool(vm); - gboolean result; - - while (1) { - if (depth < 2) { - _hg_operator_set_error(vm, op, VM_e_stackunderflow); - break; - } - n2 = hg_stack_index(ostack, 0); - n1 = hg_stack_index(ostack, 1); - if ((HG_IS_VALUE_INTEGER (n1) || HG_IS_VALUE_REAL (n1)) && - (HG_IS_VALUE_INTEGER (n2) || HG_IS_VALUE_REAL (n2))) { - gdouble d1; - - if (HG_IS_VALUE_INTEGER (n1)) - d1 = HG_VALUE_GET_REAL_FROM_INTEGER (n1); - else - d1 = HG_VALUE_GET_REAL (n1); - if (HG_IS_VALUE_INTEGER (n2)) - result = d1 < HG_VALUE_GET_REAL_FROM_INTEGER (n2); - else - result = d1 < HG_VALUE_GET_REAL (n2); - } else if (HG_IS_VALUE_STRING (n1) && - HG_IS_VALUE_STRING (n2)) { - HgString *s1, *s2; - - if (!hg_object_is_readable((HgObject *)n1) || - !hg_object_is_readable((HgObject *)n2)) { - _hg_operator_set_error(vm, op, VM_e_invalidaccess); - break; - } - s1 = HG_VALUE_GET_STRING (n1); - s2 = HG_VALUE_GET_STRING (n2); - result = (strcmp(hg_string_get_string(s1), hg_string_get_string(s2)) < 0); - } else { - _hg_operator_set_error(vm, op, VM_e_typecheck); - break; - } - hg_stack_pop(ostack); - hg_stack_pop(ostack); - HG_VALUE_MAKE_BOOLEAN (pool, n1, result); - if (n1 == NULL) { - _hg_operator_set_error(vm, op, VM_e_VMerror); - break; - } - retval = hg_stack_push(ostack, n1); - /* it must be true */ - break; - } -} G_STMT_END; -DEFUNC_OP_END - -DEFUNC_UNIMPLEMENTED_OP (makefont); - -DEFUNC_OP (maxlength) -G_STMT_START -{ - HgStack *ostack = hg_vm_get_ostack(vm); - guint depth = hg_stack_depth(ostack); - HgValueNode *node; - HgDict *dict; - HgMemPool *pool = hg_vm_get_current_pool(vm); - - while (1) { - if (depth < 1) { - _hg_operator_set_error(vm, op, VM_e_stackunderflow); - break; - } - node = hg_stack_index(ostack, 0); - if (!HG_IS_VALUE_DICT (node)) { - _hg_operator_set_error(vm, op, VM_e_typecheck); - break; - } - dict = HG_VALUE_GET_DICT (node); - if (!hg_object_is_readable((HgObject *)dict)) { - _hg_operator_set_error(vm, op, VM_e_invalidaccess); - break; - } - HG_VALUE_MAKE_INTEGER (pool, node, hg_dict_maxlength(dict)); - hg_stack_pop(ostack); - retval = hg_stack_push(ostack, node); - /* it must be true */ - break; - } -} G_STMT_END; -DEFUNC_OP_END - -DEFUNC_OP (mod) -G_STMT_START -{ - HgStack *ostack = hg_vm_get_ostack(vm); - HgValueNode *n1, *n2; - HgMemPool *pool = hg_vm_get_current_pool(vm); - guint depth = hg_stack_depth(ostack); - gint32 i2, result; - - while (1) { - if (depth < 2) { - _hg_operator_set_error(vm, op, VM_e_stackunderflow); - break; - } - n2 = hg_stack_index(ostack, 0); - n1 = hg_stack_index(ostack, 1); - if (!HG_IS_VALUE_INTEGER (n1) || !HG_IS_VALUE_INTEGER (n2)) { - _hg_operator_set_error(vm, op, VM_e_typecheck); - break; - } - i2 = HG_VALUE_GET_INTEGER (n2); - if (i2 == 0) { - _hg_operator_set_error(vm, op, VM_e_undefinedresult); - break; - } - result = HG_VALUE_GET_INTEGER (n1) % i2; - HG_VALUE_MAKE_INTEGER (pool, n1, result); - if (n1 == NULL) { - _hg_operator_set_error(vm, op, VM_e_VMerror); - break; - } - hg_stack_pop(ostack); - hg_stack_pop(ostack); - retval = hg_stack_push(ostack, n1); - /* it must be true */ - break; - } -} G_STMT_END; -DEFUNC_OP_END - -DEFUNC_OP (moveto) -G_STMT_START -{ - HgStack *ostack = hg_vm_get_ostack(vm); - guint depth = hg_stack_depth(ostack); - HgValueNode *nx, *ny; - gdouble dx, dy; - - while (1) { - if (depth < 2) { - _hg_operator_set_error(vm, op, VM_e_stackunderflow); - break; - } - ny = hg_stack_index(ostack, 0); - nx = hg_stack_index(ostack, 1); - if (HG_IS_VALUE_INTEGER (nx)) - dx = HG_VALUE_GET_REAL_FROM_INTEGER (nx); - else if (HG_IS_VALUE_REAL (nx)) - dx = HG_VALUE_GET_REAL (nx); - else { - _hg_operator_set_error(vm, op, VM_e_typecheck); - break; - } - if (HG_IS_VALUE_INTEGER (ny)) - dy = HG_VALUE_GET_REAL_FROM_INTEGER (ny); - else if (HG_IS_VALUE_REAL (ny)) - dy = HG_VALUE_GET_REAL (ny); - else { - _hg_operator_set_error(vm, op, VM_e_typecheck); - break; - } - retval = hg_graphic_state_path_moveto(hg_graphics_get_state(hg_vm_get_graphics(vm)), - dx, dy); - if (!retval) { - _hg_operator_set_error(vm, op, VM_e_VMerror); - break; - } - hg_stack_pop(ostack); - hg_stack_pop(ostack); - break; - } -} G_STMT_END; -DEFUNC_OP_END - -DEFUNC_OP (mul) -G_STMT_START -{ - HgStack *ostack = hg_vm_get_ostack(vm); - HgValueNode *n1, *n2; - HgMemPool *pool = hg_vm_get_current_pool(vm); - gdouble d1, d2; - guint depth = hg_stack_depth(ostack); - gdouble integer = TRUE; - - while (1) { - if (depth < 2) { - _hg_operator_set_error(vm, op, VM_e_stackunderflow); - break; - } - n2 = hg_stack_index(ostack, 0); - n1 = hg_stack_index(ostack, 1); - if (HG_IS_VALUE_INTEGER (n1)) - d1 = HG_VALUE_GET_REAL_FROM_INTEGER (n1); - else if (HG_IS_VALUE_REAL (n1)) { - d1 = HG_VALUE_GET_REAL (n1); - integer = FALSE; - } else { - _hg_operator_set_error(vm, op, VM_e_typecheck); - break; - } - if (HG_IS_VALUE_INTEGER (n2)) - d2 = HG_VALUE_GET_REAL_FROM_INTEGER (n2); - else if (HG_IS_VALUE_REAL (n2)) { - d2 = HG_VALUE_GET_REAL (n2); - integer = FALSE; - } else { - _hg_operator_set_error(vm, op, VM_e_typecheck); - break; - } - d1 *= d2; - if (integer && d1 <= G_MAXINT) { - HG_VALUE_MAKE_INTEGER (pool, n1, d1); - } else { - HG_VALUE_MAKE_REAL (pool, n1, d1); - } - if (n1 == NULL) { - _hg_operator_set_error(vm, op, VM_e_VMerror); - break; - } - hg_stack_pop(ostack); - hg_stack_pop(ostack); - retval = hg_stack_push(ostack, n1); - /* it must be true */ - break; - } -} G_STMT_END; -DEFUNC_OP_END - -DEFUNC_OP (ne) -G_STMT_START -{ - HgStack *ostack = hg_vm_get_ostack(vm); - guint depth = hg_stack_depth(ostack); - HgValueNode *n1, *n2; - HgMemPool *pool = hg_vm_get_current_pool(vm); - gboolean result; - - while (1) { - if (depth < 2) { - _hg_operator_set_error(vm, op, VM_e_stackunderflow); - break; - } - n2 = hg_stack_index(ostack, 0); - n1 = hg_stack_index(ostack, 1); - if (!hg_object_is_readable((HgObject *)n1) || - !hg_object_is_readable((HgObject *)n2)) { - _hg_operator_set_error(vm, op, VM_e_invalidaccess); - break; - } - result = !hg_value_node_compare(n1, n2); - if (result) { - if ((HG_IS_VALUE_NAME (n1) || HG_IS_VALUE_STRING (n1)) && - (HG_IS_VALUE_NAME (n2) || HG_IS_VALUE_STRING (n2))) { - gchar *str1, *str2; - - if (HG_IS_VALUE_NAME (n1)) - str1 = HG_VALUE_GET_NAME (n1); - else - str1 = hg_string_get_string(HG_VALUE_GET_STRING (n1)); - if (HG_IS_VALUE_NAME (n2)) - str2 = HG_VALUE_GET_NAME (n2); - else - str2 = hg_string_get_string(HG_VALUE_GET_STRING (n2)); - if (str1 != NULL && str2 != NULL) - result = (strcmp(str1, str2) != 0); - } else if ((HG_IS_VALUE_INTEGER (n1) || HG_IS_VALUE_REAL (n1)) && - (HG_IS_VALUE_INTEGER (n2) || HG_IS_VALUE_REAL (n2))) { - gdouble d1; - - if (HG_IS_VALUE_INTEGER (n1)) - d1 = HG_VALUE_GET_REAL_FROM_INTEGER (n1); - else - d1 = HG_VALUE_GET_REAL (n1); - if (HG_IS_VALUE_INTEGER (n2)) - result = !HG_VALUE_REAL_SIMILAR (d1, HG_VALUE_GET_REAL_FROM_INTEGER (n2)); - else - result = !HG_VALUE_REAL_SIMILAR (d1, HG_VALUE_GET_REAL (n2)); - } - } - HG_VALUE_MAKE_BOOLEAN (pool, n1, result); - if (n1 == NULL) { - _hg_operator_set_error(vm, op, VM_e_VMerror); - break; - } - hg_stack_pop(ostack); - hg_stack_pop(ostack); - retval = hg_stack_push(ostack, n1); - /* it must be true */ - break; - } -} G_STMT_END; -DEFUNC_OP_END - -DEFUNC_OP (neg) -G_STMT_START -{ - HgStack *ostack = hg_vm_get_ostack(vm); - HgValueNode *n, *node; - HgMemPool *pool = hg_vm_get_current_pool(vm); - guint depth = hg_stack_depth(ostack); - - while (1) { - if (depth < 1) { - _hg_operator_set_error(vm, op, VM_e_stackunderflow); - break; - } - n = hg_stack_index(ostack, 0); - if (HG_IS_VALUE_INTEGER (n)) { - HG_VALUE_MAKE_INTEGER (pool, node, -HG_VALUE_GET_INTEGER (n)); - } else if (HG_IS_VALUE_REAL (n)) { - HG_VALUE_MAKE_REAL (pool, node, -HG_VALUE_GET_REAL (n)); - } else { - _hg_operator_set_error(vm, op, VM_e_typecheck); - break; - } - if (node == NULL) { - _hg_operator_set_error(vm, op, VM_e_VMerror); - break; - } - hg_stack_pop(ostack); - retval = hg_stack_push(ostack, node); - /* it must be true */ - break; - } -} G_STMT_END; -DEFUNC_OP_END - -DEFUNC_OP (newpath) -G_STMT_START -{ - retval = hg_graphic_state_path_new(hg_graphics_get_state(hg_vm_get_graphics(vm))); - if (!retval) - _hg_operator_set_error(vm, op, VM_e_VMerror); -} G_STMT_END; -DEFUNC_OP_END - -DEFUNC_OP (noaccess) -G_STMT_START -{ - HgStack *ostack = hg_vm_get_ostack(vm); - guint depth = hg_stack_depth(ostack); - HgValueNode *node; - - while (1) { - if (depth < 1) { - _hg_operator_set_error(vm, op, VM_e_stackunderflow); - break; - } - node = hg_stack_index(ostack, 0); - if (!HG_IS_VALUE_ARRAY (node) && - !HG_IS_VALUE_DICT (node) && - !HG_IS_VALUE_FILE (node) && - !HG_IS_VALUE_STRING (node)) { - _hg_operator_set_error(vm, op, VM_e_typecheck); - break; - } - if (HG_IS_VALUE_DICT (node)) { - HgDict *dict = HG_VALUE_GET_DICT (node); - - if (!hg_object_is_writable((HgObject *)dict)) { - _hg_operator_set_error(vm, op, VM_e_invalidaccess); - break; - } - hg_object_inaccessible((HgObject *)dict); - } - hg_object_inaccessible((HgObject *)node); - retval = TRUE; - break; - } -} G_STMT_END; -DEFUNC_OP_END - -DEFUNC_OP (not) -G_STMT_START -{ - HgStack *ostack = hg_vm_get_ostack(vm); - guint depth = hg_stack_depth(ostack); - HgValueNode *node; - HgMemPool *pool = hg_vm_get_current_pool(vm); - - while (1) { - if (depth < 1) { - _hg_operator_set_error(vm, op, VM_e_stackunderflow); - break; - } - node = hg_stack_index(ostack, 0); - if (HG_IS_VALUE_BOOLEAN (node)) { - gboolean bool = HG_VALUE_GET_BOOLEAN (node); - - HG_VALUE_MAKE_BOOLEAN (pool, node, !bool); - } else if (HG_IS_VALUE_INTEGER (node)) { - gint32 i = HG_VALUE_GET_INTEGER (node); - - HG_VALUE_MAKE_INTEGER (pool, node, ~i); - } else { - _hg_operator_set_error(vm, op, VM_e_typecheck); - break; - } - hg_stack_pop(ostack); - retval = hg_stack_push(ostack, node); - /* it must be true */ - break; - } -} G_STMT_END; -DEFUNC_OP_END - -DEFUNC_UNIMPLEMENTED_OP (nulldevice); - -DEFUNC_OP (or) -G_STMT_START -{ - HgStack *ostack = hg_vm_get_ostack(vm); - guint depth = hg_stack_depth(ostack); - HgValueNode *n1, *n2; - HgMemPool *pool = hg_vm_get_current_pool(vm); - - while (1) { - if (depth < 2) { - _hg_operator_set_error(vm, op, VM_e_stackunderflow); - break; - } - n2 = hg_stack_index(ostack, 0); - n1 = hg_stack_index(ostack, 1); - if (HG_IS_VALUE_BOOLEAN (n1) && - HG_IS_VALUE_BOOLEAN (n2)) { - gboolean result = HG_VALUE_GET_BOOLEAN (n1) | HG_VALUE_GET_BOOLEAN (n2); - - HG_VALUE_MAKE_BOOLEAN (pool, n1, result); - if (n1 == NULL) { - _hg_operator_set_error(vm, op, VM_e_VMerror); - break; - } - } else if (HG_IS_VALUE_INTEGER (n1) && - HG_IS_VALUE_INTEGER (n2)) { - gint32 result = HG_VALUE_GET_INTEGER (n1) | HG_VALUE_GET_INTEGER (n2); - - HG_VALUE_MAKE_INTEGER (pool, n1, result); - if (n1 == NULL) { - _hg_operator_set_error(vm, op, VM_e_VMerror); - break; - } - } else { - _hg_operator_set_error(vm, op, VM_e_typecheck); - break; - } - hg_stack_pop(ostack); - hg_stack_pop(ostack); - retval = hg_stack_push(ostack, n1); - /* it must be true */ - break; - } -} G_STMT_END; -DEFUNC_OP_END - -DEFUNC_OP (pathbbox) -G_STMT_START -{ - HgStack *ostack = hg_vm_get_ostack(vm); - HgMemPool *pool = hg_vm_get_current_pool(vm); - HgValueNode *node; - HgPathBBox bbox; - - while (1) { - if (hg_vm_get_emulation_level(vm) == VM_EMULATION_LEVEL_1) { - retval = hg_graphic_state_get_bbox_from_path(hg_graphics_get_state(hg_vm_get_graphics(vm)), - FALSE, &bbox); - } else { - retval = hg_graphic_state_get_bbox_from_path(hg_graphics_get_state(hg_vm_get_graphics(vm)), - TRUE, &bbox); - } - if (!retval) { - _hg_operator_set_error(vm, op, VM_e_nocurrentpoint); - break; - } - HG_VALUE_MAKE_REAL (pool, node, bbox.llx); - if (node == NULL) { - _hg_operator_set_error(vm, op, VM_e_VMerror); - break; - } - hg_stack_push(ostack, node); - HG_VALUE_MAKE_REAL (pool, node, bbox.lly); - if (node == NULL) { - _hg_operator_set_error(vm, op, VM_e_VMerror); - break; - } - hg_stack_push(ostack, node); - HG_VALUE_MAKE_REAL (pool, node, bbox.urx); - if (node == NULL) { - _hg_operator_set_error(vm, op, VM_e_VMerror); - break; - } - hg_stack_push(ostack, node); - HG_VALUE_MAKE_REAL (pool, node, bbox.ury); - if (node == NULL) { - _hg_operator_set_error(vm, op, VM_e_VMerror); - break; - } - retval = hg_stack_push(ostack, node); - if (!retval) - _hg_operator_set_error(vm, op, VM_e_stackoverflow); - break; - } -} G_STMT_END; -DEFUNC_OP_END - -DEFUNC_UNIMPLEMENTED_OP (pathforall); - -DEFUNC_OP (pop) -G_STMT_START -{ - HgStack *ostack = hg_vm_get_ostack(vm); - guint depth = hg_stack_depth(ostack); - - while (1) { - if (depth < 1) { - _hg_operator_set_error(vm, op, VM_e_stackunderflow); - break; - } - hg_stack_pop(ostack); - retval = TRUE; - break; - } -} G_STMT_END; -DEFUNC_OP_END - -DEFUNC_OP (print) -G_STMT_START -{ - HgStack *ostack = hg_vm_get_ostack(vm); - guint depth = hg_stack_depth(ostack); - HgValueNode *node; - HgString *hs; - HgFileObject *stdout; - - while (1) { - if (depth < 1) { - _hg_operator_set_error(vm, op, VM_e_stackunderflow); - break; - } - node = hg_stack_index(ostack, 0); - if (!HG_IS_VALUE_STRING (node)) { - _hg_operator_set_error(vm, op, VM_e_typecheck); - break; - } - if (!hg_object_is_readable((HgObject *)node)) { - _hg_operator_set_error(vm, op, VM_e_invalidaccess); - break; - } - hs = HG_VALUE_GET_STRING (node); - stdout = hg_vm_get_io(vm, VM_IO_STDOUT); - hg_file_object_write(stdout, - hg_string_get_string(hs), - sizeof (gchar), - hg_string_maxlength(hs)); - if (hg_file_object_has_error(stdout)) { - _hg_operator_set_error_from_file(vm, op, stdout); - break; - } - hg_stack_pop(ostack); - retval = TRUE; - break; - } -} G_STMT_END; -DEFUNC_OP_END - -/* almost code is shared to _hg_operator_op_private_hg_forceput */ -DEFUNC_OP (put) -G_STMT_START -{ - HgStack *ostack = hg_vm_get_ostack(vm); - guint depth = hg_stack_depth(ostack), len; - gint32 index; - HgValueNode *n1, *n2, *n3; - HgMemObject *obj; - - while (1) { - if (depth < 3) { - _hg_operator_set_error(vm, op, VM_e_stackunderflow); - break; - } - n3 = hg_stack_index(ostack, 0); - n2 = hg_stack_index(ostack, 1); - n1 = hg_stack_index(ostack, 2); - if (!hg_object_is_writable((HgObject *)n1)) { - _hg_operator_set_error(vm, op, VM_e_invalidaccess); - break; - } - hg_mem_get_object__inline(n3, obj); - if (hg_vm_is_global_object(vm, n1) && - hg_mem_is_complex_mark(obj) && - !hg_vm_is_global_object(vm, n3)) { - _hg_operator_set_error(vm, op, VM_e_invalidaccess); - break; - } - if (HG_IS_VALUE_ARRAY (n1)) { - HgArray *array = HG_VALUE_GET_ARRAY (n1); - - hg_mem_get_object__inline(array, obj); - if (!HG_IS_VALUE_INTEGER (n2)) { - _hg_operator_set_error(vm, op, VM_e_typecheck); - break; - } - len = hg_array_length(array); - index = HG_VALUE_GET_INTEGER (n2); - if (index > len || index > 65535) { - _hg_operator_set_error(vm, op, VM_e_rangecheck); - break; - } - retval = hg_array_replace_forcibly(array, n3, index, TRUE); - } else if (HG_IS_VALUE_DICT (n1)) { - HgDict *dict = HG_VALUE_GET_DICT (n1); - - hg_mem_get_object__inline(dict, obj); - if (!hg_object_is_writable((HgObject *)dict)) { - _hg_operator_set_error(vm, op, VM_e_invalidaccess); - break; - } - if (hg_vm_get_emulation_level(vm) == VM_EMULATION_LEVEL_1 && - hg_dict_length(dict) == hg_dict_maxlength(dict) && - hg_dict_lookup(dict, n2) == NULL) { - _hg_operator_set_error(vm, op, VM_e_dictfull); - break; - } - retval = hg_dict_insert_forcibly(obj->pool, dict, n2, n3, TRUE); - } else if (HG_IS_VALUE_STRING (n1)) { - HgString *string = HG_VALUE_GET_STRING (n1); - gint32 c; - - if (!HG_IS_VALUE_INTEGER (n2) || !HG_IS_VALUE_INTEGER (n3)) { - _hg_operator_set_error(vm, op, VM_e_typecheck); - break; - } - index = HG_VALUE_GET_INTEGER (n2); - c = HG_VALUE_GET_INTEGER (n3); - retval = hg_string_insert_c(string, c, index); - } else { - _hg_operator_set_error(vm, op, VM_e_typecheck); - break; - } - hg_stack_pop(ostack); - hg_stack_pop(ostack); - hg_stack_pop(ostack); - break; - } -} G_STMT_END; -DEFUNC_OP_END - -DEFUNC_OP (rand) -G_STMT_START -{ - HgStack *ostack = hg_vm_get_ostack(vm); - HgValueNode *node; - GRand *rand_ = hg_vm_get_random_generator(vm); - - HG_VALUE_MAKE_INTEGER (hg_vm_get_current_pool(vm), - node, g_rand_int_range(rand_, 0, RAND_MAX)); - if (node == NULL) { - _hg_operator_set_error(vm, op, VM_e_VMerror); - } else { - retval = hg_stack_push(ostack, node); - if (!retval) - _hg_operator_set_error(vm, op, VM_e_stackoverflow); - } -} G_STMT_END; -DEFUNC_OP_END - -DEFUNC_OP (rcheck) -G_STMT_START -{ - HgStack *ostack = hg_vm_get_ostack(vm); - guint depth = hg_stack_depth(ostack); - HgValueNode *node; - HgMemPool *pool = hg_vm_get_current_pool(vm); - - while (1) { - if (depth < 1) { - _hg_operator_set_error(vm, op, VM_e_stackunderflow); - break; - } - node = hg_stack_index(ostack, 0); - if (HG_IS_VALUE_ARRAY (node) || - HG_IS_VALUE_FILE (node) || - HG_IS_VALUE_STRING (node)) { - gboolean result = hg_object_is_readable((HgObject *)node); - - HG_VALUE_MAKE_BOOLEAN (pool, node, result); - } else if (HG_IS_VALUE_DICT (node)) { - HgDict *dict = HG_VALUE_GET_DICT (node); - gboolean result = hg_object_is_readable((HgObject *)dict); - - HG_VALUE_MAKE_BOOLEAN (pool, node, result); - } else { - _hg_operator_set_error(vm, op, VM_e_typecheck); - break; - } - hg_stack_pop(ostack); - retval = hg_stack_push(ostack, node); - /* it must be true */ - break; - } -} G_STMT_END; -DEFUNC_OP_END - -DEFUNC_UNIMPLEMENTED_OP (rcurveto); - -DEFUNC_OP (read) -G_STMT_START -{ - HgStack *ostack = hg_vm_get_ostack(vm); - guint depth = hg_stack_depth(ostack); - HgValueNode *nfile, *node; - HgMemPool *pool = hg_vm_get_current_pool(vm); - HgFileObject *file, *stdin; - gchar c; - - while (1) { - if (depth < 1) { - _hg_operator_set_error(vm, op, VM_e_stackunderflow); - break; - } - nfile = hg_stack_index(ostack, 0); - if (!HG_IS_VALUE_FILE (nfile)) { - _hg_operator_set_error(vm, op, VM_e_typecheck); - break; - } - if (!hg_object_is_readable((HgObject *)nfile)) { - _hg_operator_set_error(vm, op, VM_e_invalidaccess); - break; - } - file = HG_VALUE_GET_FILE (nfile); - stdin = hg_vm_get_io(vm, VM_IO_STDIN); - node = hg_vm_lookup_with_string(vm, "JOBSERVER"); - if (file == stdin && - node != NULL && - HG_IS_VALUE_BOOLEAN (node) && - HG_VALUE_GET_BOOLEAN (node) == TRUE) { - /* it's under the job server mode now. - * this means stdin is being used to get PostScript. - * just returns false to not breaks it. - */ - HG_VALUE_MAKE_BOOLEAN (pool, node, FALSE); - hg_stack_pop(ostack); - retval = hg_stack_push(ostack, node); - /* it must be true */ - break; - } - c = hg_file_object_getc(file); - if (hg_file_object_is_eof(file)) { - HG_VALUE_MAKE_BOOLEAN (pool, node, FALSE); - hg_stack_pop(ostack); - retval = hg_stack_push(ostack, node); - /* it must be true */ - break; - } else if (hg_file_object_has_error(file)) { - _hg_operator_set_error_from_file(vm, op, file); - break; - } else { - hg_stack_pop(ostack); - HG_VALUE_MAKE_INTEGER (pool, node, c); - hg_stack_push(ostack, node); - HG_VALUE_MAKE_BOOLEAN (pool, node, TRUE); - retval = hg_stack_push(ostack, node); - if (!retval) - _hg_operator_set_error(vm, op, VM_e_stackoverflow); - } - break; - } -} G_STMT_END; -DEFUNC_OP_END - -DEFUNC_OP (readhexstring) -G_STMT_START -{ - HgStack *ostack = hg_vm_get_ostack(vm); - guint depth = hg_stack_depth(ostack); - HgValueNode *n1, *n2; - HgFileObject *file; - HgString *s, *sub; - guint maxlength, length = 0; - HgMemPool *pool = hg_vm_get_current_pool(vm); - gchar c, hex = 0; - gint count = 2; - HgMemObject *obj; - gboolean found; - - while (1) { - if (depth < 2) { - _hg_operator_set_error(vm, op, VM_e_stackunderflow); - break; - } - n2 = hg_stack_index(ostack, 0); - n1 = hg_stack_index(ostack, 1); - if (!HG_IS_VALUE_FILE (n1) || - !HG_IS_VALUE_STRING (n2)) { - _hg_operator_set_error(vm, op, VM_e_typecheck); - break; - } - if (!hg_object_is_readable((HgObject *)n1) || - !hg_object_is_writable((HgObject *)n2)) { - _hg_operator_set_error(vm, op, VM_e_invalidaccess); - break; - } - file = HG_VALUE_GET_FILE (n1); - s = HG_VALUE_GET_STRING (n2); - maxlength = hg_string_maxlength(s); - while (length < maxlength) { - found = FALSE; - c = hg_file_object_getc(file); - if (hg_file_object_is_eof(file)) { - break; - } - if (c >= '0' && c <= '9') { - c = c - '0'; - found = TRUE; - } else if (c >= 'a' && c <= 'f') { - c = c - 'a' + 10; - found = TRUE; - } else if (c >= 'A' && c <= 'F') { - c = c - 'A' + 10; - found = TRUE; - } - if (found) { - hex = (hex << 4) | c; - count--; - if (count == 0) { - hg_string_insert_c(s, hex, length++); - count = 2; - hex = 0; - } - } - } - if (length < maxlength) { - hg_mem_get_object__inline(s, obj); - HG_VALUE_MAKE_BOOLEAN (pool, n1, FALSE); - sub = hg_string_make_substring(obj->pool, s, 0, length - 1); - HG_VALUE_MAKE_STRING (n2, sub); - } else { - HG_VALUE_MAKE_BOOLEAN (pool, n1, TRUE); - } - hg_stack_pop(ostack); - hg_stack_pop(ostack); - hg_stack_push(ostack, n2); - retval = hg_stack_push(ostack, n1); - /* it must be true */ - break; - } -} G_STMT_END; -DEFUNC_OP_END - -DEFUNC_OP (readline) -G_STMT_START -{ - HgStack *ostack = hg_vm_get_ostack(vm); - guint depth = hg_stack_depth(ostack); - HgValueNode *n1, *n2; - HgString *s, *sresult; - HgFileObject *file; - guchar c; - guint length = 0, maxlength; - gboolean result = FALSE; - HgMemPool *pool = hg_vm_get_current_pool(vm); - - while (1) { - if (depth < 2) { - _hg_operator_set_error(vm, op, VM_e_stackunderflow); - break; - } - n2 = hg_stack_index(ostack, 0); - n1 = hg_stack_index(ostack, 1); - if (!HG_IS_VALUE_FILE (n1) || - !HG_IS_VALUE_STRING (n2)) { - _hg_operator_set_error(vm, op, VM_e_typecheck); - break; - } - if (!hg_object_is_readable((HgObject *)n1) || - !hg_object_is_writable((HgObject *)n2)) { - _hg_operator_set_error(vm, op, VM_e_invalidaccess); - break; - } - file = HG_VALUE_GET_FILE (n1); - s = HG_VALUE_GET_STRING (n2); - maxlength = hg_string_maxlength(s); - while (1) { - c = hg_file_object_getc(file); - if (hg_file_object_is_eof(file)) - break; - if (c == '\r') { - c = hg_file_object_getc(file); - if (c != '\n') - hg_file_object_ungetc(file, c); - result = TRUE; - break; - } else if (c == '\n') { - result = TRUE; - break; - } - if (length > maxlength) { - _hg_operator_set_error(vm, op, VM_e_rangecheck); - return FALSE; - } - hg_string_insert_c(s, c, length++); - } - sresult = hg_string_make_substring(pool, s, 0, length - 1); - HG_VALUE_MAKE_STRING (n1, sresult); - HG_VALUE_MAKE_BOOLEAN (pool, n2, result); - hg_stack_pop(ostack); - hg_stack_pop(ostack); - hg_stack_push(ostack, n1); - retval = hg_stack_push(ostack, n2); - /* it must be true */ - break; - } -} G_STMT_END; -DEFUNC_OP_END - -DEFUNC_OP (readonly) -G_STMT_START -{ - HgStack *ostack = hg_vm_get_ostack(vm); - guint depth = hg_stack_depth(ostack); - HgValueNode *node; - - while (1) { - if (depth < 1) { - _hg_operator_set_error(vm, op, VM_e_stackunderflow); - break; - } - node = hg_stack_index(ostack, 0); - if (!HG_IS_VALUE_ARRAY (node) && - !HG_IS_VALUE_DICT (node) && - !HG_IS_VALUE_FILE (node) && - !HG_IS_VALUE_STRING (node)) { - _hg_operator_set_error(vm, op, VM_e_typecheck); - break; - } - if (!hg_object_is_writable((HgObject *)node) && - !hg_object_is_readable((HgObject *)node)) { - _hg_operator_set_error(vm, op, VM_e_invalidaccess); - break; - } - if (HG_IS_VALUE_DICT (node)) { - HgDict *dict = HG_VALUE_GET_DICT (node); - - if (!hg_object_is_writable((HgObject *)dict) && - !hg_object_is_readable((HgObject *)dict)) { - _hg_operator_set_error(vm, op, VM_e_invalidaccess); - break; - } - hg_object_unwritable((HgObject *)dict); - } - hg_object_unwritable((HgObject *)node); - retval = TRUE; - break; - } -} G_STMT_END; -DEFUNC_OP_END - -DEFUNC_OP (readstring) -G_STMT_START -{ - HgStack *ostack = hg_vm_get_ostack(vm); - guint depth = hg_stack_depth(ostack); - HgValueNode *n1, *n2; - HgFileObject *file; - HgString *s, *sub; - guint length = 0, maxlength; - gchar c; - HgMemObject *obj; - HgMemPool *pool = hg_vm_get_current_pool(vm); - - while (1) { - if (depth < 2) { - _hg_operator_set_error(vm, op, VM_e_stackunderflow); - break; - } - n2 = hg_stack_index(ostack, 0); - n1 = hg_stack_index(ostack, 1); - if (!HG_IS_VALUE_FILE (n1) || - !HG_IS_VALUE_STRING (n2)) { - _hg_operator_set_error(vm, op, VM_e_typecheck); - break; - } - if (!hg_object_is_readable((HgObject *)n1) || - !hg_object_is_writable((HgObject *)n2)) { - _hg_operator_set_error(vm, op, VM_e_invalidaccess); - break; - } - file = HG_VALUE_GET_FILE (n1); - s = HG_VALUE_GET_STRING (n2); - maxlength = hg_string_maxlength(s); - if (maxlength <= 0) { - _hg_operator_set_error(vm, op, VM_e_rangecheck); - break; - } - while (length < maxlength) { - c = hg_file_object_getc(file); - if (hg_file_object_is_eof(file)) - break; - hg_string_insert_c(s, c, length++); - } - if (length < maxlength) { - hg_mem_get_object__inline(s, obj); - HG_VALUE_MAKE_BOOLEAN (pool, n1, FALSE); - sub = hg_string_make_substring(obj->pool, s, 0, length - 1); - HG_VALUE_MAKE_STRING (n2, sub); - } else { - HG_VALUE_MAKE_BOOLEAN (pool, n1, TRUE); - } - hg_stack_pop(ostack); - hg_stack_pop(ostack); - hg_stack_push(ostack, n2); - retval = hg_stack_push(ostack, n1); - /* it must be true */ - break; - } -} G_STMT_END; -DEFUNC_OP_END - -DEFUNC_OP (repeat) -G_STMT_START -{ - HgStack *ostack = hg_vm_get_ostack(vm); - HgStack *estack = hg_vm_get_estack(vm); - guint depth = hg_stack_depth(ostack); - HgValueNode *n, *nproc, *node, *self; - - while (1) { - if (depth < 2) { - _hg_operator_set_error(vm, op, VM_e_stackunderflow); - break; - } - nproc = hg_stack_index(ostack, 0); - n = hg_stack_index(ostack, 1); - if (!HG_IS_VALUE_INTEGER (n) || !HG_IS_VALUE_ARRAY (nproc)) { - _hg_operator_set_error(vm, op, VM_e_typecheck); - break; - } - if (!hg_object_is_executable((HgObject *)nproc) || - (!hg_object_is_readable((HgObject *)nproc) && - !hg_object_is_executeonly((HgObject *)nproc))) { - _hg_operator_set_error(vm, op, VM_e_invalidaccess); - break; - } - if (HG_VALUE_GET_INTEGER (n) < 0) { - _hg_operator_set_error(vm, op, VM_e_rangecheck); - break; - } - self = hg_stack_pop(estack); - /* only n must be copied. */ - node = hg_object_copy((HgObject *)n); - if (node == NULL) { - _hg_operator_set_error(vm, op, VM_e_VMerror); - break; - } - hg_stack_push(estack, node); - hg_stack_push(estack, nproc); - node = hg_dict_lookup_with_string(hg_vm_get_dict_systemdict(vm), - "%repeat_continue"); - hg_stack_push(estack, node); - retval = hg_stack_push(estack, self); /* dummy */ - if (!retval) { - _hg_operator_set_error(vm, op, VM_e_execstackoverflow); - break; - } - - hg_stack_pop(ostack); - hg_stack_pop(ostack); - break; - } -} G_STMT_END; -DEFUNC_OP_END - -DEFUNC_UNIMPLEMENTED_OP (resetfile); - -DEFUNC_OP (restore) -G_STMT_START -{ - HgStack *ostack = hg_vm_get_ostack(vm); - guint depth = hg_stack_depth(ostack); - HgValueNode *node; - HgMemSnapshot *snapshot; - HgMemPool *pool; - gboolean global_mode; - - while (1) { - if (depth < 1) { - _hg_operator_set_error(vm, op, VM_e_stackunderflow); - break; - } - node = hg_stack_index(ostack, 0); - if (!HG_IS_VALUE_SNAPSHOT (node)) { - _hg_operator_set_error(vm, op, VM_e_typecheck); - break; - } - snapshot = HG_VALUE_GET_SNAPSHOT (node); - global_mode = hg_vm_is_global_pool_used(vm); - hg_vm_use_global_pool(vm, FALSE); - pool = hg_vm_get_current_pool(vm); - hg_vm_use_global_pool(vm, global_mode); - retval = hg_mem_pool_restore_snapshot(pool, snapshot, 1); - if (!retval) { - _hg_operator_set_error(vm, op, VM_e_invalidrestore); - break; - } - hg_stack_pop(ostack); - break; - } -} G_STMT_END; -DEFUNC_OP_END - -DEFUNC_UNIMPLEMENTED_OP (reversepath); - -DEFUNC_OP (rlineto) -G_STMT_START -{ - HgStack *ostack = hg_vm_get_ostack(vm); - guint depth = hg_stack_depth(ostack); - HgValueNode *nx, *ny; - HgGraphicState *gstate = hg_graphics_get_state(hg_vm_get_graphics(vm)); - gdouble dx, dy, d; - - while (1) { - if (depth < 2) { - _hg_operator_set_error(vm, op, VM_e_stackunderflow); - break; - } - ny = hg_stack_index(ostack, 0); - nx = hg_stack_index(ostack, 1); - if (HG_IS_VALUE_INTEGER (nx)) - dx = HG_VALUE_GET_REAL_FROM_INTEGER (nx); - else if (HG_IS_VALUE_REAL (nx)) - dx = HG_VALUE_GET_REAL (nx); - else { - _hg_operator_set_error(vm, op, VM_e_typecheck); - break; - } - if (HG_IS_VALUE_INTEGER (ny)) - dy = HG_VALUE_GET_REAL_FROM_INTEGER (ny); - else if (HG_IS_VALUE_REAL (ny)) - dy = HG_VALUE_GET_REAL (ny); - else { - _hg_operator_set_error(vm, op, VM_e_typecheck); - break; - } - if (!hg_path_compute_current_point(gstate->path, &d, &d)) { - _hg_operator_set_error(vm, op, VM_e_nocurrentpoint); - break; - } - retval = hg_graphic_state_path_rlineto(gstate, dx, dy); - if (!retval) { - _hg_operator_set_error(vm, op, VM_e_VMerror); - break; - } - hg_stack_pop(ostack); - hg_stack_pop(ostack); - break; - } -} G_STMT_END; -DEFUNC_OP_END - -DEFUNC_UNIMPLEMENTED_OP (rmoveto); - -DEFUNC_OP (roll) -G_STMT_START -{ - HgStack *ostack = hg_vm_get_ostack(vm); - guint depth = hg_stack_depth(ostack); - HgValueNode *nd, *ni; - gint32 index, d; - - while (1) { - if (depth < 2) { - _hg_operator_set_error(vm, op, VM_e_stackunderflow); - break; - } - nd = hg_stack_index(ostack, 0); - ni = hg_stack_index(ostack, 1); - if (!HG_IS_VALUE_INTEGER (nd) || !HG_IS_VALUE_INTEGER (ni)) { - _hg_operator_set_error(vm, op, VM_e_typecheck); - break; - } - index = HG_VALUE_GET_INTEGER (ni); - if (index < 0) { - _hg_operator_set_error(vm, op, VM_e_rangecheck); - break; - } - if ((depth - 2) < index) { - _hg_operator_set_error(vm, op, VM_e_stackunderflow); - break; - } - d = HG_VALUE_GET_INTEGER (nd); - hg_stack_pop(ostack); - hg_stack_pop(ostack); - hg_stack_roll(ostack, index, d); - retval = TRUE; - break; - } -} G_STMT_END; -DEFUNC_OP_END - -DEFUNC_OP (rotate) -G_STMT_START -{ - HgStack *ostack = hg_vm_get_ostack(vm); - guint depth = hg_stack_depth(ostack), len; - HgValueNode *node, *nmatrix; - HgMemPool *pool = hg_vm_get_current_pool(vm); - HgArray *matrix = NULL; - HgMatrix *mtx; - gdouble angle; - - while (1) { - if (depth < 1) { - _hg_operator_set_error(vm, op, VM_e_stackunderflow); - break; - } - nmatrix = hg_stack_index(ostack, 0); - if (HG_IS_VALUE_ARRAY (nmatrix)) { - if (depth < 2) { - _hg_operator_set_error(vm, op, VM_e_stackunderflow); - break; - } - if (!hg_object_is_writable((HgObject *)nmatrix)) { - _hg_operator_set_error(vm, op, VM_e_invalidaccess); - break; - } - matrix = HG_VALUE_GET_ARRAY (nmatrix); - len = hg_array_length(matrix); - if (len != 6) { - _hg_operator_set_error(vm, op, VM_e_rangecheck); - break; - } - node = hg_stack_index(ostack, 1); - } else { - node = nmatrix; - nmatrix = NULL; - } - if (HG_IS_VALUE_INTEGER (node)) - angle = HG_VALUE_GET_REAL_FROM_INTEGER (node); - else if (HG_IS_VALUE_REAL (node)) - angle = HG_VALUE_GET_REAL (node); - else { - _hg_operator_set_error(vm, op, VM_e_typecheck); - break; - } - angle *= 2 * M_PI / 360; - if (nmatrix != NULL) { - mtx = hg_matrix_rotate(pool, angle); - if (mtx == NULL) { - _hg_operator_set_error(vm, op, VM_e_VMerror); - break; - } - HG_VALUE_SET_REAL (hg_array_index(matrix, 0), mtx->xx); - HG_VALUE_SET_REAL (hg_array_index(matrix, 1), mtx->yx); - HG_VALUE_SET_REAL (hg_array_index(matrix, 2), mtx->xy); - HG_VALUE_SET_REAL (hg_array_index(matrix, 3), mtx->yy); - HG_VALUE_SET_REAL (hg_array_index(matrix, 4), mtx->x0); - HG_VALUE_SET_REAL (hg_array_index(matrix, 5), mtx->y0); - - hg_stack_pop(ostack); - hg_stack_pop(ostack); - retval = hg_stack_push(ostack, nmatrix); - } else { - retval = hg_graphics_matrix_rotate(hg_vm_get_graphics(vm), - angle); - if (!retval) { - _hg_operator_set_error(vm, op, VM_e_VMerror); - break; - } - hg_stack_pop(ostack); - } - break; - } -} G_STMT_END; -DEFUNC_OP_END - -DEFUNC_OP (round) -G_STMT_START -{ - HgStack *ostack = hg_vm_get_ostack(vm); - guint depth = hg_stack_depth(ostack); - HgValueNode *n; - gdouble result; - HgMemPool *pool = hg_vm_get_current_pool(vm); - - while (1) { - if (depth < 1) { - _hg_operator_set_error(vm, op, VM_e_stackunderflow); - break; - } - n = hg_stack_index(ostack, 0); - if (HG_IS_VALUE_INTEGER (n)) { - /* nothing to do */ - retval = TRUE; - } else if (HG_IS_VALUE_REAL (n)) { - result = round(HG_VALUE_GET_REAL (n)); - HG_VALUE_MAKE_REAL (pool, n, result); - hg_stack_pop(ostack); - retval = hg_stack_push(ostack, n); - /* it must be true */ - } else { - _hg_operator_set_error(vm, op, VM_e_typecheck); - } - break; - } -} G_STMT_END; -DEFUNC_OP_END - -DEFUNC_UNIMPLEMENTED_OP (rrand); - -DEFUNC_OP (save) -G_STMT_START -{ - HgStack *ostack = hg_vm_get_ostack(vm); - HgMemSnapshot *snapshot; - HgMemPool *pool; - gboolean global_mode = hg_vm_is_global_pool_used(vm); - HgValueNode *node; - - while (1) { - hg_vm_use_global_pool(vm, FALSE); - pool = hg_vm_get_current_pool(vm); - snapshot = hg_mem_pool_save_snapshot(pool); - HG_VALUE_MAKE_SNAPSHOT (node, snapshot); - if (node == NULL) { - _hg_operator_set_error(vm, op, VM_e_VMerror); - break; - } - hg_vm_use_global_pool(vm, global_mode); - retval = hg_stack_push(ostack, node); - if (!retval) - _hg_operator_set_error(vm, op, VM_e_stackoverflow); - break; - } -} G_STMT_END; -DEFUNC_OP_END - -DEFUNC_OP (scale) -G_STMT_START -{ - HgStack *ostack = hg_vm_get_ostack(vm); - guint depth = hg_stack_depth(ostack); - HgValueNode *nx, *ny, *nmatrix; - HgMemPool *pool = hg_vm_get_current_pool(vm); - HgArray *matrix; - HgMatrix *mtx; - gdouble dx, dy; - guint len, offset; - - while (1) { - if (depth < 2) { - _hg_operator_set_error(vm, op, VM_e_stackunderflow); - break; - } - nmatrix = hg_stack_index(ostack, 0); - if (HG_IS_VALUE_ARRAY (nmatrix)) { - if (depth < 3) { - _hg_operator_set_error(vm, op, VM_e_stackunderflow); - break; - } - if (!hg_object_is_writable((HgObject *)nmatrix)) { - _hg_operator_set_error(vm, op, VM_e_invalidaccess); - break; - } - matrix = HG_VALUE_GET_ARRAY (nmatrix); - len = hg_array_length(matrix); - if (len != 6) { - _hg_operator_set_error(vm, op, VM_e_rangecheck); - break; - } - ny = hg_stack_index(ostack, 1); - offset = 2; - } else { - ny = nmatrix; - nmatrix = NULL; - offset = 1; - } - nx = hg_stack_index(ostack, offset); - if (HG_IS_VALUE_INTEGER (nx)) - dx = HG_VALUE_GET_REAL_FROM_INTEGER (nx); - else if (HG_IS_VALUE_REAL (nx)) - dx = HG_VALUE_GET_REAL (nx); - else { - _hg_operator_set_error(vm, op, VM_e_typecheck); - break; - } - if (HG_IS_VALUE_INTEGER (ny)) - dy = HG_VALUE_GET_REAL_FROM_INTEGER (ny); - else if (HG_IS_VALUE_REAL (ny)) - dy = HG_VALUE_GET_REAL (ny); - else { - _hg_operator_set_error(vm, op, VM_e_typecheck); - break; - } - if (nmatrix != NULL) { - mtx = hg_matrix_scale(pool, dx, dy); - matrix = HG_VALUE_GET_ARRAY (nmatrix); - HG_VALUE_SET_REAL (hg_array_index(matrix, 0), mtx->xx); - HG_VALUE_SET_REAL (hg_array_index(matrix, 1), mtx->yx); - HG_VALUE_SET_REAL (hg_array_index(matrix, 2), mtx->xy); - HG_VALUE_SET_REAL (hg_array_index(matrix, 3), mtx->yy); - HG_VALUE_SET_REAL (hg_array_index(matrix, 4), mtx->x0); - HG_VALUE_SET_REAL (hg_array_index(matrix, 5), mtx->y0); - - hg_stack_pop(ostack); - hg_stack_pop(ostack); - hg_stack_pop(ostack); - retval = hg_stack_push(ostack, nmatrix); - /* it must be true */ - } else { - retval = hg_graphics_matrix_scale(hg_vm_get_graphics(vm), - dx, dy); - if (!retval) { - _hg_operator_set_error(vm, op, VM_e_VMerror); - break; - } - hg_stack_pop(ostack); - hg_stack_pop(ostack); - } - break; - } -} G_STMT_END; -DEFUNC_OP_END - -DEFUNC_UNIMPLEMENTED_OP (scalefont); - -DEFUNC_OP (search) -G_STMT_START -{ - HgStack *ostack = hg_vm_get_ostack(vm); - guint depth = hg_stack_depth(ostack), length1, length2, i; - HgValueNode *n1, *n2, *npre, *npost, *nmatch, *nresult; - HgString *s, *seek, *pre, *post, *match; - gchar c1, c2; - HgMemObject *obj; - HgMemPool *pool = hg_vm_get_current_pool(vm); - gboolean found = FALSE; - - while (1) { - if (depth < 2) { - _hg_operator_set_error(vm, op, VM_e_stackunderflow); - break; - } - n2 = hg_stack_index(ostack, 0); - n1 = hg_stack_index(ostack, 1); - if (!HG_IS_VALUE_STRING (n1) || - !HG_IS_VALUE_STRING (n2)) { - _hg_operator_set_error(vm, op, VM_e_typecheck); - break; - } - if (!hg_object_is_readable((HgObject *)n1) || - !hg_object_is_readable((HgObject *)n2)) { - _hg_operator_set_error(vm, op, VM_e_invalidaccess); - break; - } - s = HG_VALUE_GET_STRING (n1); - seek = HG_VALUE_GET_STRING (n2); - length1 = hg_string_length(s); - length2 = hg_string_length(seek); - c2 = hg_string_index(seek, 0); - for (i = 0; i <= (length1 - length2); i++) { - c1 = hg_string_index(s, i); - if (c1 == c2) { - if (hg_string_ncompare_offset_later(s, seek, i, 0, length2)) { - found = TRUE; - hg_mem_get_object__inline(s, obj); - pre = hg_string_make_substring(obj->pool, s, 0, i - 1); - match = hg_string_make_substring(obj->pool, s, i, i + length2 - 1); - if ((i + length2) == length1) { - post = hg_string_new(obj->pool, 0); - } else { - post = hg_string_make_substring(obj->pool, s, i + length2, length1 - 1); - } - - HG_VALUE_MAKE_STRING (npost, post); - HG_VALUE_MAKE_STRING (nmatch, match); - HG_VALUE_MAKE_STRING (npre, pre); - HG_VALUE_MAKE_BOOLEAN (pool, nresult, TRUE); - - hg_stack_pop(ostack); - hg_stack_pop(ostack); - hg_stack_push(ostack, npost); - hg_stack_push(ostack, nmatch); - hg_stack_push(ostack, npre); - retval = hg_stack_push(ostack, nresult); - if (!retval) - _hg_operator_set_error(vm, op, VM_e_stackoverflow); - } - } - } - if (!found) { - hg_stack_pop(ostack); - HG_VALUE_MAKE_BOOLEAN (pool, nresult, FALSE); - retval = hg_stack_push(ostack, nresult); - /* it must be true */ - } - break; - } -} G_STMT_END; -DEFUNC_OP_END - -DEFUNC_UNIMPLEMENTED_OP (setcachedevice); -DEFUNC_UNIMPLEMENTED_OP (setcachelimit); -DEFUNC_UNIMPLEMENTED_OP (setcharwidth); -DEFUNC_UNIMPLEMENTED_OP (setdash); -DEFUNC_UNIMPLEMENTED_OP (setflat); -DEFUNC_UNIMPLEMENTED_OP (setfont); - -DEFUNC_OP (setgray) -G_STMT_START -{ - HgStack *ostack = hg_vm_get_ostack(vm); - guint depth = hg_stack_depth(ostack); - HgValueNode *node; - gdouble d; - - while (1) { - if (depth < 1) { - _hg_operator_set_error(vm, op, VM_e_stackunderflow); - break; - } - node = hg_stack_index(ostack, 0); - if (HG_IS_VALUE_INTEGER (node)) - d = HG_VALUE_GET_REAL_FROM_INTEGER (node); - else if (HG_IS_VALUE_REAL (node)) - d = HG_VALUE_GET_REAL (node); - else { - _hg_operator_set_error(vm, op, VM_e_typecheck); - break; - } - hg_stack_pop(ostack); - retval = hg_graphic_state_color_set_rgb(hg_vm_get_graphics(vm)->current_gstate, - d, d, d); - break; - } -} G_STMT_END; -DEFUNC_OP_END - -DEFUNC_OP (sethsbcolor) -G_STMT_START -{ - HgStack *ostack = hg_vm_get_ostack(vm); - guint depth = hg_stack_depth(ostack); - HgValueNode *nh, *ns, *nb; - gdouble dh, ds, db; - - while (1) { - if (depth < 3) { - _hg_operator_set_error(vm, op, VM_e_stackunderflow); - break; - } - nh = hg_stack_index(ostack, 0); - ns = hg_stack_index(ostack, 1); - nb = hg_stack_index(ostack, 2); - if (HG_IS_VALUE_INTEGER (nh)) - dh = HG_VALUE_GET_REAL_FROM_INTEGER (nh); - else if (HG_IS_VALUE_REAL (nh)) - dh = HG_VALUE_GET_REAL (nh); - else { - _hg_operator_set_error(vm, op, VM_e_typecheck); - break; - } - if (HG_IS_VALUE_INTEGER (ns)) - ds = HG_VALUE_GET_REAL_FROM_INTEGER (ns); - else if (HG_IS_VALUE_REAL (ns)) - ds = HG_VALUE_GET_REAL (ns); - else { - _hg_operator_set_error(vm, op, VM_e_typecheck); - break; - } - if (HG_IS_VALUE_INTEGER (nb)) - db = HG_VALUE_GET_REAL_FROM_INTEGER (nb); - else if (HG_IS_VALUE_REAL (nb)) - db = HG_VALUE_GET_REAL (nb); - else { - _hg_operator_set_error(vm, op, VM_e_typecheck); - break; - } - retval = hg_graphic_state_color_set_hsv(hg_vm_get_graphics(vm)->current_gstate, - dh, ds, db); - hg_stack_pop(ostack); - hg_stack_pop(ostack); - hg_stack_pop(ostack); - break; - } -} G_STMT_END; -DEFUNC_OP_END - -DEFUNC_UNIMPLEMENTED_OP (setlinecap); -DEFUNC_UNIMPLEMENTED_OP (setlinejoin); - -DEFUNC_OP (setlinewidth) -G_STMT_START -{ - HgStack *ostack = hg_vm_get_ostack(vm); - guint depth = hg_stack_depth(ostack); - HgValueNode *node; - gdouble d; - - while (1) { - if (depth < 1) { - _hg_operator_set_error(vm, op, VM_e_stackunderflow); - break; - } - node = hg_stack_index(ostack, 0); - if (HG_IS_VALUE_INTEGER (node)) - d = HG_VALUE_GET_REAL_FROM_INTEGER (node); - else if (HG_IS_VALUE_REAL (node)) - d = HG_VALUE_GET_REAL (node); - else { - _hg_operator_set_error(vm, op, VM_e_typecheck); - break; - } - hg_stack_pop(ostack); - retval = hg_graphic_state_set_linewidth(hg_vm_get_graphics(vm)->current_gstate, d); - break; - } -} G_STMT_END; -DEFUNC_OP_END - -DEFUNC_OP (setmatrix) -G_STMT_START -{ - HgStack *ostack = hg_vm_get_ostack(vm); - guint depth = hg_stack_depth(ostack), i; - HgValueNode *node; - HgArray *matrix; - HgGraphicState *gstate = hg_graphics_get_state(hg_vm_get_graphics(vm)); - HgMatrix *mtx; - gdouble dmatrix[6]; - - while (1) { - if (depth < 1) { - _hg_operator_set_error(vm, op, VM_e_stackunderflow); - break; - } - node = hg_stack_index(ostack, 0); - if (!HG_IS_VALUE_ARRAY (node)) { - _hg_operator_set_error(vm, op, VM_e_typecheck); - break; - } - if (!hg_object_is_readable((HgObject *)node)) { - _hg_operator_set_error(vm, op, VM_e_invalidaccess); - break; - } - matrix = HG_VALUE_GET_ARRAY (node); - if (hg_array_length(matrix) != 6) { - _hg_operator_set_error(vm, op, VM_e_rangecheck); - break; - } - for (i = 0; i < 6; i++) { - node = hg_array_index(matrix, i); - if (HG_IS_VALUE_INTEGER (node)) { - dmatrix[i] = HG_VALUE_GET_REAL_FROM_INTEGER (node); - } else if (HG_IS_VALUE_REAL (node)) { - dmatrix[i] = HG_VALUE_GET_REAL (node); - } else { - _hg_operator_set_error(vm, op, VM_e_typecheck); - break; - } - } - if (i == 6) { - mtx = hg_matrix_new(hg_vm_get_current_pool(vm), - dmatrix[0], dmatrix[1], dmatrix[2], - dmatrix[3], dmatrix[4], dmatrix[5]); - if (mtx == NULL) { - _hg_operator_set_error(vm, op, VM_e_VMerror); - break; - } - memcpy(&gstate->ctm, mtx, sizeof (HgMatrix)); - hg_mem_free(mtx); - retval = hg_path_matrix(gstate->path, - gstate->ctm.xx, gstate->ctm.yx, - gstate->ctm.xy, gstate->ctm.yy, - gstate->ctm.x0, gstate->ctm.y0); - if (!retval) { - _hg_operator_set_error(vm, op, VM_e_VMerror); - break; - } - hg_stack_pop(ostack); - } - break; - } -} G_STMT_END; -DEFUNC_OP_END - -DEFUNC_UNIMPLEMENTED_OP (setmiterlimit); - -DEFUNC_OP (setrgbcolor) -G_STMT_START -{ - HgStack *ostack = hg_vm_get_ostack(vm); - guint depth = hg_stack_depth(ostack); - HgValueNode *nr, *ng, *nb; - gdouble dr, dg, db; - - while (1) { - if (depth < 3) { - _hg_operator_set_error(vm, op, VM_e_stackunderflow); - break; - } - nb = hg_stack_index(ostack, 0); - ng = hg_stack_index(ostack, 1); - nr = hg_stack_index(ostack, 2); - if (HG_IS_VALUE_INTEGER (nr)) - dr = HG_VALUE_GET_REAL_FROM_INTEGER (nr); - else if (HG_IS_VALUE_REAL (nr)) - dr = HG_VALUE_GET_REAL (nr); - else { - _hg_operator_set_error(vm, op, VM_e_typecheck); - break; - } - if (HG_IS_VALUE_INTEGER (ng)) - dg = HG_VALUE_GET_REAL_FROM_INTEGER (ng); - else if (HG_IS_VALUE_REAL (ng)) - dg = HG_VALUE_GET_REAL (ng); - else { - _hg_operator_set_error(vm, op, VM_e_typecheck); - break; - } - if (HG_IS_VALUE_INTEGER (nb)) - db = HG_VALUE_GET_REAL_FROM_INTEGER (nb); - else if (HG_IS_VALUE_REAL (nb)) - db = HG_VALUE_GET_REAL (nb); - else { - _hg_operator_set_error(vm, op, VM_e_typecheck); - break; - } - retval = hg_graphic_state_color_set_rgb(hg_vm_get_graphics(vm)->current_gstate, - dr, dg, db); - hg_stack_pop(ostack); - hg_stack_pop(ostack); - hg_stack_pop(ostack); - break; - } -} G_STMT_END; -DEFUNC_OP_END - -DEFUNC_UNIMPLEMENTED_OP (setscreen); -DEFUNC_UNIMPLEMENTED_OP (settransfer); -DEFUNC_UNIMPLEMENTED_OP (show); - -DEFUNC_OP (showpage) -G_STMT_START -{ - /* FIXME */ - /* correct procedure are: - * 1) invoke an EndPage procedure in pagedevice dictionary and - * push a page number and the code to ostack, which means - * that EndPage procedure was invoked from showpage. (see Section 6.2.6) - * 2) if EndPage procedure returned true, invoke erasepage to clear - * the raster memory after transfering the current page to the output device. - * 3) initialize the graphic state with initgraphics. - * 4) invoke a BeginPage procedure in pagedevice dictionary and - * push a page number to ostack. - */ - retval = hg_graphics_show_page(hg_vm_get_graphics(vm)); -} G_STMT_END; -DEFUNC_OP_END - -DEFUNC_OP (sin) -G_STMT_START -{ - HgStack *ostack = hg_vm_get_ostack(vm); - guint depth = hg_stack_depth(ostack); - HgValueNode *node; - gdouble d; - - while (1) { - if (depth < 1) { - _hg_operator_set_error(vm, op, VM_e_stackunderflow); - break; - } - node = hg_stack_index(ostack, 0); - if (HG_IS_VALUE_INTEGER (node)) { - d = HG_VALUE_GET_REAL_FROM_INTEGER (node); - } else if (HG_IS_VALUE_REAL (node)) { - d = HG_VALUE_GET_REAL (node); - } else { - _hg_operator_set_error(vm, op, VM_e_typecheck); - break; - } - HG_VALUE_MAKE_REAL (hg_vm_get_current_pool(vm), - node, - sin(d * (2 * M_PI / 360))); - if (node == NULL) { - _hg_operator_set_error(vm, op, VM_e_VMerror); - break; - } - hg_stack_pop(ostack); - retval = hg_stack_push(ostack, node); - /* it must be true */ - break; - } -} G_STMT_END; -DEFUNC_OP_END - -DEFUNC_OP (sqrt) -G_STMT_START -{ - HgStack *ostack = hg_vm_get_ostack(vm); - guint depth = hg_stack_depth(ostack); - HgValueNode *node; - HgMemPool *pool = hg_vm_get_current_pool(vm); - gdouble d; - - while (1) { - if (depth < 1) { - _hg_operator_set_error(vm, op, VM_e_stackunderflow); - break; - } - node = hg_stack_index(ostack, 0); - if (HG_IS_VALUE_INTEGER (node)) { - d = HG_VALUE_GET_REAL_FROM_INTEGER (node); - } else if (HG_IS_VALUE_REAL (node)) { - d = HG_VALUE_GET_REAL (node); - } else { - _hg_operator_set_error(vm, op, VM_e_typecheck); - break; - } - if (d < 0) { - _hg_operator_set_error(vm, op, VM_e_rangecheck); - break; - } - HG_VALUE_MAKE_REAL (pool, node, sqrt(d)); - hg_stack_pop(ostack); - retval = hg_stack_push(ostack, node); - /* it must be true */ - break; - } -} G_STMT_END; -DEFUNC_OP_END - -DEFUNC_OP (srand) -G_STMT_START -{ - HgStack *ostack = hg_vm_get_ostack(vm); - guint depth = hg_stack_depth(ostack); - HgValueNode *node; - GRand *rand_; - - while (1) { - if (depth < 1) { - _hg_operator_set_error(vm, op, VM_e_stackunderflow); - break; - } - node = hg_stack_index(ostack, 0); - if (!HG_IS_VALUE_INTEGER (node)) { - _hg_operator_set_error(vm, op, VM_e_typecheck); - break; - } - rand_ = hg_vm_get_random_generator(vm); - g_rand_set_seed(rand_, (guint32)HG_VALUE_GET_INTEGER (node)); - hg_stack_pop(ostack); - retval = TRUE; - break; - } -} G_STMT_END; -DEFUNC_OP_END - -DEFUNC_OP (status) -G_STMT_START -{ - HgStack *ostack = hg_vm_get_ostack(vm); - guint depth = hg_stack_depth(ostack); - HgValueNode *n, *npages, *nbytes, *nreferenced, *ncreated; - HgFileObject *file; - HgString *s; - HgMemPool *pool = hg_vm_get_current_pool(vm); - gchar *filename; - struct stat st; - - while (1) { - if (depth < 1) { - _hg_operator_set_error(vm, op, VM_e_stackunderflow); - break; - } - n = hg_stack_index(ostack, 0); - if (HG_IS_VALUE_FILE (n)) { - file = HG_VALUE_GET_FILE (n); - HG_VALUE_MAKE_BOOLEAN (pool, n, !hg_file_object_is_closed(file)); - hg_stack_pop(ostack); - retval = hg_stack_push(ostack, n); - /* it must be true */ - } else if (HG_IS_VALUE_STRING (n)) { - hg_stack_pop(ostack); - - s = HG_VALUE_GET_STRING (n); - filename = hg_string_get_string(s); - if (lstat(filename, &st) == -1) { - HG_VALUE_MAKE_BOOLEAN (pool, n, FALSE); - } else { - HG_VALUE_MAKE_INTEGER (pool, npages, st.st_blocks); - HG_VALUE_MAKE_INTEGER (pool, nbytes, st.st_size); - HG_VALUE_MAKE_INTEGER (pool, nreferenced, st.st_atime); - HG_VALUE_MAKE_INTEGER (pool, ncreated, st.st_mtime); - HG_VALUE_MAKE_BOOLEAN (pool, n, TRUE); - hg_stack_push(ostack, npages); - hg_stack_push(ostack, nbytes); - hg_stack_push(ostack, nreferenced); - hg_stack_push(ostack, ncreated); - } - retval = hg_stack_push(ostack, n); - if (!retval) { - _hg_operator_set_error(vm, op, VM_e_stackoverflow); - } - } else { - _hg_operator_set_error(vm, op, VM_e_typecheck); - } - break; - } -} G_STMT_END; -DEFUNC_OP_END - -DEFUNC_OP (stop) -G_STMT_START -{ - HgStack *estack = hg_vm_get_estack(vm); - guint edepth = hg_stack_depth(estack), i; - HgValueNode *node, *self, *key; - HgMemPool *pool = hg_vm_get_current_pool(vm); - - for (i = 0; i < edepth; i++) { - node = hg_stack_index(estack, i); - if (HG_IS_VALUE_OPERATOR (node) && - strcmp("%stopped_continue", hg_operator_get_name(HG_VALUE_GET_OPERATOR (node))) == 0) { - break; - } - } - if (i == edepth) { - hg_stderr_printf("No /stopped operator found. exiting...\n"); - node = hg_dict_lookup_with_string(hg_vm_get_dict_systemdict(vm), ".abort"); - self = hg_stack_pop(estack); - hg_stack_push(estack, node); - retval = hg_stack_push(estack, self); - if (!retval) - _hg_operator_set_error(vm, op, VM_e_execstackoverflow); - } else { - /* this operator itself is still in the estack. */ - for (; i > 1; i--) - hg_stack_pop(estack); - key = hg_vm_get_name_node(vm, ".isstop"); - HG_VALUE_MAKE_BOOLEAN (pool, node, TRUE); - hg_dict_insert(pool, hg_vm_get_dict_error(vm), key, node); - retval = TRUE; - } -} G_STMT_END; -DEFUNC_OP_END - -DEFUNC_OP (stopped) -G_STMT_START -{ - HgStack *ostack = hg_vm_get_ostack(vm); - HgStack *estack = hg_vm_get_estack(vm); - guint depth = hg_stack_depth(ostack); - HgValueNode *node, *self, *proc; - - while (1) { - if (depth < 1) { - _hg_operator_set_error(vm, op, VM_e_stackunderflow); - break; - } - node = hg_stack_index(ostack, 0); - if (!hg_object_is_readable((HgObject *)node) && - !hg_object_is_executeonly((HgObject *)node)) { - _hg_operator_set_error(vm, op, VM_e_invalidaccess); - break; - } - if (hg_object_is_executable((HgObject *)node)) { - hg_stack_pop(ostack); - self = hg_stack_pop(estack); - proc = hg_dict_lookup_with_string(hg_vm_get_dict_systemdict(vm), - "%stopped_continue"); - hg_stack_push(estack, proc); - hg_stack_push(estack, node); - retval = hg_stack_push(estack, self); - if (!retval) - _hg_operator_set_error(vm, op, VM_e_execstackoverflow); - } else { - HG_VALUE_MAKE_BOOLEAN (hg_vm_get_current_pool(vm), - node, FALSE); - retval = hg_stack_push(ostack, node); - if (!retval) - _hg_operator_set_error(vm, op, VM_e_stackoverflow); - } - break; - } -} G_STMT_END; -DEFUNC_OP_END - -DEFUNC_OP (string) -G_STMT_START -{ - HgStack *ostack = hg_vm_get_ostack(vm); - guint depth = hg_stack_depth(ostack); - HgValueNode *node; - gint32 size; - HgMemPool *pool = hg_vm_get_current_pool(vm); - HgString *hs; - - while (1) { - if (depth < 1) { - _hg_operator_set_error(vm, op, VM_e_stackunderflow); - break; - } - node = hg_stack_index(ostack, 0); - if (!HG_IS_VALUE_INTEGER (node)) { - _hg_operator_set_error(vm, op, VM_e_typecheck); - break; - } - size = HG_VALUE_GET_INTEGER (node); - if (size < 0 || size > 65535) { - _hg_operator_set_error(vm, op, VM_e_rangecheck); - break; - } - hs = hg_string_new(pool, size); - if (hs == NULL) { - _hg_operator_set_error(vm, op, VM_e_VMerror); - break; - } - HG_VALUE_MAKE_STRING (node, hs); - if (node == NULL) { - _hg_operator_set_error(vm, op, VM_e_VMerror); - break; - } - hg_stack_pop(ostack); - retval = hg_stack_push(ostack, node); - /* it must be true */ - break; - } -} G_STMT_END; -DEFUNC_OP_END - -DEFUNC_UNIMPLEMENTED_OP (stringwidth); - -DEFUNC_OP (stroke) -G_STMT_START -{ - retval = hg_graphics_render_stroke(hg_vm_get_graphics(vm)); - if (!retval) - _hg_operator_set_error(vm, op, VM_e_VMerror); -} G_STMT_END; -DEFUNC_OP_END - -DEFUNC_UNIMPLEMENTED_OP (strokepath); - -DEFUNC_OP (sub) -G_STMT_START -{ - HgStack *ostack = hg_vm_get_ostack(vm); - HgValueNode *n1, *n2; - HgMemPool *pool = hg_vm_get_current_pool(vm); - gdouble d1, d2; - guint depth = hg_stack_depth(ostack); - gdouble integer = TRUE; - - while (1) { - if (depth < 2) { - _hg_operator_set_error(vm, op, VM_e_stackunderflow); - break; - } - n2 = hg_stack_index(ostack, 0); - n1 = hg_stack_index(ostack, 1); - if (HG_IS_VALUE_INTEGER (n1)) - d1 = HG_VALUE_GET_REAL_FROM_INTEGER (n1); - else if (HG_IS_VALUE_REAL (n1)) { - d1 = HG_VALUE_GET_REAL (n1); - integer = FALSE; - } else { - _hg_operator_set_error(vm, op, VM_e_typecheck); - break; - } - if (HG_IS_VALUE_INTEGER (n2)) - d2 = HG_VALUE_GET_REAL_FROM_INTEGER (n2); - else if (HG_IS_VALUE_REAL (n2)) { - d2 = HG_VALUE_GET_REAL (n2); - integer = FALSE; - } else { - _hg_operator_set_error(vm, op, VM_e_typecheck); - break; - } - if (integer) { - HG_VALUE_MAKE_INTEGER (pool, n1, (gint32)(d1 - d2)); - } else { - HG_VALUE_MAKE_REAL (pool, n1, d1 - d2); - } - if (n1 == NULL) { - _hg_operator_set_error(vm, op, VM_e_VMerror); - break; - } - hg_stack_pop(ostack); - hg_stack_pop(ostack); - retval = hg_stack_push(ostack, n1); - /* it must be true */ - break; - } -} G_STMT_END; -DEFUNC_OP_END - -DEFUNC_OP (token) -G_STMT_START -{ - HgStack *ostack = hg_vm_get_ostack(vm); - guint depth = hg_stack_depth(ostack); - HgValueNode *n1, *nresult, *npost; - HgFileObject *file; - HgString *s, *sub; - gboolean result = FALSE; - HgMemPool *pool = hg_vm_get_current_pool(vm); - HgMemObject *obj; - gchar c; - - while (1) { - if (depth < 1) { - _hg_operator_set_error(vm, op, VM_e_stackunderflow); - break; - } - n1 = hg_stack_index(ostack, 0); - if (!hg_object_is_readable((HgObject *)n1)) { - _hg_operator_set_error(vm, op, VM_e_invalidaccess); - break; - } - if (HG_IS_VALUE_FILE (n1)) { - file = HG_VALUE_GET_FILE (n1); - nresult = hg_scanner_get_object(vm, file); - c = hg_file_object_getc(file); - if (!_hg_scanner_isspace(c)) { - hg_file_object_ungetc(file, c); - } - hg_stack_pop(ostack); - if (nresult != NULL) { - hg_stack_push(ostack, nresult); - result = TRUE; - } - } else if (HG_IS_VALUE_STRING (n1)) { - s = HG_VALUE_GET_STRING (n1); - file = hg_file_object_new(pool, HG_FILE_TYPE_BUFFER, - HG_FILE_MODE_READ, "%token", - hg_string_get_string(s), hg_string_maxlength(s)); - nresult = hg_scanner_get_object(vm, file); - c = hg_file_object_getc(file); - if (!_hg_scanner_isspace(c)) { - hg_file_object_ungetc(file, c); - } - hg_stack_pop(ostack); - if (nresult != NULL) { - gssize pos = hg_file_object_seek(file, 0, HG_FILE_POS_CURRENT); - guint maxlength = hg_string_maxlength(s) - 1; - - hg_mem_get_object__inline(s, obj); - if (pos > maxlength) { - sub = hg_string_new(obj->pool, 0); - } else { - sub = hg_string_make_substring(obj->pool, s, pos, maxlength); - } - HG_VALUE_MAKE_STRING (npost, sub); - hg_stack_push(ostack, npost); - hg_stack_push(ostack, nresult); - result = TRUE; - } - hg_mem_free(file); - } else { - _hg_operator_set_error(vm, op, VM_e_typecheck); - break; - } - HG_VALUE_MAKE_BOOLEAN (pool, n1, result); - retval = hg_stack_push(ostack, n1); - if (!retval) { - _hg_operator_set_error(vm, op, VM_e_stackoverflow); - } - break; - } -} G_STMT_END; -DEFUNC_OP_END - -DEFUNC_UNIMPLEMENTED_OP (transform); - -DEFUNC_OP (translate) -G_STMT_START -{ - HgStack *ostack = hg_vm_get_ostack(vm); - guint depth = hg_stack_depth(ostack); - HgValueNode *nx, *ny, *nmatrix; - HgMemPool *pool = hg_vm_get_current_pool(vm); - HgArray *matrix; - HgMatrix *mtx; - gdouble dx, dy; - guint len, offset; - - while (1) { - if (depth < 2) { - _hg_operator_set_error(vm, op, VM_e_stackunderflow); - break; - } - nmatrix = hg_stack_index(ostack, 0); - if (HG_IS_VALUE_ARRAY (nmatrix)) { - if (depth < 3) { - _hg_operator_set_error(vm, op, VM_e_stackunderflow); - break; - } - if (!hg_object_is_writable((HgObject *)nmatrix)) { - _hg_operator_set_error(vm, op, VM_e_invalidaccess); - break; - } - matrix = HG_VALUE_GET_ARRAY (nmatrix); - len = hg_array_length(matrix); - if (len != 6) { - _hg_operator_set_error(vm, op, VM_e_rangecheck); - break; - } - ny = hg_stack_index(ostack, 1); - offset = 2; - } else { - ny = nmatrix; - nmatrix = NULL; - offset = 1; - } - nx = hg_stack_index(ostack, offset); - if (HG_IS_VALUE_INTEGER (nx)) - dx = HG_VALUE_GET_REAL_FROM_INTEGER (nx); - else if (HG_IS_VALUE_REAL (nx)) - dx = HG_VALUE_GET_REAL (nx); - else { - _hg_operator_set_error(vm, op, VM_e_typecheck); - break; - } - if (HG_IS_VALUE_INTEGER (ny)) - dy = HG_VALUE_GET_REAL_FROM_INTEGER (ny); - else if (HG_IS_VALUE_REAL (ny)) - dy = HG_VALUE_GET_REAL (ny); - else { - _hg_operator_set_error(vm, op, VM_e_typecheck); - break; - } - if (nmatrix != NULL) { - mtx = hg_matrix_translate(pool, dx, dy); - matrix = HG_VALUE_GET_ARRAY (nmatrix); - HG_VALUE_SET_REAL (hg_array_index(matrix, 0), mtx->xx); - HG_VALUE_SET_REAL (hg_array_index(matrix, 1), mtx->yx); - HG_VALUE_SET_REAL (hg_array_index(matrix, 2), mtx->xy); - HG_VALUE_SET_REAL (hg_array_index(matrix, 3), mtx->yy); - HG_VALUE_SET_REAL (hg_array_index(matrix, 4), mtx->x0); - HG_VALUE_SET_REAL (hg_array_index(matrix, 5), mtx->y0); - - hg_stack_pop(ostack); - hg_stack_pop(ostack); - hg_stack_pop(ostack); - retval = hg_stack_push(ostack, nmatrix); - /* it must be true */ - } else { - retval = hg_graphics_matrix_translate(hg_vm_get_graphics(vm), - dx, dy); - if (!retval) { - _hg_operator_set_error(vm, op, VM_e_VMerror); - break; - } - hg_stack_pop(ostack); - hg_stack_pop(ostack); - } - break; - } -} G_STMT_END; -DEFUNC_OP_END - -DEFUNC_OP (truncate) -G_STMT_START -{ - HgStack *ostack = hg_vm_get_ostack(vm); - guint depth = hg_stack_depth(ostack); - HgValueNode *node; - HgMemPool *pool = hg_vm_get_current_pool(vm); - - while (1) { - if (depth < 1) { - _hg_operator_set_error(vm, op, VM_e_stackunderflow); - break; - } - node = hg_stack_index(ostack, 0); - if (HG_IS_VALUE_INTEGER (node)) { - /* nothing to do here */ - retval = TRUE; - } else if (HG_IS_VALUE_REAL (node)) { - gdouble result = floor(HG_VALUE_GET_REAL (node)); - - HG_VALUE_MAKE_REAL (pool, node, result); - if (node == NULL) { - _hg_operator_set_error(vm, op, VM_e_VMerror); - break; - } - hg_stack_pop(ostack); - retval = hg_stack_push(ostack, node); - /* it must be true */ - } else { - _hg_operator_set_error(vm, op, VM_e_typecheck); - } - break; - } -} G_STMT_END; -DEFUNC_OP_END - -DEFUNC_OP (type) -G_STMT_START -{ - HgStack *ostack = hg_vm_get_ostack(vm); - guint depth = hg_stack_depth(ostack); - HgValueNode *node; - - while (1) { - if (depth < 1) { - _hg_operator_set_error(vm, op, VM_e_stackunderflow); - break; - } - node = hg_stack_index(ostack, 0); - switch (HG_VALUE_GET_VALUE_TYPE (node)) { - case HG_TYPE_VALUE_BOOLEAN: - node = hg_vm_get_name_node(vm, "booleantype"); - break; - case HG_TYPE_VALUE_INTEGER: - node = hg_vm_get_name_node(vm, "integertype"); - break; - case HG_TYPE_VALUE_REAL: - node = hg_vm_get_name_node(vm, "realtype"); - break; - case HG_TYPE_VALUE_NAME: - node = hg_vm_get_name_node(vm, "nametype"); - break; - case HG_TYPE_VALUE_ARRAY: - node = hg_vm_get_name_node(vm, "arraytype"); - break; - case HG_TYPE_VALUE_STRING: - node = hg_vm_get_name_node(vm, "stringtype"); - break; - case HG_TYPE_VALUE_DICT: - node = hg_vm_get_name_node(vm, "dicttype"); - break; - case HG_TYPE_VALUE_NULL: - node = hg_vm_get_name_node(vm, "nulltype"); - break; - case HG_TYPE_VALUE_OPERATOR: - node = hg_vm_get_name_node(vm, "operatortype"); - break; - case HG_TYPE_VALUE_MARK: - node = hg_vm_get_name_node(vm, "marktype"); - break; - case HG_TYPE_VALUE_FILE: - node = hg_vm_get_name_node(vm, "filetype"); - break; - case HG_TYPE_VALUE_SNAPSHOT: - node = hg_vm_get_name_node(vm, "savetype"); - break; - case HG_TYPE_VALUE_END: - default: - hg_log_warning("[BUG] Unknown node type %d was given.", - HG_VALUE_GET_VALUE_TYPE (node)); - _hg_operator_set_error(vm, op, VM_e_typecheck); - - return retval; - } - hg_object_executable((HgObject *)node); - hg_stack_pop(ostack); - retval = hg_stack_push(ostack, node); - /* it must be true */ - break; - } -} G_STMT_END; -DEFUNC_OP_END - -DEFUNC_OP (usertime) -G_STMT_START -{ - HgStack *ostack = hg_vm_get_ostack(vm); - HgValueNode *node; - - HG_VALUE_MAKE_INTEGER (hg_vm_get_current_pool(vm), - node, hg_vm_get_current_time(vm)); - if (node == NULL) { - _hg_operator_set_error(vm, op, VM_e_VMerror); - } else { - retval = hg_stack_push(ostack, node); - if (!retval) - _hg_operator_set_error(vm, op, VM_e_stackoverflow); - } -} G_STMT_END; -DEFUNC_OP_END - -DEFUNC_OP (vmstatus) -G_STMT_START -{ - HgStack *ostack = hg_vm_get_ostack(vm); - HgValueNode *n1, *n2, *n3; - HgMemPool *pool = hg_vm_get_current_pool(vm); - gint32 level, used, maximum; - - while (1) { - level = hg_vm_get_save_level(vm); - used = hg_mem_pool_get_used_heap_size(pool); - maximum = hg_mem_pool_get_free_heap_size(pool); - HG_VALUE_MAKE_INTEGER (pool, n1, level); - HG_VALUE_MAKE_INTEGER (pool, n2, used); - HG_VALUE_MAKE_INTEGER (pool, n3, maximum); - if (n1 == NULL || - n2 == NULL || - n3 == NULL) { - _hg_operator_set_error(vm, op, VM_e_VMerror); - break; - } - hg_stack_push(ostack, n1); - hg_stack_push(ostack, n2); - retval = hg_stack_push(ostack, n3); - if (!retval) - _hg_operator_set_error(vm, op, VM_e_stackoverflow); - break; - } -} G_STMT_END; -DEFUNC_OP_END - -DEFUNC_OP (wcheck) -G_STMT_START -{ - HgStack *ostack = hg_vm_get_ostack(vm); - guint depth = hg_stack_depth(ostack); - HgValueNode *node; - HgMemPool *pool = hg_vm_get_current_pool(vm); - - while (1) { - if (depth < 1) { - _hg_operator_set_error(vm, op, VM_e_stackunderflow); - break; - } - node = hg_stack_index(ostack, 0); - if (HG_IS_VALUE_ARRAY (node) || - HG_IS_VALUE_FILE (node) || - HG_IS_VALUE_STRING (node)) { - gboolean result = hg_object_is_writable((HgObject *)node); - - HG_VALUE_MAKE_BOOLEAN (pool, node, result); - } else if (HG_IS_VALUE_DICT (node)) { - HgDict *dict = HG_VALUE_GET_DICT (node); - gboolean result = hg_object_is_writable((HgObject *)dict); - - HG_VALUE_MAKE_BOOLEAN (pool, node, result); - } else { - _hg_operator_set_error(vm, op, VM_e_typecheck); - break; - } - hg_stack_pop(ostack); - retval = hg_stack_push(ostack, node); - /* it must be true */ - break; - } -} G_STMT_END; -DEFUNC_OP_END - -DEFUNC_OP (where) -G_STMT_START -{ - HgStack *ostack = hg_vm_get_ostack(vm); - HgStack *dstack = hg_vm_get_dstack(vm); - guint depth = hg_stack_depth(ostack); - guint ddepth = hg_stack_depth(dstack), i; - HgValueNode *node, *ndict; - HgDict *dict = NULL; - HgMemPool *pool = hg_vm_get_current_pool(vm); - - while (1) { - if (depth < 1) { - _hg_operator_set_error(vm, op, VM_e_stackunderflow); - break; - } - node = hg_stack_index(ostack, 0); - for (i = 0; i < ddepth; i++) { - ndict = hg_stack_index(dstack, i); - if (!HG_IS_VALUE_DICT (ndict)) { - hg_log_warning("[BUG] Invalid dictionary was in the dictionary stack."); - return retval; - } - dict = HG_VALUE_GET_DICT (ndict); - if (hg_dict_lookup(dict, node) != NULL) - break; - } - hg_stack_pop(ostack); - if (i == ddepth || dict == NULL) { - HG_VALUE_MAKE_BOOLEAN (pool, node, FALSE); - retval = hg_stack_push(ostack, node); - /* it must be true */ - } else { - HG_VALUE_MAKE_DICT (node, dict); - hg_stack_push(ostack, node); - HG_VALUE_MAKE_BOOLEAN (pool, node, TRUE); - retval = hg_stack_push(ostack, node); - if (!retval) - _hg_operator_set_error(vm, op, VM_e_stackoverflow); - } - break; - } -} G_STMT_END; -DEFUNC_OP_END - -DEFUNC_UNIMPLEMENTED_OP (widthshow); - -DEFUNC_OP (write) -G_STMT_START -{ - HgStack *ostack = hg_vm_get_ostack(vm); - guint depth = hg_stack_depth(ostack); - HgValueNode *n1, *n2; - HgFileObject *file; - gint32 i; - - while (1) { - if (depth < 2) { - _hg_operator_set_error(vm, op, VM_e_stackunderflow); - break; - } - n2 = hg_stack_index(ostack, 0); - n1 = hg_stack_index(ostack, 1); - if (!HG_IS_VALUE_FILE (n1) || - !HG_IS_VALUE_INTEGER (n2)) { - _hg_operator_set_error(vm, op, VM_e_typecheck); - break; - } - if (!hg_object_is_writable((HgObject *)n1)) { - _hg_operator_set_error(vm, op, VM_e_invalidaccess); - break; - } - file = HG_VALUE_GET_FILE (n1); - i = HG_VALUE_GET_INTEGER (n2); - hg_file_object_printf(file, "%c", i % 256); - hg_stack_pop(ostack); - hg_stack_pop(ostack); - retval = TRUE; - break; - } -} G_STMT_END; -DEFUNC_OP_END - -DEFUNC_OP (writehexstring) -G_STMT_START -{ - HgStack *ostack = hg_vm_get_ostack(vm); - guint depth = hg_stack_depth(ostack); - HgValueNode *n1, *n2; - HgFileObject *file; - HgString *s; - guint length, i; - - while (1) { - if (depth < 2) { - _hg_operator_set_error(vm, op, VM_e_stackunderflow); - break; - } - n2 = hg_stack_index(ostack, 0); - n1 = hg_stack_index(ostack, 1); - if (!HG_IS_VALUE_FILE (n1) || - !HG_IS_VALUE_STRING (n2)) { - _hg_operator_set_error(vm, op, VM_e_typecheck); - break; - } - if (!hg_object_is_writable((HgObject *)n1) || - !hg_object_is_readable((HgObject *)n2)) { - _hg_operator_set_error(vm, op, VM_e_invalidaccess); - break; - } - file = HG_VALUE_GET_FILE (n1); - s = HG_VALUE_GET_STRING (n2); - length = hg_string_maxlength(s); - for (i = 0; i < length; i++) { - hg_file_object_printf(file, "%02X", hg_string_index(s, i) & 0xff); - } - hg_stack_pop(ostack); - hg_stack_pop(ostack); - retval = TRUE; - break; - } -} G_STMT_END; -DEFUNC_OP_END - -DEFUNC_OP (writestring) -G_STMT_START -{ - HgStack *ostack = hg_vm_get_ostack(vm); - guint depth = hg_stack_depth(ostack); - HgValueNode *n1, *n2; - HgFileObject *file; - HgString *hs; - - while (1) { - if (depth < 2) { - _hg_operator_set_error(vm, op, VM_e_stackunderflow); - break; - } - n2 = hg_stack_index(ostack, 0); - n1 = hg_stack_index(ostack, 1); - if (!HG_IS_VALUE_FILE (n1) || - !HG_IS_VALUE_STRING (n2)) { - _hg_operator_set_error(vm, op, VM_e_typecheck); - break; - } - if (!hg_object_is_writable((HgObject *)n1) || - !hg_object_is_readable((HgObject *)n2)) { - _hg_operator_set_error(vm, op, VM_e_invalidaccess); - break; - } - file = HG_VALUE_GET_FILE (n1); - hs = HG_VALUE_GET_STRING (n2); - hg_file_object_write(file, - hg_string_get_string(hs), - sizeof (gchar), - hg_string_maxlength(hs)); - if (hg_file_object_has_error(file)) { - _hg_operator_set_error_from_file(vm, op, file); - break; - } - hg_stack_pop(ostack); - hg_stack_pop(ostack); - retval = TRUE; - break; - } -} G_STMT_END; -DEFUNC_OP_END - -DEFUNC_OP (xcheck) -G_STMT_START -{ - HgStack *ostack = hg_vm_get_ostack(vm); - guint depth = hg_stack_depth(ostack); - HgValueNode *node; - HgMemPool *pool = hg_vm_get_current_pool(vm); - - while (1) { - if (depth < 1) { - _hg_operator_set_error(vm, op, VM_e_stackunderflow); - break; - } - node = hg_stack_index(ostack, 0); - if (HG_IS_VALUE_ARRAY (node) || - HG_IS_VALUE_FILE (node) || - HG_IS_VALUE_STRING (node) || - HG_IS_VALUE_NAME (node)) { - gboolean result = hg_object_is_executable((HgObject *)node); - - HG_VALUE_MAKE_BOOLEAN (pool, node, result); - } else if (HG_IS_VALUE_DICT (node)) { - HgDict *dict = HG_VALUE_GET_DICT (node); - gboolean result = hg_object_is_executable((HgObject *)dict); - - HG_VALUE_MAKE_BOOLEAN (pool, node, result); - } else { - HG_VALUE_MAKE_BOOLEAN (pool, node, FALSE); - } - hg_stack_pop(ostack); - retval = hg_stack_push(ostack, node); - /* it must be true */ - break; - } -} G_STMT_END; -DEFUNC_OP_END - -DEFUNC_OP (xor) -G_STMT_START -{ - HgStack *ostack = hg_vm_get_ostack(vm); - guint depth = hg_stack_depth(ostack); - HgValueNode *n1, *n2; - HgMemPool *pool = hg_vm_get_current_pool(vm); - - while (1) { - if (depth < 2) { - _hg_operator_set_error(vm, op, VM_e_stackunderflow); - break; - } - n2 = hg_stack_index(ostack, 0); - n1 = hg_stack_index(ostack, 1); - if (HG_IS_VALUE_BOOLEAN (n1) && - HG_IS_VALUE_BOOLEAN (n2)) { - gboolean result = HG_VALUE_GET_BOOLEAN (n1) ^ HG_VALUE_GET_BOOLEAN (n2); - - HG_VALUE_MAKE_BOOLEAN (pool, n1, result); - if (n1 == NULL) { - _hg_operator_set_error(vm, op, VM_e_VMerror); - break; - } - } else if (HG_IS_VALUE_INTEGER (n1) && - HG_IS_VALUE_INTEGER (n2)) { - gint32 result = HG_VALUE_GET_INTEGER (n1) ^ HG_VALUE_GET_INTEGER (n2); - - HG_VALUE_MAKE_INTEGER (pool, n1, result); - if (n1 == NULL) { - _hg_operator_set_error(vm, op, VM_e_VMerror); - break; - } - } else { - _hg_operator_set_error(vm, op, VM_e_typecheck); - break; - } - hg_stack_pop(ostack); - hg_stack_pop(ostack); - retval = hg_stack_push(ostack, n1); - /* it must be true */ - break; - } -} G_STMT_END; -DEFUNC_OP_END - -/* level 2 */ -DEFUNC_UNIMPLEMENTED_OP (arct); -DEFUNC_UNIMPLEMENTED_OP (colorimage); -DEFUNC_UNIMPLEMENTED_OP (cshow); -DEFUNC_UNIMPLEMENTED_OP (currentblackgeneration); -DEFUNC_UNIMPLEMENTED_OP (currentcacheparams); -DEFUNC_UNIMPLEMENTED_OP (currentcmykcolor); -DEFUNC_UNIMPLEMENTED_OP (currentcolor); -DEFUNC_UNIMPLEMENTED_OP (currentcolorrendering); -DEFUNC_UNIMPLEMENTED_OP (currentcolorscreen); -DEFUNC_UNIMPLEMENTED_OP (currentcolorspace); -DEFUNC_UNIMPLEMENTED_OP (currentcolortransfer); -DEFUNC_UNIMPLEMENTED_OP (currentdevparams); -DEFUNC_UNIMPLEMENTED_OP (currentgstate); -DEFUNC_UNIMPLEMENTED_OP (currenthalftone); -DEFUNC_UNIMPLEMENTED_OP (currentobjectformat); -DEFUNC_UNIMPLEMENTED_OP (currentoverprint); -DEFUNC_UNIMPLEMENTED_OP (currentpacking); -DEFUNC_UNIMPLEMENTED_OP (currentpagedevice); -DEFUNC_UNIMPLEMENTED_OP (currentshared); -DEFUNC_UNIMPLEMENTED_OP (currentstrokeadjust); -DEFUNC_UNIMPLEMENTED_OP (currentsystemparams); -DEFUNC_UNIMPLEMENTED_OP (currentundercolorremoval); -DEFUNC_UNIMPLEMENTED_OP (currentuserparams); -DEFUNC_UNIMPLEMENTED_OP (defineresource); -DEFUNC_UNIMPLEMENTED_OP (defineuserobject); -DEFUNC_UNIMPLEMENTED_OP (deletefile); -DEFUNC_UNIMPLEMENTED_OP (execform); -DEFUNC_UNIMPLEMENTED_OP (execuserobject); -DEFUNC_UNIMPLEMENTED_OP (filenameforall); -DEFUNC_UNIMPLEMENTED_OP (fileposition); -DEFUNC_UNIMPLEMENTED_OP (filter); -DEFUNC_UNIMPLEMENTED_OP (findencoding); -DEFUNC_UNIMPLEMENTED_OP (findresource); -DEFUNC_UNIMPLEMENTED_OP (gcheck); -DEFUNC_UNIMPLEMENTED_OP (globalfontdirectory); -DEFUNC_UNIMPLEMENTED_OP (glyphshow); -DEFUNC_UNIMPLEMENTED_OP (gstate); -DEFUNC_UNIMPLEMENTED_OP (ineofill); -DEFUNC_UNIMPLEMENTED_OP (infill); -DEFUNC_UNIMPLEMENTED_OP (instroke); -DEFUNC_UNIMPLEMENTED_OP (inueofill); -DEFUNC_UNIMPLEMENTED_OP (inufill); -DEFUNC_UNIMPLEMENTED_OP (inustroke); -DEFUNC_UNIMPLEMENTED_OP (isolatin1encoding); -DEFUNC_UNIMPLEMENTED_OP (languagelevel); -DEFUNC_UNIMPLEMENTED_OP (makepattern); -DEFUNC_UNIMPLEMENTED_OP (packedarray); -DEFUNC_UNIMPLEMENTED_OP (printobject); -DEFUNC_UNIMPLEMENTED_OP (realtime); -DEFUNC_UNIMPLEMENTED_OP (rectclip); -DEFUNC_UNIMPLEMENTED_OP (rectfill); -DEFUNC_UNIMPLEMENTED_OP (rectstroke); -DEFUNC_UNIMPLEMENTED_OP (renamefile); -DEFUNC_UNIMPLEMENTED_OP (resourceforall); -DEFUNC_UNIMPLEMENTED_OP (resourcestatus); -DEFUNC_UNIMPLEMENTED_OP (rootfont); -DEFUNC_UNIMPLEMENTED_OP (scheck); -DEFUNC_UNIMPLEMENTED_OP (selectfont); -DEFUNC_UNIMPLEMENTED_OP (serialnumber); -DEFUNC_UNIMPLEMENTED_OP (setbbox); -DEFUNC_UNIMPLEMENTED_OP (setblackgeneration); -DEFUNC_UNIMPLEMENTED_OP (setcachedevice2); -DEFUNC_UNIMPLEMENTED_OP (setcacheparams); -DEFUNC_UNIMPLEMENTED_OP (setcmykcolor); -DEFUNC_UNIMPLEMENTED_OP (setcolor); -DEFUNC_UNIMPLEMENTED_OP (setcolorrendering); -DEFUNC_UNIMPLEMENTED_OP (setcolorscreen); -DEFUNC_UNIMPLEMENTED_OP (setcolorspace); -DEFUNC_UNIMPLEMENTED_OP (setcolortransfer); -DEFUNC_UNIMPLEMENTED_OP (setdevparams); -DEFUNC_UNIMPLEMENTED_OP (setfileposition); -DEFUNC_UNIMPLEMENTED_OP (setgstate); -DEFUNC_UNIMPLEMENTED_OP (sethalftone); -DEFUNC_UNIMPLEMENTED_OP (setobjectformat); -DEFUNC_UNIMPLEMENTED_OP (setoverprint); -DEFUNC_UNIMPLEMENTED_OP (setpacking); -DEFUNC_UNIMPLEMENTED_OP (setpagedevice); -DEFUNC_UNIMPLEMENTED_OP (setpattern); -DEFUNC_UNIMPLEMENTED_OP (setshared); -DEFUNC_UNIMPLEMENTED_OP (setstrokeadjust); -DEFUNC_UNIMPLEMENTED_OP (setsystemparams); -DEFUNC_UNIMPLEMENTED_OP (setucacheparams); -DEFUNC_UNIMPLEMENTED_OP (setundercoloremoval); -DEFUNC_UNIMPLEMENTED_OP (setuserparams); -DEFUNC_UNIMPLEMENTED_OP (setvmthreshold); -DEFUNC_UNIMPLEMENTED_OP (shareddict); -DEFUNC_UNIMPLEMENTED_OP (sharedfontdirectory); -DEFUNC_UNIMPLEMENTED_OP (startjob); -DEFUNC_UNIMPLEMENTED_OP (uappend); -DEFUNC_UNIMPLEMENTED_OP (ucache); -DEFUNC_UNIMPLEMENTED_OP (ucachestatus); -DEFUNC_UNIMPLEMENTED_OP (ueofill); -DEFUNC_UNIMPLEMENTED_OP (ufill); -DEFUNC_UNIMPLEMENTED_OP (undef); -DEFUNC_UNIMPLEMENTED_OP (undefineresource); -DEFUNC_UNIMPLEMENTED_OP (undefineuserobject); -DEFUNC_UNIMPLEMENTED_OP (upath); -DEFUNC_UNIMPLEMENTED_OP (userobjects); -DEFUNC_UNIMPLEMENTED_OP (ustroke); -DEFUNC_UNIMPLEMENTED_OP (ustrokepath); -DEFUNC_UNIMPLEMENTED_OP (vmreclaim); -DEFUNC_UNIMPLEMENTED_OP (writeobject); -DEFUNC_UNIMPLEMENTED_OP (xshow); -DEFUNC_UNIMPLEMENTED_OP (xyshow); -DEFUNC_UNIMPLEMENTED_OP (yshow); - -/* level 3 */ -DEFUNC_UNIMPLEMENTED_OP (addglyph); -DEFUNC_UNIMPLEMENTED_OP (beginbfchar); -DEFUNC_UNIMPLEMENTED_OP (beginbfrange); -DEFUNC_UNIMPLEMENTED_OP (begincidchar); -DEFUNC_UNIMPLEMENTED_OP (begincidrange); -DEFUNC_UNIMPLEMENTED_OP (begincmap); -DEFUNC_UNIMPLEMENTED_OP (begincodespacerange); -DEFUNC_UNIMPLEMENTED_OP (beginnotdefchar); -DEFUNC_UNIMPLEMENTED_OP (beginnotdefrange); -DEFUNC_UNIMPLEMENTED_OP (beginrearrangedfont); -DEFUNC_UNIMPLEMENTED_OP (beginusematrix); -DEFUNC_UNIMPLEMENTED_OP (cliprestore); -DEFUNC_UNIMPLEMENTED_OP (clipsave); -DEFUNC_UNIMPLEMENTED_OP (composefont); -DEFUNC_UNIMPLEMENTED_OP (currentsmoothness); -DEFUNC_UNIMPLEMENTED_OP (currentrapparams); -DEFUNC_UNIMPLEMENTED_OP (endbfchar); -DEFUNC_UNIMPLEMENTED_OP (endbfrange); -DEFUNC_UNIMPLEMENTED_OP (endcidchar); -DEFUNC_UNIMPLEMENTED_OP (endcidrange); -DEFUNC_UNIMPLEMENTED_OP (endcmap); -DEFUNC_UNIMPLEMENTED_OP (endcodespacerange); -DEFUNC_UNIMPLEMENTED_OP (endnotdefchar); -DEFUNC_UNIMPLEMENTED_OP (endnotdefrange); -DEFUNC_UNIMPLEMENTED_OP (endrearrangedfont); -DEFUNC_UNIMPLEMENTED_OP (endusematrix); -DEFUNC_UNIMPLEMENTED_OP (findcolorrendering); -DEFUNC_UNIMPLEMENTED_OP (gethalftonename); -DEFUNC_UNIMPLEMENTED_OP (getpagedevicename); -DEFUNC_UNIMPLEMENTED_OP (getsubstitutecrd); -DEFUNC_UNIMPLEMENTED_OP (removeall); -DEFUNC_UNIMPLEMENTED_OP (removeglyphs); -DEFUNC_UNIMPLEMENTED_OP (setsmoothness); -DEFUNC_UNIMPLEMENTED_OP (settrapparams); -DEFUNC_UNIMPLEMENTED_OP (settrapzone); -DEFUNC_UNIMPLEMENTED_OP (shfill); -DEFUNC_UNIMPLEMENTED_OP (startdata); -DEFUNC_UNIMPLEMENTED_OP (usecmap); -DEFUNC_UNIMPLEMENTED_OP (usefont); - -/* hieroglyph specific operators */ -DEFUNC_OP (private_hg_abort) -G_STMT_START -{ - HgFileObject *file = hg_vm_get_io(vm, VM_IO_STDERR); - HgStack *ostack = hg_vm_get_ostack(vm); - HgStack *estack = hg_vm_get_estack(vm); - HgStack *dstack = hg_vm_get_dstack(vm); - HgMemPool *local_pool, *global_pool; - gboolean flag = hg_vm_is_global_pool_used(vm); - gsize free_size, used_size; - - hg_vm_use_global_pool(vm, TRUE); - global_pool = hg_vm_get_current_pool(vm); - hg_vm_use_global_pool(vm, FALSE); - local_pool = hg_vm_get_current_pool(vm); - hg_vm_use_global_pool(vm, flag); - /* allow resizing to avoid /VMerror during dumping */ - hg_mem_pool_allow_resize(global_pool, TRUE); - hg_mem_pool_allow_resize(local_pool, TRUE); - - hg_file_object_printf(file, "\nOperand stack:\n"); - hg_stack_dump(ostack, file); - hg_file_object_printf(file, "\nExecution stack:\n"); - hg_stack_dump(estack, file); - hg_file_object_printf(file, "\nDictionary stack:\n"); - hg_stack_dump(dstack, file); - hg_file_object_printf(file, "\nVM Status:\n"); - free_size = hg_mem_pool_get_free_heap_size(global_pool); - used_size = hg_mem_pool_get_used_heap_size(global_pool); - hg_file_object_printf(file, " Total (Global): %" G_GSIZE_FORMAT "\n", free_size + used_size); - hg_file_object_printf(file, " Free (Global): %" G_GSIZE_FORMAT "\n", free_size); - hg_file_object_printf(file, " Used (Global): %" G_GSIZE_FORMAT "\n", used_size); - free_size = hg_mem_pool_get_free_heap_size(local_pool); - used_size = hg_mem_pool_get_used_heap_size(local_pool); - hg_file_object_printf(file, " Total (Local): %" G_GSIZE_FORMAT "\n", free_size + used_size); - hg_file_object_printf(file, " Free (Local): %" G_GSIZE_FORMAT "\n", free_size); - hg_file_object_printf(file, " Used (Local): %" G_GSIZE_FORMAT "\n", used_size); - abort(); -} G_STMT_END; -DEFUNC_OP_END - -DEFUNC_OP (private_hg_clearerror) -G_STMT_START -{ - hg_vm_reset_error(vm); - retval = TRUE; -} G_STMT_END; -DEFUNC_OP_END - -DEFUNC_OP (private_hg_currentglobal) -G_STMT_START -{ - HgStack *ostack = hg_vm_get_ostack(vm); - HgValueNode *node; - - HG_VALUE_MAKE_BOOLEAN (hg_vm_get_current_pool(vm), node, hg_vm_is_global_pool_used(vm)); - retval = hg_stack_push(ostack, node); - if (!retval) - _hg_operator_set_error(vm, op, VM_e_stackoverflow); -} G_STMT_END; -DEFUNC_OP_END - -DEFUNC_OP (private_hg_execn) -G_STMT_START -{ - HgStack *ostack = hg_vm_get_ostack(vm); - HgStack *estack = hg_vm_get_estack(vm); - guint depth = hg_stack_depth(ostack); - HgValueNode *nn, *node, *copy_node, *self; - gint32 i, n; - - while (1) { - if (depth < 1) { - _hg_operator_set_error(vm, op, VM_e_stackunderflow); - break; - } - nn = hg_stack_index(ostack, 0); - if (!HG_IS_VALUE_INTEGER (nn)) { - _hg_operator_set_error(vm, op, VM_e_typecheck); - break; - } - n = HG_VALUE_GET_INTEGER (nn); - if (depth < (n + 1)) { - _hg_operator_set_error(vm, op, VM_e_stackunderflow); - break; - } - self = hg_stack_pop(estack); - for (i = 0; i < n; i++) { - node = hg_stack_index(ostack, i + 1); - copy_node = hg_object_copy((HgObject *)node); - if (copy_node == NULL) { - _hg_operator_set_error(vm, op, VM_e_VMerror); - break; - } - hg_stack_push(estack, copy_node); - } - if (!hg_vm_has_error(vm)) { - hg_stack_pop(ostack); - for (i = 0; i < n; i++) - hg_stack_pop(ostack); - } - retval = hg_stack_push(estack, self); - /* it must be true */ - break; - } -} G_STMT_END; -DEFUNC_OP_END - -/* almost code is shared to _hg_operator_op_exit */ -DEFUNC_OP (private_hg_exit) -G_STMT_START -{ - HgStack *estack = hg_vm_get_estack(vm); - guint depth = hg_stack_depth(estack), i, j; - const gchar *name; - HgValueNode *node; - - for (i = 0; i < depth; i++) { - node = hg_stack_index(estack, i); - if (HG_IS_VALUE_OPERATOR (node)) { - /* target operators are: - * cshow filenameforall for forall kshow loop pathforall - * repeat resourceforall - */ - name = hg_operator_get_name(HG_VALUE_GET_OPERATOR (node)); - if (strcmp(name, "%for_pos_int_continue") == 0 || - strcmp(name, "%for_pos_real_continue") == 0) { - /* drop down ini inc limit proc in estack */ - hg_stack_pop(estack); - hg_stack_pop(estack); - hg_stack_pop(estack); - hg_stack_pop(estack); - } else if (strcmp(name, "%loop_continue") == 0) { - /* drop down proc in estack */ - hg_stack_pop(estack); - } else if (strcmp(name, "%repeat_continue") == 0) { - /* drop down n proc in estack */ - hg_stack_pop(estack); - hg_stack_pop(estack); - } else if (strcmp(name, "%forall_array_continue") == 0 || - strcmp(name, "%forall_dict_continue") == 0 || - strcmp(name, "%forall_string_continue") == 0) { - /* drop down n val proc in estack */ - hg_stack_pop(estack); - hg_stack_pop(estack); - hg_stack_pop(estack); - } else { - continue; - } - for (j = 0; j < i; j++) - hg_stack_pop(estack); - retval = TRUE; - break; - } else if (HG_IS_VALUE_FILE (node)) { - _hg_operator_set_error(vm, op, VM_e_invalidexit); - break; - } - } - if (i == depth) - _hg_operator_set_error(vm, op, VM_e_invalidexit); -} G_STMT_END; -DEFUNC_OP_END - -DEFUNC_OP (private_hg_findlibfile) -G_STMT_START -{ - HgStack *ostack = hg_vm_get_ostack(vm); - guint depth = hg_stack_depth(ostack); - HgValueNode *node, *nresult; - HgString *s; - gchar *filename; - HgMemPool *pool = hg_vm_get_current_pool(vm); - gboolean result = FALSE; - - while (1) { - if (depth < 1) { - _hg_operator_set_error(vm, op, VM_e_stackunderflow); - break; - } - node = hg_stack_index(ostack, 0); - if (!HG_IS_VALUE_STRING (node)) { - _hg_operator_set_error(vm, op, VM_e_typecheck); - break; - } - s = HG_VALUE_GET_STRING (node); - filename = hg_vm_find_libfile(vm, hg_string_get_string(s)); - if (filename) { - hg_stack_pop(ostack); - result = TRUE; - s = hg_string_new(pool, -1); - hg_string_append(s, filename, -1); - hg_string_fix_string_size(s); - HG_VALUE_MAKE_STRING(node, s); - hg_stack_push(ostack, node); - } - HG_VALUE_MAKE_BOOLEAN (pool, nresult, result); - retval = hg_stack_push(ostack, nresult); - if (!retval) - _hg_operator_set_error(vm, op, VM_e_stackoverflow); - break; - } -} G_STMT_END; -DEFUNC_OP_END - -/* almost code is shared to _hg_operator_op_put */ -DEFUNC_OP (private_hg_forceput) -G_STMT_START -{ - HgStack *ostack = hg_vm_get_ostack(vm); - guint depth = hg_stack_depth(ostack), len; - gint32 index; - HgValueNode *n1, *n2, *n3; - HgMemObject *obj; - - while (1) { - if (depth < 3) { - _hg_operator_set_error(vm, op, VM_e_stackunderflow); - break; - } - n3 = hg_stack_index(ostack, 0); - n2 = hg_stack_index(ostack, 1); - n1 = hg_stack_index(ostack, 2); - if (HG_IS_VALUE_ARRAY (n1)) { - HgArray *array = HG_VALUE_GET_ARRAY (n1); - - if (!HG_IS_VALUE_INTEGER (n2)) { - _hg_operator_set_error(vm, op, VM_e_typecheck); - break; - } - len = hg_array_length(array); - index = HG_VALUE_GET_INTEGER (n2); - if (index > len || index > 65535) { - _hg_operator_set_error(vm, op, VM_e_rangecheck); - break; - } - retval = hg_array_replace_forcibly(array, n3, index, TRUE); - } else if (HG_IS_VALUE_DICT (n1)) { - HgDict *dict = HG_VALUE_GET_DICT (n1); - - hg_mem_get_object__inline(dict, obj); - retval = hg_dict_insert_forcibly(obj->pool, dict, n2, n3, TRUE); - } else if (HG_IS_VALUE_STRING (n1)) { - HgString *string = HG_VALUE_GET_STRING (n1); - gint32 c; - - if (!HG_IS_VALUE_INTEGER (n2) || !HG_IS_VALUE_INTEGER (n3)) { - _hg_operator_set_error(vm, op, VM_e_typecheck); - break; - } - index = HG_VALUE_GET_INTEGER (n2); - c = HG_VALUE_GET_INTEGER (n3); - retval = hg_string_insert_c(string, c, index); - } else { - _hg_operator_set_error(vm, op, VM_e_typecheck); - break; - } - hg_stack_pop(ostack); - hg_stack_pop(ostack); - hg_stack_pop(ostack); - break; - } -} G_STMT_END; -DEFUNC_OP_END - -DEFUNC_OP (private_hg_getsecuritylevel) -G_STMT_START -{ - HgStack *ostack = hg_vm_get_ostack(vm); - HgValueNode *node; - HgMemPool *pool = hg_vm_get_current_pool(vm); - - HG_VALUE_MAKE_INTEGER (pool, node, hg_vm_get_security_level(vm)); - retval = hg_stack_push(ostack, node); - if (!retval) - _hg_operator_set_error(vm, op, VM_e_stackoverflow); -} G_STMT_END; -DEFUNC_OP_END - -DEFUNC_OP (private_hg_hgrevision) -G_STMT_START -{ - HgStack *ostack = hg_vm_get_ostack(vm); - HgValueNode *node; - HgMemPool *pool = hg_vm_get_current_pool(vm); - gint32 revision = 0; - - sscanf(__hg_rcsid, "$Rev: %d $", &revision); - HG_VALUE_MAKE_INTEGER (pool, node, revision); - retval = hg_stack_push(ostack, node); - if (!retval) - _hg_operator_set_error(vm, op, VM_e_stackoverflow); -} G_STMT_END; -DEFUNC_OP_END - -DEFUNC_OP (private_hg_initplugins) -G_STMT_START -{ - hg_vm_load_plugins_all(vm); - retval = TRUE; -} G_STMT_END; -DEFUNC_OP_END - -DEFUNC_OP (private_hg_odef) -G_STMT_START -{ - HgStack *ostack = hg_vm_get_ostack(vm); - HgStack *estack = hg_vm_get_estack(vm); - guint depth = hg_stack_depth(ostack); - HgValueNode *n1, *n2, *n, *nself; - HgArray *array; - HgDict *systemdict = hg_vm_get_dict_systemdict(vm); - - while (1) { - if (depth < 2) { - _hg_operator_set_error(vm, op, VM_e_stackunderflow); - break; - } - n2 = hg_stack_index(ostack, 0); - n1 = hg_stack_index(ostack, 1); - if (!HG_IS_VALUE_NAME (n1) || - !HG_IS_VALUE_ARRAY (n2)) { - _hg_operator_set_error(vm, op, VM_e_typecheck); - break; - } - n = hg_dict_lookup_with_string(systemdict, "def"); - if (n == NULL) { - _hg_operator_set_error(vm, op, VM_e_undefined); - break; - } - if (hg_object_is_executable((HgObject *)n2)) { - array = HG_VALUE_GET_ARRAY (n2); - hg_array_set_name(array, HG_VALUE_GET_NAME (n1)); - hg_object_executeonly((HgObject *)n2); - } - nself = hg_stack_pop(estack); - hg_stack_push(estack, n); - retval = hg_stack_push(estack, nself); - if (!retval) { - _hg_operator_set_error(vm, op, VM_e_execstackoverflow); - break; - } - break; - } -} G_STMT_END; -DEFUNC_OP_END - -DEFUNC_OP (private_hg_product) -G_STMT_START -{ - HgStack *ostack = hg_vm_get_ostack(vm); - HgValueNode *node; - HgMemPool *pool = hg_vm_get_current_pool(vm); - HgString *hs = hg_string_new(pool, -1); - - hg_string_append(hs, "Hieroglyph PostScript Interpreter", -1); - hg_string_fix_string_size(hs); - HG_VALUE_MAKE_STRING (node, hs); - hg_object_unwritable((HgObject *)node); - retval = hg_stack_push(ostack, node); - if (!retval) - _hg_operator_set_error(vm, op, VM_e_stackoverflow); -} G_STMT_END; -DEFUNC_OP_END - -DEFUNC_OP (private_hg_quit) -G_STMT_START -{ - HgStack *ostack = hg_vm_get_ostack(vm); - guint depth = hg_stack_depth(ostack); - HgValueNode *node; - - while (1) { - if (depth < 1) { - _hg_operator_set_error(vm, op, VM_e_stackunderflow); - break; - } - node = hg_stack_index(ostack, 0); - if (!HG_IS_VALUE_INTEGER (node)) { - _hg_operator_set_error(vm, op, VM_e_typecheck); - break; - } - hg_vm_shutdown(vm, HG_VALUE_GET_INTEGER (node)); - retval = TRUE; - break; - } -} G_STMT_END; -DEFUNC_OP_END - -DEFUNC_OP (private_hg_revision) -G_STMT_START -{ - HgStack *ostack = hg_vm_get_ostack(vm); - HgValueNode *node; - HgMemPool *pool = hg_vm_get_current_pool(vm); - gint32 major, minor, release; - - sscanf(HIEROGLYPH_VERSION, "%d.%d.%d", &major, &minor, &release); - HG_VALUE_MAKE_INTEGER (pool, node, major * 1000000 + minor * 1000 + release); - retval = hg_stack_push(ostack, node); - if (!retval) - _hg_operator_set_error(vm, op, VM_e_stackoverflow); -} G_STMT_END; -DEFUNC_OP_END - -DEFUNC_OP (private_hg_setglobal) -G_STMT_START -{ - HgStack *ostack = hg_vm_get_ostack(vm); - guint depth = hg_stack_depth(ostack); - HgValueNode *node; - - while (1) { - if (depth < 1) { - _hg_operator_set_error(vm, op, VM_e_stackunderflow); - break; - } - node = hg_stack_index(ostack, 0); - if (!HG_IS_VALUE_BOOLEAN (node)) { - _hg_operator_set_error(vm, op, VM_e_typecheck); - break; - } - hg_vm_use_global_pool(vm, HG_VALUE_GET_BOOLEAN (node)); - hg_stack_pop(ostack); - retval = TRUE; - break; - } -} G_STMT_END; -DEFUNC_OP_END - -DEFUNC_OP (private_hg_setsecuritylevel) -G_STMT_START -{ - - HgStack *ostack = hg_vm_get_ostack(vm); - guint depth = hg_stack_depth(ostack); - HgValueNode *node; - - while (1) { - if (depth < 1) { - _hg_operator_set_error(vm, op, VM_e_stackunderflow); - break; - } - node = hg_stack_index(ostack, 0); - if (!HG_IS_VALUE_INTEGER (node)) { - _hg_operator_set_error(vm, op, VM_e_typecheck); - break; - } - if (!hg_vm_set_security_level(vm, HG_VALUE_GET_INTEGER (node))) { - _hg_operator_set_error(vm, op, VM_e_invalidaccess); - break; - } - hg_stack_pop(ostack); - retval = TRUE; - break; - } -} G_STMT_END; -DEFUNC_OP_END - -DEFUNC_OP (private_hg_startjobserver) -G_STMT_START -{ - HgValueNode *key, *val; - - key = hg_vm_get_name_node(vm, "%initialized"); - val = hg_dict_lookup_with_string(hg_vm_get_dict_systemdict(vm), - "true"); - hg_dict_insert(hg_vm_get_current_pool(vm), - hg_vm_get_dict_statusdict(vm), - key, val); - - /* set read-only attribute to systemdict */ - hg_object_unwritable((HgObject *)hg_vm_get_dict_systemdict(vm)); - retval = TRUE; -} G_STMT_END; -DEFUNC_OP_END - -DEFUNC_OP (private_hg_undef) -G_STMT_START -{ - HgStack *ostack = hg_vm_get_ostack(vm); - guint depth = hg_stack_depth(ostack); - HgValueNode *n1, *n2; - HgDict *dict; - - while (1) { - if (depth < 2) { - _hg_operator_set_error(vm, op, VM_e_stackunderflow); - break; - } - n2 = hg_stack_index(ostack, 0); - n1 = hg_stack_index(ostack, 1); - if (!HG_IS_VALUE_DICT (n1)) { - _hg_operator_set_error(vm, op, VM_e_typecheck); - break; - } - dict = HG_VALUE_GET_DICT (n1); - if (!hg_object_is_writable((HgObject *)dict)) { - _hg_operator_set_error(vm, op, VM_e_invalidaccess); - break; - } - hg_dict_remove(dict, n2); - hg_stack_pop(ostack); - hg_stack_pop(ostack); - retval = TRUE; - break; - } -} G_STMT_END; -DEFUNC_OP_END - -#undef DEFUNC_UNIMPLEMENTED_OP -#undef DEFUNC_OP -#undef DEFUNC_OP_END - -/* - * Private Functions - */ -static void -_hg_operator_real_set_flags(gpointer data, - guint flags) -{ - HgOperator *op = data; - HgMemObject *obj; - - hg_mem_get_object__inline(op->name, obj); - if (obj == NULL) { - hg_log_warning("Invalid object %p to be marked: HgOperator->name", op->name); - } else { -#ifdef DEBUG_GC - G_STMT_START { - if ((flags & HG_MEMOBJ_MARK_AGE_MASK) != 0) { - if (!hg_mem_is_flags__inline(obj, flags)) { - hg_value_node_debug_print(__hg_file_stderr, HG_DEBUG_GC_MARK, HG_TYPE_VALUE_OPERATOR, NULL, data, op->name); - } else { - hg_value_node_debug_print(__hg_file_stderr, HG_DEBUG_GC_ALREADYMARK, HG_TYPE_VALUE_OPERATOR, NULL, data, op->name); - } - } - } G_STMT_END; -#endif /* DEBUG_GC */ - if (!hg_mem_is_flags__inline(obj, flags)) - hg_mem_add_flags__inline(obj, flags, TRUE); - } -} - -static void -_hg_operator_real_relocate(gpointer data, - HgMemRelocateInfo *info) -{ - HgOperator *op = data; - - if ((gsize)op->name >= info->start && - (gsize)op->name <= info->end) { - op->name = (gchar *)((gsize)op->name + info->diff); - } -} - -static gpointer -_hg_operator_real_to_string(gpointer data) -{ - HgOperator *op = data; - HgMemObject *obj; - HgString *retval; - - hg_mem_get_object__inline(data, obj); - if (obj == NULL) - return NULL; - retval = hg_string_new(obj->pool, strlen(op->name) + 4); - hg_string_append(retval, "--", 2); - hg_string_append(retval, op->name, -1); - hg_string_append(retval, "--", 2); - - return retval; -} - -static void -hg_operator_level1_init(HgVM *vm, - HgMemPool *pool, - HgDict *dict) -{ - BUILD_OP_ (vm, pool, dict, %arraytomark, private_arraytomark); - BUILD_OP_ (vm, pool, dict, %dicttomark, private_dicttomark); - BUILD_OP_ (vm, pool, dict, %for_pos_int_continue, private_for_pos_int_continue); - BUILD_OP_ (vm, pool, dict, %for_pos_real_continue, private_for_pos_real_continue); - BUILD_OP_ (vm, pool, dict, %forall_array_continue, private_forall_array_continue); - BUILD_OP_ (vm, pool, dict, %forall_dict_continue, private_forall_dict_continue); - BUILD_OP_ (vm, pool, dict, %forall_string_continue, private_forall_string_continue); - BUILD_OP_ (vm, pool, dict, %loop_continue, private_loop_continue); - BUILD_OP_ (vm, pool, dict, %repeat_continue, private_repeat_continue); - BUILD_OP_ (vm, pool, dict, %stopped_continue, private_stopped_continue); - BUILD_OP_ (vm, pool, dict, .findfont, private_findfont); - BUILD_OP_ (vm, pool, dict, .definefont, private_definefont); - BUILD_OP_ (vm, pool, dict, .stringcvs, private_stringcvs); - BUILD_OP_ (vm, pool, dict, .undefinefont, private_undefinefont); - BUILD_OP_ (vm, pool, dict, .write==only, private_write_eqeq_only); - BUILD_OP (vm, pool, dict, abs, abs); - BUILD_OP (vm, pool, dict, add, add); - BUILD_OP (vm, pool, dict, aload, aload); - BUILD_OP (vm, pool, dict, and, and); - BUILD_OP (vm, pool, dict, arc, arc); - BUILD_OP (vm, pool, dict, arcn, arcn); - BUILD_OP (vm, pool, dict, arcto, arcto); - BUILD_OP (vm, pool, dict, array, array); - BUILD_OP (vm, pool, dict, ashow, ashow); - BUILD_OP (vm, pool, dict, astore, astore); - BUILD_OP (vm, pool, dict, atan, atan); - BUILD_OP (vm, pool, dict, awidthshow, awidthshow); - BUILD_OP (vm, pool, dict, begin, begin); - BUILD_OP (vm, pool, dict, bind, bind); - BUILD_OP (vm, pool, dict, bitshift, bitshift); - BUILD_OP (vm, pool, dict, bytesavailable, bytesavailable); - BUILD_OP (vm, pool, dict, cachestatus, cachestatus); - BUILD_OP (vm, pool, dict, ceiling, ceiling); - BUILD_OP (vm, pool, dict, charpath, charpath); - BUILD_OP (vm, pool, dict, clear, clear); - BUILD_OP (vm, pool, dict, cleardictstack, cleardictstack); - BUILD_OP (vm, pool, dict, cleartomark, cleartomark); - BUILD_OP (vm, pool, dict, clip, clip); - BUILD_OP (vm, pool, dict, clippath, clippath); - BUILD_OP (vm, pool, dict, closefile, closefile); - BUILD_OP (vm, pool, dict, closepath, closepath); - BUILD_OP (vm, pool, dict, concat, concat); - BUILD_OP (vm, pool, dict, concatmatrix, concatmatrix); - BUILD_OP (vm, pool, dict, copy, copy); - BUILD_OP (vm, pool, dict, copypage, copypage); - BUILD_OP (vm, pool, dict, cos, cos); - BUILD_OP (vm, pool, dict, count, count); - BUILD_OP (vm, pool, dict, countdictstack, countdictstack); - BUILD_OP (vm, pool, dict, countexecstack, countexecstack); - BUILD_OP (vm, pool, dict, counttomark, counttomark); - BUILD_OP (vm, pool, dict, currentdash, currentdash); - BUILD_OP (vm, pool, dict, currentdict, currentdict); - BUILD_OP (vm, pool, dict, currentfile, currentfile); - BUILD_OP (vm, pool, dict, currentflat, currentflat); - BUILD_OP (vm, pool, dict, currentfont, currentfont); - BUILD_OP (vm, pool, dict, currentgray, currentgray); - BUILD_OP (vm, pool, dict, currenthsbcolor, currenthsbcolor); - BUILD_OP (vm, pool, dict, currentlinecap, currentlinecap); - BUILD_OP (vm, pool, dict, currentlinejoin, currentlinejoin); - BUILD_OP (vm, pool, dict, currentlinewidth, currentlinewidth); - BUILD_OP (vm, pool, dict, currentmatrix, currentmatrix); - BUILD_OP (vm, pool, dict, currentmiterlimit, currentmiterlimit); - BUILD_OP (vm, pool, dict, currentpoint, currentpoint); - BUILD_OP (vm, pool, dict, currentrgbcolor, currentrgbcolor); - BUILD_OP (vm, pool, dict, currentscreen, currentscreen); - BUILD_OP (vm, pool, dict, currenttransfer, currenttransfer); - BUILD_OP (vm, pool, dict, curveto, curveto); - BUILD_OP (vm, pool, dict, cvi, cvi); - BUILD_OP (vm, pool, dict, cvlit, cvlit); - BUILD_OP (vm, pool, dict, cvn, cvn); - BUILD_OP (vm, pool, dict, cvr, cvr); - BUILD_OP (vm, pool, dict, cvrs, cvrs); - BUILD_OP (vm, pool, dict, cvx, cvx); - BUILD_OP (vm, pool, dict, def, def); - BUILD_OP (vm, pool, dict, defaultmatrix, defaultmatrix); - BUILD_OP (vm, pool, dict, dict, dict); - BUILD_OP (vm, pool, dict, dictstack, dictstack); - BUILD_OP (vm, pool, dict, div, div); - BUILD_OP (vm, pool, dict, dtransform, dtransform); - BUILD_OP (vm, pool, dict, dup, dup); - BUILD_OP (vm, pool, dict, echo, echo); - BUILD_OP_ (vm, pool, dict, eexec, eexec); - BUILD_OP (vm, pool, dict, end, end); - BUILD_OP (vm, pool, dict, eoclip, eoclip); - BUILD_OP (vm, pool, dict, eofill, eofill); - BUILD_OP (vm, pool, dict, eq, eq); - BUILD_OP (vm, pool, dict, erasepage, erasepage); - BUILD_OP (vm, pool, dict, exch, exch); - BUILD_OP (vm, pool, dict, exec, exec); - BUILD_OP (vm, pool, dict, execstack, execstack); - BUILD_OP (vm, pool, dict, executeonly, executeonly); - BUILD_OP (vm, pool, dict, exit, exit); - BUILD_OP (vm, pool, dict, exp, exp); - BUILD_OP (vm, pool, dict, file, file); - BUILD_OP (vm, pool, dict, fill, fill); - BUILD_OP (vm, pool, dict, flattenpath, flattenpath); - BUILD_OP (vm, pool, dict, flush, flush); - BUILD_OP (vm, pool, dict, flushfile, flushfile); - BUILD_OP (vm, pool, dict, FontDirectory, fontdirectory); - BUILD_OP (vm, pool, dict, for, for); - BUILD_OP (vm, pool, dict, forall, forall); - BUILD_OP (vm, pool, dict, ge, ge); - BUILD_OP (vm, pool, dict, get, get); - BUILD_OP (vm, pool, dict, getinterval, getinterval); - BUILD_OP (vm, pool, dict, grestore, grestore); - BUILD_OP (vm, pool, dict, grestoreall, grestoreall); - BUILD_OP (vm, pool, dict, gsave, gsave); - BUILD_OP (vm, pool, dict, gt, gt); - BUILD_OP (vm, pool, dict, identmatrix, identmatrix); - BUILD_OP (vm, pool, dict, idiv, idiv); - BUILD_OP (vm, pool, dict, idtransform, idtransform); - BUILD_OP (vm, pool, dict, if, if); - BUILD_OP (vm, pool, dict, ifelse, ifelse); - BUILD_OP (vm, pool, dict, image, image); - BUILD_OP (vm, pool, dict, imagemask, imagemask); - BUILD_OP (vm, pool, dict, index, index); - BUILD_OP (vm, pool, dict, initclip, initclip); - BUILD_OP (vm, pool, dict, initgraphics, initgraphics); - BUILD_OP (vm, pool, dict, initmatrix, initmatrix); - BUILD_OP_ (vm, pool, dict, internaldict, internaldict); - BUILD_OP (vm, pool, dict, invertmatrix, invertmatrix); - BUILD_OP (vm, pool, dict, itransform, itransform); - BUILD_OP (vm, pool, dict, known, known); - BUILD_OP (vm, pool, dict, kshow, kshow); - BUILD_OP (vm, pool, dict, le, le); - BUILD_OP (vm, pool, dict, length, length); - BUILD_OP (vm, pool, dict, lineto, lineto); - BUILD_OP (vm, pool, dict, ln, ln); - BUILD_OP (vm, pool, dict, log, log); - BUILD_OP (vm, pool, dict, loop, loop); - BUILD_OP (vm, pool, dict, lt, lt); - BUILD_OP (vm, pool, dict, makefont, makefont); - BUILD_OP (vm, pool, dict, maxlength, maxlength); - BUILD_OP (vm, pool, dict, mod, mod); - BUILD_OP (vm, pool, dict, moveto, moveto); - BUILD_OP (vm, pool, dict, mul, mul); - BUILD_OP (vm, pool, dict, ne, ne); - BUILD_OP (vm, pool, dict, neg, neg); - BUILD_OP (vm, pool, dict, newpath, newpath); - BUILD_OP (vm, pool, dict, noaccess, noaccess); - BUILD_OP (vm, pool, dict, not, not); - BUILD_OP (vm, pool, dict, nulldevice, nulldevice); - BUILD_OP (vm, pool, dict, or, or); - BUILD_OP (vm, pool, dict, pathbbox, pathbbox); - BUILD_OP (vm, pool, dict, pathforall, pathforall); - BUILD_OP (vm, pool, dict, pop, pop); - BUILD_OP (vm, pool, dict, print, print); - BUILD_OP (vm, pool, dict, put, put); - BUILD_OP (vm, pool, dict, rand, rand); - BUILD_OP (vm, pool, dict, rcheck, rcheck); - BUILD_OP (vm, pool, dict, rcurveto, rcurveto); - BUILD_OP (vm, pool, dict, read, read); - BUILD_OP (vm, pool, dict, readhexstring, readhexstring); - BUILD_OP (vm, pool, dict, readline, readline); - BUILD_OP (vm, pool, dict, readonly, readonly); - BUILD_OP (vm, pool, dict, readstring, readstring); - BUILD_OP (vm, pool, dict, repeat, repeat); - BUILD_OP (vm, pool, dict, resetfile, resetfile); - BUILD_OP (vm, pool, dict, restore, restore); - BUILD_OP (vm, pool, dict, reversepath, reversepath); - BUILD_OP (vm, pool, dict, rlineto, rlineto); - BUILD_OP (vm, pool, dict, rmoveto, rmoveto); - BUILD_OP (vm, pool, dict, roll, roll); - BUILD_OP (vm, pool, dict, rotate, rotate); - BUILD_OP (vm, pool, dict, round, round); - BUILD_OP (vm, pool, dict, rrand, rrand); - BUILD_OP (vm, pool, dict, save, save); - BUILD_OP (vm, pool, dict, scale, scale); - BUILD_OP (vm, pool, dict, scalefont, scalefont); - BUILD_OP (vm, pool, dict, search, search); - BUILD_OP (vm, pool, dict, setcachedevice, setcachedevice); - BUILD_OP (vm, pool, dict, setcachelimit, setcachelimit); - BUILD_OP (vm, pool, dict, setcharwidth, setcharwidth); - BUILD_OP (vm, pool, dict, setdash, setdash); - BUILD_OP (vm, pool, dict, setflat, setflat); - BUILD_OP (vm, pool, dict, setfont, setfont); - BUILD_OP (vm, pool, dict, setgray, setgray); - BUILD_OP (vm, pool, dict, sethsbcolor, sethsbcolor); - BUILD_OP (vm, pool, dict, setlinecap, setlinecap); - BUILD_OP (vm, pool, dict, setlinejoin, setlinejoin); - BUILD_OP (vm, pool, dict, setlinewidth, setlinewidth); - BUILD_OP (vm, pool, dict, setmatrix, setmatrix); - BUILD_OP (vm, pool, dict, setmiterlimit, setmiterlimit); - BUILD_OP (vm, pool, dict, setrgbcolor, setrgbcolor); - BUILD_OP (vm, pool, dict, setscreen, setscreen); - BUILD_OP (vm, pool, dict, settransfer, settransfer); - BUILD_OP (vm, pool, dict, show, show); - BUILD_OP (vm, pool, dict, showpage, showpage); - BUILD_OP (vm, pool, dict, sin, sin); - BUILD_OP (vm, pool, dict, sqrt, sqrt); - BUILD_OP (vm, pool, dict, srand, srand); - BUILD_OP (vm, pool, dict, status, status); - BUILD_OP (vm, pool, dict, stop, stop); - BUILD_OP (vm, pool, dict, stopped, stopped); - BUILD_OP (vm, pool, dict, string, string); - BUILD_OP (vm, pool, dict, stringwidth, stringwidth); - BUILD_OP (vm, pool, dict, stroke, stroke); - BUILD_OP (vm, pool, dict, strokepath, strokepath); - BUILD_OP (vm, pool, dict, sub, sub); - BUILD_OP (vm, pool, dict, token, token); - BUILD_OP (vm, pool, dict, transform, transform); - BUILD_OP (vm, pool, dict, translate, translate); - BUILD_OP (vm, pool, dict, truncate, truncate); - BUILD_OP (vm, pool, dict, type, type); - BUILD_OP (vm, pool, dict, usertime, usertime); - BUILD_OP (vm, pool, dict, vmstatus, vmstatus); - BUILD_OP (vm, pool, dict, wcheck, wcheck); - BUILD_OP (vm, pool, dict, where, where); - BUILD_OP (vm, pool, dict, widthshow, widthshow); - BUILD_OP (vm, pool, dict, write, write); - BUILD_OP (vm, pool, dict, writehexstring, writehexstring); - BUILD_OP (vm, pool, dict, writestring, writestring); - BUILD_OP (vm, pool, dict, xcheck, xcheck); - BUILD_OP (vm, pool, dict, xor, xor); -} - -static void -hg_operator_level2_init(HgVM *vm, - HgMemPool *pool, - HgDict *dict) -{ - BUILD_OP (vm, pool, dict, arct, arct); - BUILD_OP (vm, pool, dict, colorimage, colorimage); - BUILD_OP (vm, pool, dict, cshow, cshow); - BUILD_OP (vm, pool, dict, currentblackgeneration, currentblackgeneration); - BUILD_OP (vm, pool, dict, currentcacheparams, currentcacheparams); - BUILD_OP (vm, pool, dict, currentcmykcolor, currentcmykcolor); - BUILD_OP (vm, pool, dict, currentcolor, currentcolor); - BUILD_OP (vm, pool, dict, currentcolorrendering, currentcolorrendering); - BUILD_OP (vm, pool, dict, currentcolorscreen, currentcolorscreen); - BUILD_OP (vm, pool, dict, currentcolorspace, currentcolorspace); - BUILD_OP (vm, pool, dict, currentcolortransfer, currentcolortransfer); - BUILD_OP (vm, pool, dict, currentdevparams, currentdevparams); - BUILD_OP (vm, pool, dict, currentgstate, currentgstate); - BUILD_OP (vm, pool, dict, currenthalftone, currenthalftone); - BUILD_OP (vm, pool, dict, currentobjectformat, currentobjectformat); - BUILD_OP (vm, pool, dict, currentoverprint, currentoverprint); - BUILD_OP (vm, pool, dict, currentpacking, currentpacking); - BUILD_OP (vm, pool, dict, currentpagedevice, currentpagedevice); - BUILD_OP (vm, pool, dict, currentshared, currentshared); - BUILD_OP (vm, pool, dict, currentstrokeadjust, currentstrokeadjust); - BUILD_OP (vm, pool, dict, currentsystemparams, currentsystemparams); - BUILD_OP (vm, pool, dict, currentundercolorremoval, currentundercolorremoval); - BUILD_OP (vm, pool, dict, currentuserparams, currentuserparams); - BUILD_OP (vm, pool, dict, defineresource, defineresource); - BUILD_OP (vm, pool, dict, defineuserobject, defineuserobject); - BUILD_OP (vm, pool, dict, deletefile, deletefile); - BUILD_OP (vm, pool, dict, execform, execform); - BUILD_OP (vm, pool, dict, execuserobject, execuserobject); - BUILD_OP (vm, pool, dict, filenameforall, filenameforall); - BUILD_OP (vm, pool, dict, fileposition, fileposition); - BUILD_OP (vm, pool, dict, filter, filter); - BUILD_OP (vm, pool, dict, findencoding, findencoding); - BUILD_OP (vm, pool, dict, findresource, findresource); - BUILD_OP (vm, pool, dict, gcheck, gcheck); - BUILD_OP (vm, pool, dict, GlobalFontDirectory, globalfontdirectory); - BUILD_OP (vm, pool, dict, glyphshow, glyphshow); - BUILD_OP (vm, pool, dict, gstate, gstate); - BUILD_OP (vm, pool, dict, ineofill, ineofill); - BUILD_OP (vm, pool, dict, infill, infill); - BUILD_OP (vm, pool, dict, instroke, instroke); - BUILD_OP (vm, pool, dict, inueofill, inueofill); - BUILD_OP (vm, pool, dict, inufill, inufill); - BUILD_OP (vm, pool, dict, inustroke, inustroke); - BUILD_OP (vm, pool, dict, ISOLatin1Encoding, isolatin1encoding); - BUILD_OP (vm, pool, dict, languagelevel, languagelevel); - BUILD_OP (vm, pool, dict, makepattern, makepattern); - BUILD_OP (vm, pool, dict, packedarray, packedarray); - BUILD_OP (vm, pool, dict, printobject, printobject); - BUILD_OP (vm, pool, dict, realtime, realtime); - BUILD_OP (vm, pool, dict, rectclip, rectclip); - BUILD_OP (vm, pool, dict, rectfill, rectfill); - BUILD_OP (vm, pool, dict, rectstroke, rectstroke); - BUILD_OP (vm, pool, dict, renamefile, renamefile); - BUILD_OP (vm, pool, dict, resourceforall, resourceforall); - BUILD_OP (vm, pool, dict, resourcestatus, resourcestatus); - BUILD_OP (vm, pool, dict, rootfont, rootfont); - BUILD_OP (vm, pool, dict, scheck, scheck); - BUILD_OP (vm, pool, dict, selectfont, selectfont); - BUILD_OP (vm, pool, dict, serialnumber, serialnumber); - BUILD_OP (vm, pool, dict, setbbox, setbbox); - BUILD_OP (vm, pool, dict, setblackgeneration, setblackgeneration); - BUILD_OP (vm, pool, dict, setcachedevice2, setcachedevice2); - BUILD_OP (vm, pool, dict, setcacheparams, setcacheparams); - BUILD_OP (vm, pool, dict, setcmykcolor, setcmykcolor); - BUILD_OP (vm, pool, dict, setcolor, setcolor); - BUILD_OP (vm, pool, dict, setcolorrendering, setcolorrendering); - BUILD_OP (vm, pool, dict, setcolorscreen, setcolorscreen); - BUILD_OP (vm, pool, dict, setcolorspace, setcolorspace); - BUILD_OP (vm, pool, dict, setcolortransfer, setcolortransfer); - BUILD_OP (vm, pool, dict, setdevparams, setdevparams); - BUILD_OP (vm, pool, dict, setfileposition, setfileposition); - BUILD_OP (vm, pool, dict, setgstate, setgstate); - BUILD_OP (vm, pool, dict, sethalftone, sethalftone); - BUILD_OP (vm, pool, dict, setobjectformat, setobjectformat); - BUILD_OP (vm, pool, dict, setoverprint, setoverprint); - BUILD_OP (vm, pool, dict, setpacking, setpacking); - BUILD_OP (vm, pool, dict, setpagedevice, setpagedevice); - BUILD_OP (vm, pool, dict, setpattern, setpattern); - BUILD_OP (vm, pool, dict, setshared, setshared); - BUILD_OP (vm, pool, dict, setstrokeadjust, setstrokeadjust); - BUILD_OP (vm, pool, dict, setsystemparams, setsystemparams); - BUILD_OP (vm, pool, dict, setucacheparams, setucacheparams); - BUILD_OP (vm, pool, dict, setundercolorremoval, setundercoloremoval); - BUILD_OP (vm, pool, dict, setuserparams, setuserparams); - BUILD_OP (vm, pool, dict, setvmthreshold, setvmthreshold); - BUILD_OP (vm, pool, dict, shareddict, shareddict); - BUILD_OP (vm, pool, dict, SharedFontDirectory, sharedfontdirectory); - BUILD_OP (vm, pool, dict, startjob, startjob); - BUILD_OP (vm, pool, dict, uappend, uappend); - BUILD_OP (vm, pool, dict, ucache, ucache); - BUILD_OP (vm, pool, dict, ucachestatus, ucachestatus); - BUILD_OP (vm, pool, dict, ueofill, ueofill); - BUILD_OP (vm, pool, dict, ufill, ufill); - BUILD_OP (vm, pool, dict, undef, undef); - BUILD_OP (vm, pool, dict, undefineresource, undefineresource); - BUILD_OP (vm, pool, dict, undefineuserobject, undefineuserobject); - BUILD_OP (vm, pool, dict, upath, upath); - BUILD_OP (vm, pool, dict, UserObjects, userobjects); - BUILD_OP (vm, pool, dict, ustroke, ustroke); - BUILD_OP (vm, pool, dict, ustrokepath, ustrokepath); - BUILD_OP (vm, pool, dict, vmreclaim, vmreclaim); - BUILD_OP (vm, pool, dict, writeobject, writeobject); - BUILD_OP (vm, pool, dict, xshow, xshow); - BUILD_OP (vm, pool, dict, xyshow, xyshow); - BUILD_OP (vm, pool, dict, yshow, yshow); -} - -static void -hg_operator_level3_init(HgVM *vm, - HgMemPool *pool, - HgDict *dict) -{ - BUILD_OP_ (vm, pool, dict, addglyph, addglyph); - BUILD_OP_ (vm, pool, dict, beginbfchar, beginbfchar); - BUILD_OP_ (vm, pool, dict, beginbfrange, beginbfrange); - BUILD_OP_ (vm, pool, dict, begincidchar, begincidchar); - BUILD_OP_ (vm, pool, dict, begincidrange, begincidrange); - BUILD_OP_ (vm, pool, dict, begincmap, begincmap); - BUILD_OP_ (vm, pool, dict, begincodespacerange, begincodespacerange); - BUILD_OP_ (vm, pool, dict, beginnotdefchar, beginnotdefchar); - BUILD_OP_ (vm, pool, dict, beginnotdefrange, beginnotdefrange); - BUILD_OP_ (vm, pool, dict, beginrearrangedfont, beginrearrangedfont); - BUILD_OP_ (vm, pool, dict, beginusematrix, beginusematrix); - BUILD_OP_ (vm, pool, dict, cliprestore, cliprestore); - BUILD_OP_ (vm, pool, dict, clipsave, clipsave); - BUILD_OP_ (vm, pool, dict, composefont, composefont); - BUILD_OP_ (vm, pool, dict, currentsmoothness, currentsmoothness); - BUILD_OP_ (vm, pool, dict, currentrapparams, currentrapparams); - BUILD_OP_ (vm, pool, dict, endbfchar, endbfchar); - BUILD_OP_ (vm, pool, dict, endbfrange, endbfrange); - BUILD_OP_ (vm, pool, dict, endcidchar, endcidchar); - BUILD_OP_ (vm, pool, dict, endcidrange, endcidrange); - BUILD_OP_ (vm, pool, dict, endcmap, endcmap); - BUILD_OP_ (vm, pool, dict, endcodespacerange, endcodespacerange); - BUILD_OP_ (vm, pool, dict, endnotdefchar, endnotdefchar); - BUILD_OP_ (vm, pool, dict, endnotdefrange, endnotdefrange); - BUILD_OP_ (vm, pool, dict, endrearrangedfont, endrearrangedfont); - BUILD_OP_ (vm, pool, dict, endusematrix, endusematrix); - BUILD_OP_ (vm, pool, dict, findcolorrendering, findcolorrendering); - BUILD_OP_ (vm, pool, dict, GetHalftoneName, gethalftonename); - BUILD_OP_ (vm, pool, dict, GetPageDeviceName, getpagedevicename); - BUILD_OP_ (vm, pool, dict, GetSubstituteCRD, getsubstitutecrd); - BUILD_OP_ (vm, pool, dict, removeall, removeall); - BUILD_OP_ (vm, pool, dict, removeglyphs, removeglyphs); - BUILD_OP_ (vm, pool, dict, setsmoothness, setsmoothness); - BUILD_OP_ (vm, pool, dict, settrapparams, settrapparams); - BUILD_OP_ (vm, pool, dict, settrapzone, settrapzone); - BUILD_OP_ (vm, pool, dict, shfill, shfill); - BUILD_OP_ (vm, pool, dict, StartData, startdata); - BUILD_OP_ (vm, pool, dict, usecmap, usecmap); - BUILD_OP_ (vm, pool, dict, usefont, usefont); -} - -static void -hg_operator_hieroglyph_init(HgVM *vm, - HgMemPool *pool, - HgDict *dict) -{ - BUILD_OP_ (vm, pool, dict, .abort, private_hg_abort); - BUILD_OP_ (vm, pool, dict, .clearerror, private_hg_clearerror); - BUILD_OP_ (vm, pool, dict, .currentglobal, private_hg_currentglobal); - BUILD_OP_ (vm, pool, dict, .execn, private_hg_execn); - BUILD_OP_ (vm, pool, dict, .exit, private_hg_exit); - BUILD_OP_ (vm, pool, dict, .findlibfile, private_hg_findlibfile); - BUILD_OP_ (vm, pool, dict, .forceput, private_hg_forceput); - BUILD_OP_ (vm, pool, dict, .getsecuritylevel, private_hg_getsecuritylevel); - BUILD_OP_ (vm, pool, dict, .hgrevision, private_hg_hgrevision); - BUILD_OP_ (vm, pool, dict, .initplugins, private_hg_initplugins); - BUILD_OP_ (vm, pool, dict, .odef, private_hg_odef); - BUILD_OP_ (vm, pool, dict, .product, private_hg_product); - BUILD_OP_ (vm, pool, dict, .quit, private_hg_quit); - BUILD_OP_ (vm, pool, dict, .revision, private_hg_revision); - BUILD_OP_ (vm, pool, dict, .setglobal, private_hg_setglobal); - BUILD_OP_ (vm, pool, dict, .setsecuritylevel, private_hg_setsecuritylevel); - BUILD_OP_ (vm, pool, dict, .startjobserver, private_hg_startjobserver); - BUILD_OP_ (vm, pool, dict, .undef, private_hg_undef); -} - -/* - * Public Functions - */ -HgOperator * -hg_operator_new(HgMemPool *pool, - const gchar *name, - HgOperatorFunc func) -{ - HgOperator *retval; - size_t len; - - g_return_val_if_fail (pool != NULL, NULL); - g_return_val_if_fail (name != NULL, NULL); - g_return_val_if_fail (func != NULL, NULL); - - retval = hg_mem_alloc_with_flags(pool, sizeof (HgOperator), - HG_FL_HGOBJECT); - if (retval == NULL) { - hg_log_warning("Failed to create an operator."); - return NULL; - } - HG_OBJECT_INIT_STATE (&retval->object); - HG_OBJECT_SET_STATE (&retval->object, hg_mem_pool_get_default_access_mode(pool)); - hg_object_set_vtable(&retval->object, &__hg_operator_vtable); - - len = strlen(name); - retval->name = hg_mem_alloc(pool, len + 1); - if (retval->name == NULL) { - hg_log_warning("Failed to create an operator."); - return NULL; - } - strncpy(retval->name, name, len); - retval->name[len] = 0; - retval->operator = func; - - return retval; -} - -gboolean -hg_operator_init(HgVM *vm) -{ - HgVMEmulationType type; - HgStack *ostack; - gboolean pool_mode; - HgMemPool *pool; - HgDict *systemdict, *dict; - HgValueNode *key, *val; - - g_return_val_if_fail (vm != NULL, FALSE); - - type = hg_vm_get_emulation_level(vm); - if (type < VM_EMULATION_LEVEL_1 || - type > VM_EMULATION_LEVEL_3) { - hg_log_warning("[BUG] Unknown emulation level %d", type); - - return FALSE; - } - - pool_mode = hg_vm_is_global_pool_used(vm); - hg_vm_use_global_pool(vm, TRUE); - pool = hg_vm_get_current_pool(vm); - systemdict = hg_vm_get_dict_systemdict(vm); - - /* systemdict is a read-only dictionary. - * it needs to be changed to the writable once. - */ - hg_object_writable((HgObject *)systemdict); - - /* true */ - key = _hg_vm_get_name_node(vm, "true"); - HG_VALUE_MAKE_BOOLEAN (pool, val, TRUE); - hg_dict_insert(pool, systemdict, key, val); - /* false */ - key = _hg_vm_get_name_node(vm, "false"); - HG_VALUE_MAKE_BOOLEAN (pool, val, FALSE); - hg_dict_insert(pool, systemdict, key, val); - /* null */ - key = _hg_vm_get_name_node(vm, "null"); - HG_VALUE_MAKE_NULL (pool, val, NULL); - hg_dict_insert(pool, systemdict, key, val); - /* mark */ - key = _hg_vm_get_name_node(vm, "mark"); - HG_VALUE_MAKE_MARK (pool, val); - hg_dict_insert(pool, systemdict, key, val); - /* $error */ - key = _hg_vm_get_name_node(vm, "$error"); - dict = hg_vm_get_dict_error(vm); - HG_VALUE_MAKE_DICT (val, dict); - hg_dict_insert_forcibly(pool, systemdict, key, val, TRUE); - /* errordict */ - key = _hg_vm_get_name_node(vm, "errordict"); - dict = hg_vm_get_dict_errordict(vm); - HG_VALUE_MAKE_DICT (val, dict); - hg_dict_insert_forcibly(pool, systemdict, key, val, TRUE); - /* serverdict */ - key = _hg_vm_get_name_node(vm, "serverdict"); - dict = hg_vm_get_dict_serverdict(vm); - HG_VALUE_MAKE_DICT (val, dict); - hg_dict_insert_forcibly(pool, systemdict, key, val, TRUE); - /* statusdict */ - key = _hg_vm_get_name_node(vm, "statusdict"); - dict = hg_vm_get_dict_statusdict(vm); - HG_VALUE_MAKE_DICT (val, dict); - hg_dict_insert_forcibly(pool, systemdict, key, val, TRUE); - /* systemdict */ - key = _hg_vm_get_name_node(vm, "systemdict"); - HG_VALUE_MAKE_DICT (val, systemdict); - hg_dict_insert(pool, systemdict, key, val); - - hg_operator_level1_init(vm, pool, systemdict); - - ostack = hg_vm_get_ostack(vm); - - /* hieroglyph specific operators */ - hg_operator_hieroglyph_init(vm, pool, systemdict); - - if (type >= VM_EMULATION_LEVEL_2) - hg_operator_level2_init(vm, pool, systemdict); - - if (type >= VM_EMULATION_LEVEL_3) - hg_operator_level3_init(vm, pool, systemdict); - - hg_vm_use_global_pool(vm, pool_mode); - - return TRUE; -} - -gboolean -hg_operator_invoke(HgOperator *op, - HgVM *vm) -{ - g_return_val_if_fail (op != NULL, FALSE); - g_return_val_if_fail (vm != NULL, FALSE); - - return op->operator(op, vm); -} - -const gchar * -hg_operator_get_name(HgOperator *op) -{ - g_return_val_if_fail (op != NULL, NULL); - - return op->name; -} diff --git a/hieroglyph/operator.h b/hieroglyph/operator.h deleted file mode 100644 index bb108b5..0000000 --- a/hieroglyph/operator.h +++ /dev/null @@ -1,589 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* - * operator.h - * Copyright (C) 2005-2006 Akira TAGOH - * - * Authors: - * Akira TAGOH <at@gclab.org> - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - */ -#ifndef __HG_OPERATOR_H__ -#define __HG_OPERATOR_H__ - -#include <hieroglyph/hgtypes.h> - -G_BEGIN_DECLS - - -typedef enum { - HG_op_abs = 0, - HG_op_add, - HG_op_aload, - HG_op_anchorsearch, - HG_op_and, - HG_op_arc, - HG_op_arcn, - HG_op_arct, - HG_op_arcto, - HG_op_array, - - HG_op_ashow, - HG_op_astore, - HG_op_awidthshow, - HG_op_begin, - HG_op_bind, - HG_op_bitshift, - HG_op_ceiling, - HG_op_charpath, - HG_op_clear, - HG_op_cleartomark, - - HG_op_clip, - HG_op_clippath, - HG_op_closepath, - HG_op_concat, - HG_op_concatmatrix, - HG_op_copy, - HG_op_count, - HG_op_counttomark, - HG_op_currentcmykcolor, - HG_op_currentdash, - - HG_op_currentdict, - HG_op_currentfile, - HG_op_currentfont, - HG_op_currentgray, - HG_op_currentgstate, - HG_op_currenthsbcolor, - HG_op_currentlinecap, - HG_op_currentlinejoin, - HG_op_currentlinewidth, - HG_op_currentmatrix, - - HG_op_currentpoint, - HG_op_currentrgbcolor, - HG_op_currentshared, - HG_op_curveto, - HG_op_cvi, - HG_op_cvlit, - HG_op_cvn, - HG_op_cvr, - HG_op_cvrs, - HG_op_cvs, - - HG_op_cvx, - HG_op_def, - HG_op_defineusername, - HG_op_dict, - HG_op_div, - HG_op_dtransform, - HG_op_dup, - HG_op_end, - HG_op_eoclip, - HG_op_eofill, - - HG_op_eoviewclip, - HG_op_eq, - HG_op_exch, - HG_op_exec, - HG_op_exit, - HG_op_file, - HG_op_fill, - HG_op_findfont, - HG_op_flattenpath, - HG_op_floor, - - HG_op_flush, - HG_op_flushfile, - HG_op_for, - HG_op_forall, - HG_op_ge, - HG_op_get, - HG_op_getinterval, - HG_op_grestore, - HG_op_gsave, - HG_op_gstate, - - HG_op_gt, - HG_op_identmatrix, - HG_op_idiv, - HG_op_idtransform, - HG_op_if, - HG_op_ifelse, - HG_op_image, - HG_op_imagemask, - HG_op_index, - HG_op_ineofill, - - HG_op_infill, - HG_op_initviewclip, - HG_op_inueofill, - HG_op_inufill, - HG_op_invertmatrix, - HG_op_itransform, - HG_op_known, - HG_op_le, - HG_op_length, - HG_op_lineto, - - HG_op_load, - HG_op_loop, - HG_op_lt, - HG_op_makefont, - HG_op_matrix, - HG_op_maxlength, - HG_op_mod, - HG_op_moveto, - HG_op_mul, - HG_op_ne, - - HG_op_neg, - HG_op_newpath, - HG_op_not, - HG_op_null, - HG_op_or, - HG_op_pathbbox, - HG_op_pathforall, - HG_op_pop, - HG_op_print, - HG_op_printobject, - - HG_op_put, - HG_op_putinterval, - HG_op_rcurveto, - HG_op_read, - HG_op_readhexstring, - HG_op_readline, - HG_op_readstring, - HG_op_rectclip, - HG_op_rectfill, - HG_op_rectstroke, - - HG_op_rectviewclip, - HG_op_repeat, - HG_op_restore, - HG_op_rlineto, - HG_op_rmoveto, - HG_op_roll, - HG_op_rotate, - HG_op_round, - HG_op_save, - HG_op_scale, - - HG_op_scalefont, - HG_op_search, - HG_op_selectfont, - HG_op_setbbox, - HG_op_setcachedevice, - HG_op_setcachedevice2, - HG_op_setcharwidth, - HG_op_setcmykcolor, - HG_op_setdash, - HG_op_setfont, - - HG_op_setgray, - HG_op_setgstate, - HG_op_sethsbcolor, - HG_op_setlinecap, - HG_op_setlinejoin, - HG_op_setlinewidth, - HG_op_setmatrix, - HG_op_setrgbcolor, - HG_op_setshared, - HG_op_shareddict, - - HG_op_show, - HG_op_showpage, - HG_op_stop, - HG_op_stopped, - HG_op_store, - HG_op_string, - HG_op_stringwidth, - HG_op_stroke, - HG_op_strokepath, - HG_op_sub, - - HG_op_systemdict, - HG_op_token, - HG_op_transform, - HG_op_translate, - HG_op_truncate, - HG_op_type, - HG_op_uappend, - HG_op_ucache, - HG_op_ueofill, - HG_op_ufill, - - HG_op_undef, - HG_op_upath, - HG_op_userdict, - HG_op_ustroke, - HG_op_viewclip, - HG_op_viewclippath, - HG_op_where, - HG_op_widthshow, - HG_op_write, - HG_op_writehexstring, - - HG_op_writeobject, - HG_op_writestring, - HG_op_wtranslation, - HG_op_xor, - HG_op_xshow, - HG_op_xyshow, - HG_op_yshow, - HG_op_FontDirectory, - HG_op_SharedFontDirectory, - HG_op_Courier, - - HG_op_Courier_Bold, - HG_op_Courier_BoldOblique, - HG_op_Courier_Oblique, - HG_op_Helvetica, - HG_op_Helvetica_Bold, - HG_op_Helvetica_BoldOblique, - HG_op_Helvetica_Oblique, - HG_op_Symbol, - HG_op_Times_Bold, - HG_op_Times_BoldItalic, - - HG_op_Times_Italic, - HG_op_Times_Roman, - HG_op_execuserobject, - HG_op_currentcolor, - HG_op_currentcolorspace, - HG_op_currentglobal, - HG_op_execform, - HG_op_filter, - HG_op_findresource, - HG_op_globaldict, - - HG_op_makepattern, - HG_op_setcolor, - HG_op_setcolorspace, - HG_op_setglobal, - HG_op_setpagedevice, - HG_op_setpattern, - - HG_op_sym_eq = 256, - HG_op_sym_eqeq, - HG_op_ISOLatin1Encoding, - HG_op_StandardEncoding, - - HG_op_sym_left_square_bracket, - HG_op_sym_right_square_bracket, - HG_op_atan, - HG_op_banddevice, - HG_op_bytesavailable, - HG_op_cachestatus, - HG_op_closefile, - HG_op_colorimage, - HG_op_condition, - HG_op_copypage, - - HG_op_cos, - HG_op_countdictstack, - HG_op_countexecstack, - HG_op_cshow, - HG_op_currentblackgeneration, - HG_op_currentcacheparams, - HG_op_currentcolorscreen, - HG_op_currentcolortransfer, - HG_op_currentcontext, - HG_op_currentflat, - - HG_op_currenthalftone, - HG_op_currenthalftonephase, - HG_op_currentmiterlimit, - HG_op_currentobjectformat, - HG_op_currentpacking, - HG_op_currentscreen, - HG_op_currentstrokeadjust, - HG_op_currenttransfer, - HG_op_currentundercolorremoval, - HG_op_defaultmatrix, - - HG_op_definefont, - HG_op_deletefile, - HG_op_detach, - HG_op_deviceinfo, - HG_op_dictstack, - HG_op_echo, - HG_op_erasepage, - HG_op_errordict, - HG_op_execstack, - HG_op_executeonly, - - HG_op_exp, - HG_op_false, - HG_op_filenameforall, - HG_op_fileposition, - HG_op_fork, - HG_op_framedevice, - HG_op_grestoreall, - HG_op_handleerror, - HG_op_initclip, - HG_op_initgraphics, - - HG_op_initmatrix, - HG_op_instroke, - HG_op_inustroke, - HG_op_join, - HG_op_kshow, - HG_op_ln, - HG_op_lock, - HG_op_log, - HG_op_mark, - HG_op_monitor, - - HG_op_noaccess, - HG_op_notify, - HG_op_nulldevice, - HG_op_packedarray, - HG_op_quit, - HG_op_rand, - HG_op_rcheck, - HG_op_readonly, - HG_op_realtime, - HG_op_renamefile, - - HG_op_renderbands, - HG_op_resetfile, - HG_op_reversepath, - HG_op_rootfont, - HG_op_rrand, - HG_op_run, - HG_op_scheck, - HG_op_setblackgeneration, - HG_op_setcachelimit, - HG_op_setcacheparams, - - HG_op_setcolorscreen, - HG_op_setcolortransfer, - HG_op_setfileposition, - HG_op_setflat, - HG_op_sethalftone, - HG_op_sethalftonephase, - HG_op_setmiterlimit, - HG_op_setobjectformat, - HG_op_setpacking, - HG_op_setscreen, - - HG_op_setstrokeadjust, - HG_op_settransfer, - HG_op_setucacheparams, - HG_op_setundercolorremoval, - HG_op_sin, - HG_op_sqrt, - HG_op_srand, - HG_op_stack, - HG_op_status, - HG_op_statusdict, - - HG_op_true, - HG_op_ucachestatus, - HG_op_undefinefont, - HG_op_usertime, - HG_op_ustrokepath, - HG_op_version, - HG_op_vmreclaim, - HG_op_vmstatus, - HG_op_wait, - HG_op_wcheck, - - HG_op_xcheck, - HG_op_yield, - HG_op_defineuserobject, - HG_op_undefineuserobject, - HG_op_UserObjects, - HG_op_cleardictstack, - HG_op_A, - HG_op_B, - HG_op_C, - HG_op_D, - HG_op_E, - HG_op_F, - HG_op_G, - HG_op_H, - HG_op_I, - HG_op_J, - HG_op_K, - HG_op_L, - HG_op_M, - HG_op_N, - - HG_op_O, - HG_op_P, - HG_op_Q, - HG_op_R, - HG_op_S, - HG_op_T, - HG_op_U, - HG_op_V, - HG_op_W, - HG_op_X, - - HG_op_Y, - HG_op_Z, - HG_op_a, - HG_op_b, - HG_op_c, - HG_op_d, - HG_op_e, - HG_op_f, - HG_op_g, - HG_op_h, - - HG_op_i, - HG_op_j, - HG_op_k, - HG_op_l, - HG_op_m, - HG_op_n, - HG_op_o, - HG_op_p, - HG_op_q, - HG_op_r, - - HG_op_s, - HG_op_t, - HG_op_u, - HG_op_v, - HG_op_w, - HG_op_x, - HG_op_y, - HG_op_z, - HG_op_setvmthreshold, - HG_op_sym_begin_dict_mark, - - HG_op_sym_end_dict_mark, - HG_op_currentcolorrendering, - HG_op_currentdevparams, - HG_op_currentoverprint, - HG_op_currentpagedevice, - HG_op_currentsystemparams, - HG_op_currentuserparams, - HG_op_defineresource, - HG_op_findencoding, - HG_op_gcheck, - - HG_op_glyphshow, - HG_op_languagelevel, - HG_op_product, - HG_op_pstack, - HG_op_resourceforall, - HG_op_resourcestatus, - HG_op_revision, - HG_op_serialnumber, - HG_op_setcolorrendering, - HG_op_setdevparams, - - HG_op_setoverprint, - HG_op_setsystemparams, - HG_op_setuserparams, - HG_op_startjob, - HG_op_undefineresource, - HG_op_GlobalFontDirectory, - HG_op_ASCII85Decode, - HG_op_ASCII85Encode, - HG_op_ASCIIHexDecode, - HG_op_ASCIIHexEncode, - - HG_op_CCITTFaxDecode, - HG_op_CCITTFaxEncode, - HG_op_DCTDecode, - HG_op_DCTEncode, - HG_op_LZWDecode, - HG_op_LZWEncode, - HG_op_NullEncode, - HG_op_RunLengthDecode, - HG_op_RunLengthEncode, - HG_op_SubFileDecode, - - HG_op_CIEBasedA, - HG_op_CIEBasedABC, - HG_op_DeviceCMYK, - HG_op_DeviceGray, - HG_op_DeviceRGB, - HG_op_Indexed, - HG_op_Pattern, - HG_op_Separation, - HG_op_CIEBasedDEF, - HG_op_CIEBasedDEFG, - - HG_op_DeviceN, - - HG_op_POSTSCRIPT_RESERVED_END, - - HG_op_END -} HgOperatorEncoding; - - -#define hg_operator_build_operator__inline(prefix, vm, pool, sdict, name, func, ret_op) \ - G_STMT_START { \ - HgValueNode *__hg_key, *__hg_val; \ - \ - (ret_op) = hg_operator_new((pool), #name, prefix##func); \ - if ((ret_op) == NULL) { \ - g_warning("Failed to create an operator %s", #name); \ - } else { \ - __hg_key = hg_vm_get_name_node((vm), #name); \ - HG_VALUE_MAKE_OPERATOR (__hg_val, (ret_op)); \ - if (__hg_val == NULL) { \ - hg_vm_set_error((vm), __hg_key, VM_e_VMerror, FALSE); \ - } else { \ - hg_object_executable((HgObject *)__hg_val); \ - hg_dict_insert((pool), (sdict), __hg_key, __hg_val); \ - } \ - } \ - } G_STMT_END -#define _BUILD_OP(prefix, vm, pool, sdict, name, func) \ - G_STMT_START { \ - HgOperator *__hg_op; \ - \ - hg_operator_build_operator__inline(prefix, vm, pool, sdict, name, func, __hg_op); \ - } G_STMT_END -#define _hg_operator_set_error(v, o, e) \ - G_STMT_START { \ - HgValueNode *__lb_op_node; \ - \ - HG_VALUE_MAKE_OPERATOR (__lb_op_node, (o)); \ - hg_vm_set_error((v), __lb_op_node, (e), TRUE); \ - } G_STMT_END -#define _hg_operator_set_error_from_file(v, o, e) \ - G_STMT_START { \ - HgValueNode *__lb_op_node; \ - \ - HG_VALUE_MAKE_OPERATOR (__lb_op_node, (o)); \ - hg_vm_set_error_from_file((v), __lb_op_node, (e), TRUE); \ - } G_STMT_END - - -extern HgOperator *__hg_operator_list[HG_op_END]; - -HgOperator *hg_operator_new (HgMemPool *pool, - const gchar *name, - HgOperatorFunc func); -gboolean hg_operator_init (HgVM *vm); -gboolean hg_operator_invoke (HgOperator *op, - HgVM *vm); -const gchar *hg_operator_get_name(HgOperator *op) G_GNUC_CONST; - - -G_END_DECLS - -#endif /* __HG_OPERATOR_H__ */ diff --git a/hieroglyph/scanner.c b/hieroglyph/scanner.c deleted file mode 100644 index fc40d36..0000000 --- a/hieroglyph/scanner.c +++ /dev/null @@ -1,891 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* - * scanner.c - * Copyright (C) 2005-2006 Akira TAGOH - * - * Authors: - * Akira TAGOH <at@gclab.org> - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - */ -#ifdef HAVE_CONFIG_H -#include <config.h> -#endif - -#include <ctype.h> -#include "scanner.h" -#include "hgmem.h" -#include "hgarray.h" -#include "hgdict.h" -#include "hgfile.h" -#include "hglog.h" -#include "hgstring.h" -#include "hgvaluenode.h" -#include "iarray.h" -#include "operator.h" -#include "vm.h" - - -static gboolean _hg_scanner_parse_number(HgVM *vm, - HgFileObject *file, - gint token_type, - gint radix, - gint sign, - gboolean is_integer, - HgString *string, - HgValueNode **node, - gboolean *error); - -#define _hg_scanner_is_sign(__hg_scanner_c) \ - ((__hg_scanner_c) == '+' || \ - (__hg_scanner_c) == '-') -#define _hg_scanner_skip_spaces(__hg_scanner_file, __hg_scanner_char) \ - while (1) { \ - (__hg_scanner_char) = hg_file_object_getc(__hg_scanner_file); \ - if (_hg_scanner_isspace(__hg_scanner_char)) { \ - continue; \ - } \ - break; \ - } -#define _hg_scanner_set_error(v, o, e) \ - G_STMT_START { \ - HgValueNode *__hg_op_node; \ - \ - HG_VALUE_MAKE_OPERATOR (__hg_op_node, (o)); \ - hg_vm_set_error((v), __hg_op_node, (e), FALSE); \ - } G_STMT_END - - -struct _HieroGlyphScanner { -}; - -typedef enum { - HG_SCAN_PUSH_NONE, - HG_SCAN_PUSH_OSTACK, - HG_SCAN_PUSH_ESTACK, -} HgScannerStackType; - -enum { - HG_SCAN_TOKEN_LITERAL = 1, - HG_SCAN_TOKEN_EVAL_NAME, - HG_SCAN_TOKEN_NUMERIC, - HG_SCAN_TOKEN_STRING, - HG_SCAN_TOKEN_NAME, - HG_SCAN_TOKEN_MARK, - HG_SCAN_TOKEN_ARRAY, - HG_SCAN_TOKEN_DICT, - HG_SCAN_TOKEN_PROC, - HG_SCAN_TOKEN_PROC_END, -}; - -static HgScannerCharType __hg_scanner_token[256] = { - HG_SCAN_C_NULL, /* 0x00 */ HG_SCAN_C_NAME, /* 0x01 */ - HG_SCAN_C_NAME, /* 0x02 */ HG_SCAN_C_NAME, /* 0x03 */ - HG_SCAN_C_CONTROL, /* 0x04 */ HG_SCAN_C_NAME, /* 0x05 */ - HG_SCAN_C_NAME, /* 0x06 */ HG_SCAN_C_NAME, /* 0x07 */ - HG_SCAN_C_NAME, /* 0x08 */ HG_SCAN_C_SPACE, /* 0x09 (tab \t) */ - HG_SCAN_C_SPACE, /* 0x0A (LF \n) */ HG_SCAN_C_NAME, /* 0x0B */ - HG_SCAN_C_SPACE, /* 0x0C (FF \f) */ HG_SCAN_C_SPACE, /* 0x0D (CR \r) */ - HG_SCAN_C_NAME, /* 0x0E */ HG_SCAN_C_NAME, /* 0x0F */ - HG_SCAN_C_NAME, /* 0x10 */ HG_SCAN_C_NAME, /* 0x11 */ - HG_SCAN_C_NAME, /* 0x12 */ HG_SCAN_C_NAME, /* 0x13 */ - HG_SCAN_C_NAME, /* 0x14 */ HG_SCAN_C_NAME, /* 0x15 */ - HG_SCAN_C_NAME, /* 0x16 */ HG_SCAN_C_NAME, /* 0x17 */ - HG_SCAN_C_NAME, /* 0x18 */ HG_SCAN_C_NAME, /* 0x19 */ - HG_SCAN_C_NAME, /* 0x1A */ HG_SCAN_C_NAME, /* 0x1B */ - HG_SCAN_C_NAME, /* 0x1C */ HG_SCAN_C_NAME, /* 0x1D */ - HG_SCAN_C_NAME, /* 0x1E */ HG_SCAN_C_NAME, /* 0x1F */ - HG_SCAN_C_SPACE, /* 0x20 (space) */ HG_SCAN_C_NAME, /* 0x21 */ - HG_SCAN_C_NAME, /* 0x22 */ HG_SCAN_C_NAME, /* 0x23 */ - HG_SCAN_C_NAME, /* 0x24 */ HG_SCAN_C_CONTROL, /* 0x25 % */ - HG_SCAN_C_NAME, /* 0x26 */ HG_SCAN_C_NAME, /* 0x27 */ - HG_SCAN_C_CONTROL, /* 0x28 ( */ HG_SCAN_C_CONTROL, /* 0x29 ) */ - HG_SCAN_C_NAME, /* 0x2A */ HG_SCAN_C_NAME, /* 0x2B */ - HG_SCAN_C_NAME, /* 0x2C */ HG_SCAN_C_NAME, /* 0x2D */ - HG_SCAN_C_NAME, /* 0x2E */ HG_SCAN_C_CONTROL, /* 0x2F / */ - HG_SCAN_C_NUMERAL, /* 0x30 */ HG_SCAN_C_NUMERAL, /* 0x31 */ - HG_SCAN_C_NUMERAL, /* 0x32 */ HG_SCAN_C_NUMERAL, /* 0x33 */ - HG_SCAN_C_NUMERAL, /* 0x34 */ HG_SCAN_C_NUMERAL, /* 0x35 */ - HG_SCAN_C_NUMERAL, /* 0x36 */ HG_SCAN_C_NUMERAL, /* 0x37 */ - HG_SCAN_C_NUMERAL, /* 0x38 */ HG_SCAN_C_NUMERAL, /* 0x39 */ - HG_SCAN_C_NAME, /* 0x3A */ HG_SCAN_C_NAME, /* 0x3B */ - HG_SCAN_C_CONTROL, /* 0x3C < */ HG_SCAN_C_NAME, /* 0x3D */ - HG_SCAN_C_CONTROL, /* 0x3E > */ HG_SCAN_C_NAME, /* 0x3F */ - HG_SCAN_C_NAME, /* 0x40 */ HG_SCAN_C_NAME, /* 0x41 A */ - HG_SCAN_C_NAME, /* 0x42 B */ HG_SCAN_C_NAME, /* 0x43 C */ - HG_SCAN_C_NAME, /* 0x44 D */ HG_SCAN_C_NAME, /* 0x45 E */ - HG_SCAN_C_NAME, /* 0x46 F */ HG_SCAN_C_NAME, /* 0x47 G */ - HG_SCAN_C_NAME, /* 0x48 H */ HG_SCAN_C_NAME, /* 0x49 I */ - HG_SCAN_C_NAME, /* 0x4A J */ HG_SCAN_C_NAME, /* 0x4B K */ - HG_SCAN_C_NAME, /* 0x4C L */ HG_SCAN_C_NAME, /* 0x4D M */ - HG_SCAN_C_NAME, /* 0x4E N */ HG_SCAN_C_NAME, /* 0x4F O */ - HG_SCAN_C_NAME, /* 0x50 P */ HG_SCAN_C_NAME, /* 0x51 Q */ - HG_SCAN_C_NAME, /* 0x52 R */ HG_SCAN_C_NAME, /* 0x53 S */ - HG_SCAN_C_NAME, /* 0x54 T */ HG_SCAN_C_NAME, /* 0x55 U */ - HG_SCAN_C_NAME, /* 0x56 V */ HG_SCAN_C_NAME, /* 0x57 W */ - HG_SCAN_C_NAME, /* 0x58 X */ HG_SCAN_C_NAME, /* 0x59 Y */ - HG_SCAN_C_NAME, /* 0x5A Z */ HG_SCAN_C_CONTROL, /* 0x5B [ */ - HG_SCAN_C_NAME, /* 0x5C */ HG_SCAN_C_CONTROL, /* 0x5D ] */ - HG_SCAN_C_NAME, /* 0x5E */ HG_SCAN_C_NAME, /* 0x5F */ - HG_SCAN_C_NAME, /* 0x60 */ HG_SCAN_C_NAME, /* 0x61 a */ - HG_SCAN_C_NAME, /* 0x62 b */ HG_SCAN_C_NAME, /* 0x63 c */ - HG_SCAN_C_NAME, /* 0x64 d */ HG_SCAN_C_NAME, /* 0x65 e */ - HG_SCAN_C_NAME, /* 0x66 f */ HG_SCAN_C_NAME, /* 0x67 g */ - HG_SCAN_C_NAME, /* 0x68 h */ HG_SCAN_C_NAME, /* 0x69 i */ - HG_SCAN_C_NAME, /* 0x6A j */ HG_SCAN_C_NAME, /* 0x6B k */ - HG_SCAN_C_NAME, /* 0x6C l */ HG_SCAN_C_NAME, /* 0x6D m */ - HG_SCAN_C_NAME, /* 0x6E n */ HG_SCAN_C_NAME, /* 0x6F o */ - HG_SCAN_C_NAME, /* 0x70 p */ HG_SCAN_C_NAME, /* 0x71 q */ - HG_SCAN_C_NAME, /* 0x72 r */ HG_SCAN_C_NAME, /* 0x73 s */ - HG_SCAN_C_NAME, /* 0x74 t */ HG_SCAN_C_NAME, /* 0x75 u */ - HG_SCAN_C_NAME, /* 0x76 v */ HG_SCAN_C_NAME, /* 0x77 w */ - HG_SCAN_C_NAME, /* 0x78 x */ HG_SCAN_C_NAME, /* 0x79 y */ - HG_SCAN_C_NAME, /* 0x7A z */ HG_SCAN_C_CONTROL, /* 0x7B { */ - HG_SCAN_C_NAME, /* 0x7C */ HG_SCAN_C_CONTROL, /* 0x7D } */ - HG_SCAN_C_NAME, /* 0x7E */ HG_SCAN_C_NAME, /* 0x7F */ - HG_SCAN_C_BINARY, /* 0x80 */ HG_SCAN_C_BINARY, /* 0x81 */ - HG_SCAN_C_BINARY, /* 0x82 */ HG_SCAN_C_BINARY, /* 0x83 */ - HG_SCAN_C_BINARY, /* 0x84 */ HG_SCAN_C_BINARY, /* 0x85 */ - HG_SCAN_C_BINARY, /* 0x86 */ HG_SCAN_C_BINARY, /* 0x87 */ - HG_SCAN_C_BINARY, /* 0x88 */ HG_SCAN_C_BINARY, /* 0x89 */ - HG_SCAN_C_BINARY, /* 0x8A */ HG_SCAN_C_BINARY, /* 0x8B */ - HG_SCAN_C_BINARY, /* 0x8C */ HG_SCAN_C_BINARY, /* 0x8D */ - HG_SCAN_C_BINARY, /* 0x8E */ HG_SCAN_C_BINARY, /* 0x8F */ - HG_SCAN_C_BINARY, /* 0x90 */ HG_SCAN_C_BINARY, /* 0x91 */ - HG_SCAN_C_BINARY, /* 0x92 */ HG_SCAN_C_BINARY, /* 0x93 */ - HG_SCAN_C_BINARY, /* 0x94 */ HG_SCAN_C_BINARY, /* 0x95 */ - HG_SCAN_C_BINARY, /* 0x96 */ HG_SCAN_C_BINARY, /* 0x97 */ - HG_SCAN_C_BINARY, /* 0x98 */ HG_SCAN_C_BINARY, /* 0x99 */ - HG_SCAN_C_BINARY, /* 0x9A */ HG_SCAN_C_BINARY, /* 0x9B */ - HG_SCAN_C_BINARY, /* 0x9C */ HG_SCAN_C_BINARY, /* 0x9D */ - HG_SCAN_C_BINARY, /* 0x9E */ HG_SCAN_C_BINARY, /* 0x9F */ - HG_SCAN_C_BINARY, /* 0xA0 */ HG_SCAN_C_NAME, /* 0xA1 */ - HG_SCAN_C_NAME, /* 0xA2 */ HG_SCAN_C_NAME, /* 0xA3 */ - HG_SCAN_C_NAME, /* 0xA4 */ HG_SCAN_C_NAME, /* 0xA5 */ - HG_SCAN_C_NAME, /* 0xA6 */ HG_SCAN_C_NAME, /* 0xA7 */ - HG_SCAN_C_NAME, /* 0xA8 */ HG_SCAN_C_NAME, /* 0xA9 */ - HG_SCAN_C_NAME, /* 0xAA */ HG_SCAN_C_NAME, /* 0xAB */ - HG_SCAN_C_NAME, /* 0xAC */ HG_SCAN_C_NAME, /* 0xAD */ - HG_SCAN_C_NAME, /* 0xAE */ HG_SCAN_C_NAME, /* 0xAF */ - HG_SCAN_C_NAME, /* 0xB0 */ HG_SCAN_C_NAME, /* 0xB1 */ - HG_SCAN_C_NAME, /* 0xB2 */ HG_SCAN_C_NAME, /* 0xB3 */ - HG_SCAN_C_NAME, /* 0xB4 */ HG_SCAN_C_NAME, /* 0xB5 */ - HG_SCAN_C_NAME, /* 0xB6 */ HG_SCAN_C_NAME, /* 0xB7 */ - HG_SCAN_C_NAME, /* 0xB8 */ HG_SCAN_C_NAME, /* 0xB9 */ - HG_SCAN_C_NAME, /* 0xBA */ HG_SCAN_C_NAME, /* 0xBB */ - HG_SCAN_C_NAME, /* 0xBC */ HG_SCAN_C_NAME, /* 0xBD */ - HG_SCAN_C_NAME, /* 0xBE */ HG_SCAN_C_NAME, /* 0xBF */ - HG_SCAN_C_NAME, /* 0xC0 */ HG_SCAN_C_NAME, /* 0xC1 */ - HG_SCAN_C_NAME, /* 0xC2 */ HG_SCAN_C_NAME, /* 0xC3 */ - HG_SCAN_C_NAME, /* 0xC4 */ HG_SCAN_C_NAME, /* 0xC5 */ - HG_SCAN_C_NAME, /* 0xC6 */ HG_SCAN_C_NAME, /* 0xC7 */ - HG_SCAN_C_NAME, /* 0xC8 */ HG_SCAN_C_NAME, /* 0xC9 */ - HG_SCAN_C_NAME, /* 0xCA */ HG_SCAN_C_NAME, /* 0xCB */ - HG_SCAN_C_NAME, /* 0xCC */ HG_SCAN_C_NAME, /* 0xCD */ - HG_SCAN_C_NAME, /* 0xCE */ HG_SCAN_C_NAME, /* 0xCF */ - HG_SCAN_C_NAME, /* 0xD0 */ HG_SCAN_C_NAME, /* 0xD1 */ - HG_SCAN_C_NAME, /* 0xD2 */ HG_SCAN_C_NAME, /* 0xD3 */ - HG_SCAN_C_NAME, /* 0xD4 */ HG_SCAN_C_NAME, /* 0xD5 */ - HG_SCAN_C_NAME, /* 0xD6 */ HG_SCAN_C_NAME, /* 0xD7 */ - HG_SCAN_C_NAME, /* 0xD8 */ HG_SCAN_C_NAME, /* 0xD9 */ - HG_SCAN_C_NAME, /* 0xDA */ HG_SCAN_C_NAME, /* 0xDB */ - HG_SCAN_C_NAME, /* 0xDC */ HG_SCAN_C_NAME, /* 0xDD */ - HG_SCAN_C_NAME, /* 0xDE */ HG_SCAN_C_NAME, /* 0xDF */ - HG_SCAN_C_NAME, /* 0xE0 */ HG_SCAN_C_NAME, /* 0xE1 */ - HG_SCAN_C_NAME, /* 0xE2 */ HG_SCAN_C_NAME, /* 0xE3 */ - HG_SCAN_C_NAME, /* 0xE4 */ HG_SCAN_C_NAME, /* 0xE5 */ - HG_SCAN_C_NAME, /* 0xE6 */ HG_SCAN_C_NAME, /* 0xE7 */ - HG_SCAN_C_NAME, /* 0xE8 */ HG_SCAN_C_NAME, /* 0xE9 */ - HG_SCAN_C_NAME, /* 0xEA */ HG_SCAN_C_NAME, /* 0xEB */ - HG_SCAN_C_NAME, /* 0xEC */ HG_SCAN_C_NAME, /* 0xED */ - HG_SCAN_C_NAME, /* 0xEE */ HG_SCAN_C_NAME, /* 0xEF */ - HG_SCAN_C_NAME, /* 0xF0 */ HG_SCAN_C_NAME, /* 0xF1 */ - HG_SCAN_C_NAME, /* 0xF2 */ HG_SCAN_C_NAME, /* 0xF3 */ - HG_SCAN_C_NAME, /* 0xF4 */ HG_SCAN_C_NAME, /* 0xF5 */ - HG_SCAN_C_NAME, /* 0xF6 */ HG_SCAN_C_NAME, /* 0xF7 */ - HG_SCAN_C_NAME, /* 0xF8 */ HG_SCAN_C_NAME, /* 0xF9 */ - HG_SCAN_C_NAME, /* 0xFA */ HG_SCAN_C_NAME, /* 0xFB */ - HG_SCAN_C_NAME, /* 0xFC */ HG_SCAN_C_NAME, /* 0xFD */ - HG_SCAN_C_NAME, /* 0xFE */ HG_SCAN_C_NAME, /* 0xFF */ -}; - -/* - * Private Functions - */ -HgValueNode * -_hg_scanner_get_object(HgVM *vm, - HgFileObject *file) -{ - HgMemPool *pool; - HgStack *estack, *ostack; - HgDict *systemdict; - HgValueNode *node, *retval = NULL; - guchar c; - gboolean need_loop = TRUE, maybe_real = FALSE, error = FALSE; - gboolean was_comment = FALSE; - gint token_type = 0, string_depth = 0, sign = 0; - HgString *string = NULL; - HgArray *array = NULL; - - pool = hg_vm_get_current_pool(vm); - ostack = hg_vm_get_ostack(vm); - estack = hg_vm_get_estack(vm); - systemdict = hg_vm_get_dict_systemdict(vm); - - /* skip the white spaces first */ - _hg_scanner_skip_spaces(file, c); - - if (c == 0 && hg_file_object_is_eof(file)) - return NULL; - - hg_file_object_ungetc(file, c); - while (need_loop) { - c = hg_file_object_getc(file); - switch (__hg_scanner_token[c]) { - case HG_SCAN_C_NULL: - need_loop = FALSE; - break; - case HG_SCAN_C_CONTROL: - if (token_type == HG_SCAN_TOKEN_LITERAL && c == '/') { - if (hg_string_length(string) > 0) { - hg_file_object_ungetc(file, c); - need_loop = FALSE; - } else { - token_type = HG_SCAN_TOKEN_EVAL_NAME; - } - break; - } else if (token_type == HG_SCAN_TOKEN_STRING) { - if (c == ')') { - string_depth--; - if (string_depth == 0) { - need_loop = FALSE; - break; - } - } else if (c == '(') { - string_depth++; - } - if (!hg_string_append_c(string, c)) { - _hg_scanner_set_error(vm, - __hg_operator_list[HG_op_token], - VM_e_VMerror); - return NULL; - } - break; - } else if (token_type != 0) { - hg_file_object_ungetc(file, c); - need_loop = FALSE; - break; - } - switch (c) { - case '/': - token_type = HG_SCAN_TOKEN_LITERAL; - string = hg_string_new(pool, -1); - break; - case '(': - token_type = HG_SCAN_TOKEN_STRING; - string = hg_string_new(pool, -1); - string_depth++; - break; - case ')': - _hg_scanner_set_error(vm, - __hg_operator_list[HG_op_token], - VM_e_syntaxerror); - need_loop = FALSE; - break; - case '<': - c = hg_file_object_getc(file); - if (c == '<') { - /* dict mark */ - token_type = HG_SCAN_TOKEN_MARK; - need_loop = FALSE; - } else if (c == '~') { - /* ASCII85 encoding */ - hg_log_warning("FIXME: implement me"); - } else { - hg_log_warning("FIXME: implement me"); - hg_file_object_ungetc(file, c); - } - break; - case '>': - c = hg_file_object_getc(file); - if (c == '>') { - token_type = HG_SCAN_TOKEN_DICT; - need_loop = FALSE; - } else if (c == '~') { - /* ASCII85 encoding */ - hg_log_warning("FIXME: implement me"); - } else { - hg_log_warning("FIXME: implement me"); - hg_file_object_ungetc(file, c); - } - break; - case '[': - token_type = HG_SCAN_TOKEN_MARK; - need_loop = FALSE; - break; - case ']': - token_type = HG_SCAN_TOKEN_ARRAY; - need_loop = FALSE; - break; - case '{': - array = hg_array_new(pool, -1); - if (array == NULL) { - _hg_scanner_set_error(vm, - __hg_operator_list[HG_op_token], - VM_e_VMerror); - return NULL; - } - while (1) { - node = _hg_scanner_get_object(vm, file); - if (hg_vm_has_error(vm)) { - return NULL; - } - if (node == NULL) { - _hg_scanner_set_error(vm, - __hg_operator_list[HG_op_token], - VM_e_syntaxerror); - need_loop = FALSE; - break; - } - if (HG_IS_VALUE_NULL (node) && HG_VALUE_GET_NULL (node) != NULL) { - /* HACK: assume that this is a mark for proc end. */ - token_type = HG_SCAN_TOKEN_PROC; - hg_array_fix_array_size(array); - hg_mem_free(node); - break; - } - if (!hg_array_append(array, node)) { - _hg_scanner_set_error(vm, - __hg_operator_list[HG_op_token], - VM_e_VMerror); - return NULL; - } - } - need_loop = FALSE; - break; - case '}': - token_type = HG_SCAN_TOKEN_PROC_END; - need_loop = FALSE; - break; - case 0x04: - need_loop = FALSE; - break; - case '%': - /* FIXME: parse comment? */ - while (1) { - c = hg_file_object_getc(file); - if (c == 0 || c == '\r' || c == '\n') - break; - } - _hg_scanner_skip_spaces(file, c); - hg_file_object_ungetc(file, c); - was_comment = TRUE; - break; - default: - hg_log_warning("[BUG] unknown control object %c.", c); - break; - } - break; - case HG_SCAN_C_NAME: - if (c == '\\') { - c = hg_file_object_getc(file); - switch (c) { - case 'n': - c = '\n'; - break; - case 'r': - c = '\r'; - break; - case 't': - c = '\t'; - break; - case 'b': - c = '\b'; - break; - case 'f': - c = '\f'; - break; - case '\r': - if (token_type == HG_SCAN_TOKEN_STRING) { - c = hg_file_object_getc(file); - if (c != '\n') { - hg_file_object_ungetc(file, c); - continue; - } - } else { - hg_file_object_ungetc(file, c); - c = '\\'; - } - break; - case '\n': - if (token_type == HG_SCAN_TOKEN_STRING) { - /* ignore it */ - continue; - } else { - hg_file_object_ungetc(file, c); - c = '\\'; - } - break; - default: - break; - } - } - switch (token_type) { - case 0: - /* in this case, the token might be - * name object or possibly real. - */ - string = hg_string_new(pool, -1); - if (!hg_string_append_c(string, c)) { - _hg_scanner_set_error(vm, - __hg_operator_list[HG_op_token], - VM_e_VMerror); - return NULL; - } - if (_hg_scanner_is_sign(c)) { - sign = 1; - if (c == '-') - sign = -sign; - } else if (c == '.') { - maybe_real = TRUE; - } - token_type = HG_SCAN_TOKEN_NAME; - if (_hg_scanner_parse_number(vm, file, token_type, - 10, sign, !maybe_real, - string, &retval, &error)) { - token_type = HG_SCAN_TOKEN_NUMERIC; - need_loop = FALSE; - } - if (error) - return NULL; - break; - case HG_SCAN_TOKEN_NAME: - case HG_SCAN_TOKEN_LITERAL: - case HG_SCAN_TOKEN_EVAL_NAME: - case HG_SCAN_TOKEN_STRING: - if (!hg_string_append_c(string, c)) { - _hg_scanner_set_error(vm, - __hg_operator_list[HG_op_token], - VM_e_VMerror); - return NULL; - } - break; - default: - hg_log_warning("[BUG] it may be unlikely to appear HG_SCAN_C_NAME in token type %d\n", token_type); - break; - } - break; - case HG_SCAN_C_SPACE: - if (token_type == HG_SCAN_TOKEN_STRING) { - if (!hg_string_append_c(string, c)) { - _hg_scanner_set_error(vm, - __hg_operator_list[HG_op_token], - VM_e_VMerror); - return NULL; - } - } else { - need_loop = FALSE; - } - break; - case HG_SCAN_C_NUMERAL: - switch (token_type) { - case 0: - /* it might be a numeral, but possibly name. */ - string = hg_string_new(pool, -1); - hg_file_object_ungetc(file, c); - token_type = HG_SCAN_TOKEN_NAME; - if (_hg_scanner_parse_number(vm, file, token_type, - 10, sign, !maybe_real, - string, &retval, &error)) { - token_type = HG_SCAN_TOKEN_NUMERIC; - need_loop = FALSE; - } - if (error) - return NULL; - break; - case HG_SCAN_TOKEN_LITERAL: - case HG_SCAN_TOKEN_EVAL_NAME: - case HG_SCAN_TOKEN_STRING: - case HG_SCAN_TOKEN_NAME: - if (!hg_string_append_c(string, c)) { - _hg_scanner_set_error(vm, - __hg_operator_list[HG_op_token], - VM_e_VMerror); - return NULL; - } - break; - default: - break; - } - break; - case HG_SCAN_C_BINARY: - break; - default: - hg_log_warning("Unknown character %c(%d)[%d]", c, c, __hg_scanner_token[c]); - break; - } - } - switch (token_type) { - case HG_SCAN_TOKEN_LITERAL: - retval = hg_vm_get_name_node(vm, hg_string_get_string(string)); - hg_object_inexecutable((HgObject *)retval); - hg_mem_free(string); - break; - case HG_SCAN_TOKEN_NAME: - retval = hg_vm_get_name_node(vm, hg_string_get_string(string)); - hg_object_executable((HgObject *)retval); - hg_mem_free(string); - break; - case HG_SCAN_TOKEN_EVAL_NAME: - node = hg_vm_get_name_node(vm, hg_string_get_string(string)); - retval = hg_vm_lookup(vm, node); - if (retval == NULL) { - _hg_scanner_set_error(vm, - __hg_operator_list[HG_op_token], - VM_e_undefined); - } - hg_mem_free(string); - break; - case HG_SCAN_TOKEN_NUMERIC: - hg_mem_free(string); - break; - case HG_SCAN_TOKEN_MARK: - retval = hg_dict_lookup_with_string(systemdict, "mark"); - break; - case HG_SCAN_TOKEN_ARRAY: - retval = hg_dict_lookup_with_string(systemdict, "%arraytomark"); - break; - case HG_SCAN_TOKEN_DICT: - retval = hg_dict_lookup_with_string(systemdict, "%dicttomark"); - break; - case HG_SCAN_TOKEN_PROC: - HG_VALUE_MAKE_ARRAY (retval, array); - hg_object_executable((HgObject *)retval); - break; - case HG_SCAN_TOKEN_PROC_END: - HG_VALUE_MAKE_NULL (pool, retval, GINT_TO_POINTER (1)); - break; - case HG_SCAN_TOKEN_STRING: - if (string_depth == 0) { - hg_string_fix_string_size(string); - HG_VALUE_MAKE_STRING (retval, string); - } - break; - default: - /* XXX */ - if (!was_comment) - hg_log_warning("FIXME: unknown token type %d\n", token_type); - break; - } - - /* This is to be not broken the objects in systemdict by the malicious users - * after the initialization finished. - * makes the objects in read-only anyway. - */ - node = hg_dict_lookup_with_string(hg_vm_get_dict_statusdict(vm), "%initialized"); - if ((node == NULL || - HG_VALUE_GET_BOOLEAN (node) == FALSE) && - retval != NULL && !HG_IS_VALUE_STRING (retval) && - !HG_IS_VALUE_DICT (retval)) { - hg_object_unwritable((HgObject *)retval); - } - - return retval; -} - -static gboolean -_hg_scanner_parse_number(HgVM *vm, - HgFileObject *file, - gint token_type, - gint radix, - gint sign, - gboolean is_integer, - HgString *string, - HgValueNode **node, - gboolean *error) -{ - HgMemPool *pool = hg_vm_get_current_pool(vm); - guchar c; - gboolean need_loop = TRUE, is_valid = FALSE, is_power = FALSE; - gboolean has_radix = (radix == 10 ? FALSE : TRUE); - HgIntArray *intarray, *floatarray = NULL; - gint32 i = 0, power = 0, di = 0; - gint power_sign = 0; - static const gchar *const radix_index = "0123456789abcdefghijklmnopqrstuvwxyz"; - - intarray = hg_int_array_new(pool, -1); - if (!is_integer) { - /* value may be less than 1 */ - hg_int_array_append(intarray, 0); - floatarray = hg_int_array_new(pool, -1); - } - while (need_loop) { - c = hg_file_object_getc(file); - switch (__hg_scanner_token[c]) { - case HG_SCAN_C_CONTROL: - case HG_SCAN_C_NULL: - case HG_SCAN_C_SPACE: - goto non_numeral_handler; - break; - case HG_SCAN_C_NAME: - is_valid = TRUE; - if (c != '\\') { - switch (token_type) { - case HG_SCAN_TOKEN_NAME: - if (c == '.') { - if (!is_integer || is_power || has_radix) { - is_valid = FALSE; - break; - } - di = i; - floatarray = hg_int_array_new(pool, -1); - is_integer = FALSE; - i = 0; - } else if ((c == 'e' || c == 'E') && !has_radix) { - if (is_power) { - is_valid = FALSE; - break; - } - is_power = TRUE; - if (!hg_string_append_c(string, c)) { - _hg_scanner_set_error(vm, - __hg_operator_list[HG_op_token], - VM_e_VMerror); - *error = TRUE; - return FALSE; - } - c = hg_file_object_getc(file); - if (_hg_scanner_is_sign(c)) { - power_sign = 1; - if (c == '-') - power_sign = -power_sign; - } else if (c < '0' || c > '9') { - is_valid = FALSE; - break; - } else { - hg_file_object_ungetc(file, c); - } - } else if (c == '#') { - if (is_power || !is_integer || has_radix || - hg_int_array_length(intarray) > 0 || - i > 36) { - is_valid = FALSE; - break; - } - has_radix = TRUE; - radix = i; - i = 0; - } else if ((c >= 'a' && c <= 'z') || - (c >= 'A' && c <= 'Z')) { - char *p; - gint index; - - if (is_power || !is_integer) { - is_valid = FALSE; - break; - } - p = strchr(radix_index, tolower(c)); - index = p - radix_index; - if (index >= radix) { - is_valid = FALSE; - break; - } - if ((i > 0 && (i * radix) < 0) || - (i < 0 && (i * radix) > 0)) { - /* the overflow may happens but we can't - * fallback to real. - */ - _hg_scanner_set_error(vm, - __hg_operator_list[HG_op_token], - VM_e_limitcheck); - *error = TRUE; - return FALSE; - } - i *= radix; - i += index; - } else { - is_valid = FALSE; - break; - } - - if (!hg_string_append_c(string, c)) { - _hg_scanner_set_error(vm, - __hg_operator_list[HG_op_token], - VM_e_VMerror); - *error = TRUE; - return FALSE; - } - break; - case HG_SCAN_TOKEN_LITERAL: - case HG_SCAN_TOKEN_EVAL_NAME: - case HG_SCAN_TOKEN_STRING: - /* it may be unlikely */ - is_valid = FALSE; - break; - default: - hg_log_warning("[BUG] it may be unlikely to appear HG_SCAN_C_NAME in token type %d\n", token_type); - is_valid = FALSE; - break; - } - if (is_valid) - break; - } else { - is_valid = FALSE; - } - goto non_numeral_handler; - case HG_SCAN_C_NUMERAL: - is_valid = TRUE; - switch (token_type) { - case HG_SCAN_TOKEN_LITERAL: - case HG_SCAN_TOKEN_EVAL_NAME: - case HG_SCAN_TOKEN_STRING: - /* it may be unlikely */ - is_valid = FALSE; - goto non_numeral_handler; - case HG_SCAN_TOKEN_NAME: - if (is_power) { - power *= 10; - power += c - '0'; - } else { - if (has_radix && - ((i > 0 && (i * radix) < 0) || - (i < 0 && (i * radix) > 0))) { - /* the overflow may happens but we can't - * fallback to real. - */ - _hg_scanner_set_error(vm, - __hg_operator_list[HG_op_token], - VM_e_limitcheck); - *error = TRUE; - return FALSE; - } else if (!has_radix && - i > 100000000) { - /* it could has 10 digits in 32bit integer though, - * it may be complicated to convert it to real, - * so that the overflow will happens within 10 digits. - */ - if (floatarray) { - hg_int_array_append(floatarray, i); - i = 0; - } else { - hg_int_array_append(intarray, i); - i = 0; - } - } - i *= radix; - i += c - '0'; - } - if (!hg_string_append_c(string, c)) { - _hg_scanner_set_error(vm, - __hg_operator_list[HG_op_token], - VM_e_VMerror); - *error = TRUE; - return FALSE; - } - break; - default: - hg_log_warning("[BUG] it may be unlikely to appear HG_SCAN_C_NUMERAL in token type %d\n", token_type); - is_valid = FALSE; - goto non_numeral_handler; - } - break; - case HG_SCAN_C_BINARY: - default: - non_numeral_handler: - /* postpone dealing with this */ - hg_file_object_ungetc(file, c); - need_loop = FALSE; - break; - } - } - if (is_valid) { - if (hg_int_array_length(intarray) == 0 && floatarray == NULL && !is_power) { - /* integer */ - if (sign < 0) - i = -i; - HG_VALUE_MAKE_INTEGER (pool, *node, i); - } else { - guint j, length, digits = (guint)log10(i) + 1, intdigits = 0; - gdouble d = 0.0L, dd = 0.0L; - - if (di > 0) - intdigits = (guint)log10(di) + 1; - if (has_radix) { - /* this is unlikely */ - hg_log_warning("[BUG] numeric with radix is going to be the real."); - return FALSE; - } - if (floatarray) { - length = hg_int_array_length(floatarray); - for (j = 0; j < length; j++) { - dd += ((gdouble)hg_int_array_index(floatarray, j) * exp10(-(gdouble)((j + 1) * 9))); - } - dd += (i * exp10(-(gdouble)(j * 9 + digits))); - digits = 0; - i = 0; - } - length = hg_int_array_length(intarray); - for (j = 0; j < length; j++) { - d += ((gdouble)hg_int_array_index(intarray, j) * exp10((gdouble)((length - j - 1) * 9 + digits + intdigits))); - } - if (di != 0) { - d += (gdouble)di; - } else { - d += (gdouble)i; - } - d += dd; - if (is_power) { - if (power_sign < 0) - power = -power; - dd = exp10((gdouble)power); - d *= dd; - } - if (sign < 0) - d = -d; - if (isinf(d) != 0 || isnan(d) != 0) { - _hg_scanner_set_error(vm, - __hg_operator_list[HG_op_token], - VM_e_limitcheck); - *error = TRUE; - return FALSE; - } - if (is_integer && d <= G_MAXINT32 && d >= G_MININT32) - HG_VALUE_MAKE_INTEGER (pool, *node, (gint32)d); - else - HG_VALUE_MAKE_REAL (pool, *node, d); - } - } - - if (intarray) - hg_int_array_free(intarray); - if (floatarray) - hg_int_array_free(floatarray); - - return is_valid; -} - -/* - * Public Functions - */ -HgValueNode * -hg_scanner_get_object(HgVM *vm, - HgFileObject *file) -{ - g_return_val_if_fail (vm != NULL, NULL); - g_return_val_if_fail (file != NULL, NULL); - - return _hg_scanner_get_object(vm, file); -} diff --git a/hieroglyph/scanner.h b/hieroglyph/scanner.h deleted file mode 100644 index f769fa7..0000000 --- a/hieroglyph/scanner.h +++ /dev/null @@ -1,55 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ -/* - * scanner.h - * Copyright (C) 2005-2006 Akira TAGOH - * - * Authors: - * Akira TAGOH <at@gclab.org> - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - */ -#ifndef __LIBRETTO_SCANNER_H__ -#define __LIBRETTO_SCANNER_H__ - -#include <hieroglyph/hgtypes.h> - - -G_BEGIN_DECLS - -typedef enum { - HG_SCAN_C_NULL, - HG_SCAN_C_CONTROL, - HG_SCAN_C_NAME, - HG_SCAN_C_SPACE, - HG_SCAN_C_NUMERAL, - HG_SCAN_C_BINARY, -} HgScannerCharType; - - -#define _hg_scanner_isspace(__hg_scanner_char) \ - ((__hg_scanner_char) == ' ' || \ - (__hg_scanner_char) == '\t' || \ - (__hg_scanner_char) == '\r' || \ - (__hg_scanner_char) == '\n') - - -HgValueNode *hg_scanner_get_object(HgVM *vm, - HgFileObject *file); - -G_END_DECLS - - -#endif /* __LIBRETTO_SCANNER_H__ */ diff --git a/hieroglyph/utils.c b/hieroglyph/utils.c new file mode 100644 index 0000000..a0b8fb9 --- /dev/null +++ b/hieroglyph/utils.c @@ -0,0 +1,83 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ +/* + * utils.c + * Copyright (C) 2007 Akira TAGOH + * + * Authors: + * Akira TAGOH <akira@tagoh.org> + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ +#ifdef HAVE_CONFIG_H +#include <config.h> +#endif + +#include <execinfo.h> +#include <stdlib.h> +#include <glib/gstrfuncs.h> +#include <glib/gstring.h> +#include "utils.h" + + +static gboolean __hg_stacktrace_feature = TRUE; + +/* + * private functions + */ + +/* + * public functions + */ +gchar * +hg_get_stacktrace(void) +{ + void *traces[256]; + int size, i; + char **strings; + GString *retval = g_string_new(NULL); + + if (__hg_stacktrace_feature == FALSE) + return g_strdup(""); + + size = backtrace(traces, 256); + strings = backtrace_symbols(traces, size); + + for (i = 0; i < size; i++) { + g_string_append(retval, strings[i]); + g_string_append_c(retval, '\n'); + } + free(strings); + + return g_string_free(retval, FALSE); +} + +void +hg_use_stacktrace(gboolean flag) +{ +#ifdef DEBUG + __hg_stacktrace_feature = flag; +#else + g_warning("The stacktrace feature are entirely disabled at the build time."); +#endif +} + +#ifdef DEBUG +gboolean +hg_is_stacktrace_enabled(void) +{ + return __hg_stacktrace_feature; +} +#endif diff --git a/hieroglyph/hgallocator-bfit.h b/hieroglyph/utils.h index 3eb6c5c..7981e6c 100644 --- a/hieroglyph/hgallocator-bfit.h +++ b/hieroglyph/utils.h @@ -1,10 +1,10 @@ /* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ /* - * hgallocator-bfit.h - * Copyright (C) 2006 Akira TAGOH + * utils.h + * Copyright (C) 2007 Akira TAGOH * * Authors: - * Akira TAGOH <at@gclab.org> + * Akira TAGOH <akira@tagoh.org> * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -21,15 +21,18 @@ * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ -#ifndef __HG_ALLOCATOR_BFIT_H__ -#define __HG_ALLOCATOR_BFIT_H__ +#ifndef __HIEROGLYPH__UTILS_H__ +#define __HIEROGLYPH__UTILS_H__ #include <hieroglyph/hgtypes.h> + G_BEGIN_DECLS -HgAllocatorVTable *hg_allocator_bfit_get_vtable(void) G_GNUC_CONST; +gchar *hg_get_stacktrace (void) G_GNUC_MALLOC; +void hg_use_stacktrace (gboolean flag); +gboolean hg_is_stacktrace_enabled(void) __attribute__ ((weak)); G_END_DECLS -#endif /* __HG_ALLOCATOR_BFIT_H__ */ +#endif /* __HIEROGLYPH__UTILS_H__ */ diff --git a/hieroglyph/version.h.in b/hieroglyph/version.h.in index ada5100..def947c 100644 --- a/hieroglyph/version.h.in +++ b/hieroglyph/version.h.in @@ -1,10 +1,10 @@ /* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ /* * version.h - * Copyright (C) 2005-2006 Akira TAGOH + * Copyright (C) 2005-2007 Akira TAGOH * * Authors: - * Akira TAGOH <at@gclab.org> + * Akira TAGOH <akira@tagoh.org> * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -21,18 +21,19 @@ * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ -#ifndef __HG_VERSION_H__ -#define __HG_VERSION_H__ +#ifndef c914e012-1e1c-44e8-8686-b0eb222c2ac2VERSION_H__ +#define c914e012-1e1c-44e8-8686-b0eb222c2ac2VERSION_H__ #include <glib/gmacros.h> + G_BEGIN_DECLS #define HIEROGLYPH_VERSION "@VERSION@" -#define HIEROGLYPH_UUID "bd0c9fb4-4ed8-4bb9-bce5-c4f0198ece76" +#define HIEROGLYPH_UUID "c914e012-1e1c-44e8-8686-b0eb222c2ac2" const char *__hg_rcsid G_GNUC_UNUSED = "$Rev$"; G_END_DECLS -#endif /* __HG_VERSION_H__ */ +#endif /* c914e012-1e1c-44e8-8686-b0eb222c2ac2VERSION_H__ */ diff --git a/hieroglyph/version.h.in.in b/hieroglyph/version.h.in.in index d00f80c..4f35b3a 100644 --- a/hieroglyph/version.h.in.in +++ b/hieroglyph/version.h.in.in @@ -1,10 +1,10 @@ /* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ /* * version.h - * Copyright (C) 2005-2006 Akira TAGOH + * Copyright (C) 2005-2007 Akira TAGOH * * Authors: - * Akira TAGOH <at@gclab.org> + * Akira TAGOH <akira@tagoh.org> * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -21,11 +21,12 @@ * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ -#ifndef __HG_VERSION_H__ -#define __HG_VERSION_H__ +#ifndef __HIEROGLYPH__VERSION_H__ +#define __HIEROGLYPH__VERSION_H__ #include <glib/gmacros.h> + G_BEGIN_DECLS #define HIEROGLYPH_VERSION "@VERSION@" @@ -35,4 +36,4 @@ const char *__hg_rcsid G_GNUC_UNUSED = "$Rev$"; G_END_DECLS -#endif /* __HG_VERSION_H__ */ +#endif /* __HIEROGLYPH__VERSION_H__ */ diff --git a/hieroglyph/vm.c b/hieroglyph/vm.c index 5b24eb7..1d86abb 100644 --- a/hieroglyph/vm.c +++ b/hieroglyph/vm.c @@ -1,10 +1,10 @@ /* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ /* * vm.c - * Copyright (C) 2005-2006 Akira TAGOH + * Copyright (C) 2005-2007 Akira TAGOH * * Authors: - * Akira TAGOH <at@gclab.org> + * Akira TAGOH <akira@tagoh.org> * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -22,1593 +22,663 @@ * Boston, MA 02111-1307, USA. */ #ifdef HAVE_CONFIG_H -#include <config.h> +#include "config.h" #endif -#include <errno.h> -#include <stdlib.h> -#include <string.h> -#include <sys/stat.h> +#include <glib/gmem.h> +#include <hieroglyph/hgdict.h> +#include <hieroglyph/hgfile.h> +#include <hieroglyph/hgobject.h> +#include <hieroglyph/hgoperator.h> +#include <hieroglyph/hgstack.h> #include "vm.h" -#include "hgallocator-bfit.h" -#include "hgmem.h" -#include "hgarray.h" -#include "hgdict.h" -#include "hgfile.h" -#include "hglineedit.h" -#include "hglist.h" -#include "hglog.h" -#include "hgplugins.h" -#include "hgstack.h" -#include "hgstring.h" -#include "hgvaluenode.h" -#include "hggraphics.h" -#include "operator.h" -#include "scanner.h" - - -#define _hg_vm_set_error(v, o, e, d) \ - G_STMT_START { \ - HgValueNode *__hg_op_node; \ - \ - HG_VALUE_MAKE_OPERATOR (__hg_op_node, (o)); \ - hg_vm_set_error((v), __hg_op_node, (e), (d)); \ - } G_STMT_END -#define _hg_vm_set_error_from_file(v, o, e, d) \ - G_STMT_START { \ - HgValueNode *__hg_op_node; \ - \ - HG_VALUE_MAKE_OPERATOR (__hg_op_node, (o)); \ - hg_vm_set_error_from_file((v), __hg_op_node, (e), (d)); \ - } G_STMT_END - - -struct _HieroGlyphVirtualMachine { - HgObject object; - - /* vm */ - HgVMEmulationType emulation_type; - gboolean use_global_pool : 1; - gboolean has_error : 1; - HgDict *name_dict; - GTimeVal initialized_time; - GRand *random_generator; - gint32 error_code; - gboolean shutdown; - gint32 security_level; - - /* memory pool */ - HgAllocator *local_allocator; - HgAllocator *global_allocator; - HgAllocator *graphic_allocator; - HgMemPool *local_pool; - HgMemPool *global_pool; - HgMemPool *graphic_pool; - - /* stacks */ - HgStack *ostack; - HgStack *estack; - HgStack *dstack; - - /* local dictionaries */ - HgDict *errordict; - HgDict *error; - HgDict *statusdict; - HgDict *serverdict; - HgDict *font; - - /* global dictionaries */ - HgDict *systemdict; - HgDict *globalfont; - - /* file */ - HgFileObject *stdin; - HgFileObject *stdout; - HgFileObject *stderr; - HgLineEdit *lineeditor; - - /* graphics */ - HgGraphics *graphics; - - /* plugin */ - HgDict *plugin_table; - GList *plugin_list; -}; - -static void _hg_vm_real_free (gpointer data); -static void _hg_vm_real_relocate(gpointer data, - HgMemRelocateInfo *info); +typedef struct hg_vm_private_s hg_vm_private_t; -static gboolean __hg_vm_is_initialized = FALSE; -static HgAllocator *__hg_vm_allocator = NULL; -static HgMemPool *__hg_vm_mem_pool = NULL; -HgValueNode *__hg_vm_errorname[VM_e_END] = { NULL }; -static HgObjectVTable __hg_vm_vtable = { - .free = _hg_vm_real_free, - .set_flags = NULL, - .relocate = _hg_vm_real_relocate, - .dup = NULL, - .copy = NULL, - .to_string = NULL, +struct hg_vm_private_s { + hg_vm_t instance; + hg_error_t error; + hg_emulation_type_t current_level; + hg_object_t *io[HG_FILE_TYPE_END]; + hg_stack_t *stack[HG_STACK_TYPE_END]; + hg_object_t *dict; }; -/* - * special operators - */ -static gboolean -_hg_vm_op_rollbacksecuritylevel(HgOperator *op, - gpointer data) -{ - HgVM *vm = data; - gboolean retval = TRUE; - HgStack *estack = hg_vm_get_estack(vm); - guint edepth = hg_stack_depth(estack); - HgValueNode *nself, *node; - - /* ignore the errors */ - if (edepth > 2) { - nself = hg_stack_index(estack, 0); - node = hg_stack_index(estack, 1); - if (HG_IS_VALUE_INTEGER (node)) { - vm->security_level = HG_VALUE_GET_INTEGER (node); - hg_stack_pop(estack); - hg_stack_pop(estack); - retval = hg_stack_push(estack, nself); /* dummy */ - /* it must be true */ - } - } - return retval; -} +static gboolean _hg_vm_lineedit_open (gpointer user_data, + error_t *error); +static gsize _hg_vm_lineedit_read (gpointer user_data, + gpointer buffer, + gsize size, + gsize n, + error_t *error); +static gsize _hg_vm_lineedit_write (gpointer user_data, + gconstpointer buffer, + gsize size, + gsize n, + error_t *error); +static gboolean _hg_vm_lineedit_flush (gpointer user_data, + error_t *error); +static gssize _hg_vm_lineedit_seek (gpointer user_data, + gssize offset, + hg_filepos_t whence, + error_t *error); +static void _hg_vm_lineedit_close (gpointer user_data, + error_t *error); +static gboolean _hg_vm_lineedit_is_closed (gpointer user_data); +static gboolean _hg_vm_lineedit_is_eof (gpointer user_data); +static void _hg_vm_lineedit_clear_eof (gpointer user_data); +static gboolean _hg_vm_statementedit_open (gpointer user_data, + error_t *error); +static gsize _hg_vm_statementedit_read (gpointer user_data, + gpointer buffer, + gsize size, + gsize n, + error_t *error); +static gsize _hg_vm_statementedit_write (gpointer user_data, + gconstpointer buffer, + gsize size, + gsize n, + error_t *error); +static gboolean _hg_vm_statementedit_flush (gpointer user_data, + error_t *error); +static gssize _hg_vm_statementedit_seek (gpointer user_data, + gssize offset, + hg_filepos_t whence, + error_t *error); +static void _hg_vm_statementedit_close (gpointer user_data, + error_t *error); +static gboolean _hg_vm_statementedit_is_closed(gpointer user_data); +static gboolean _hg_vm_statementedit_is_eof (gpointer user_data); +static void _hg_vm_statementedit_clear_eof(gpointer user_data); + + +static hg_filetable_t _hg_vm_lineedit_table = { + .open = _hg_vm_lineedit_open, + .read = _hg_vm_lineedit_read, + .write = _hg_vm_lineedit_write, + .flush = _hg_vm_lineedit_flush, + .seek = _hg_vm_lineedit_seek, + .close = _hg_vm_lineedit_close, + .is_closed = _hg_vm_lineedit_is_closed, + .is_eof = _hg_vm_lineedit_is_eof, + .clear_eof = _hg_vm_lineedit_clear_eof, +}; +static hg_filetable_t _hg_vm_statementedit_table = { + .open = _hg_vm_statementedit_open, + .read = _hg_vm_statementedit_read, + .write = _hg_vm_statementedit_write, + .flush = _hg_vm_statementedit_flush, + .seek = _hg_vm_statementedit_seek, + .close = _hg_vm_statementedit_close, + .is_closed = _hg_vm_statementedit_is_closed, + .is_eof = _hg_vm_statementedit_is_eof, + .clear_eof = _hg_vm_statementedit_clear_eof, +}; /* - * Private Functions + * Private functions */ -static void -_hg_vm_init_errorname(void) +static gboolean +_hg_vm_lineedit_open(gpointer user_data, + error_t *error) { -#define MAKE_ERRNAME(sym) \ - G_STMT_START { \ - HgValueNode *__hg_vm_err_node; \ - \ - HG_VALUE_MAKE_NAME_STATIC (__hg_vm_mem_pool, \ - __hg_vm_err_node, \ - #sym); \ - __hg_vm_errorname[VM_e_##sym] = __hg_vm_err_node; \ - hg_mem_pool_add_root_node(__hg_vm_mem_pool, __hg_vm_err_node); \ - } G_STMT_END - - MAKE_ERRNAME(dictfull); - MAKE_ERRNAME(dictstackoverflow); - MAKE_ERRNAME(dictstackunderflow); - MAKE_ERRNAME(execstackoverflow); - MAKE_ERRNAME(handleerror); - MAKE_ERRNAME(interrupt); - MAKE_ERRNAME(invalidaccess); - MAKE_ERRNAME(invalidexit); - MAKE_ERRNAME(invalidfileaccess); - MAKE_ERRNAME(invalidfont); - MAKE_ERRNAME(invalidrestore); - MAKE_ERRNAME(ioerror); - MAKE_ERRNAME(limitcheck); - MAKE_ERRNAME(nocurrentpoint); - MAKE_ERRNAME(rangecheck); - MAKE_ERRNAME(stackoverflow); - MAKE_ERRNAME(stackunderflow); - MAKE_ERRNAME(syntaxerror); - MAKE_ERRNAME(timeout); - MAKE_ERRNAME(typecheck); - MAKE_ERRNAME(undefined); - MAKE_ERRNAME(undefinedfilename); - MAKE_ERRNAME(undefinedresult); - MAKE_ERRNAME(unmatchedmark); - MAKE_ERRNAME(unregistered); - MAKE_ERRNAME(VMerror); - MAKE_ERRNAME(configurationerror); - MAKE_ERRNAME(undefinedresource); - -#undef MAKE_ERRNAME + /* XXX */ + return FALSE; } -static void -_hg_vm_real_free(gpointer data) +static gsize +_hg_vm_lineedit_read(gpointer user_data, + gpointer buffer, + gsize size, + gsize n, + error_t *error) { - HgVM *vm = data; - - if (vm->random_generator) - g_rand_free(vm->random_generator); - if (vm->local_pool) - hg_mem_pool_destroy(vm->local_pool); -#ifdef ENABLE_GLOBAL_POOL - if (vm->global_pool) - hg_mem_pool_destroy(vm->global_pool); -#endif - if (vm->graphic_pool) - hg_mem_pool_destroy(vm->graphic_pool); - hg_allocator_destroy(vm->local_allocator); - hg_allocator_destroy(vm->global_allocator); - hg_allocator_destroy(vm->graphic_allocator); + /* XXX */ + return 0; } -static void -_hg_vm_real_relocate(gpointer data, - HgMemRelocateInfo *info) +static gsize +_hg_vm_lineedit_write(gpointer user_data, + gconstpointer buffer, + gsize size, + gsize n, + error_t *error) { - HgVM *vm = data; - -#define _hg_vm_update_addr(_name) \ - G_STMT_START { \ - if ((gsize)vm->_name >= info->start && \ - (gsize)vm->_name <= info->end) { \ - vm->_name = (gpointer)((gsize)vm->_name + info->diff); \ - } \ - } G_STMT_END - - _hg_vm_update_addr(name_dict); - _hg_vm_update_addr(ostack); - _hg_vm_update_addr(estack); - _hg_vm_update_addr(dstack); - _hg_vm_update_addr(errordict); - _hg_vm_update_addr(error); - _hg_vm_update_addr(statusdict); - _hg_vm_update_addr(serverdict); - _hg_vm_update_addr(font); - _hg_vm_update_addr(systemdict); - _hg_vm_update_addr(globalfont); - _hg_vm_update_addr(stdin); - _hg_vm_update_addr(stdout); - _hg_vm_update_addr(stderr); - -#undef _hg_vm_update_addr + /* XXX */ + return 0; } static gboolean -_hg_vm_eval_file(HgVM *vm, - HgFileObject *file, - gboolean *error) +_hg_vm_lineedit_flush(gpointer user_data, + error_t *error) { - HgStack *estack = hg_vm_get_estack(vm); - gboolean retval = FALSE; - HgValueNode *node; - - while (1) { - if (!hg_file_object_has_error(file)) { - HG_VALUE_MAKE_FILE (node, file); - if (node == NULL) { - _hg_vm_set_error(vm, file, VM_e_VMerror, FALSE); - *error = TRUE; - break; - } - hg_stack_clear(estack); - hg_vm_reset_error(vm); - hg_object_executable((HgObject *)node); - retval = hg_stack_push(estack, node); - if (!retval) { - hg_vm_set_error(vm, node, VM_e_execstackoverflow, FALSE); - *error = TRUE; - break; - } - hg_vm_main(vm); - hg_mem_free(node); - hg_mem_free(file); - if (hg_vm_has_error(vm) || - ((node = hg_dict_lookup_with_string(vm->error, "newerror")) != NULL && - HG_IS_VALUE_BOOLEAN (node) && - HG_VALUE_GET_BOOLEAN (node) == TRUE)) { - if (error) - *error = TRUE; - } else { - retval = TRUE; - if (error) - *error = FALSE; - } - } - break; - } - - return retval; + /* XXX */ + return FALSE; } -static gboolean -_hg_vm_run(HgVM *vm, - const gchar *filename, - gboolean *error) +static gssize +_hg_vm_lineedit_seek(gpointer user_data, + gssize offset, + hg_filepos_t whence, + error_t *error) { - HgMemPool *pool = hg_vm_get_current_pool(vm); - HgFileObject *file = hg_file_object_new(pool, - HG_FILE_TYPE_FILE, - HG_FILE_MODE_READ, - filename); - - return _hg_vm_eval_file(vm, file, error); + /* XXX */ + return 0; } static void -hg_vm_set_ostack(HgVM *vm, - HgStack *ostack) +_hg_vm_lineedit_close(gpointer user_data, + error_t *error) { - g_return_if_fail (vm != NULL); - g_return_if_fail (ostack != NULL); - - vm->ostack = ostack; + /* XXX */ } -static void -hg_vm_set_estack(HgVM *vm, - HgStack *estack) +static gboolean +_hg_vm_lineedit_is_closed(gpointer user_data) { - g_return_if_fail (vm != NULL); - g_return_if_fail (estack != NULL); - - vm->estack = estack; + /* XXX */ + return FALSE; } -static void -hg_vm_set_dstack(HgVM *vm, - HgStack *dstack) +static gboolean +_hg_vm_lineedit_is_eof(gpointer user_data) { - g_return_if_fail (vm != NULL); - g_return_if_fail (dstack != NULL); - - vm->dstack = dstack; + /* XXX */ + return FALSE; } -/* - * Public Functions - */ - -/* initializer */ -void -hg_vm_init(void) +static void +_hg_vm_lineedit_clear_eof(gpointer user_data) { - if (!__hg_vm_is_initialized) { - hg_mem_init(); - hg_value_node_init(); - hg_file_init(); - hg_list_init(); - hg_log_init(); - - __hg_vm_allocator = hg_allocator_new(hg_allocator_bfit_get_vtable()); - /* XXX: Ordinarily this pool should be a global pool according - * to this purpose. However it causes the pool check error - * to store the objects to the object, such as the node to - * the array when it happens during the error handling - * so that hg_vm_get_current_pool() returns - * __hg_vm_mem_pool to avoid another VMerror. - */ - __hg_vm_mem_pool = hg_mem_pool_new(__hg_vm_allocator, - "Hieroglyph VM Memory Pool", - 8192, - HG_MEM_RESIZABLE); - hg_mem_pool_use_garbage_collection(__hg_vm_mem_pool, FALSE); - _hg_vm_init_errorname(); - __hg_vm_is_initialized = TRUE; - } + /* XXX */ } -void -hg_vm_finalize(void) +static gboolean +_hg_vm_statementedit_open(gpointer user_data, + error_t *error) { - if (__hg_vm_is_initialized) { - hg_mem_pool_destroy(__hg_vm_mem_pool); - hg_allocator_destroy(__hg_vm_allocator); - - hg_file_finalize(); - hg_log_finalize(); - /* it may be better to be finalized after logger, - * because it uses HgDict, which is referring to HgList. - */ - hg_list_finalize(); - hg_value_node_finalize(); - hg_mem_finalize(); - - __hg_vm_is_initialized = FALSE; - } + /* XXX */ + return FALSE; } -gboolean -hg_vm_is_initialized(void) +static gsize +_hg_vm_statementedit_read(gpointer user_data, + gpointer buffer, + gsize size, + gsize n, + error_t *error) { - return __hg_vm_is_initialized; + /* XXX */ + return 0; } -/* virtual machine */ -HgVM * -hg_vm_new(HgVMEmulationType type) +static gsize +_hg_vm_statementedit_write(gpointer user_data, + gconstpointer buffer, + gsize size, + gsize n, + error_t *error) { - HgVM *retval; - gchar *name; - gboolean allow_resize = FALSE; - - g_return_val_if_fail (__hg_vm_is_initialized, NULL); - - retval = hg_mem_alloc_with_flags(__hg_vm_mem_pool, sizeof (HgVM), - HG_FL_HGOBJECT); - if (retval == NULL) { - hg_log_warning("Failed to create a virtual machine."); - return NULL; - } - HG_OBJECT_INIT_STATE (&retval->object); - HG_OBJECT_SET_STATE (&retval->object, hg_mem_pool_get_default_access_mode(__hg_vm_mem_pool)); - hg_object_set_vtable(&retval->object, &__hg_vm_vtable); - - retval->emulation_type = type; - retval->use_global_pool = FALSE; - retval->has_error = FALSE; - retval->shutdown = FALSE; - retval->error_code = 0; - - if (type >= VM_EMULATION_LEVEL_2) { - allow_resize = TRUE; - retval->use_global_pool = TRUE; - } - - /* initialize the memory pools */ - retval->local_allocator = hg_allocator_new(hg_allocator_bfit_get_vtable()); - retval->global_allocator = hg_allocator_new(hg_allocator_bfit_get_vtable()); - retval->graphic_allocator = hg_allocator_new(hg_allocator_bfit_get_vtable()); - name = g_strdup_printf("VM %p:local pool", retval); - retval->local_pool = hg_mem_pool_new(retval->local_allocator, - name, - HG_LOCAL_POOL_SIZE, - (allow_resize ? HG_MEM_RESIZABLE : 0)); - g_free(name); - if (retval->local_pool == NULL) { - hg_log_warning("Failed to create a local memory pool"); - return NULL; - } -#ifdef ENABLE_GLOBAL_POOL - name = g_strdup_printf("VM %p: global pool", retval); - retval->global_pool = hg_mem_pool_new(retval->global_allocator, - name, - HG_GLOBAL_POOL_SIZE, - HG_MEM_GLOBAL | (allow_resize ? HG_MEM_RESIZABLE : 0)); - hg_mem_pool_use_global_mode(retval->global_pool, TRUE); - g_free(name); - if (retval->global_pool == NULL) { - hg_log_warning("Failed to create a global memory pool"); - return NULL; - } -#else - retval->global_pool = retval->local_pool; -#endif - name = g_strdup_printf("VM %p:graphic pool", retval); - retval->graphic_pool = hg_mem_pool_new(retval->graphic_allocator, - name, - HG_GRAPHIC_POOL_SIZE, - (allow_resize ? HG_MEM_RESIZABLE : 0)); - g_free(name); - if (retval->graphic_pool == NULL) { - hg_log_warning("Failed to create a graphic memory pool"); - return NULL; - } - - /* internal use */ - retval->name_dict = hg_dict_new(retval->global_pool, 1024); - if (retval->name_dict == NULL) { - hg_log_warning("Failed to create a name dict."); - return NULL; - } - hg_mem_pool_add_root_node(retval->global_pool, retval->name_dict); - - g_get_current_time(&retval->initialized_time); - retval->random_generator = g_rand_new(); - - /* initialize the stacks */ - retval->ostack = hg_stack_new(retval->local_pool, 500); - retval->estack = hg_stack_new(retval->local_pool, 250); - retval->dstack = hg_stack_new(retval->local_pool, 20); - if (retval->ostack == NULL || - retval->estack == NULL || - retval->dstack == NULL) { - hg_log_warning("Failed to create stacks."); - return NULL; - } - hg_mem_pool_add_root_node(retval->local_pool, retval->ostack); - hg_mem_pool_add_root_node(retval->local_pool, retval->estack); - hg_mem_pool_add_root_node(retval->local_pool, retval->dstack); - - /* initialize local dictionaries */ - retval->errordict = hg_dict_new(retval->local_pool, 128); - retval->error = hg_dict_new(retval->local_pool, 128); - retval->statusdict = hg_dict_new(retval->local_pool, 128); - retval->serverdict = hg_dict_new(retval->local_pool, 128); - retval->font = hg_dict_new(retval->local_pool, 128); - if (retval->errordict == NULL || - retval->error == NULL || - retval->statusdict == NULL || - retval->serverdict == NULL || - retval->font == NULL) { - hg_log_warning("Failed to create local dictionaries."); - return NULL; - } - hg_mem_pool_add_root_node(retval->local_pool, retval->errordict); - hg_mem_pool_add_root_node(retval->local_pool, retval->error); - hg_mem_pool_add_root_node(retval->local_pool, retval->statusdict); - hg_mem_pool_add_root_node(retval->local_pool, retval->serverdict); - hg_mem_pool_add_root_node(retval->local_pool, retval->font); - - /* initialize global dictionaries */ - retval->systemdict = hg_dict_new(retval->global_pool, 384); - retval->globalfont = hg_dict_new(retval->global_pool, 128); - if (retval->systemdict == NULL || - retval->globalfont == NULL) { - hg_log_warning("Failed to create global dictionaries."); - return NULL; - } - hg_mem_pool_add_root_node(retval->global_pool, retval->systemdict); - hg_mem_pool_add_root_node(retval->global_pool, retval->globalfont); - - /* initialize file object */ - retval->stdin = __hg_file_stdin; - retval->stdout = __hg_file_stdout; - retval->stderr = __hg_file_stderr; - retval->lineeditor = hg_line_edit_new(retval->local_pool, NULL, - retval->stdin, retval->stdout); - hg_mem_pool_add_root_node(retval->local_pool, retval->lineeditor); - - /* initialize graphics */ - retval->graphics = hg_graphics_new(retval->graphic_pool); - hg_mem_pool_add_root_node(retval->graphic_pool, retval->graphics); - - /* plugin support */ - retval->plugin_table = hg_dict_new(retval->local_pool, 256); - retval->plugin_list = NULL; - hg_mem_pool_add_root_node(retval->local_pool, retval->plugin_table); - - hg_mem_pool_add_root_node(__hg_vm_mem_pool, retval); - - return retval; + /* XXX */ + return 0; } -void -hg_vm_set_emulation_level(HgVM *vm, - HgVMEmulationType type) +static gboolean +_hg_vm_statementedit_flush(gpointer user_data, + error_t *error) { - gboolean allow_resize = FALSE; - - g_return_if_fail (vm != NULL); - - vm->emulation_type = type; - if (type >= VM_EMULATION_LEVEL_2) - allow_resize = TRUE; - - hg_mem_pool_allow_resize(vm->global_pool, allow_resize); - hg_mem_pool_allow_resize(vm->local_pool, allow_resize); - hg_vm_startjob(vm, NULL, FALSE); + /* XXX */ + return FALSE; } -HgVMEmulationType -hg_vm_get_emulation_level(HgVM *vm) +static gssize +_hg_vm_statementedit_seek(gpointer user_data, + gssize offset, + hg_filepos_t whence, + error_t *error) { - g_return_val_if_fail (vm != NULL, VM_EMULATION_LEVEL_1); - - return vm->emulation_type; + /* XXX */ + return FALSE; } -HgStack * -hg_vm_get_ostack(HgVM *vm) +static void +_hg_vm_statementedit_close(gpointer user_data, + error_t *error) { - return vm->ostack; + /* XXX */ } -HgStack * -hg_vm_get_estack(HgVM *vm) +static gboolean +_hg_vm_statementedit_is_closed(gpointer user_data) { - return vm->estack; + /* XXX */ + return FALSE; } -HgStack * -hg_vm_get_dstack(HgVM *vm) +static gboolean +_hg_vm_statementedit_is_eof(gpointer user_data) { - return vm->dstack; + /* XXX */ + return FALSE; } -HgDict * -hg_vm_get_dict_errordict(HgVM *vm) +static void +_hg_vm_statementedit_clear_eof(gpointer user_data) { - return vm->errordict; + /* XXX */ } -HgDict * -hg_vm_get_dict_error(HgVM *vm) -{ - return vm->error; +/* + * Public functions + */ +hg_vm_t * +hg_vm_new(void) +{ + hg_vm_private_t *retval = g_new0(hg_vm_private_t, 1); + hg_stack_type_t i; + + /* initialize VM */ + retval->current_level = HG_EMU_BEGIN; + for (i = HG_STACK_TYPE_OSTACK; i < HG_STACK_TYPE_END; i++) + retval->stack[i] = NULL; + retval->dict = NULL; + + /* complete the initialization here */ + retval->io[HG_FILE_TYPE_STDIN] = hg_object_file_new((hg_vm_t *)retval, + "%stdin", + HG_FILE_MODE_READ); + retval->io[HG_FILE_TYPE_STDOUT] = hg_object_file_new((hg_vm_t *)retval, + "%stdout", + HG_FILE_MODE_WRITE); + retval->io[HG_FILE_TYPE_STDERR] = hg_object_file_new((hg_vm_t *)retval, + "%stderr", + HG_FILE_MODE_WRITE); + retval->io[HG_FILE_TYPE_LINEEDIT] = hg_object_file_new_with_custom((hg_vm_t *)retval, + &_hg_vm_lineedit_table, + HG_FILE_MODE_READ); + retval->io[HG_FILE_TYPE_STATEMENTEDIT] = hg_object_file_new_with_custom((hg_vm_t *)retval, + &_hg_vm_statementedit_table, + HG_FILE_MODE_READ); + + return (hg_vm_t *)retval; } -HgDict * -hg_vm_get_dict_statusdict(HgVM *vm) +void +hg_vm_destroy(hg_vm_t *vm) { - return vm->statusdict; -} + hg_return_if_fail (vm != NULL); -HgDict * -hg_vm_get_dict_serverdict(HgVM *vm) -{ - return vm->serverdict; + /* XXX */ + g_free(vm); } -HgDict * -hg_vm_get_dict_font(HgVM *vm) +gpointer +hg_vm_malloc(hg_vm_t *vm, + gsize size) { - return vm->font; -} + gpointer retval; -HgDict * -hg_vm_get_dict_systemdict(HgVM *vm) -{ - return vm->systemdict; -} + hg_return_val_if_fail (vm != NULL, NULL); -HgDict * -hg_vm_get_dict_globalfont(HgVM *vm) -{ - return vm->globalfont; + /* XXX */ + retval = g_malloc(size); + + return retval; } -HgMemPool * -hg_vm_get_current_pool(HgVM *vm) +gpointer +hg_vm_realloc(hg_vm_t *vm, + gpointer object, + gsize size) { - g_return_val_if_fail (vm != NULL, NULL); + gpointer retval; - if (vm->has_error) { - /* return a special memory pool to avoid recursive VMerror */ - return __hg_vm_mem_pool; - } - if (vm->use_global_pool) - return vm->global_pool; + hg_return_val_if_fail (vm != NULL, NULL); - return vm->local_pool; -} + /* XXX */ + retval = g_realloc(object, size); -gboolean -hg_vm_is_global_pool_used(HgVM *vm) -{ - g_return_val_if_fail (vm != NULL, FALSE); - - return vm->use_global_pool; + return retval; } void -hg_vm_use_global_pool(HgVM *vm, - gboolean use_global) +hg_vm_mfree(hg_vm_t *vm, + gpointer data) { - g_return_if_fail (vm != NULL); + hg_return_if_fail (vm != NULL); - vm->use_global_pool = use_global; + /* XXX */ + g_free(data); } -gboolean -hg_vm_is_global_object(HgVM *vm, - HgValueNode *node) +guchar +hg_vm_get_object_format(hg_vm_t *vm) { - HgMemObject *obj; - gboolean retval = FALSE; - gpointer p; - - g_return_val_if_fail (vm != NULL, TRUE); - g_return_val_if_fail (node != NULL, TRUE); - - switch (HG_VALUE_GET_VALUE_TYPE (node)) { - case HG_TYPE_VALUE_BOOLEAN: - case HG_TYPE_VALUE_INTEGER: - case HG_TYPE_VALUE_REAL: - case HG_TYPE_VALUE_NAME: - case HG_TYPE_VALUE_NULL: - case HG_TYPE_VALUE_OPERATOR: - case HG_TYPE_VALUE_MARK: - break; - case HG_TYPE_VALUE_ARRAY: - case HG_TYPE_VALUE_STRING: - case HG_TYPE_VALUE_DICT: - case HG_TYPE_VALUE_FILE: - case HG_TYPE_VALUE_SNAPSHOT: - p = HG_VALUE_GET_VALUE_NODE (node, Pointer); - hg_mem_get_object__inline(p, obj); - retval = (vm->local_pool != obj->pool); - break; - default: - hg_log_warning("Failed to consider if the object is a global object due to the unknown type ID: %d", HG_VALUE_GET_VALUE_TYPE (node)); - break; - } + hg_return_val_if_fail (vm != NULL, 0); - return retval; + /* XXX */ + return 0; } -HgGraphics * -hg_vm_get_graphics(HgVM *vm) +void +hg_vm_get_attributes(hg_vm_t *vm, + hg_attribute_t *attr) { - g_return_val_if_fail (vm != NULL, NULL); + hg_return_if_fail (vm != NULL); + hg_return_if_fail (attr != NULL); - return vm->graphics; + /* XXX */ + attr->bit.is_accessible = TRUE; + attr->bit.is_readable = TRUE; + attr->bit.is_executeonly = FALSE; + attr->bit.is_locked = FALSE; + attr->bit.reserved4 = FALSE; + attr->bit.reserved5 = FALSE; + attr->bit.is_global = FALSE; + attr->bit.is_checked = FALSE; } -gint32 -hg_vm_get_current_time(HgVM *vm) +void +hg_vm_set_error(hg_vm_t *vm, + hg_error_t error) { - GTimeVal t; - gint32 retval, i; + hg_vm_private_t *priv; + + hg_return_if_fail (vm != NULL); - g_get_current_time(&t); - if (t.tv_sec == vm->initialized_time.tv_sec) { - retval = (t.tv_usec - vm->initialized_time.tv_usec) / 1000; + priv = (hg_vm_private_t *)vm; + if (priv->error == 0) { + priv->error = error; } else { - i = t.tv_sec - vm->initialized_time.tv_sec; - if (t.tv_usec > vm->initialized_time.tv_usec) { - retval = i * 1000 + (t.tv_usec - vm->initialized_time.tv_usec) / 1000; - } else { - i--; - retval = i * 1000 + ((1 * 1000000 - vm->initialized_time.tv_usec) + t.tv_usec) / 1000; - } + /* XXX */ } - - return retval; } -GRand * -hg_vm_get_random_generator(HgVM *vm) +hg_error_t +hg_vm_get_error(hg_vm_t *vm) { - g_return_val_if_fail (vm != NULL, 0); + hg_vm_private_t *priv; - return vm->random_generator; -} + hg_return_val_if_fail (vm != NULL, HG_e_VMerror); -HgFileObject * -hg_vm_get_io(HgVM *vm, - HgVMIOType type) -{ - g_return_val_if_fail (vm != NULL, NULL); - - switch (type) { - case VM_IO_STDIN: - return vm->stdin; - case VM_IO_STDOUT: - return vm->stdout; - case VM_IO_STDERR: - return vm->stderr; - default: - hg_log_warning("Unknown I/O type %d", type); - break; - } + priv = (hg_vm_private_t *)vm; - return NULL; + return priv->error; } void -hg_vm_set_io(HgVM *vm, - HgVMIOType type, - HgFileObject *file) +hg_vm_clear_error(hg_vm_t *vm) { - g_return_if_fail (vm != NULL); - g_return_if_fail (file != NULL); - - switch (type) { - case VM_IO_STDIN: - vm->stdin = file; - hg_line_edit_set_stdin(vm->lineeditor, file); - break; - case VM_IO_STDOUT: - vm->stdout = file; - hg_line_edit_set_stdout(vm->lineeditor, file); - break; - case VM_IO_STDERR: - vm->stderr = file; - break; - default: - hg_log_warning("Unknown I/O type %d", type); - break; - } -} + hg_vm_private_t *priv; -HgLineEdit * -hg_vm_get_line_editor(HgVM *vm) -{ - g_return_val_if_fail (vm != NULL, NULL); + hg_return_if_fail (vm != NULL); - return vm->lineeditor; + priv = (hg_vm_private_t *)vm; + priv->error = 0; } -void -hg_vm_set_line_editor(HgVM *vm, - HgLineEdit *editor) +hg_object_t * +hg_vm_get_io(hg_vm_t *vm, + hg_filetype_t iotype) { - g_return_if_fail (vm != NULL); - g_return_if_fail (editor != NULL); + hg_vm_private_t *priv; - vm->lineeditor = editor; -} + hg_return_val_if_fail (vm != NULL, NULL); -gboolean -hg_vm_load_plugin(HgVM *vm, - const gchar *filename) -{ - HgPlugin *plugin; - HgValueNode *key, *val; - - g_return_val_if_fail (vm != NULL, FALSE); - g_return_val_if_fail (filename != NULL, FALSE); + priv = (hg_vm_private_t *)vm; - if (hg_dict_lookup_with_string(vm->plugin_table, filename) != NULL) { - hg_log_warning("`%s' plugin is already loaded.", filename); - return FALSE; - } - plugin = hg_plugin_open(vm->local_pool, filename, HG_PLUGIN_EXTENSION); - if (plugin) { - HG_VALUE_MAKE_NAME_STATIC (vm->local_pool, key, filename); - HG_VALUE_MAKE_PLUGIN (val, plugin); - hg_dict_insert(vm->local_pool, vm->plugin_table, key, val); - vm->plugin_list = g_list_append(vm->plugin_list, plugin); - } - - return plugin != NULL; + return priv->io[iotype]; } void -hg_vm_load_plugins_all(HgVM *vm) +hg_vm_set_io(hg_vm_t *vm, + hg_object_t *object) { - GList *l; + hg_vm_private_t *priv; - /* load all the plugins after the VM initialization is finished */ - for (l = vm->plugin_list; l != NULL; l = g_list_next(l)) { - HgPlugin *plugin = l->data; + hg_return_if_fail (vm != NULL); + hg_return_if_fail (object != NULL); + hg_return_if_fail (HG_OBJECT_IS_FILE (object)); - hg_plugin_load(plugin, vm); - } + priv = (hg_vm_private_t *)vm; + priv->io[HG_OBJECT_FILE_DATA (object)->iotype] = object; } gboolean -hg_vm_unload_plugin(HgVM *vm, - const gchar *filename) +hg_vm_initialize(hg_vm_t *vm) { - HgValueNode *val; - - g_return_val_if_fail (vm != NULL, FALSE); - g_return_val_if_fail (filename != NULL, FALSE); - - if ((val = hg_dict_lookup_with_string(vm->plugin_table, filename)) == NULL) { - hg_log_warning("`%s' plugin isn't yet loaded.", filename); - return FALSE; - } - - return hg_plugin_unload(HG_VALUE_GET_PLUGIN (val), vm); -} + hg_vm_private_t *priv; + gboolean retval; -guint -hg_vm_get_save_level(HgVM *vm) -{ - g_return_val_if_fail (vm != NULL, 0); - - return hg_mem_pool_get_n_snapshots(hg_vm_get_current_pool(vm)); -} - -HgValueNode * -_hg_vm_get_name_node(HgVM *vm, - const gchar *name) -{ - HgValueNode *node; - - g_return_val_if_fail (vm != NULL, NULL); - g_return_val_if_fail (name != NULL, NULL); - - node = hg_dict_lookup_with_string(vm->name_dict, name); - if (node == NULL) { - HG_VALUE_MAKE_NAME_STATIC (vm->global_pool, node, name); - hg_dict_insert(vm->global_pool, vm->name_dict, node, node); - } + hg_return_val_if_fail (vm != NULL, FALSE); - return node; -} + priv = (hg_vm_private_t *)vm; + priv->stack[HG_STACK_TYPE_OSTACK] = hg_stack_new(vm, 65535); + priv->stack[HG_STACK_TYPE_ESTACK] = hg_stack_new(vm, 65535); + priv->stack[HG_STACK_TYPE_DSTACK] = hg_stack_new(vm, 65535); + priv->dict = hg_object_dict_new(vm, 65535); -HgValueNode * -hg_vm_get_name_node(HgVM *vm, - const gchar *name) -{ - HgValueNode *retval = NULL, *node; + /* push globaldict to dstack */ + hg_stack_push(priv->stack[HG_STACK_TYPE_DSTACK], priv->dict); - node = _hg_vm_get_name_node(vm, name); - if (node) { - HG_VALUE_MAKE_NAME (retval, HG_VALUE_GET_NAME (node)); - } + /* initialize operators */ + retval = hg_object_operator_initialize(vm, HG_EMU_PS_LEVEL_3); - return retval; + return TRUE; } -HgValueNode * -hg_vm_lookup(HgVM *vm, - HgValueNode *key) +gboolean +hg_vm_finalize(hg_vm_t *vm) { - guint depth, i; - HgValueNode *node, *retval = NULL; - - g_return_val_if_fail (vm != NULL, NULL); - g_return_val_if_fail (key != NULL, NULL); + hg_vm_private_t *priv; - depth = hg_stack_depth(vm->dstack); - for (i = 0; i < depth; i++) { - HgDict *dict; + hg_return_val_if_fail (vm != NULL, FALSE); - node = hg_stack_index(vm->dstack, i); - if (node == NULL || !HG_IS_VALUE_DICT (node)) { - hg_log_error("dictionary stack was broken."); - break; - } - dict = HG_VALUE_GET_DICT (node); - if ((retval = hg_dict_lookup(dict, key)) != NULL) - break; - } + priv = (hg_vm_private_t *)vm; + /* XXX */ - return retval; + return TRUE; } -HgValueNode * -hg_vm_lookup_with_string(HgVM *vm, - const gchar *key) +hg_emulation_type_t +hg_vm_get_emulation_level(hg_vm_t *vm) { - guint depth, i; - HgValueNode *node, *retval = NULL; + hg_vm_private_t *priv; - g_return_val_if_fail (vm != NULL, NULL); - g_return_val_if_fail (key != NULL, NULL); + hg_return_val_if_fail (vm != NULL, HG_EMU_BEGIN); - depth = hg_stack_depth(vm->dstack); - for (i = 0; i < depth; i++) { - node = hg_stack_index(vm->dstack, i); - if (node == NULL || !HG_IS_VALUE_DICT (node)) { - hg_log_error("dictionary stack was broken."); - break; - } - if ((retval = hg_dict_lookup_with_string(HG_VALUE_GET_DICT (node), key)) != NULL) - break; - } + priv = (hg_vm_private_t *)vm; - return retval; + return priv->current_level; } gboolean -hg_vm_startjob(HgVM *vm, - const gchar *initializer, - gboolean encapsulated) +hg_vm_set_emulation_level(hg_vm_t *vm, + hg_emulation_type_t level) { - HgValueNode *node, *nkey; - HgMemSnapshot *snap; - gboolean retval = TRUE; - - g_return_val_if_fail (vm != NULL, FALSE); + hg_vm_private_t *priv; - hg_stack_clear(vm->ostack); - hg_stack_clear(vm->dstack); + hg_return_val_if_fail (vm != NULL, FALSE); - hg_mem_garbage_collection(vm->global_pool); - hg_mem_garbage_collection(vm->local_pool); + priv = (hg_vm_private_t *)vm; - if (hg_mem_pool_get_n_snapshots(vm->global_pool) > 0) { - snap = hg_mem_pool_get_snapshot(vm->global_pool, 0); - hg_mem_pool_remove_root_node(vm->global_pool, snap); - if (!hg_mem_pool_restore_snapshot(vm->global_pool, snap, 0)) { - hg_log_warning("[BUG] failed to rollback the VM state."); - } - hg_mem_pool_clear_snapshot(vm->global_pool); - } - if (hg_mem_pool_get_n_snapshots(vm->local_pool) > 0) { - snap = hg_mem_pool_get_snapshot(vm->local_pool, 0); - hg_mem_pool_remove_root_node(vm->local_pool, snap); - if (!hg_mem_pool_restore_snapshot(vm->local_pool, snap, 0)) { - hg_log_warning("[BUG] failed to rollback the VM state."); - } - hg_mem_pool_clear_snapshot(vm->local_pool); - } - - if (encapsulated) { - HgMemSnapshot *gsnapshot = hg_mem_pool_save_snapshot(vm->global_pool); - HgMemSnapshot *lsnapshot = hg_mem_pool_save_snapshot(vm->local_pool); - - hg_mem_pool_add_root_node(vm->global_pool, gsnapshot); - hg_mem_pool_add_root_node(vm->local_pool, lsnapshot); - } - - HG_VALUE_MAKE_DICT (node, vm->systemdict); - hg_stack_push(vm->dstack, node); - - if (!hg_operator_init(vm)) + if (hg_object_operator_finalize(vm, level - 1) == FALSE) return FALSE; - /* initialize the special operators */ -#define BUILD_OP(_vm_, _pool_, _sdict_, _name_, _func_) \ - G_STMT_START { \ - HgOperator *__hg_op; \ - \ - hg_operator_build_operator__inline(_hg_vm_op_, (_vm_), (_pool_), (_sdict_), _name_, _func_, __hg_op); \ - } G_STMT_END - - BUILD_OP (vm, vm->global_pool, vm->systemdict, %rollback_securitylevel, rollbacksecuritylevel); - -#undef BUILD_OP - - /* FIXME: initialize graphics */ - - hg_vm_use_global_pool(vm, FALSE); - - HG_VALUE_MAKE_NAME_STATIC (vm->local_pool, nkey, "%initialized"); - node = hg_dict_lookup(vm->statusdict, nkey); - if (node == NULL || - !HG_IS_VALUE_BOOLEAN (node) || - HG_VALUE_GET_BOOLEAN (node) == FALSE) { - HgValueNode *ntrue = hg_dict_lookup_with_string(vm->systemdict, "true"); - - retval = hg_vm_run(vm, "hg_init.ps"); - - /* set read-only attribute for systemdict */ - hg_object_unwritable((HgObject *)vm->systemdict); - - /* initialization is done */ - hg_dict_insert(vm->local_pool, vm->serverdict, nkey, ntrue); - } - - if (initializer && initializer[0] == 0) { - /* just initialize VM */ - return TRUE; - } else if (initializer) { - gchar *eval = g_strdup_printf("{prompt (%s)(r)file dup type /filetype eq {cvx exec} if} stopped {$error /newerror get {errordict /handleerror get exec 1 .quit} if} if", initializer); + if (hg_object_operator_initialize(vm, level) == FALSE) + return FALSE; - retval = hg_vm_eval(vm, eval, NULL, NULL, NULL, NULL); - g_free(eval); + priv->current_level = level; - return retval; - } - return (retval ? hg_vm_eval(vm, "systemdict /.loadhistory known {(.hghistory) .loadhistory} if start systemdict /.savehistory known {(.hghistory) .savehistory} if", NULL, NULL, NULL, NULL) : FALSE); + return TRUE; } gboolean -hg_vm_has_error(HgVM *vm) -{ - g_return_val_if_fail (vm != NULL, TRUE); - - return vm->has_error; -} - -void -hg_vm_clear_error(HgVM *vm) -{ - g_return_if_fail (vm != NULL); - - vm->has_error = FALSE; -} - -void -hg_vm_reset_error(HgVM *vm) +hg_vm_step(hg_vm_t *vm) { - HgValueNode *key, *nfalse, *nnull; - - g_return_if_fail (vm != NULL); - - hg_vm_clear_error(vm); - _hg_stack_use_stack_validator(vm->ostack, TRUE); - _hg_stack_use_stack_validator(vm->estack, TRUE); - _hg_stack_use_stack_validator(vm->dstack, TRUE); - nnull = hg_dict_lookup_with_string(vm->systemdict, "null"); - nfalse = hg_dict_lookup_with_string(vm->systemdict, "false"); - key = _hg_vm_get_name_node(vm, "newerror"); - hg_dict_insert(vm->local_pool, vm->error, key, nfalse); - key = _hg_vm_get_name_node(vm, ".isstop"); - hg_dict_insert(vm->local_pool, vm->error, key, nfalse); - key = _hg_vm_get_name_node(vm, "errorname"); - hg_dict_insert(vm->local_pool, vm->error, key, nnull); -} - -void -hg_vm_set_error(HgVM *vm, - HgValueNode *errnode, - HgVMError error, - gboolean need_self) -{ - HgValueNode *proc, *copy_proc, *self; - - g_return_if_fail (vm != NULL); - g_return_if_fail (errnode != NULL); - g_return_if_fail (error < VM_e_END); - - if (vm->has_error) { - HgValueNode *enode = hg_dict_lookup_with_string(vm->error, "errorname"); - HgValueNode *wnode = hg_dict_lookup_with_string(vm->error, "command"); - HgString *hs = NULL, *hs2; - gchar *name, *p = NULL; - - if (wnode == NULL) { - p = name = g_strdup("--unknown--"); - } else { - hs = hg_object_to_string((HgObject *)wnode); - name = hg_string_get_string(hs); - } - hs2 = hg_object_to_string((HgObject *)errnode); - if (enode == NULL) { - hg_log_warning("Multiple errors occurred.\n prevoius error: unknown or this happened before set /errorname in %s\n current error: %s in %s\n", name, HG_VALUE_GET_NAME (__hg_vm_errorname[error]), hg_string_get_string(hs2)); - } else { - hg_log_warning("Multiple errors occurred.\n previous error: %s in %s\n current error: %s in %s\n", HG_VALUE_GET_NAME (enode), name, HG_VALUE_GET_NAME (__hg_vm_errorname[error]), hg_string_get_string(hs2)); - } - if (p) - g_free(p); - hg_mem_free(hs2); - hg_mem_free(hs); - proc = hg_dict_lookup_with_string(vm->systemdict, ".abort"); - hg_operator_invoke(HG_VALUE_GET_OPERATOR (proc), vm); - } - _hg_stack_use_stack_validator(vm->ostack, FALSE); - _hg_stack_use_stack_validator(vm->estack, FALSE); - _hg_stack_use_stack_validator(vm->dstack, FALSE); - proc = hg_dict_lookup(vm->errordict, __hg_vm_errorname[error]); - if (proc == NULL) { - hg_log_warning("[BUG] no error handler for /%s\n", HG_VALUE_GET_NAME (__hg_vm_errorname[error])); - hg_file_object_printf(vm->stderr, "\nOperand stack:\n"); - hg_stack_dump(vm->ostack, vm->stderr); - hg_file_object_printf(vm->stderr, "\nExecution stack:\n"); - hg_stack_dump(vm->estack, vm->stderr); - hg_file_object_printf(vm->stderr, "\nDictionary stack:\n"); - hg_stack_dump(vm->dstack, vm->stderr); - abort(); - } - copy_proc = hg_object_copy((HgObject *)proc); - if (copy_proc == NULL) { - hg_log_error("FATAL: failed to allocate a memory for an error handler. there are no way to recover it unfortunately."); - abort(); - } - self = hg_stack_pop(vm->estack); - _hg_stack_push(vm->estack, copy_proc); - if (need_self) - _hg_stack_push(vm->estack, self); - _hg_stack_push(vm->ostack, errnode); - vm->has_error = TRUE; -} - -void -hg_vm_set_error_from_file(HgVM *vm, - HgValueNode *errnode, - HgFileObject *file, - gboolean need_self) -{ - gchar buffer[4096]; - - g_return_if_fail (vm != NULL); - g_return_if_fail (file != NULL); - - switch (hg_file_object_get_error(file)) { - case 0: - /* no error */ - break; - case EACCES: - case EBADF: - case EEXIST: - case ENOTDIR: - case ENOTEMPTY: - case EPERM: - case EROFS: - hg_vm_set_error(vm, errnode, VM_e_invalidfileaccess, need_self); - break; - case EAGAIN: - if (file == vm->stdin) { - /* probably no data from stdin found. */ + hg_vm_private_t *priv; + hg_stack_t *estack, *ostack; + hg_object_t *object, *result; + gboolean retval = TRUE; + gsize index; + + hg_return_val_if_fail (vm != NULL, FALSE); + + priv = (hg_vm_private_t *)vm; + estack = priv->stack[HG_STACK_TYPE_ESTACK]; + ostack = priv->stack[HG_STACK_TYPE_OSTACK]; + object = hg_stack_index(estack, 0); + + evaluate: + switch (HG_OBJECT_GET_TYPE (object)) { + case HG_OBJECT_TYPE_ARRAY: + case HG_OBJECT_TYPE_NAME: + if (HG_OBJECT_ATTR_IS_EXECUTABLE (object)) { + if (HG_OBJECT_GET_TYPE (object) == HG_OBJECT_TYPE_NAME) { + result = hg_vm_dict_lookup(vm, object); + if (result == NULL) { + hg_vm_set_error(vm, HG_e_undefined); + return FALSE; + } + } else { + result = object; + } + if (!hg_stack_push(estack, result)) { + hg_vm_set_error(vm, HG_e_execstackoverflow); + return FALSE; + } + hg_stack_roll(estack, 2, 1); + hg_stack_pop(estack); break; } - case EBUSY: - case EIO: - case ENOSPC: - hg_vm_set_error(vm, errnode, VM_e_ioerror, need_self); - break; - case EMFILE: - hg_vm_set_error(vm, errnode, VM_e_limitcheck, need_self); + case HG_OBJECT_TYPE_NULL: + case HG_OBJECT_TYPE_INTEGER: + case HG_OBJECT_TYPE_REAL: + case HG_OBJECT_TYPE_BOOLEAN: + case HG_OBJECT_TYPE_STRING: + case HG_OBJECT_TYPE_DICT: + case HG_OBJECT_TYPE_MARK: + if (hg_stack_push(ostack, object) == FALSE) { + hg_vm_set_error(vm, HG_e_stackoverflow); + retval = FALSE; + } + hg_stack_pop(estack); break; - case ENAMETOOLONG: - case ENODEV: - case ENOENT: - hg_vm_set_error(vm, errnode, VM_e_undefinedfilename, need_self); + case HG_OBJECT_TYPE_EVAL: + result = hg_vm_dict_lookup(vm, object); + if (result == NULL) { + hg_vm_set_error(vm, HG_e_undefined); + return FALSE; + } + object = result; + goto evaluate; + case HG_OBJECT_TYPE_FILE: + /* XXX: read a token and push to estack */ break; - case ENOMEM: - hg_vm_set_error(vm, errnode, VM_e_VMerror, need_self); + case HG_OBJECT_TYPE_OPERATOR: + index = hg_stack_length(estack); + retval = hg_object_operator_invoke(vm, object); + hg_stack_roll(estack, hg_stack_length(estack) - index + 1, 1); + hg_stack_pop(estack); break; default: - strerror_r(hg_file_object_get_error(file), buffer, 4096); - hg_log_warning("%s: need to support errno %d\n %s\n", - __FUNCTION__, hg_file_object_get_error(file), buffer); + g_warning("[BUG] Unknown object type `%d'", HG_OBJECT_GET_TYPE (object)); break; } - hg_file_object_clear_error(file); + + return retval; } -gboolean -hg_vm_main(HgVM *vm) +hg_object_t * +hg_vm_get_dict(hg_vm_t *vm) { - HgValueNode *node; - HgOperator *op; - HgFileObject *file; - guint depth; - gboolean retval = TRUE; + hg_vm_private_t *priv; - g_return_val_if_fail (vm != NULL, FALSE); - - vm->shutdown = FALSE; - file = hg_file_object_new(hg_vm_get_current_pool(vm), - HG_FILE_TYPE_BUFFER, - HG_FILE_MODE_READ, - "%system", - "", 0); - while (!vm->shutdown) { - depth = hg_stack_depth(vm->estack); - if (depth == 0) - break; - node = hg_stack_index(vm->estack, 0); - if (node == NULL) { - retval = FALSE; - break; - } - -#ifdef DEBUG - G_STMT_START { - HgString *s; - - s = hg_object_to_string((HgObject *)node); - hg_log_debug(DEBUG_VM, "processing %s on %s", hg_string_get_string(s), - hg_value_node_get_type_name(HG_VALUE_GET_VALUE_TYPE (node))); - hg_mem_free(s); - } G_STMT_END; -#endif /* DEBUG */ - switch (HG_VALUE_GET_VALUE_TYPE (node)) { - case HG_TYPE_VALUE_BOOLEAN: - case HG_TYPE_VALUE_INTEGER: - case HG_TYPE_VALUE_REAL: - case HG_TYPE_VALUE_DICT: - case HG_TYPE_VALUE_NULL: - case HG_TYPE_VALUE_MARK: - hg_log_warning("[BUG] %s: an object (node type %d) which isn't actually executable, was pushed into the estack.", - __FUNCTION__, HG_VALUE_GET_VALUE_TYPE (node)); - hg_stack_pop(vm->estack); - retval = hg_stack_push(vm->ostack, node); - if (!retval) { - _hg_vm_set_error(vm, file, VM_e_stackoverflow, FALSE); - } - break; - case HG_TYPE_VALUE_ARRAY: - if (hg_object_is_executable((HgObject *)node)) { - HgArray *array; - HgValueNode *tmp; - - array = HG_VALUE_GET_ARRAY (node); - if (hg_array_length(array) == 0) { - /* this might be an empty array */ - hg_stack_pop(vm->estack); - break; - } - tmp = hg_array_index(array, 0); - hg_array_remove(array, 0); - if (hg_array_length(array) == 0) - hg_stack_pop(vm->estack); - if (hg_object_is_executable((HgObject *)tmp) && - (HG_IS_VALUE_NAME (tmp) || HG_IS_VALUE_OPERATOR (tmp))) { - retval = hg_stack_push(vm->estack, tmp); - if (!retval) - _hg_vm_set_error(vm, file, VM_e_execstackoverflow, FALSE); - } else { - retval = hg_stack_push(vm->ostack, tmp); - if (!retval) - _hg_vm_set_error(vm, file, VM_e_stackoverflow, FALSE); - } - } else { - hg_log_warning("[BUG] %s: an object (node type %d) which isn't actually executable, was pushed into the estack.", - __FUNCTION__, HG_VALUE_GET_VALUE_TYPE (node)); - hg_stack_pop(vm->estack); - retval = hg_stack_push(vm->ostack, node); - if (!retval) { - _hg_vm_set_error(vm, file, VM_e_stackoverflow, FALSE); - } - } - break; - case HG_TYPE_VALUE_STRING: - if (hg_object_is_executable((HgObject *)node)) { - HgString *hs = HG_VALUE_GET_STRING (node); - guint state = hg_object_get_state((HgObject *)node); - - file = hg_file_object_new(hg_vm_get_current_pool(vm), - HG_FILE_TYPE_BUFFER, - HG_FILE_MODE_READ, - "%eval_string", - hg_string_get_string(hs), - hg_string_maxlength(hs)); - hg_stack_pop(vm->estack); - HG_VALUE_MAKE_FILE (node, file); - hg_object_set_state((HgObject *)node, state); - retval = hg_stack_push(vm->estack, node); - } else { - hg_log_warning("[BUG] %s: an object (node type %d) which isn't actually executable, was pushed into the estack.", - __FUNCTION__, HG_VALUE_GET_VALUE_TYPE (node)); - hg_stack_pop(vm->estack); - retval = hg_stack_push(vm->ostack, node); - } - if (!retval) { - _hg_vm_set_error(vm, file, VM_e_stackoverflow, FALSE); - } - break; - case HG_TYPE_VALUE_NAME: - if (hg_object_is_executable((HgObject *)node)) { - HgValueNode *op_node = hg_vm_lookup(vm, node), *tmp; - - if (op_node == NULL) { - hg_vm_set_error(vm, node, VM_e_undefined, FALSE); - } else { - hg_stack_pop(vm->estack); - if (hg_object_is_executable((HgObject *)op_node)) { - tmp = hg_object_copy((HgObject *)op_node); - if (tmp == NULL) { - _hg_vm_set_error(vm, file, VM_e_VMerror, FALSE); - } else { - retval = hg_stack_push(vm->estack, tmp); - if (!retval) - _hg_vm_set_error(vm, file, VM_e_execstackoverflow, FALSE); - } - } else { - retval = hg_stack_push(vm->ostack, op_node); - if (!retval) - _hg_vm_set_error(vm, file, VM_e_stackoverflow, FALSE); - } - } - } else { - hg_log_warning("[BUG] %s: an object (node type %d) which isn't actually executable, was pushed into the estack.", - __FUNCTION__, HG_VALUE_GET_VALUE_TYPE (node)); - hg_stack_pop(vm->estack); - retval = hg_stack_push(vm->ostack, node); - if (!retval) { - _hg_vm_set_error(vm, file, VM_e_stackoverflow, FALSE); - } - } - break; - case HG_TYPE_VALUE_OPERATOR: - op = HG_VALUE_GET_OPERATOR (node); - retval = hg_operator_invoke(op, vm); - hg_stack_pop(vm->estack); - break; - case HG_TYPE_VALUE_FILE: - if (hg_object_is_executable((HgObject *)node)) { - file = HG_VALUE_GET_FILE (node); - if (hg_file_object_has_error(file)) { - hg_stack_pop(vm->estack); - _hg_vm_set_error_from_file(vm, file, file, FALSE); - } else { - HgValueNode *tmp_node; - - tmp_node = hg_scanner_get_object(vm, file); - if (tmp_node != NULL) { -#ifdef DEBUG - G_STMT_START { - HgString *__str__ = hg_object_to_string((HgObject *)tmp_node); - - hg_log_debug(DEBUG_SCANNER, "scanning %s", - hg_string_get_string(__str__)); - hg_mem_free(__str__); - } G_STMT_END; -#endif /* DEBUG */ - if (hg_object_is_executable((HgObject *)tmp_node) && - (HG_IS_VALUE_NAME (tmp_node) || - HG_IS_VALUE_OPERATOR (tmp_node))) { - hg_stack_push(vm->estack, tmp_node); - } else { - hg_stack_push(vm->ostack, tmp_node); - } - } else { - if (hg_file_object_is_eof(file)) { - hg_stack_pop(vm->estack); - } - } - } - } else { - hg_log_warning("[BUG] %s: an object (node type %d) which isn't actually executable, was pushed into the estack.", - __FUNCTION__, HG_VALUE_GET_VALUE_TYPE (node)); - hg_stack_pop(vm->estack); - retval = hg_stack_push(vm->ostack, node); - if (!retval) { - _hg_vm_set_error(vm, file, VM_e_stackoverflow, FALSE); - } - } - break; - default: - hg_log_warning("[BUG] Unknown node type %d was given into the estack.", - HG_VALUE_GET_VALUE_TYPE (node)); - hg_stack_pop(vm->estack); - break; - } - if (!retval && !hg_vm_has_error(vm)) { - hg_log_warning("[BUG] probably unknown error happened."); - break; - } - } + hg_return_val_if_fail (vm != NULL, NULL); - return retval; + priv = (hg_vm_private_t *)vm; + + return priv->dict; } -gchar * -hg_vm_find_libfile(HgVM *vm, - const gchar *file) +hg_object_t * +hg_vm_dict_lookup(hg_vm_t *vm, + hg_object_t *object) { - const gchar *env = g_getenv("HIEROGLYPH_LIB_PATH"); - gchar **paths, *filename = NULL, *basename = g_path_get_basename(file); - gint i = 0; - struct stat st; - - /* for the security reason, ignore the original path identifier */ - if (env != NULL) { - paths = g_strsplit(env, ":", 0); - if (paths != NULL) { - while (paths[i] != NULL) { - filename = g_build_filename(paths[i], basename, NULL); - if (stat(filename, &st) == 0) { - break; - } - g_free(filename); - filename = NULL; - i++; - } - } - g_strfreev(paths); - } - if (filename == NULL) { - /* if the PS file couldn't load, try the default path. */ - filename = g_build_filename(HIEROGLYPH_LIBDIR, basename, NULL); - if (stat(filename, &st) == -1) { - g_free(filename); - filename = NULL; - } - } - if (basename) - g_free(basename); + hg_vm_private_t *priv; + hg_stack_t *dstack; + hg_object_t *dict, *retval; + gsize i, length; - return filename; -} + hg_return_val_if_fail (vm != NULL, NULL); + hg_return_val_if_fail (object != NULL, NULL); -gboolean -hg_vm_run(HgVM *vm, - const gchar *file) -{ - const gchar *env = g_getenv("HIEROGLYPH_LIB_PATH"); - gchar **paths, *filename, *path = g_path_get_dirname(file), *basename = g_path_get_basename(file); - gint i = 0; - gboolean retval = FALSE, error = FALSE; - - if (path != NULL && strcmp(path, ".") != 0) { - /* file contains any path. try it first */ - retval = _hg_vm_run(vm, file, &error); - if (error) { - /* don't retry anymore */ - return FALSE; - } - if (retval) + priv = (hg_vm_private_t *)vm; + dstack = priv->stack[HG_STACK_TYPE_DSTACK]; + length = hg_stack_length(dstack); + for (i = 0; i < length; i++) { + dict = hg_stack_index(dstack, i); + if ((retval = hg_object_dict_lookup(dict, object)) != NULL) return retval; } - if (path) - g_free(path); - if (env != NULL) { - paths = g_strsplit(env, ":", 0); - if (paths != NULL) { - while (paths[i] != NULL) { - filename = g_build_filename(paths[i], basename, NULL); - retval = _hg_vm_run(vm, filename, &error); - g_free(filename); - if (retval || - error) - break; - i++; - } - } - g_strfreev(paths); - } - if (!retval && !error) { - /* if the PS file couldn't load, try to load it from the default path. */ - filename = g_build_filename(HIEROGLYPH_LIBDIR, basename, NULL); - - retval = _hg_vm_run(vm, filename, &error); - g_free(filename); - } - if (env == NULL && !retval && !error) { - /* still can't find a file, try to read it on current directory. - * but someone may not prefers this way. so this behavior can be - * disabled with specifying HIEROGLYPH_LIB_PATH anytime. - */ - retval = _hg_vm_run(vm, file, &error); - } - if (basename) - g_free(basename); - return retval; + return NULL; } gboolean -hg_vm_eval(HgVM *vm, - const gchar *expression, - HgStack *ostack, - HgStack *estack, - HgStack *dstack, - gboolean *error) -{ - HgMemPool *pool = hg_vm_get_current_pool(vm); - HgStack *old_ostack = NULL, *old_estack = NULL, *old_dstack = NULL; - HgFileObject *file; +hg_vm_dict_remove(hg_vm_t *vm, + const gchar *name, + gboolean remove_all) +{ + hg_vm_private_t *priv; + hg_stack_t *dstack; + hg_object_t *dict, *nobject; + gsize i, length; gboolean retval = FALSE; - g_return_val_if_fail (vm != NULL, FALSE); - g_return_val_if_fail (expression != NULL, FALSE); - - if (ostack) { - old_ostack = hg_vm_get_ostack(vm); - hg_vm_set_ostack(vm, ostack); - } - if (estack) { - old_estack = hg_vm_get_estack(vm); - hg_vm_set_estack(vm, estack); - } - if (dstack) { - old_dstack = hg_vm_get_dstack(vm); - hg_vm_set_dstack(vm, dstack); + hg_return_val_if_fail (vm != NULL, FALSE); + hg_return_val_if_fail (name != NULL, FALSE); + + priv = (hg_vm_private_t *)vm; + dstack = priv->stack[HG_STACK_TYPE_DSTACK]; + length = hg_stack_length(dstack); + for (i = 0; i < length; i++) { + dict = hg_stack_index(dstack, i); + nobject = hg_vm_name_lookup(vm, name); + retval |= hg_object_dict_remove(dict, nobject); + if (retval && remove_all == FALSE) + break; } - file = hg_file_object_new(pool, - HG_FILE_TYPE_BUFFER, - HG_FILE_MODE_READ, - "%eval", - expression, - 1); - - retval = _hg_vm_eval_file(vm, file, error); - - if (old_ostack) - hg_vm_set_ostack(vm, old_ostack); - if (old_estack) - hg_vm_set_estack(vm, old_estack); - if (old_dstack) - hg_vm_set_dstack(vm, old_dstack); return retval; } -gint32 -hg_vm_get_error_code(HgVM *vm) +hg_object_t * +hg_vm_get_currentdict(hg_vm_t *vm) { - g_return_val_if_fail (vm != NULL, -1); + hg_vm_private_t *priv; + hg_object_t *retval; + hg_stack_t *dstack; - return vm->error_code; -} + hg_return_val_if_fail (vm != NULL, NULL); -void -hg_vm_set_error_code(HgVM *vm, - gint32 error_code) -{ - g_return_if_fail (vm != NULL); - - vm->error_code = error_code; -} + priv = (hg_vm_private_t *)vm; + dstack = priv->stack[HG_STACK_TYPE_DSTACK]; + retval = hg_stack_index(dstack, 0); -void -hg_vm_shutdown(HgVM *vm, - gint32 error_code) -{ - g_return_if_fail (vm != NULL); - - vm->shutdown = TRUE; - hg_vm_set_error_code(vm, error_code); -} - -gint32 -hg_vm_get_security_level(HgVM *vm) -{ - g_return_val_if_fail(vm != NULL, G_MAXINT32); - - return vm->security_level; + return retval; } -gboolean -hg_vm_set_security_level(HgVM *vm, - gint32 level) +hg_object_t * +hg_vm_name_lookup(hg_vm_t *vm, + const gchar *name) { - g_return_val_if_fail (vm != NULL, FALSE); - - if (hg_vm_get_security_level(vm) > level) - return FALSE; + hg_return_val_if_fail (vm != NULL, NULL); + hg_return_val_if_fail (name != NULL, NULL); - vm->security_level = level; + /* XXX */ - return TRUE; + return hg_object_name_new(vm, name, FALSE); } diff --git a/hieroglyph/vm.h b/hieroglyph/vm.h index 943acb7..0c293f2 100644 --- a/hieroglyph/vm.h +++ b/hieroglyph/vm.h @@ -1,10 +1,10 @@ /* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ /* * vm.h - * Copyright (C) 2005-2006 Akira TAGOH + * Copyright (C) 2005-2007 Akira TAGOH * * Authors: - * Akira TAGOH <at@gclab.org> + * Akira TAGOH <akira@tagoh.org> * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -21,149 +21,47 @@ * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ -#ifndef __LIBRETTO_VM_H__ -#define __LIBRETTO_VM_H__ +#ifndef __HIEROGLYPH__VM_H__ +#define __HIEROGLYPH__VM_H__ #include <hieroglyph/hgtypes.h> -G_BEGIN_DECLS -#define HG_LOCAL_POOL_SIZE 240000 * 100 -#define HG_GLOBAL_POOL_SIZE 240000 * 100 -#define HG_GRAPHIC_POOL_SIZE 240000 * 50 +hg_vm_t *hg_vm_new (void) G_GNUC_WARN_UNUSED_RESULT; +void hg_vm_destroy (hg_vm_t *vm); +gpointer hg_vm_malloc (hg_vm_t *vm, + gsize size) G_GNUC_WARN_UNUSED_RESULT; +gpointer hg_vm_realloc (hg_vm_t *vm, + gpointer object, + gsize size) G_GNUC_WARN_UNUSED_RESULT; +void hg_vm_mfree (hg_vm_t *vm, + gpointer data); +guchar hg_vm_get_object_format (hg_vm_t *vm); +void hg_vm_get_attributes (hg_vm_t *vm, + hg_attribute_t *attr); +void hg_vm_set_error (hg_vm_t *vm, + hg_error_t error); +hg_error_t hg_vm_get_error (hg_vm_t *vm); +void hg_vm_clear_error (hg_vm_t *vm); +hg_object_t *hg_vm_get_io (hg_vm_t *vm, + hg_filetype_t iotype); +void hg_vm_set_io (hg_vm_t *vm, + hg_object_t *object); +gboolean hg_vm_initialize (hg_vm_t *vm); +gboolean hg_vm_finalize (hg_vm_t *vm); +hg_emulation_type_t hg_vm_get_emulation_level(hg_vm_t *vm); +gboolean hg_vm_set_emulation_level(hg_vm_t *vm, + hg_emulation_type_t level); +gboolean hg_vm_step (hg_vm_t *vm); +hg_object_t *hg_vm_get_dict (hg_vm_t *vm); +hg_object_t *hg_vm_dict_lookup (hg_vm_t *vm, + hg_object_t *object); +gboolean hg_vm_dict_remove (hg_vm_t *vm, + const gchar *name, + gboolean remove_all); +hg_object_t *hg_vm_get_currentdict (hg_vm_t *vm); +hg_object_t *hg_vm_name_lookup (hg_vm_t *vm, + const gchar *name) G_GNUC_WARN_UNUSED_RESULT; -typedef enum { - VM_EMULATION_LEVEL_1 = 1, - VM_EMULATION_LEVEL_2, - VM_EMULATION_LEVEL_3 -} HgVMEmulationType; - -typedef enum { - VM_IO_STDIN = 1, - VM_IO_STDOUT, - VM_IO_STDERR, -} HgVMIOType; - -typedef enum { - VM_e_dictfull = 1, - VM_e_dictstackoverflow, - VM_e_dictstackunderflow, - VM_e_execstackoverflow, - VM_e_handleerror, - VM_e_interrupt, - VM_e_invalidaccess, - VM_e_invalidexit, - VM_e_invalidfileaccess, - VM_e_invalidfont, - VM_e_invalidrestore, - VM_e_ioerror, - VM_e_limitcheck, - VM_e_nocurrentpoint, - VM_e_rangecheck, - VM_e_stackoverflow, - VM_e_stackunderflow, - VM_e_syntaxerror, - VM_e_timeout, - VM_e_typecheck, - VM_e_undefined, - VM_e_undefinedfilename, - VM_e_undefinedresult, - VM_e_unmatchedmark, - VM_e_unregistered, - VM_e_VMerror, - VM_e_configurationerror, - VM_e_undefinedresource, - VM_e_END, -} HgVMError; - - -/* initializer */ -void hg_vm_init (void); -void hg_vm_finalize (void); -gboolean hg_vm_is_initialized(void); - -/* virtual machine */ -HgVM *hg_vm_new (HgVMEmulationType type); -void hg_vm_set_emulation_level (HgVM *vm, - HgVMEmulationType type); -HgVMEmulationType hg_vm_get_emulation_level (HgVM *vm); -HgStack *hg_vm_get_ostack (HgVM *vm); -HgStack *hg_vm_get_estack (HgVM *vm); -HgStack *hg_vm_get_dstack (HgVM *vm); -HgDict *hg_vm_get_dict_errordict (HgVM *vm); -HgDict *hg_vm_get_dict_error (HgVM *vm); -HgDict *hg_vm_get_dict_statusdict (HgVM *vm); -HgDict *hg_vm_get_dict_serverdict (HgVM *vm); -HgDict *hg_vm_get_dict_font (HgVM *vm); -HgDict *hg_vm_get_dict_systemdict (HgVM *vm); -HgDict *hg_vm_get_dict_globalfont (HgVM *vm); -HgMemPool *hg_vm_get_current_pool (HgVM *vm); -gboolean hg_vm_is_global_pool_used (HgVM *vm); -void hg_vm_use_global_pool (HgVM *vm, - gboolean use_global); -gboolean hg_vm_is_global_object (HgVM *vm, - HgValueNode *node); -HgGraphics *hg_vm_get_graphics (HgVM *vm); -gint32 hg_vm_get_current_time (HgVM *vm); -GRand *hg_vm_get_random_generator (HgVM *vm); -HgFileObject *hg_vm_get_io (HgVM *vm, - HgVMIOType type); -void hg_vm_set_io (HgVM *vm, - HgVMIOType type, - HgFileObject *file); -HgLineEdit *hg_vm_get_line_editor (HgVM *vm); -void hg_vm_set_line_editor (HgVM *vm, - HgLineEdit *editor); -gboolean hg_vm_load_plugin (HgVM *vm, - const gchar *filename); -gboolean hg_vm_unload_plugin (HgVM *vm, - const gchar *filename); -void hg_vm_load_plugins_all (HgVM *vm); -guint hg_vm_get_save_level (HgVM *vm); -HgValueNode *hg_vm_get_name_node (HgVM *vm, - const gchar *name); -HgValueNode *hg_vm_lookup (HgVM *vm, - HgValueNode *key); -HgValueNode *hg_vm_lookup_with_string (HgVM *vm, - const gchar *key); -gboolean hg_vm_startjob (HgVM *vm, - const gchar *initializer, - gboolean encapsulated); -gboolean hg_vm_has_error (HgVM *vm); -void hg_vm_clear_error (HgVM *vm); -void hg_vm_reset_error (HgVM *vm); -void hg_vm_set_error (HgVM *vm, - HgValueNode *errnode, - HgVMError error, - gboolean drop_self); -void hg_vm_set_error_from_file (HgVM *vm, - HgValueNode *errnode, - HgFileObject *file, - gboolean drop_self); -gboolean hg_vm_main (HgVM *vm); -gchar *hg_vm_find_libfile (HgVM *vm, - const gchar *file); -gboolean hg_vm_run (HgVM *vm, - const gchar *file); -gboolean hg_vm_eval (HgVM *vm, - const gchar *expression, - HgStack *ostack, - HgStack *estack, - HgStack *dstack, - gboolean *error); -gint32 hg_vm_get_error_code (HgVM *vm); -void hg_vm_shutdown (HgVM *vm, - gint32 error_code); -gint32 hg_vm_get_security_level (HgVM *vm); -gboolean hg_vm_set_security_level (HgVM *vm, - gint32 level); - - -/* internal use */ -HgValueNode *_hg_vm_get_name_node(HgVM *vm, - const gchar *name); - -G_END_DECLS - -#endif /* __HG_VM_H__ */ +#endif /* __HIEROGLYPH__VM_H__ */ diff --git a/tests/Makefile.am b/tests/Makefile.am index 002ec15..bc24fd0 100644 --- a/tests/Makefile.am +++ b/tests/Makefile.am @@ -4,124 +4,32 @@ SUBDIRS = ps INCLUDES = \ -I$(top_srcdir)/hieroglyph \ $(HG_CFLAGS) \ + $(CHECK_CFLAGS) \ $(NULL) DEPS = \ $(top_builddir)/hieroglyph/libhieroglyph.la \ $(NULL) LDADDS = \ $(top_builddir)/hieroglyph/libhieroglyph.la \ + $(CHECK_LIBS) \ $(NULL) noinst_PROGRAMS = \ - test-hgbtree \ - test-hgmem \ - test-hgfile \ - test-hgstring \ - test-hgarray \ - test-hgdict \ - test-hgpage \ - test-hglineedit \ - test-hglist \ - test-snapshot \ - test-scanner \ - test-vm \ - test-operatorencoding \ - bench1-hgallocator-bfit \ - bench2-hgallocator-bfit \ + test-hgobject \ + test-hgstack \ $(NULL) -test_hgbtree_SOURCES = \ - hgbtree.c \ +test_hgobject_SOURCES = \ + main.c \ + hgobject.c \ $(NULL) -test_hgbtree_LDADD = $(LDADDS) - -test_hgmem_SOURCES = \ - hgmem.c \ - $(NULL) -test_hgmem_LDADD = $(LDADDS) - -test_hgfile_SOURCES = \ - hgfile.c \ - $(NULL) -test_hgfile_LDADD = $(LDADDS) - -test_hgstring_SOURCES = \ - hgstring.c \ - $(NULL) -test_hgstring_LDADD = $(LDADDS) - -test_hgarray_SOURCES = \ - hgarray.c \ - $(NULL) -test_hgarray_LDADD = $(LDADDS) - -test_hgdict_SOURCES = \ - hgdict.c \ - $(NULL) -test_hgdict_LDADD = $(LDADDS) - -test_hgpage_SOURCES = \ - hgpage.c \ - $(NULL) -test_hgpage_LDADD = $(LDADDS) - -test_hglineedit_SOURCES = \ - hglineedit.c \ - $(NULL) -test_hglineedit_LDADD = $(LDADDS) - -test_hglist_SOURCES = \ - hglist.c \ - $(NULL) -test_hglist_LDADD = $(LDADDS) - -test_snapshot_SOURCES = \ - snapshot.c \ - $(NULL) -test_snapshot_LDADD = $(LDADDS) - -test_scanner_SOURCES = \ - scanner.c \ - $(NULL) -test_scanner_LDADD = \ - $(LDADDS) \ - $(NULL) - -test_vm_SOURCES = \ - vm.c \ - $(NULL) -test_vm_LDADD = \ - $(LDADDS) \ - $(NULL) - -test_operatorencoding_SOURCES = \ - operatorencoding.c \ - $(NULL) -test_operatorencoding_LDADD = \ - $(LDADDS) \ - $(NULL) - -bench1_hgallocator_bfit_SOURCES = \ - hgallocator-bfit-bench1.c \ - $(NULL) -bench1_hgallocator_bfit_LDADD = $(LDADDS) - -bench2_hgallocator_bfit_SOURCES = \ - hgallocator-bfit-bench2.c \ +test_hgobject_LDADD = $(LDADDS) +test_hgstack_SOURCES = \ + hgstack.c \ $(NULL) -bench2_hgallocator_bfit_LDADD = $(LDADDS) +test_hgstack_LDADD = $(LDADDS) TESTS = \ - test-hgbtree \ - test-hgmem \ - test-hglist \ - test-hgfile \ - test-hgstring \ - test-hgarray \ - test-hgdict \ - test-hgpage \ - test-snapshot \ - test-scanner \ - test-vm \ - test-operatorencoding \ + test-hgobject \ + test-hgstack \ $(NULL) diff --git a/tests/hgallocator-bfit-bench1.c b/tests/hgallocator-bfit-bench1.c deleted file mode 100644 index 9c61369..0000000 --- a/tests/hgallocator-bfit-bench1.c +++ /dev/null @@ -1,34 +0,0 @@ -#include <stdio.h> -#include <string.h> -#include <hieroglyph/hgallocator-bfit.h> -#include <hieroglyph/hgmem.h> - -int -main(void) -{ - HG_MEM_INIT; - - HgAllocator *allocator; - HgMemPool *pool; - gint i; - gchar *s; - - allocator = hg_allocator_new(hg_allocator_bfit_get_vtable()); - pool = hg_mem_pool_new(allocator, "test", 90000000, 0); - if (pool == NULL) { - g_print("Failed to create a pool.\n"); - return 1; - } - for (i = 0; i < 1000000; i++) { - s = hg_mem_alloc(pool, 16); - if (s == NULL) { - g_print("failed to allocate memory: %d\n", i); - return 1; - } - } - hg_mem_pool_destroy(pool); - hg_allocator_destroy(allocator); - hg_mem_finalize(); - - return 0; -} diff --git a/tests/hgallocator-bfit-bench2.c b/tests/hgallocator-bfit-bench2.c deleted file mode 100644 index 8a50dee..0000000 --- a/tests/hgallocator-bfit-bench2.c +++ /dev/null @@ -1,32 +0,0 @@ -#include <stdio.h> -#include <string.h> -#include <hieroglyph/hgallocator-bfit.h> -#include <hieroglyph/hgmem.h> - -int -main(void) -{ - HG_MEM_INIT; - - HgAllocator *allocator; - HgMemPool *pool; - gint i; - gchar *s; - - allocator = hg_allocator_new(hg_allocator_bfit_get_vtable()); - pool = hg_mem_pool_new(allocator, "test", 90000000, 0); - if (pool == NULL) { - g_print("Failed to create a pool.\n"); - return 1; - } - for (i = 0; i < 1000000; i++) { - s = hg_mem_alloc(pool, 16); - } - s = NULL; - hg_mem_garbage_collection(pool); - hg_mem_pool_destroy(pool); - hg_allocator_destroy(allocator); - hg_mem_finalize(); - - return 0; -} diff --git a/tests/hgallocator-ffit-bench1.c b/tests/hgallocator-ffit-bench1.c deleted file mode 100644 index 4ae4196..0000000 --- a/tests/hgallocator-ffit-bench1.c +++ /dev/null @@ -1,29 +0,0 @@ -#include <stdio.h> -#include <string.h> -#include <hieroglyph/hgallocator-ffit.h> -#include <hieroglyph/hgmem.h> - -int -main(void) -{ - HgAllocator *allocator; - HgMemPool *pool; - gint i; - gchar *s; - - hg_mem_init(); - allocator = hg_allocator_new(hg_allocator_ffit_get_vtable()); - pool = hg_mem_pool_new(allocator, "test", 90000000, 0); - if (pool == NULL) { - g_print("Failed to create a pool.\n"); - return 1; - } - for (i = 0; i < 1000000; i++) { - s = hg_mem_alloc(pool, 16); - } - hg_mem_pool_destroy(pool); - hg_allocator_destroy(allocator); - hg_mem_finalize(); - - return 0; -} diff --git a/tests/hgallocator-ffit-bench2.c b/tests/hgallocator-ffit-bench2.c deleted file mode 100644 index a21c2b3..0000000 --- a/tests/hgallocator-ffit-bench2.c +++ /dev/null @@ -1,31 +0,0 @@ -#include <stdio.h> -#include <string.h> -#include <hieroglyph/hgallocator-ffit.h> -#include <hieroglyph/hgmem.h> - -int -main(void) -{ - HgAllocator *allocator; - HgMemPool *pool; - gint i; - gchar *s; - - hg_mem_init(); - allocator = hg_allocator_new(hg_allocator_ffit_get_vtable()); - pool = hg_mem_pool_new(allocator, "test", 90000000, 0); - if (pool == NULL) { - g_print("Failed to create a pool.\n"); - return 1; - } - for (i = 0; i < 1000000; i++) { - s = hg_mem_alloc(pool, 16); - } - s = NULL; - hg_mem_garbage_collection(pool); - hg_mem_pool_destroy(pool); - hg_allocator_destroy(allocator); - hg_mem_finalize(); - - return 0; -} diff --git a/tests/hgarray.c b/tests/hgarray.c deleted file mode 100644 index 69f623a..0000000 --- a/tests/hgarray.c +++ /dev/null @@ -1,119 +0,0 @@ -#include <hieroglyph/hgallocator-bfit.h> -#include <hieroglyph/hgmem.h> -#include <hieroglyph/hgarray.h> -#include <hieroglyph/hgvaluenode.h> - -int -main(void) -{ - HG_MEM_INIT; - - HgAllocator *allocator; - HgMemPool *pool; - HgArray *a, *b; - HgValueNode *node; - guint i; - - hg_value_node_init(); - allocator = hg_allocator_new(hg_allocator_bfit_get_vtable()); - pool = hg_mem_pool_new(allocator, "test", 128, HG_MEM_RESIZABLE); - if (pool == NULL) { - g_print("Failed to create a memory pool.\n"); - return 1; - } - a = hg_array_new(pool, 5); - if (a == NULL) { - g_print("Failed to create an Array."); - return 1; - } - - for (i = 0; i < 5; i++) { - HG_VALUE_MAKE_INTEGER (pool, node, i + 1); - if (!hg_array_append(a, node)) { - g_print("Failed to append a node: %d\n", i); - return 1; - } - } - - for (i = 0; i < 5; i++) { - node = hg_array_index(a, i); - if (node == NULL || !HG_IS_VALUE_INTEGER (node) || HG_VALUE_GET_INTEGER (node) != (i + 1)) { - g_print("Failed to get an index %d\n", i); - g_print(" actual result: %d, expected result: %d\n", HG_VALUE_GET_INTEGER (node), i + 1); - return 1; - } - } - HG_VALUE_MAKE_INTEGER (pool, node, 6); - hg_array_replace(a, node, 0); - node = hg_array_index(a, 0); - if (node == NULL || !HG_IS_VALUE_INTEGER (node) || HG_VALUE_GET_INTEGER (node) != 6) { - g_print("Failed to get an index %d: take 2\n", 0); - g_print(" actual result: %d, expected result: %d\n", HG_VALUE_GET_INTEGER (node), 6); - return 1; - } - hg_array_remove(a, 0); - if (hg_array_length(a) != 4) { - g_print("Failed to remove Array at index %d\n", 0); - return 0; - } - for (i = 0; i < 4; i++) { - node = hg_array_index(a, i); - if (node == NULL || !HG_IS_VALUE_INTEGER (node) || HG_VALUE_GET_INTEGER (node) != (i + 2)) { - g_print("Failed to get an index %d: take 3\n", i); - g_print(" actual result: %d, expected result: %d\n", HG_VALUE_GET_INTEGER (node), i + 2); - return 1; - } - } - - a = hg_array_new(pool, -1); - if (a == NULL) { - g_print("Failed to create an Array."); - return 1; - } - - for (i = 0; i <= 256; i++) { - HG_VALUE_MAKE_INTEGER (pool, node, i + 1); - if (!hg_array_append(a, node)) { - g_print("Failed to append a node: %d\n", i); - return 1; - } - } - for (i = 0; i <= 256; i++) { - node = hg_array_index(a, i); - if (node == NULL || !HG_IS_VALUE_INTEGER (node) || HG_VALUE_GET_INTEGER (node) != (i + 1)) { - g_print("Failed to get an index %d\n", i); - g_print(" actual result: %d, expected result: %d\n", HG_VALUE_GET_INTEGER (node), i + 1); - return 1; - } - } - b = hg_array_make_subarray(pool, a, 10, 19); - for (i = 0; i < 10; i++) { - node = hg_array_index(b, i); - if (node == NULL || !HG_IS_VALUE_INTEGER (node) || HG_VALUE_GET_INTEGER (node) != (i + 11)) { - g_print("Failed to get an index %d\n", i); - g_print(" actual result: %d, expected result: %d\n", HG_VALUE_GET_INTEGER (node), i + 11); - return 1; - } - } - HG_VALUE_MAKE_INTEGER (pool, node, 1010); - hg_array_replace(b, node, 0); - node = hg_array_index(b, 0); - if (node == NULL || !HG_IS_VALUE_INTEGER (node) || HG_VALUE_GET_INTEGER (node) != 1010) { - g_print("Failed to get an index 0 for subarray\n"); - g_print(" actual result: %d, expected result: 1010\n", HG_VALUE_GET_INTEGER (node)); - return 1; - } - node = hg_array_index(a, 10); - if (node == NULL || !HG_IS_VALUE_INTEGER (node) || HG_VALUE_GET_INTEGER (node) != 1010) { - g_print("Failed to get an index 10: from parent array for subarray\n"); - g_print(" actual result: %d, expected result: 1010\n", HG_VALUE_GET_INTEGER (node)); - return 1; - } - - hg_mem_pool_destroy(pool); - hg_allocator_destroy(allocator); - hg_value_node_finalize(); - hg_mem_finalize(); - - return 0; -} diff --git a/tests/hgbtree.c b/tests/hgbtree.c deleted file mode 100644 index 74d42ec..0000000 --- a/tests/hgbtree.c +++ /dev/null @@ -1,113 +0,0 @@ -#include <stdio.h> -#include <string.h> -#include <hieroglyph/hgmem.h> -#include <hieroglyph/hgallocator-bfit.h> -#include <hieroglyph/hgbtree.h> - -void -tree2string(HgBTreePage *page, GString *string) -{ - static gint depth = 0; - guint16 i; - - if (page == NULL) { - g_string_append_c(string, '.'); - return; - } - g_string_append_c(string, '('); - depth++; - for (i = 0; i < page->n_data; i++) { - tree2string(page->page[i], string); - g_string_append_printf(string, "%d", GPOINTER_TO_INT(page->val[i])); - } - tree2string(page->page[page->n_data], string); - g_string_append_c(string, ')'); - depth--; -} - -int -main(void) -{ - HG_MEM_INIT; - - HgAllocator *allocator = hg_allocator_new(hg_allocator_bfit_get_vtable()); - HgMemPool *pool = hg_mem_pool_new(allocator, "btree_test", 1024, HG_MEM_RESIZABLE); - HgBTree *tree = hg_btree_new(pool, 2); - GString *string = g_string_new(NULL); - gchar *test1 = "(.0.1.2.3.)"; - gchar *test2 = "((.0.1.)2(.3.4.))"; - gchar *test = "(((((.0.1.)2(.3.4.)5(.6.7.))8((.9.10.)11(.12.13.)14(.15.16.))17((.18.19.)20(.21.22.)23(.24.25.)))26(((.27.28.)29(.30.31.)32(.33.34.))35((.36.37.)38(.39.40.)41(.42.43.))44((.45.46.)47(.48.49.)50(.51.52.)))53(((.54.55.)56(.57.58.)59(.60.61.))62((.63.64.)65(.66.67.)68(.69.70.))71((.72.73.)74(.75.76.)77(.78.79.))))80((((.81.82.)83(.84.85.)86(.87.88.))89((.90.91.)92(.93.94.)95(.96.97.))98((.99.100.)101(.102.103.)104(.105.106.)))107(((.108.109.)110(.111.112.)113(.114.115.))116((.117.118.)119(.120.121.)122(.123.124.))125((.126.127.)128(.129.130.)131(.132.133.)))134(((.135.136.)137(.138.139.)140(.141.142.))143((.144.145.)146(.147.148.)149(.150.151.))152((.153.154.)155(.156.157.)158(.159.160.))))161((((.162.163.)164(.165.166.)167(.168.169.))170((.171.172.)173(.174.175.)176(.177.178.))179((.180.181.)182(.183.184.)185(.186.187.)))188(((.189.190.)191(.192.193.)194(.195.196.))197((.198.199.)200(.201.202.)203(.204.205.))206((.207.208.)209(.210.211.)212(.213.214.)))215(((.216.217.)218(.219.220.)221(.222.223.))224((.225.226.)227(.228.229.)230(.231.232.))233((.234.235.)236(.237.238.)239(.240.241.))242((.243.244.)245(.246.247.)248(.249.250.)251(.252.253.254.255.)))))"; - gint i; - HgBTreeIter iter = hg_btree_iter_new(); - - hg_btree_allow_marking(tree, FALSE); - hg_btree_add(tree, GINT_TO_POINTER (0), GINT_TO_POINTER (0)); - hg_btree_add(tree, GINT_TO_POINTER (1), GINT_TO_POINTER (1)); - hg_btree_add(tree, GINT_TO_POINTER (2), GINT_TO_POINTER (2)); - hg_btree_add(tree, GINT_TO_POINTER (3), GINT_TO_POINTER (3)); - hg_btree_get_iter_first(tree, iter); - if (iter->val != 0) { - printf("failed to get an iterator 0\n"); - return 1; - } - hg_btree_get_iter_next(tree, iter); - if (iter->val != GINT_TO_POINTER (1)) { - printf("failed to get an iterator 1\n"); - return 1; - } - hg_btree_get_iter_next(tree, iter); - if (iter->val != GINT_TO_POINTER (2)) { - printf("failed to get an iterator 2\n"); - return 1; - } - hg_btree_get_iter_next(tree, iter); - if (iter->val != GINT_TO_POINTER (3)) { - printf("failed to get an iterator 3\n"); - return 1; - } - tree2string(tree->root, string); - if (strcmp(string->str, test1)) { - printf("error.\n Expected: %s\n Actual: %s\n", test1, string->str); - return 1; - } - g_string_erase(string, 0, -1); - hg_btree_add(tree, GINT_TO_POINTER (4), GINT_TO_POINTER (4)); - if (hg_btree_is_iter_valid(tree, iter)) { - printf("failed to test if an iterator is valid.\n"); - return 1; - } - if (!hg_btree_update_iter(tree, iter)) { - printf("failed to update an iterator\n"); - return 1; - } - hg_btree_get_iter_next(tree, iter); - if (iter->val != GINT_TO_POINTER (4)) { - printf("failed to get an iterator 4\n"); - return 1; - } - tree2string(tree->root, string); - if (strcmp(string->str, test2)) { - printf("error.\n Expected: %s\n Actual: %s\n", test2, string->str); - return 1; - } - g_string_erase(string, 0, -1); - for (i = 5; i < 256; i++) { - hg_btree_add(tree, GINT_TO_POINTER (i), GINT_TO_POINTER (i)); - } - tree2string(tree->root, string); - if (strcmp(string->str, test)) { - printf("error.\n Expected: %s\n Actual: %s\n", test, string->str); - return 1; - } - if (hg_btree_length(tree) != 256) { - printf("error.\n Expected: 256\n Actual: %u\n", hg_btree_length(tree)); - return 1; - } - hg_btree_iter_free(iter); - g_string_free(string, TRUE); - hg_mem_free(tree); - hg_mem_pool_destroy(pool); - hg_allocator_destroy(allocator); - - return 0; -} diff --git a/tests/hgdevice-cairo.c b/tests/hgdevice-cairo.c deleted file mode 100644 index bb90866..0000000 --- a/tests/hgdevice-cairo.c +++ /dev/null @@ -1,36 +0,0 @@ -#include <hieroglyph/hgdevice.h> -#include <hieroglyph/hgvalue-integer.h> -#include <hieroglyph/hgvalue-string.h> - -int -main(void) -{ - HgDevice *device; - int retval = 1; - - hieroglyph_init(); - - device = hieroglyph_device_new("ps-embedded"); - if (device != NULL) { -/* - cairo_select_font_face(cr, "Sans", - CAIRO_FONT_SLANT_NORMAL, - CAIRO_FONT_WEIGHT_NORMAL); - cairo_set_font_size(cr, 20); -*/ - - hieroglyph_device_move_to(device, - hieroglyph_value_integer_new(100), - hieroglyph_value_integer_new(100)); - hieroglyph_device_show(device, - hieroglyph_value_string_new("日本語")); -// cairo_show_page(cr); - - hieroglyph_object_unref(HG_OBJECT (device)); -// cairo_destroy(cr); -// cairo_surface_destroy(cs); - retval = 0; - } - - return retval; -} diff --git a/tests/hgdict.c b/tests/hgdict.c deleted file mode 100644 index 19a9645..0000000 --- a/tests/hgdict.c +++ /dev/null @@ -1,53 +0,0 @@ -#include <hieroglyph/hgallocator-bfit.h> -#include <hieroglyph/hgmem.h> -#include <hieroglyph/hgdict.h> -#include <hieroglyph/hgvaluenode.h> - -int -main(void) -{ - HG_MEM_INIT; - - HgAllocator *allocator; - HgMemPool *pool; - HgDict *d; - HgValueNode *key, *val, *node; - - hg_value_node_init(); - allocator = hg_allocator_new(hg_allocator_bfit_get_vtable()); - pool = hg_mem_pool_new(allocator, "test", 3840, 0); - if (pool == NULL) { - g_print("Failed to create a memory pool.\n"); - return 1; - } - d = hg_dict_new(pool, 5); - if (d == NULL) { - g_print("Failed to create a dictionary.\n"); - return 1; - } - - HG_VALUE_MAKE_INTEGER (pool, key, 50); - HG_VALUE_MAKE_INTEGER (pool, val, 10); - if (!hg_dict_insert(pool, d, key, val)) { - g_print("Failed to insert\n"); - return 1; - } - node = hg_dict_lookup(d, key); - if (node == NULL) { - g_print("Failed to lookup: %d\n", HG_VALUE_GET_INTEGER (key)); - return 1; - } - if (!HG_IS_VALUE_INTEGER (node) || HG_VALUE_GET_INTEGER (node) != 10) { - g_print("Failed to lookup value\n"); - g_print(" Expected: %d, Actual: %d\n", 10, HG_VALUE_GET_INTEGER (node)); - return 1; - } - -// hg_mem_free(d); - hg_mem_pool_destroy(pool); - hg_allocator_destroy(allocator); - hg_value_node_finalize(); - hg_mem_finalize(); - - return 0; -} diff --git a/tests/hgfile.c b/tests/hgfile.c deleted file mode 100644 index 47f6f40..0000000 --- a/tests/hgfile.c +++ /dev/null @@ -1,47 +0,0 @@ -#include <hieroglyph/hgallocator-bfit.h> -#include <hieroglyph/hgmem.h> -#include <hieroglyph/hgfile.h> - -int -main(void) -{ - HG_MEM_INIT; - - HgAllocator *allocator; - HgMemPool *pool; - HgFileObject *file; - gchar c; - - hg_file_init(); - - allocator = hg_allocator_new(hg_allocator_bfit_get_vtable()); - pool = hg_mem_pool_new(allocator, "test", 128, HG_MEM_RESIZABLE); - if (pool == NULL) { - hg_stderr_printf("Failed to create a memory pool.\n"); - return 1; - } - hg_stdout_printf("Hello\n"); - hg_stderr_printf("Hello world\n"); - file = hg_file_object_new(pool, HG_FILE_TYPE_FILE, HG_FILE_MODE_READ, "hgfile.c"); - c = hg_file_object_getc(file); - if (c != '#') { - hg_stderr_printf("Failed to get a char.\n"); - return 1; - } - hg_file_object_ungetc(file, ' '); - c = hg_file_object_getc(file); - if (c != ' ') { - hg_stderr_printf("Failed to unget a char.\n"); - return 1; - } - c = hg_file_object_getc(file); - if (c != 'i') { - hg_stderr_printf("Failed to get a char [2].\n"); - return 1; - } - - hg_file_finalize(); - hg_mem_finalize(); - - return 0; -} diff --git a/tests/hgfilter-ps.c b/tests/hgfilter-ps.c deleted file mode 100644 index 75c3acd..0000000 --- a/tests/hgfilter-ps.c +++ /dev/null @@ -1,24 +0,0 @@ -#include <fcntl.h> -#include <hieroglyph/hgfilter.h> - -int -main(void) -{ - HgFilter *filter; - int retval = 1; - int fd; - - hieroglyph_init(); - - filter = hieroglyph_filter_new("ps"); - fd = open("./tests/test.ps", O_RDONLY); - if (hieroglyph_filter_open_stream(filter, fd, "test.ps")) { - hieroglyph_filter_close_stream(filter); - } - if (filter != NULL) { - hieroglyph_object_unref(HG_OBJECT (filter)); - retval = 0; - } - - return retval; -} diff --git a/tests/hglineedit.c b/tests/hglineedit.c deleted file mode 100644 index 1abe82a..0000000 --- a/tests/hglineedit.c +++ /dev/null @@ -1,18 +0,0 @@ -#include <hieroglyph/hglineedit.h> - -int -main(void) -{ - gchar *line; - - while (1) { - line = hg_line_edit_get_line((gpointer)1, NULL, FALSE); - g_print("->%s\n", line); - g_free(line); - line = hg_line_edit_get_statement((gpointer)1, NULL); - g_print("=>%s\n", line); - g_free(line); - } - - return 0; -} diff --git a/tests/hglist.c b/tests/hglist.c deleted file mode 100644 index 4b8411b..0000000 --- a/tests/hglist.c +++ /dev/null @@ -1,439 +0,0 @@ -#include <hieroglyph/hgallocator-bfit.h> -#include <hieroglyph/hgmem.h> -#include <hieroglyph/hglist.h> - -int -main(void) -{ - HG_MEM_INIT; - - HgAllocator *allocator; - HgMemPool *pool; - HgList *list; - HgListIter iter, iter2; - gint tc1[] = {1, 2, 3, 0}; - gint tc2[] = {1, 3, 0}; - gint tc3[] = {2, 3, 0}; - gint tc4[] = {1, 2, 0}; - gint tc5[] = {4, 1, 2, 3, 5, 0}; - gint tc6[] = {4, 1, 2, 3, 0}; - gint tc7[] = {1, 4, 2, 3, 5, 0}; - gint tc8[] = {1, 5, 2, 3, 4, 0}; - gint tc9[] = {2, 3, 4, 1, 5, 0}; - gint tc10[] = {2, 3, 4, 1, 0}; - gint tc11[] = {1, 3, 4, 2, 5, 0}; - gint tc12[] = {1, 3, 4, 5, 2, 0}; - gint i; - - allocator = hg_allocator_new(hg_allocator_bfit_get_vtable()); - pool = hg_mem_pool_new(allocator, "test", 128, HG_MEM_RESIZABLE); - if (pool == NULL) { - g_print("Failed to create a memory pool.\n"); - return 1; - } - list = hg_list_new(pool); - if (list == NULL) { - g_print("Failed to create an list.\n"); - return 1; - } - - list = hg_list_append(list, GINT_TO_POINTER (1)); - list = hg_list_append(list, GINT_TO_POINTER (2)); - list = hg_list_append(list, GINT_TO_POINTER (3)); - - iter = hg_list_iter_new(list); - if (iter == NULL) { - g_print("Failed to create an iter.\n"); - return 1; - } - - for (i = 0; ; i++) { - if (tc1[i] != GPOINTER_TO_INT (hg_list_iter_get_data(iter))) { - g_print("Failed to compare: expected %d, but actually %d", - tc1[i], GPOINTER_TO_INT (hg_list_iter_get_data(iter))); - return 1; - } - if (!hg_list_get_iter_next(list, iter)) - break; - } - if (i != 2) { - g_print("Expected list size 3 but actually was %d\n", i + 1); - return 1; - } - list = hg_list_remove(list, GINT_TO_POINTER (2)); - hg_list_get_iter_first(list, iter); - for (i = 0; ; i++) { - if (tc2[i] != GPOINTER_TO_INT (hg_list_iter_get_data(iter))) { - g_print("Failed to compare: expected %d, but actually %d", - tc2[i], GPOINTER_TO_INT (hg_list_iter_get_data(iter))); - return 1; - } - if (!hg_list_get_iter_next(list, iter)) - break; - } - if (i != 1) { - g_print("Expected list size 2 but actually was %d\n", i + 1); - return 1; - } - - /* testcase 2 */ - list = hg_list_new(pool); - if (list == NULL) { - g_print("Failed to create an list.\n"); - return 1; - } - - list = hg_list_append(list, GINT_TO_POINTER (1)); - list = hg_list_append(list, GINT_TO_POINTER (2)); - list = hg_list_append(list, GINT_TO_POINTER (3)); - - list = hg_list_remove(list, GINT_TO_POINTER (1)); - iter = hg_list_iter_new(list); - if (iter == NULL) { - g_print("Failed to create an iter.\n"); - return 1; - } - for (i = 0; ; i++) { - if (tc3[i] != GPOINTER_TO_INT (hg_list_iter_get_data(iter))) { - g_print("Failed to compare: expected %d, but actually %d", - tc3[i], GPOINTER_TO_INT (hg_list_iter_get_data(iter))); - return 1; - } - if (!hg_list_get_iter_next(list, iter)) - break; - } - if (i != 1) { - g_print("Expected list size 2 but actually was %d\n", i + 1); - return 1; - } - - /* testcase 3 */ - list = hg_list_new(pool); - if (list == NULL) { - g_print("Failed to create an list.\n"); - return 1; - } - - list = hg_list_append(list, GINT_TO_POINTER (1)); - list = hg_list_append(list, GINT_TO_POINTER (2)); - list = hg_list_append(list, GINT_TO_POINTER (3)); - - list = hg_list_remove(list, GINT_TO_POINTER (3)); - iter = hg_list_iter_new(list); - if (iter == NULL) { - g_print("Failed to create an iter.\n"); - return 1; - } - for (i = 0; ; i++) { - if (tc4[i] != GPOINTER_TO_INT (hg_list_iter_get_data(iter))) { - g_print("Failed to compare: expected %d, but actually %d", - tc4[i], GPOINTER_TO_INT (hg_list_iter_get_data(iter))); - return 1; - } - if (!hg_list_get_iter_next(list, iter)) - break; - } - if (i != 1) { - g_print("Expected list size 2 but actually was %d\n", i + 1); - return 1; - } - - /* testcase 4 */ - list = hg_list_new(pool); - if (list == NULL) { - g_print("Failed to create an list.\n"); - return 1; - } - - list = hg_list_append(list, GINT_TO_POINTER (1)); - - list = hg_list_remove(list, GINT_TO_POINTER (1)); - if (list != NULL) { - g_print("Expected list size 0 but actually was %d\n", hg_list_length(list)); - return 1; - } - - /* testcase 5 */ - list = hg_list_new(pool); - if (list == NULL) { - g_print("Failed to create an list.\n"); - return 1; - } - - list = hg_list_append(list, GINT_TO_POINTER (1)); - list = hg_list_append(list, GINT_TO_POINTER (2)); - list = hg_list_append(list, GINT_TO_POINTER (3)); - list = hg_list_append(list, GINT_TO_POINTER (4)); - list = hg_list_append(list, GINT_TO_POINTER (5)); - - iter = hg_list_iter_new(list); - iter2 = hg_list_iter_new(list); - hg_list_get_iter_last(list, iter2); - hg_list_get_iter_previous(list, iter2); - list = hg_list_iter_roll(iter, iter2, 1); - hg_list_get_iter_first(list, iter); - if (hg_list_length(list) != 5) { - g_print("Expected list size 5 but actually was %d\n", hg_list_length(list)); - return 1; - } - for (i = 0; ; i++) { - if (tc5[i] != GPOINTER_TO_INT (hg_list_iter_get_data(iter))) { - g_print("Failed to compare: expected %d[%d], but actually %d\n", - tc5[i], i, GPOINTER_TO_INT (hg_list_iter_get_data(iter))); - return 1; - } - if (!hg_list_get_iter_next(list, iter)) - break; - } - hg_list_iter_free(iter); - hg_list_iter_free(iter2); - - /* testcase 6 */ - list = hg_list_new(pool); - if (list == NULL) { - g_print("Failed to create an list.\n"); - return 1; - } - - list = hg_list_append(list, GINT_TO_POINTER (1)); - list = hg_list_append(list, GINT_TO_POINTER (2)); - list = hg_list_append(list, GINT_TO_POINTER (3)); - list = hg_list_append(list, GINT_TO_POINTER (4)); - - iter = hg_list_iter_new(list); - iter2 = hg_list_iter_new(list); - hg_list_get_iter_last(list, iter2); - list = hg_list_iter_roll(iter, iter2, 1); - hg_list_get_iter_first(list, iter); - if (hg_list_length(list) != 4) { - g_print("Expected list size 4 but actually was %d\n", hg_list_length(list)); - return 1; - } - for (i = 0; ; i++) { - if (tc6[i] != GPOINTER_TO_INT (hg_list_iter_get_data(iter))) { - g_print("Failed to compare: expected %d[%d], but actually %d\n", - tc6[i], i, GPOINTER_TO_INT (hg_list_iter_get_data(iter))); - return 1; - } - if (!hg_list_get_iter_next(list, iter)) - break; - } - hg_list_iter_free(iter); - hg_list_iter_free(iter2); - - /* testcase 7 */ - list = hg_list_new(pool); - if (list == NULL) { - g_print("Failed to create an list.\n"); - return 1; - } - - list = hg_list_append(list, GINT_TO_POINTER (1)); - list = hg_list_append(list, GINT_TO_POINTER (2)); - list = hg_list_append(list, GINT_TO_POINTER (3)); - list = hg_list_append(list, GINT_TO_POINTER (4)); - list = hg_list_append(list, GINT_TO_POINTER (5)); - - iter = hg_list_iter_new(list); - hg_list_get_iter_next(list, iter); - iter2 = hg_list_iter_new(list); - hg_list_get_iter_last(list, iter2); - hg_list_get_iter_previous(list, iter2); - list = hg_list_iter_roll(iter, iter2, 1); - hg_list_get_iter_first(list, iter); - if (hg_list_length(list) != 5) { - g_print("Expected list size 5 but actually was %d\n", hg_list_length(list)); - return 1; - } - for (i = 0; ; i++) { - if (tc7[i] != GPOINTER_TO_INT (hg_list_iter_get_data(iter))) { - g_print("Failed to compare: expected %d[%d], but actually %d\n", - tc7[i], i, GPOINTER_TO_INT (hg_list_iter_get_data(iter))); - return 1; - } - if (!hg_list_get_iter_next(list, iter)) - break; - } - hg_list_iter_free(iter); - hg_list_iter_free(iter2); - - /* testcase 8 */ - list = hg_list_new(pool); - if (list == NULL) { - g_print("Failed to create an list.\n"); - return 1; - } - - list = hg_list_append(list, GINT_TO_POINTER (1)); - list = hg_list_append(list, GINT_TO_POINTER (2)); - list = hg_list_append(list, GINT_TO_POINTER (3)); - list = hg_list_append(list, GINT_TO_POINTER (4)); - list = hg_list_append(list, GINT_TO_POINTER (5)); - - iter = hg_list_iter_new(list); - hg_list_get_iter_next(list, iter); - iter2 = hg_list_iter_new(list); - hg_list_get_iter_last(list, iter2); - list = hg_list_iter_roll(iter, iter2, 1); - hg_list_get_iter_first(list, iter); - if (hg_list_length(list) != 5) { - g_print("Expected list size 5 but actually was %d\n", hg_list_length(list)); - return 1; - } - for (i = 0; ; i++) { - if (tc8[i] != GPOINTER_TO_INT (hg_list_iter_get_data(iter))) { - g_print("Failed to compare: expected %d[%d], but actually %d\n", - tc8[i], i, GPOINTER_TO_INT (hg_list_iter_get_data(iter))); - return 1; - } - if (!hg_list_get_iter_next(list, iter)) - break; - } - hg_list_iter_free(iter); - hg_list_iter_free(iter2); - - /* testcase 9 */ - list = hg_list_new(pool); - if (list == NULL) { - g_print("Failed to create an list.\n"); - return 1; - } - - list = hg_list_append(list, GINT_TO_POINTER (1)); - list = hg_list_append(list, GINT_TO_POINTER (2)); - list = hg_list_append(list, GINT_TO_POINTER (3)); - list = hg_list_append(list, GINT_TO_POINTER (4)); - list = hg_list_append(list, GINT_TO_POINTER (5)); - - iter = hg_list_iter_new(list); - iter2 = hg_list_iter_new(list); - hg_list_get_iter_last(list, iter2); - hg_list_get_iter_previous(list, iter2); - list = hg_list_iter_roll(iter2, iter, 1); - hg_list_get_iter_first(list, iter); - if (hg_list_length(list) != 5) { - g_print("Expected list size 5 but actually was %d\n", hg_list_length(list)); - return 1; - } - for (i = 0; ; i++) { - if (tc9[i] != GPOINTER_TO_INT (hg_list_iter_get_data(iter))) { - g_print("Failed to compare: expected %d[%d], but actually %d\n", - tc9[i], i, GPOINTER_TO_INT (hg_list_iter_get_data(iter))); - return 1; - } - if (!hg_list_get_iter_next(list, iter)) - break; - } - hg_list_iter_free(iter); - hg_list_iter_free(iter2); - - /* testcase 10 */ - list = hg_list_new(pool); - if (list == NULL) { - g_print("Failed to create an list.\n"); - return 1; - } - - list = hg_list_append(list, GINT_TO_POINTER (1)); - list = hg_list_append(list, GINT_TO_POINTER (2)); - list = hg_list_append(list, GINT_TO_POINTER (3)); - list = hg_list_append(list, GINT_TO_POINTER (4)); - - iter = hg_list_iter_new(list); - iter2 = hg_list_iter_new(list); - hg_list_get_iter_last(list, iter2); - list = hg_list_iter_roll(iter2, iter, 1); - hg_list_get_iter_first(list, iter); - if (hg_list_length(list) != 4) { - g_print("Expected list size 4 but actually was %d\n", hg_list_length(list)); - return 1; - } - for (i = 0; ; i++) { - if (tc10[i] != GPOINTER_TO_INT (hg_list_iter_get_data(iter))) { - g_print("Failed to compare: expected %d[%d], but actually %d\n", - tc10[i], i, GPOINTER_TO_INT (hg_list_iter_get_data(iter))); - return 1; - } - if (!hg_list_get_iter_next(list, iter)) - break; - } - hg_list_iter_free(iter); - hg_list_iter_free(iter2); - - /* testcase 11 */ - list = hg_list_new(pool); - if (list == NULL) { - g_print("Failed to create an list.\n"); - return 1; - } - - list = hg_list_append(list, GINT_TO_POINTER (1)); - list = hg_list_append(list, GINT_TO_POINTER (2)); - list = hg_list_append(list, GINT_TO_POINTER (3)); - list = hg_list_append(list, GINT_TO_POINTER (4)); - list = hg_list_append(list, GINT_TO_POINTER (5)); - - iter = hg_list_iter_new(list); - hg_list_get_iter_next(list, iter); - iter2 = hg_list_iter_new(list); - hg_list_get_iter_last(list, iter2); - hg_list_get_iter_previous(list, iter2); - list = hg_list_iter_roll(iter2, iter, 1); - hg_list_get_iter_first(list, iter); - if (hg_list_length(list) != 5) { - g_print("Expected list size 5 but actually was %d\n", hg_list_length(list)); - return 1; - } - for (i = 0; ; i++) { - if (tc11[i] != GPOINTER_TO_INT (hg_list_iter_get_data(iter))) { - g_print("Failed to compare: expected %d[%d], but actually %d\n", - tc11[i], i, GPOINTER_TO_INT (hg_list_iter_get_data(iter))); - return 1; - } - if (!hg_list_get_iter_next(list, iter)) - break; - } - hg_list_iter_free(iter); - hg_list_iter_free(iter2); - - /* testcase 12 */ - list = hg_list_new(pool); - if (list == NULL) { - g_print("Failed to create an list.\n"); - return 1; - } - - list = hg_list_append(list, GINT_TO_POINTER (1)); - list = hg_list_append(list, GINT_TO_POINTER (2)); - list = hg_list_append(list, GINT_TO_POINTER (3)); - list = hg_list_append(list, GINT_TO_POINTER (4)); - list = hg_list_append(list, GINT_TO_POINTER (5)); - - iter = hg_list_iter_new(list); - hg_list_get_iter_next(list, iter); - iter2 = hg_list_iter_new(list); - hg_list_get_iter_last(list, iter2); - list = hg_list_iter_roll(iter2, iter, 1); - hg_list_get_iter_first(list, iter); - if (hg_list_length(list) != 5) { - g_print("Expected list size 5 but actually was %d\n", hg_list_length(list)); - return 1; - } - for (i = 0; ; i++) { - if (tc12[i] != GPOINTER_TO_INT (hg_list_iter_get_data(iter))) { - g_print("Failed to compare: expected %d[%d], but actually %d\n", - tc12[i], i, GPOINTER_TO_INT (hg_list_iter_get_data(iter))); - return 1; - } - if (!hg_list_get_iter_next(list, iter)) - break; - } - hg_list_iter_free(iter); - hg_list_iter_free(iter2); - - hg_mem_pool_destroy(pool); - hg_allocator_destroy(allocator); - hg_mem_finalize(); - - return 0; -} diff --git a/tests/hgmem.c b/tests/hgmem.c deleted file mode 100644 index a4b2fd0..0000000 --- a/tests/hgmem.c +++ /dev/null @@ -1,106 +0,0 @@ -#include <stdio.h> -#include <string.h> -#include <hieroglyph/hgallocator-bfit.h> -#include <hieroglyph/hgmem.h> - -#if 0 -int -test_ffit(void) -{ - HgAllocator *allocator; - HgMemPool *pool; - gchar *s, *s2; - - g_print("ffit\n"); - allocator = hg_allocator_new(hg_allocator_ffit_get_vtable()); - pool = hg_mem_pool_new(allocator, "test", 256, HG_MEM_RESIZABLE); - if (pool == NULL) { - g_print("Failed to create a pool.\n"); - return 1; - } - s = hg_mem_alloc(pool, 16); - printf("%p\n", s); - s2 = hg_mem_alloc(pool, 256); - printf("%p:%p\n", s, s2); - if (s == NULL || s2 == NULL) { - g_print("Failed to alloc a memory: %p %p.\n", s, s2); - return 1; - } - strcpy(s, "test"); - strcpy(s2, "test"); - if (strcmp(s, s2)) { - g_print("Failed to compare the memory.\n"); - return 1; - } - s = hg_mem_resize(s, 256); - printf("%p:%p\n", s, s2); - if (strcmp(s, s2)) { - g_print("Failed to compare the memory.\n"); - return 1; - } - hg_mem_free(s2); - hg_mem_free(s); - hg_mem_pool_destroy(pool); - hg_allocator_destroy(allocator); - - return 0; -} -#endif - -int -test_bfit(void) -{ - HgAllocator *allocator; - HgMemPool *pool; - gchar *s, *s2; - - allocator = hg_allocator_new(hg_allocator_bfit_get_vtable()); - pool = hg_mem_pool_new(allocator, "test", 256, HG_MEM_RESIZABLE); - if (pool == NULL) { - g_print("Failed to create a pool.\n"); - return 1; - } - s = hg_mem_alloc(pool, 16); - printf("%p\n", s); - s2 = hg_mem_alloc(pool, 256); - printf("%p:%p\n", s, s2); - if (s == NULL || s2 == NULL) { - g_print("Failed to alloc a memory: %p %p.\n", s, s2); - return 1; - } - strcpy(s, "test"); - strcpy(s2, "test"); - if (strcmp(s, s2)) { - g_print("Failed to compare the memory.\n"); - return 1; - } - s = hg_mem_resize(s, 256); - printf("%p:%p\n", s, s2); - if (strcmp(s, s2)) { - g_print("Failed to compare the memory.\n"); - return 1; - } - hg_mem_free(s2); - hg_mem_free(s); - hg_mem_pool_destroy(pool); - hg_allocator_destroy(allocator); - - return 0; -} - -int -main(void) -{ - HG_MEM_INIT; - -#if 0 - if (test_ffit() != 0) - return 1; -#endif - if (test_bfit() != 0) - return 1; - - hg_mem_finalize(); - - return 0; -} diff --git a/tests/hgobject.c b/tests/hgobject.c new file mode 100644 index 0000000..1aa9f08 --- /dev/null +++ b/tests/hgobject.c @@ -0,0 +1,187 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ +/* + * hgobject.c + * Copyright (C) 2007 Akira TAGOH + * + * Authors: + * Akira TAGOH <akira@tagoh.org> + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ +#include <hieroglyph/hgobject.h> +#include <hieroglyph/vm.h> +#include "main.h" + + +hg_vm_t *vm; +hg_object_t *obj; + +void +setup(void) +{ + vm = hg_vm_new(); +} + +void +teardown(void) +{ + hg_vm_destroy(vm); +} + +/* core object */ +TDEF (hg_object_new) +{ + gboolean flag; + + obj = hg_object_new(vm, 1); + + fail_unless(obj != NULL, "Failed to create an object"); + fail_unless(HG_OBJECT_GET_N_OBJECTS (obj) == 1, "The amount of the object is different."); + + hg_object_free(vm, obj); + + obj = hg_object_new(vm, 10); + + fail_unless(obj != NULL, "Failed to create an object"); + fail_unless(HG_OBJECT_GET_N_OBJECTS (obj) == 10, "The amount of the object is different."); + + hg_object_free(vm, obj); + + /* disable stacktrace */ + if (hg_is_stacktrace_enabled) + flag = hg_is_stacktrace_enabled(); + hg_use_stacktrace(FALSE); + obj = hg_object_new(vm, 0); + if (hg_is_stacktrace_enabled) + hg_use_stacktrace(flag); + + fail_unless(obj == NULL, "Not allowed to create empty object"); +} +TEND + +TDEF (hg_object_sized_new) +{ +} +TEND + +TDEF (hg_object_dup) +{ +} +TEND + +TDEF (hg_object_copy) +{ +} +TEND + +TDEF (hg_object_compare) +{ +} +TEND + +TDEF (hg_object_dump) +{ +} +TEND + +/* null object */ +TDEF (hg_object_null_new) +{ + obj = hg_object_null_new(vm); + + fail_unless(obj != NULL, "Failed to create a null object"); + fail_unless(HG_OBJECT_IS_NULL (obj), "Created object isn't a null object."); + + hg_object_free(vm, obj); +} +TEND + +/* integer object */ +TDEF (hg_object_integer_new) +{ + obj = hg_object_integer_new(vm, 1); + + fail_unless(obj != NULL, "Failed to create an integer object"); + fail_unless(HG_OBJECT_IS_INTEGER (obj), "Created object isn't an integer object"); + fail_unless(HG_OBJECT_INTEGER (obj) == 1, "Object isn't set correctly on creation"); + + hg_object_free(vm, obj); + obj = hg_object_integer_new(vm, -1); + + fail_unless(obj != NULL, "Failed to create an integer object"); + fail_unless(HG_OBJECT_IS_INTEGER (obj), "Created object isn't an integer object"); + fail_unless(HG_OBJECT_INTEGER (obj) == -1, "Object isn't set correctly on creation"); + + hg_object_free(vm, obj); +} +TEND + +/* real object */ +TDEF (hg_object_real_new) +{ +} +TEND + +/* name object */ +TDEF (hg_object_name_new) +{ +} +TEND + +/* system encoding object */ +TDEF (hg_object_system_encoding_new) +{ +} +TEND + +/* boolean object */ +TDEF (hg_object_boolean_new) +{ +} +TEND + +/* mark object */ +TDEF (hg_object_mark_new) +{ +} +TEND + +/************************************************************/ +Suite * +hieroglyph_suite(void) +{ + Suite *s = suite_create("hg_object_t"); + TCase *tc = tcase_create("Generic Functionalities"); + + tcase_add_checked_fixture(tc, setup, teardown); + T (hg_object_new); + T (hg_object_sized_new); + T (hg_object_dup); + T (hg_object_copy); + T (hg_object_compare); + T (hg_object_dump); + T (hg_object_null_new); + T (hg_object_integer_new); + T (hg_object_real_new); + T (hg_object_name_new); + T (hg_object_system_encoding_new); + T (hg_object_boolean_new); + T (hg_object_mark_new); + + suite_add_tcase(s, tc); + + return s; +} diff --git a/tests/hgpage.c b/tests/hgpage.c deleted file mode 100644 index aa40b99..0000000 --- a/tests/hgpage.c +++ /dev/null @@ -1,75 +0,0 @@ -#include <math.h> -#include <hieroglyph/hgpage.h> - -int -test_hg_page_get_size(void) -{ - gdouble w, h; - -#define CMP_SIZE(size, ww, hh) \ - G_STMT_START { \ - gdouble uw = ww / 25.4 * 72; \ - gdouble uh = hh / 25.4 * 72; \ - if (!hg_page_get_size((size), &w, &h)) \ - return 1; \ - if (fabs(w - uw) > fabs(DBL_EPSILON * w) || \ - fabs(h - uh) > fabs(DBL_EPSILON * h)) { \ - g_print("expect: %fmm x %fmm\n", (gdouble)ww, (gdouble)hh); \ - g_print("expect: %f x %f\n", (gdouble)uw, (gdouble)uh); \ - g_print("actual: %f x %f\n", w, h); \ - return 1; \ - } \ - } G_STMT_END - - CMP_SIZE (HG_PAGE_4A0, 1682, 2378); - CMP_SIZE (HG_PAGE_2A0, 1189, 1682); - CMP_SIZE (HG_PAGE_A0, 841, 1189); - CMP_SIZE (HG_PAGE_A1, 594, 841); - CMP_SIZE (HG_PAGE_A2, 420, 594); - CMP_SIZE (HG_PAGE_A3, 297, 420); - CMP_SIZE (HG_PAGE_A4, 210, 297); - CMP_SIZE (HG_PAGE_A5, 148, 210); - CMP_SIZE (HG_PAGE_A6, 105, 148); - CMP_SIZE (HG_PAGE_A7, 74, 105); - - CMP_SIZE (HG_PAGE_B0, 1000, 1414); - CMP_SIZE (HG_PAGE_B1, 707, 1000); - CMP_SIZE (HG_PAGE_B2, 500, 707); - CMP_SIZE (HG_PAGE_B3, 353, 500); - CMP_SIZE (HG_PAGE_B4, 250, 353); - CMP_SIZE (HG_PAGE_B5, 176, 250); - CMP_SIZE (HG_PAGE_B6, 125, 176); - CMP_SIZE (HG_PAGE_B7, 88, 125); - - CMP_SIZE (HG_PAGE_JIS_B0, 1030, 1456); - CMP_SIZE (HG_PAGE_JIS_B1, 728, 1030); - CMP_SIZE (HG_PAGE_JIS_B2, 515, 728); - CMP_SIZE (HG_PAGE_JIS_B3, 364, 515); - CMP_SIZE (HG_PAGE_JIS_B4, 257, 364); - CMP_SIZE (HG_PAGE_JIS_B5, 182, 257); - CMP_SIZE (HG_PAGE_JIS_B6, 128, 182); - - CMP_SIZE (HG_PAGE_C0, 917, 1297); - CMP_SIZE (HG_PAGE_C1, 648, 917); - CMP_SIZE (HG_PAGE_C2, 458, 648); - CMP_SIZE (HG_PAGE_C3, 324, 458); - CMP_SIZE (HG_PAGE_C4, 229, 324); - CMP_SIZE (HG_PAGE_C5, 162, 229); - CMP_SIZE (HG_PAGE_C6, 114, 162); - CMP_SIZE (HG_PAGE_C7, 81, 114); - - CMP_SIZE (HG_PAGE_JAPAN_POSTCARD, 100, 148); - CMP_SIZE (HG_PAGE_LETTER, 215.9, 279.4); - CMP_SIZE (HG_PAGE_LEGAL, 215.9, 355.6); - - return 0; -} - -int -main(void) -{ - if (test_hg_page_get_size() != 0) - return 1; - - return 0; -} diff --git a/tests/hgstack.c b/tests/hgstack.c new file mode 100644 index 0000000..d1d8b86 --- /dev/null +++ b/tests/hgstack.c @@ -0,0 +1,97 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ +/* + * hgstack.c + * Copyright (C) 2007 Akira TAGOH + * + * Authors: + * Akira TAGOH <akira@tagoh.org> + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include <hieroglyph/hgobject.h> +#include <hieroglyph/hgstack.h> +#include <hieroglyph/vm.h> + + +int +main(int argc, + char **argv) +{ + hg_vm_t *vm; + hg_stack_t *stack; + hg_object_t *obj; + gint i = 1; + + vm = hg_vm_new(); + stack = hg_stack_new(vm, 10); + hg_stack_dump(vm, stack); + obj = hg_object_integer_new(vm, i++); + hg_stack_push(stack, obj); + hg_stack_dump(vm, stack); + obj = hg_object_integer_new(vm, i++); + hg_stack_push(stack, obj); + hg_stack_dump(vm, stack); + obj = hg_object_integer_new(vm, i++); + hg_stack_push(stack, obj); + obj = hg_object_integer_new(vm, i++); + hg_stack_push(stack, obj); + obj = hg_object_integer_new(vm, i++); + hg_stack_push(stack, obj); + hg_stack_dump(vm, stack); + hg_stack_pop(stack); + hg_stack_dump(vm, stack); + obj = hg_object_integer_new(vm, i++); + hg_stack_push(stack, obj); + hg_stack_dump(vm, stack); + hg_stack_roll(stack, 3, 2); + hg_stack_dump(vm, stack); + obj = hg_object_integer_new(vm, i++); + hg_stack_push(stack, obj); + hg_stack_dump(vm, stack); + hg_stack_roll(stack, 3, -2); + hg_stack_dump(vm, stack); + hg_stack_roll(stack, 6, 2); + hg_stack_dump(vm, stack); + hg_stack_pop(stack); + hg_stack_pop(stack); + hg_stack_pop(stack); + hg_stack_pop(stack); + hg_stack_pop(stack); + hg_stack_pop(stack); + hg_stack_dump(vm, stack); + + i = 1; + do { + obj = hg_object_integer_new(vm, i++); + } while (hg_stack_push(stack, obj)); + printf("%d\n", i); + hg_stack_dump(vm, stack); + hg_stack_roll(stack, 3, 2); + hg_stack_dump(vm, stack); + hg_stack_roll(stack, 3, -2); + hg_stack_dump(vm, stack); + hg_stack_roll(stack, 10, -2); + hg_stack_dump(vm, stack); + + hg_stack_free(vm, stack); + hg_vm_destroy(vm); + + return 0; +} diff --git a/tests/hgstring.c b/tests/hgstring.c deleted file mode 100644 index 7cc79e5..0000000 --- a/tests/hgstring.c +++ /dev/null @@ -1,72 +0,0 @@ -#include <hieroglyph/hgallocator-bfit.h> -#include <hieroglyph/hgmem.h> -#include <hieroglyph/hgstring.h> - -int -main(void) -{ - HG_MEM_INIT; - - HgAllocator *allocator; - HgMemPool *pool; - HgString *s; - - allocator = hg_allocator_new(hg_allocator_bfit_get_vtable()); - pool = hg_mem_pool_new(allocator, "test", 256, HG_MEM_RESIZABLE); - if (pool == NULL) { - g_print("Failed to create a memory pool.\n"); - return 1; - } - s = hg_string_new(pool, 256); - if (s == NULL) { - g_print("Failed to create a string.\n"); - return 1; - } - - hg_string_append(s, "This is a test program for HgString.", -1); - if (!hg_string_compare_with_raw(s, "This is a test program for HgString.", -1)) { - g_print("Failed to compare: %s\n", hg_string_get_string(s)); - return 1; - } - - hg_string_insert_c(s, 'a', 2); - hg_string_insert_c(s, 't', 3); - if (!hg_string_compare_with_raw(s, "That is a test program for HgString.", -1)) { - g_print("Failed to compare: %s\n", hg_string_get_string(s)); - return 1; - } - - s = hg_string_new(pool, -1); - if (s == NULL) { - g_print("Failed to create a string2.\n"); - return 1; - } - hg_string_append(s, "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz", -1); - hg_string_append(s, "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz", -1); - hg_string_append(s, "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz", -1); - hg_string_append(s, "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz", -1); - hg_string_append(s, "0123456789", -1); - hg_string_append(s, "0123456789", -1); - hg_string_append(s, "0123456789", -1); - hg_string_append(s, "0123456789", -1); - hg_string_append_c(s, ' '); - hg_string_append_c(s, 't'); - hg_string_append_c(s, 'e'); - hg_string_append_c(s, 's'); - hg_string_append_c(s, 't'); - hg_string_append_c(s, ' '); - hg_string_append_c(s, 't'); - hg_string_append_c(s, 'e'); - hg_string_append_c(s, 's'); - hg_string_append_c(s, 't'); - if (!hg_string_compare_with_raw(s, "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789012345678901234567890123456789 test test", -1)) { - g_print("Failed to compare (take 2): %s\n", hg_string_get_string(s)); - return 1; - } - - hg_mem_pool_destroy(pool); - hg_allocator_destroy(allocator); - hg_mem_finalize(); - - return 0; -} diff --git a/hieroglyph/hgdebug.h b/tests/main.c index 45374bb..916c00a 100644 --- a/hieroglyph/hgdebug.h +++ b/tests/main.c @@ -1,10 +1,10 @@ /* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ /* - * hgdebug.h - * Copyright (C) 2006 Akira TAGOH + * main.c + * Copyright (C) 2007 Akira TAGOH * * Authors: - * Akira TAGOH <at@gclab.org> + * Akira TAGOH <akira@tagoh.org> * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -21,15 +21,21 @@ * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ -#ifndef __HG_DEBUG_H__ -#define __HG_DEBUG_H__ +#include <stdlib.h> +#include <check.h> -#include <hieroglyph/hgtypes.h> +extern Suite *hieroglyph_suite(void); -G_BEGIN_DECLS +int +main(void) +{ + int number_failed; + Suite *s = hieroglyph_suite(); + SRunner *sr = srunner_create(s); -void hg_debug_sleep(gpointer data); + srunner_run_all(sr, CK_NORMAL); + number_failed = srunner_ntests_failed(sr); + srunner_free(sr); -G_END_DECLS - -#endif /* __HG_DEBUG_H__ */ + return (number_failed == 0 ? EXIT_SUCCESS : EXIT_FAILURE); +} diff --git a/hieroglyph/hgdebug.c b/tests/main.h index 158c117..681c75b 100644 --- a/hieroglyph/hgdebug.c +++ b/tests/main.h @@ -1,10 +1,10 @@ /* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ /* - * hgdebug.c - * Copyright (C) 2006 Akira TAGOH + * main.h + * Copyright (C) 2007 Akira TAGOH * * Authors: - * Akira TAGOH <at@gclab.org> + * Akira TAGOH <akira@tagoh.org> * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -21,24 +21,13 @@ * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ -#ifdef HAVE_CONFIG_H -#include <config.h> -#endif +#ifndef __HIEROGLYPH_TEST_MAIN_H__ +#define __HIEROGLYPH_TEST_MAIN_H__ -#include "hgdebug.h" +#include <check.h> +#define TDEF(fn) START_TEST (test_ ## fn) +#define TEND END_TEST +#define T(fn) tcase_add_test(tc, test_ ## fn) -/* - * Private Functions - */ - -/* - * Public Functions - */ -void -hg_debug_sleep(gpointer data) -{ - guint i = GPOINTER_TO_UINT (data); - - sleep(i); -} +#endif /* __HIEROGLYPH_TEST_MAIN_H__ */ diff --git a/tests/operatorencoding.c b/tests/operatorencoding.c deleted file mode 100644 index 274e08e..0000000 --- a/tests/operatorencoding.c +++ /dev/null @@ -1,20 +0,0 @@ -#include <hieroglyph/operator.h> - -int -main(void) -{ - if (HG_op_setpattern != 225) { - g_print("actual result: setpattern = %d\n", HG_op_store); - return 1; - } - if (HG_op_sym_eq != 256) { - g_print("actual result: /= = %d\n", HG_op_sym_eq); - return 1; - } - if (HG_op_POSTSCRIPT_RESERVED_END != 481) { - g_print("actual result: %d\n", HG_op_POSTSCRIPT_RESERVED_END); - return 1; - } - - return 0; -} diff --git a/tests/scanner.c b/tests/scanner.c deleted file mode 100644 index 575db65..0000000 --- a/tests/scanner.c +++ /dev/null @@ -1,186 +0,0 @@ -#include <stdlib.h> -#include <hieroglyph/hgmem.h> -#include <hieroglyph/hgfile.h> -#include <hieroglyph/hgstack.h> -#include <hieroglyph/hgstring.h> -#include <hieroglyph/hgvaluenode.h> -#include <hieroglyph/scanner.h> -#include <hieroglyph/vm.h> - -void -print_stack(HgStack *stack) -{ - HgValueNode *node; - guint i, depth; - - depth = hg_stack_depth(stack); - for (i = 0; i < depth; i++) { - node = hg_stack_index(stack, depth - i - 1); - switch (HG_VALUE_GET_VALUE_TYPE (node)) { - case HG_TYPE_VALUE_BOOLEAN: - g_print(" bool:%s\n", (HG_VALUE_GET_BOOLEAN (node) ? "true" : "false")); - break; - case HG_TYPE_VALUE_NAME: - if (hg_object_is_executable((HgObject *)node)) - g_print(" name:%s\n", HG_VALUE_GET_NAME (node)); - else - g_print(" name:/%s\n", HG_VALUE_GET_NAME (node)); - break; - case HG_TYPE_VALUE_NULL: - g_print(" null:null\n"); - break; - case HG_TYPE_VALUE_MARK: - g_print(" --mark--\n"); - break; - case HG_TYPE_VALUE_STRING: - g_print(" string:(%s)\n", hg_string_get_string(HG_VALUE_GET_STRING (node))); - break; - case HG_TYPE_VALUE_INTEGER: - g_print(" int:%d\n", HG_VALUE_GET_INTEGER (node)); - break; - case HG_TYPE_VALUE_REAL: - g_print(" real:%f\n", HG_VALUE_GET_REAL (node)); - break; - default: - g_print("pooooo\n"); - break; - } - } -} - -gboolean -test(HgVM *vm, - HgMemPool *pool, - const gchar *expression, - HgValueNode *expected_node) -{ - HgFileObject *file = hg_file_object_new(pool, HG_FILE_TYPE_BUFFER, - HG_FILE_MODE_READ, "*buffer*", - expression, -1); - HgValueNode *node; - HgString *expected_string, *actual_string; - gboolean retval = TRUE; - - expected_string = hg_object_to_string((HgObject *)expected_node); - node = hg_scanner_get_object(vm, file); - if (node != NULL) { - if (expected_node != NULL && - !hg_value_node_compare_content(expected_node, node, 0)) { - actual_string = hg_object_to_string((HgObject *)node); - g_print("Expression: %s, Expected result is %s [%s] but Actual result was %s [%s]\n", - expression, hg_string_get_string(expected_string), - hg_value_node_get_type_name(HG_VALUE_GET_VALUE_TYPE (expected_node)), - hg_string_get_string(actual_string), - hg_value_node_get_type_name(HG_VALUE_GET_VALUE_TYPE (node))); - retval = FALSE; - } else if (expected_node == NULL) { - actual_string = hg_object_to_string((HgObject *)node); - g_print("Expression: %s, Expected result is NULL but Actual result was %s [%s]\n", - expression, - hg_string_get_string(actual_string), - hg_value_node_get_type_name(HG_VALUE_GET_VALUE_TYPE (node))); - retval = FALSE; - } - } else { - if (expected_node != NULL) { - g_print("Expression: %s, Expected result is %s [%s] but failed to parse it.\n", - expression, hg_string_get_string(expected_string), - hg_value_node_get_type_name(HG_VALUE_GET_VALUE_TYPE (expected_node))); - retval = FALSE; - } - } - if (hg_object_is_executable((HgObject *)expected_node) && - !hg_object_is_executable((HgObject *)node)) { - g_print("Expression: %s, Expected an executable, but it was not.\n", - expression); - retval = FALSE; - } else if (!hg_object_is_executable((HgObject *)expected_node) && - hg_object_is_executable((HgObject *)node)) { - g_print("Expression: %s, Expected a non-executable, but it was not.\n", - expression); - retval = FALSE; - } - - return retval; -} - -int -main(void) -{ - HG_MEM_INIT; - - HgVM *vm; - HgMemPool *pool; - HgFileObject *file; - HgValueNode *node; - HgStack *ostack; - - hg_vm_init(); - - vm = hg_vm_new(VM_EMULATION_LEVEL_1); - hg_vm_startjob(vm, NULL, FALSE); - pool = hg_vm_get_current_pool(vm); - ostack = hg_vm_get_ostack(vm); - -#define do_test_null(_vm_, _pool_, _exp_) \ - G_STMT_START { \ - if (!test((_vm_), (_pool_), (_exp_), NULL)) { \ - exit(1); \ - } \ - } G_STMT_END -#define do_test(_vm_, _pool_, _exp_, _type_, _val_) \ - G_STMT_START { \ - HgValueNode *__node__; \ - HG_VALUE_MAKE_ ## _type_ ((_pool_), __node__, (_val_)); \ - if (!test((_vm_), (_pool_), (_exp_), __node__)) { \ - exit(1); \ - } \ - } G_STMT_END -#define do_test_name(_vm_, _pool_, _exp_, _val_, _exec_) \ - G_STMT_START { \ - HgValueNode *__node__; \ - HG_VALUE_MAKE_NAME_STATIC ((_pool_), __node__, (_val_)); \ - if ((_exec_)) \ - hg_object_executable((HgObject *)__node__); \ - if (!test((_vm_), (_pool_), (_exp_), __node__)) { \ - exit(1); \ - } \ - } G_STMT_END - - do_test_name(vm, pool, "/foo", "foo", FALSE); - do_test_name(vm, pool, "true", "true", TRUE); - do_test_name(vm, pool, "false", "false", TRUE); - do_test(vm, pool, "//true", BOOLEAN, TRUE); - do_test(vm, pool, "//false", BOOLEAN, FALSE); - do_test_name(vm, pool, "null", "null", TRUE); - do_test(vm, pool, "//null", NULL, NULL); - do_test(vm, pool, "10050", INTEGER, 10050); - do_test(vm, pool, "2147483647", INTEGER, 2147483647); - do_test(vm, pool, "-2147483648", INTEGER, 0x80000000); - do_test_name(vm, pool, "10a", "10a", TRUE); - do_test(vm, pool, "10.5", REAL, 10.5); - do_test(vm, pool, "-1", INTEGER, -1); - do_test(vm, pool, ".5", REAL, 0.5); - do_test(vm, pool, "-1e10", REAL, -1e+10); - do_test(vm, pool, "10.0E5", REAL, 10.0e5); - do_test_name(vm, pool, "1E", "1E", TRUE); - do_test(vm, pool, "5.2e-2", REAL, 5.2e-2); - do_test(vm, pool, "36#Z", INTEGER, 35); - do_test(vm, pool, "1#0", INTEGER, 0); - do_test_name(vm, pool, "=", "=", TRUE); - do_test_null(vm, pool, " "); - do_test_null(vm, pool, "\n"); - - file = hg_file_object_new(pool, HG_FILE_TYPE_BUFFER, HG_FILE_MODE_READ, "*buffer*", "/foo true false null [moveto (test(test test) test) 10050 10a 10.5 -1 .5 -1e10 10.0E5 1E 5.2e-2 36#Z 1#0 //true 10e2.5 1.0ee10 1..5", -1); - while (!hg_file_object_is_eof(file)) { - node = hg_scanner_get_object(vm, file); - if (node != NULL) { - hg_stack_push(ostack, node); - } - } - print_stack(ostack); - - hg_vm_finalize(); - - return 0; -} diff --git a/tests/snapshot.c b/tests/snapshot.c deleted file mode 100644 index 83aff90..0000000 --- a/tests/snapshot.c +++ /dev/null @@ -1,123 +0,0 @@ -#include <hieroglyph/hgallocator-bfit.h> -#include <hieroglyph/hgmem.h> -#include <hieroglyph/hgarray.h> -#include <hieroglyph/hgfile.h> -#include <hieroglyph/hgvaluenode.h> -#include <hieroglyph/hgstring.h> -#include <hieroglyph/hgdict.h> - - -int -foo(void) -{ - HgAllocator *allocator; - HgMemPool *pool; - HgMemSnapshot *snap; - HgValueNode *node, *key, *val; - HgArray *array; - HgString *string; - HgDict *dict; - - hg_file_init(); - hg_value_node_init(); - allocator = hg_allocator_new(hg_allocator_bfit_get_vtable()); - pool = hg_mem_pool_new(allocator, "test", 256, HG_MEM_RESIZABLE); - if (pool == NULL) { - g_print("Failed to create a pool\n"); - return 1; - } -// g_print("creating array...\n"); - array = hg_array_new(pool, 2); -// g_print("creating string...\n"); - string = hg_string_new(pool, 32); -// g_print("appending string...\n"); - hg_string_append(string, "This is a pen.", -1); -// g_print("creating node...\n"); - HG_VALUE_MAKE_INTEGER (pool, node, 3); -// g_print("appending node to array...\n"); - hg_array_append(array, node); -// g_print("creating node...\n"); - HG_VALUE_MAKE_STRING (node, string); -// g_print("appending node to array...\n"); - hg_array_append(array, node); - dict = hg_dict_new(pool, 2); - HG_VALUE_MAKE_NAME_STATIC (pool, key, "test"); - HG_VALUE_MAKE_BOOLEAN (pool, val, TRUE); - hg_dict_insert(pool, dict, key, val); - - g_print("creating snapshot...\n"); - snap = hg_mem_pool_save_snapshot(pool); - - node = hg_array_index(array, 0); - HG_VALUE_SET_INTEGER (node, 10); - hg_string_insert_c(string, 'a', 2); - hg_string_insert_c(string, 't', 3); - HG_VALUE_MAKE_INTEGER (pool, val, 20); - hg_dict_insert(pool, dict, key, val); - node = hg_dict_lookup(dict, key); - - if (node == NULL || !HG_IS_VALUE_INTEGER (node) || HG_VALUE_GET_INTEGER (node) != 20) { - g_print("Failed to lookup dict.\n"); - return 1; - } - - g_print("restoring snapshot...\n"); - if (!hg_mem_pool_restore_snapshot(pool, snap, 0)) { - g_print("Failed to restore from snapshot.\n"); - return 1; - } - node = hg_array_index(array, 0); - if (!HG_IS_VALUE_INTEGER (node) || HG_VALUE_GET_INTEGER (node) != 3) { - g_print("Failed to restore from snapshot.\n Expected: 3\n Actual: %d\n", HG_VALUE_GET_INTEGER (node)); - return 1; - } - node = hg_array_index(array, 1); - if (!HG_IS_VALUE_STRING (node) || !hg_string_compare_with_raw(HG_VALUE_GET_STRING (node), "That is a pen.", -1)) { - g_print("Failed to restore from snapshot.\n Expected: That is a pen.\n Actual: %s\n", hg_string_get_string(HG_VALUE_GET_STRING (node))); - return 1; - } - node = hg_dict_lookup(dict, key); - - if (node == NULL || !HG_IS_VALUE_BOOLEAN (node) || HG_VALUE_GET_BOOLEAN (node) != TRUE) { - g_print("Failed to lookup dict after restoring.\n"); - return 1; - } - - /* stage 2 */ - g_print("creating snapshot...\n"); - snap = hg_mem_pool_save_snapshot(pool); - string = hg_string_new(pool, 32); - { - HgMemObject *obj; - - hg_mem_get_object__inline(string, obj); - hg_mem_set_lock(obj); - } - if (hg_mem_pool_restore_snapshot(pool, snap, 0)) { - g_print("shouldn't be successful restoring.\n"); - return 1; - } - hg_mem_free(string); - g_print("restoring snapshot...\n"); - if (!hg_mem_pool_restore_snapshot(pool, snap, 0)) { - g_print("Failed to restore from snapshot.\n"); - return 1; - } - - hg_mem_pool_destroy(pool); - hg_allocator_destroy(allocator); - hg_value_node_finalize(); - hg_file_finalize(); - hg_mem_finalize(); - - return 0; -} - -int -main(void) -{ - HG_MEM_INIT; - - - return foo(); -} diff --git a/tests/vm.c b/tests/vm.c deleted file mode 100644 index 3dd5239..0000000 --- a/tests/vm.c +++ /dev/null @@ -1,36 +0,0 @@ -#include <hieroglyph/hgmem.h> -#include <hieroglyph/hgstack.h> -#include <hieroglyph/hgvaluenode.h> -#include <hieroglyph/vm.h> - -int -main(void) -{ - HG_MEM_INIT; - - HgVM *vm; - HgStack *e, *o; - HgValueNode *node; - HgMemPool *pool; - - hg_vm_init(); - - vm = hg_vm_new(VM_EMULATION_LEVEL_1); - hg_vm_startjob(vm, NULL, FALSE); - - pool = hg_vm_get_current_pool(vm); - e = hg_vm_get_estack(vm); - o = hg_vm_get_ostack(vm); - node = hg_vm_get_name_node(vm, "add"); - hg_object_executable((HgObject *)node); - hg_stack_push(e, node); - HG_VALUE_MAKE_INTEGER (pool, node, 2); - hg_stack_push(o, node); - HG_VALUE_MAKE_INTEGER (pool, node, 1); - hg_stack_push(o, node); - hg_vm_main(vm); - - hg_vm_finalize(); - - return 0; -} |