Array.c
上传用户:liugui
上传日期:2007-01-04
资源大小:822k
文件大小:3k
源码类别:

代理服务器

开发平台:

Unix_Linux

  1. /*
  2.  * $Id: Array.c,v 1.3 1998/07/22 20:36:32 wessels Exp $
  3.  *
  4.  * AUTHOR: Alex Rousskov
  5.  *
  6.  * SQUID Internet Object Cache  http://squid.nlanr.net/Squid/
  7.  * ----------------------------------------------------------
  8.  *
  9.  *  Squid is the result of efforts by numerous individuals from the
  10.  *  Internet community.  Development is led by Duane Wessels of the
  11.  *  National Laboratory for Applied Network Research and funded by the
  12.  *  National Science Foundation.  Squid is Copyrighted (C) 1998 by
  13.  *  Duane Wessels and the University of California San Diego.  Please
  14.  *  see the COPYRIGHT file for full details.  Squid incorporates
  15.  *  software developed and/or copyrighted by other sources.  Please see
  16.  *  the CREDITS file for full details.
  17.  *
  18.  *  This program is free software; you can redistribute it and/or modify
  19.  *  it under the terms of the GNU General Public License as published by
  20.  *  the Free Software Foundation; either version 2 of the License, or
  21.  *  (at your option) any later version.
  22.  *  
  23.  *  This program is distributed in the hope that it will be useful,
  24.  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
  25.  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  26.  *  GNU General Public License for more details.
  27.  *  
  28.  *  You should have received a copy of the GNU General Public License
  29.  *  along with this program; if not, write to the Free Software
  30.  *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111, USA.
  31.  *
  32.  */
  33. /*
  34.  * Array is an array of (void*) items with unlimited capacity
  35.  *
  36.  * Array grows when arrayAppend() is called and no space is left
  37.  * Currently, array does not have an interface for deleting an item because
  38.  *     we do not need such an interface yet.
  39.  */
  40. #include "config.h"
  41. #if HAVE_ASSERT_H
  42. #include <assert.h>
  43. #endif
  44. #if HAVE_STRING_H
  45. #include <string.h>
  46. #endif
  47. #include "util.h"
  48. #include "Array.h"
  49. static void arrayGrow(Array * a, int min_capacity);
  50. Array *
  51. arrayCreate()
  52. {
  53.     Array *a = xmalloc(sizeof(Array));
  54.     arrayInit(a);
  55.     return a;
  56. }
  57. void
  58. arrayInit(Array * a)
  59. {
  60.     assert(a);
  61.     memset(a, 0, sizeof(Array));
  62. }
  63. void
  64. arrayClean(Array * a)
  65. {
  66.     assert(a);
  67.     /* could also warn if some objects are left */
  68.     xfree(a->items);
  69.     a->items = NULL;
  70. }
  71. void
  72. arrayDestroy(Array * a)
  73. {
  74.     assert(a);
  75.     arrayClean(a);
  76.     xfree(a);
  77. }
  78. void
  79. arrayAppend(Array * a, void *obj)
  80. {
  81.     assert(a);
  82.     if (a->count >= a->capacity)
  83. arrayGrow(a, a->count+1);
  84.     a->items[a->count++] = obj;
  85. }
  86. /* if you are going to append a known and large number of items, call this first */
  87. void
  88. arrayPreAppend(Array * a, int app_count)
  89. {
  90.     assert(a);
  91.     if (a->count + app_count > a->capacity)
  92. arrayGrow(a, a->count + app_count);
  93. }
  94. /* grows internal buffer to satisfy required minimal capacity */
  95. static void
  96. arrayGrow(Array * a, int min_capacity)
  97. {
  98.     const int min_delta = 16;
  99.     int delta;
  100.     assert(a->capacity < min_capacity);
  101.     delta = min_capacity;
  102.     /* make delta a multiple of min_delta */
  103.     delta += min_delta-1;
  104.     delta /= min_delta;
  105.     delta *= min_delta;
  106.     /* actual grow */
  107.     assert(delta > 0);
  108.     a->capacity += delta;
  109.     a->items = a->items ?
  110. xrealloc(a->items, a->capacity * sizeof(void*)) :
  111. xmalloc(a->capacity * sizeof(void*));
  112.     /* reset, just in case */
  113.     memset(a->items+a->count, 0, (a->capacity-a->count) * sizeof(void*));
  114. }