wsfalloc.c
上传用户:gzpyjq
上传日期:2013-01-31
资源大小:1852k
文件大小:3k
源码类别:

手机WAP编程

开发平台:

WINDOWS

  1. /*
  2.  *
  3.  * wsfalloc.c
  4.  *
  5.  * Author: Markku Rossi <mtr@iki.fi>
  6.  *
  7.  * Copyright (c) 1999-2000 WAPIT OY LTD.
  8.  *  All rights reserved.
  9.  *
  10.  * Fast memory allocation routines.
  11.  *
  12.  */
  13. #include "wsint.h"
  14. /********************* Global functions *********************************/
  15. WsFastMalloc *ws_f_create(size_t block_size)
  16. {
  17.     WsFastMalloc *pool = ws_calloc(1, sizeof(WsFastMalloc));
  18.     if (pool == NULL)
  19.         return NULL;
  20.     pool->block_size = block_size;
  21.     return pool;
  22. }
  23. void ws_f_destroy(WsFastMalloc *pool)
  24. {
  25.     WsFastMallocBlock *b, *bnext;
  26.     if (pool == NULL)
  27.         return;
  28.     for (b = pool->blocks; b; b = bnext) {
  29.         bnext = b->next;
  30.         ws_free(b);
  31.     }
  32.     ws_free(pool);
  33. }
  34. void *ws_f_malloc(WsFastMalloc *pool, size_t size)
  35. {
  36.     unsigned char *result;
  37.     /* Keep the blocks aligned, because this function is used to allocate
  38.      * space for structures containing longs and such. */
  39.     if (size % sizeof(long) != 0) {
  40.         size += sizeof(long) - (size % sizeof(long));
  41.     }
  42.     if (pool->size < size) {
  43.         size_t alloc_size;
  44.         WsFastMallocBlock *b;
  45.         /* Must allocate a fresh block. */
  46.         alloc_size = pool->block_size;
  47.         if (alloc_size < size)
  48.             alloc_size = size;
  49.         /* Allocate the block and remember to add the header size. */
  50.         b = ws_malloc(alloc_size + sizeof(WsFastMallocBlock));
  51.         if (b == NULL)
  52.             /* No memory available. */
  53.             return NULL;
  54.         /* Add this block to the memory pool. */
  55.         b->next = pool->blocks;
  56.         pool->blocks = b;
  57.         pool->ptr = ((unsigned char *) b) + sizeof(WsFastMallocBlock);
  58.         pool->size = alloc_size;
  59.     }
  60.     /* Now we can allocate `size' bytes of data from this pool. */
  61.     result = pool->ptr;
  62.     pool->ptr += size;
  63.     pool->size -= size;
  64.     pool->user_bytes_allocated += size;
  65.     return result;
  66. }
  67. void *ws_f_calloc(WsFastMalloc *pool, size_t num, size_t size)
  68. {
  69.     void *p = ws_f_malloc(pool, num * size);
  70.     if (p == NULL)
  71.         return p;
  72.     memset(p, 0, num * size);
  73.     return p;
  74. }
  75. void *ws_f_memdup(WsFastMalloc *pool, const void *ptr, size_t size)
  76. {
  77.     unsigned char *d = ws_f_malloc(pool, size + 1);
  78.     if (d == NULL)
  79.         return NULL;
  80.     memcpy(d, ptr, size);
  81.     d[size] = '';
  82.     return d;
  83. }
  84. void *ws_f_strdup(WsFastMalloc *pool, const char *str)
  85. {
  86.     size_t len;
  87.     char *s;
  88.     if (str == NULL)
  89.         return NULL;
  90.     len = strlen(str) + 1;
  91.     s = ws_f_malloc(pool, len);
  92.     if (s == NULL)
  93.         return NULL;
  94.     memcpy(s, str, len);
  95.     return s;
  96. }