Files
harbour-core/harbour/external/libhpdf/hpdf_mmgr.c
Viktor Szakats c356496480 2009-03-29 11:02 UTC+0200 Viktor Szakats (harbour.01 syenar hu)
* INSTALL
  * external/Makefile
  + external/libhpdf/*
  + external/libpng/*
    + Added libharu and libpng to Harbour repository.
      Now it's possible to use libhpdf as static lib on all
      platforms. This is useful because this lib isn't yet part
      of Linux distros.
      libpng is only built for win/dos/os2 platforms.
      It's possible to override libpng location by using
      HB_INC_LIBPNG envvar.

  * contrib/hbhpdf/Makefile
    + Look for libharu headers in /external dir.

  * external/sqlite3/Makefile
    - Disabled for bcc. Latest sqlite3 version breaks with this compiler:
      ---
      Error E2293 ../../sqlite3.c 29156: ) expected in function winCurrentTime
      Warning W8013 ../../sqlite3.c 29157: Possible use of 'timeW' before definition in function winCurrentTime
      Error E2379 ../../sqlite3.c 29157: Statement missing ; in function winCurrentTime
      Error E2379 ../../sqlite3.c 29158: Statement missing ; in function winCurrentTime
      Error E2379 ../../sqlite3.c 29160: Statement missing ; in function winCurrentTime
      Error E2293 ../../sqlite3.c 29161: ) expected in function winCurrentTime
      Error E2379 ../../sqlite3.c 29162: Statement missing ; in function winCurrentTime
      Error E2293 ../../sqlite3.c 29163: ) expected in function winCurrentTime
      Warning W8057 ../../sqlite3.c 29171: Parameter 'prNow' is never used in function winCurrentTime
      *** 7 errors in Compile ***
      ---
      bcc users can report this problem here:
      http://www.sqlite.org/cvstrac/tktnew

  + tests/bnch_win.bat
  - tests/bnchmark
    * Moved bnch_win.bat to tests.
2009-03-29 09:09:24 +00:00

251 lines
5.8 KiB
C

/*
* << Haru Free PDF Library >> -- hpdf_mmgr.c
*
* URL: http://libharu.org
*
* Copyright (c) 1999-2006 Takeshi Kanno <takeshi_kanno@est.hi-ho.ne.jp>
* Copyright (c) 2007-2008 Antony Dovgal <tony@daylessday.org>
*
* Permission to use, copy, modify, distribute and sell this software
* and its documentation for any purpose is hereby granted without fee,
* provided that the above copyright notice appear in all copies and
* that both that copyright notice and this permission notice appear
* in supporting documentation.
* It is provided "as is" without express or implied warranty.
*
*/
#include "hpdf_conf.h"
#include "hpdf_consts.h"
#include "hpdf_mmgr.h"
#include "hpdf_utils.h"
#ifndef HPDF_STDCALL
#ifdef HPDF_DLL_MAKE
#define HPDF_STDCALL __stdcall
#else
#ifdef HPDF_DLL
#define HPDF_STDCALL __stdcall
#else
#define HPDF_STDCALL
#endif
#endif
#endif
static void * HPDF_STDCALL
InternalGetMem (HPDF_UINT size);
static void HPDF_STDCALL
InternalFreeMem (void* aptr);
HPDF_MMgr
HPDF_MMgr_New (HPDF_Error error,
HPDF_UINT buf_size,
HPDF_Alloc_Func alloc_fn,
HPDF_Free_Func free_fn)
{
HPDF_MMgr mmgr;
HPDF_PTRACE((" HPDF_MMgr_New\n"));
if (alloc_fn)
mmgr = (HPDF_MMgr)alloc_fn (sizeof(HPDF_MMgr_Rec));
else
mmgr = (HPDF_MMgr)InternalGetMem (sizeof(HPDF_MMgr_Rec));
HPDF_PTRACE(("+%p mmgr-new\n", mmgr));
if (mmgr != NULL) {
/* initialize mmgr object */
mmgr->error = error;
#ifdef HPDF_MEM_DEBUG
mmgr->alloc_cnt = 0;
mmgr->free_cnt = 0;
#endif
/*
* if alloc_fn and free_fn are specified, these function is
* used. if not, default function (maybe these will be "malloc" and
* "free") is used.
*/
if (alloc_fn && free_fn) {
mmgr->alloc_fn = alloc_fn;
mmgr->free_fn = free_fn;
} else {
mmgr->alloc_fn = InternalGetMem;
mmgr->free_fn = InternalFreeMem;
}
/*
* if buf_size parameter is specified, this object is configured
* to be using memory-pool.
*
*/
if (!buf_size)
mmgr->mpool = NULL;
else {
HPDF_MPool_Node node;
node = (HPDF_MPool_Node)mmgr->alloc_fn (sizeof(HPDF_MPool_Node_Rec) +
buf_size);
HPDF_PTRACE(("+%p mmgr-node-new\n", node));
if (node == NULL) {
HPDF_SetError (error, HPDF_FAILD_TO_ALLOC_MEM, HPDF_NOERROR);
mmgr->free_fn(mmgr);
mmgr = NULL;
} else {
mmgr->mpool = node;
node->buf = (HPDF_BYTE *)node + sizeof(HPDF_MPool_Node_Rec);
node->size = buf_size;
node->used_size = 0;
node->next_node = NULL;
}
#ifdef HPDF_MEM_DEBUG
if (mmgr) {
mmgr->alloc_cnt += 1;
}
#endif
}
if (mmgr) {
mmgr->buf_size = buf_size;
}
} else
HPDF_SetError(error, HPDF_FAILD_TO_ALLOC_MEM, HPDF_NOERROR);
return mmgr;
}
void
HPDF_MMgr_Free (HPDF_MMgr mmgr)
{
HPDF_MPool_Node node;
HPDF_PTRACE((" HPDF_MMgr_Free\n"));
if (mmgr == NULL)
return;
node = mmgr->mpool;
/* delete all nodes recursively */
while (node != NULL) {
HPDF_MPool_Node tmp = node;
node = tmp->next_node;
HPDF_PTRACE(("-%p mmgr-node-free\n", tmp));
mmgr->free_fn (tmp);
#ifdef HPDF_MEM_DEBUG
mmgr->free_cnt++;
#endif
}
#ifdef HPDF_MEM_DEBUG
HPDF_PRINTF ("# HPDF_MMgr alloc-cnt=%u, free-cnt=%u\n",
mmgr->alloc_cnt, mmgr->free_cnt);
if (mmgr->alloc_cnt != mmgr->free_cnt)
HPDF_PRINTF ("# ERROR #\n");
#endif
HPDF_PTRACE(("-%p mmgr-free\n", mmgr));
mmgr->free_fn (mmgr);
}
void*
HPDF_GetMem (HPDF_MMgr mmgr,
HPDF_UINT size)
{
void * ptr;
if (mmgr->mpool) {
HPDF_MPool_Node node = mmgr->mpool;
#ifdef HPDF_ALINMENT_SIZ
size = (size + (HPDF_ALINMENT_SIZ - 1)) / HPDF_ALINMENT_SIZ;
size *= HPDF_ALINMENT_SIZ;
#endif
if (node->size - node->used_size >= size) {
ptr = (HPDF_BYTE*)node->buf + node->used_size;
node->used_size += size;
return ptr;
} else {
HPDF_UINT tmp_buf_siz = (mmgr->buf_size < size) ? size :
mmgr->buf_size;
node = (HPDF_MPool_Node)mmgr->alloc_fn (sizeof(HPDF_MPool_Node_Rec)
+ tmp_buf_siz);
HPDF_PTRACE(("+%p mmgr-new-node\n", node));
if (!node) {
HPDF_SetError (mmgr->error, HPDF_FAILD_TO_ALLOC_MEM,
HPDF_NOERROR);
return NULL;
}
node->size = tmp_buf_siz;
}
node->next_node = mmgr->mpool;
mmgr->mpool = node;
node->used_size = size;
node->buf = (HPDF_BYTE*)node + sizeof(HPDF_MPool_Node_Rec);
ptr = node->buf;
} else {
ptr = mmgr->alloc_fn (size);
HPDF_PTRACE(("+%p mmgr-alloc_fn size=%u\n", ptr, size));
if (ptr == NULL)
HPDF_SetError (mmgr->error, HPDF_FAILD_TO_ALLOC_MEM, HPDF_NOERROR);
}
#ifdef HPDF_MEM_DEBUG
if (ptr)
mmgr->alloc_cnt++;
#endif
return ptr;
}
void
HPDF_FreeMem (HPDF_MMgr mmgr,
void *aptr)
{
if (!aptr)
return;
if (!mmgr->mpool) {
HPDF_PTRACE(("-%p mmgr-free-mem\n", aptr));
mmgr->free_fn(aptr);
#ifdef HPDF_MEM_DEBUG
mmgr->free_cnt++;
#endif
}
return;
}
static void * HPDF_STDCALL
InternalGetMem (HPDF_UINT size)
{
return HPDF_MALLOC (size);
}
static void HPDF_STDCALL
InternalFreeMem (void* aptr)
{
HPDF_FREE (aptr);
}