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

Web服务器

开发平台:

Unix_Linux

  1. /*
  2. ** table.c
  3. **
  4. ** Copyright (c) 1995 Peter Eriksson <pen@signum.se>
  5. **
  6. ** This program is free software; you can redistribute it and/or modify
  7. ** it under the terms of the GNU General Public License as published by
  8. ** the Free Software Foundation; either version 2 of the License, or
  9. ** (at your option) any later version.
  10. **
  11. ** This program is distributed in the hope that it will be useful,
  12. ** but WITHOUT ANY WARRANTY; without even the implied warranty of
  13. ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  14. ** GNU General Public License for more details.
  15. ** You should have received a copy of the GNU General Public License
  16. ** along with this program; if not, write to the Free Software
  17. ** Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  18. */
  19. #include <stdlib.h>
  20. #include <string.h>
  21. #include <synch.h>
  22. #include "phttpd.h"
  23. struct table *tbl_create(int size_hint)
  24. {
  25.     struct table *tp;
  26.     if (size_hint <= 0)
  27. size_hint = 32;
  28.     
  29.     tp = s_malloc(sizeof(struct table));
  30.     tp->value = s_malloc((tp->size = size_hint)*sizeof(void *));
  31.     tp->length = 0;
  32.     
  33.     mutex_init(&tp->lock, USYNC_THREAD, NULL);
  34.     
  35.     return tp;
  36. }
  37. void tbl_free(struct table *tp,
  38.       void (*val_free)(void *val))
  39. {
  40.     int i;
  41.     
  42.     for (i = 0; i < tp->length; i++)
  43. (*val_free)(tp->value[i]);
  44.     
  45.     mutex_destroy(&tp->lock);
  46.     
  47.     s_free(tp->value);
  48.     s_free(tp);
  49. }
  50. int tbl_insert(struct table *tp, int pos, void *value)
  51. {
  52.     int i;
  53.     mutex_lock(&tp->lock);
  54.     
  55.     if (tp->length == tp->size)
  56.     {
  57. int new_size;
  58. if (pos >= tp->size)
  59.     new_size = pos + 32;
  60. else
  61.     new_size = tp->size + 32;
  62. tp->value = s_realloc(tp->value, new_size*sizeof(void *));
  63. tp->size  = new_size;
  64.     }
  65.     for (i = tp->length; i > pos; i--)
  66. tp->value[i] = tp->value[i-1];
  67.     
  68.     tp->value[pos] = value;
  69.     mutex_unlock(&tp->lock);
  70.     
  71.     return ++tp->length;
  72. }
  73. int tbl_delete(struct table *tp, int pos)
  74. {
  75.     int i;
  76.     mutex_lock(&tp->lock);
  77.     for (i = pos; i < tp->length - 1; i++)
  78. tp->value[i] = tp->value[i+1];
  79.     tp->value[i] = NULL;
  80.     
  81.     mutex_unlock(&tp->lock);
  82.     
  83.     return --tp->length;
  84. }
  85. int tbl_prepend(struct table *tp, void *value)
  86. {
  87.     return tbl_insert(tp, 0, value);
  88. }
  89. int tbl_append(struct table *tp, void *value)
  90. {
  91.     return tbl_insert(tp, tp->length, value);
  92. }
  93. int tbl_foreach(struct table *tp,
  94. int (*fcnp)(void *value, void *misc),
  95. void *misc)
  96. {
  97.     int i, status;
  98.     
  99.     mutex_lock(&tp->lock);
  100.     status = 0;
  101.     for (i = 0; i < tp->length; i++)
  102. if ((status = (*fcnp)(tp->value[i], misc)) != 0)
  103.     break;
  104.     
  105.     mutex_unlock(&tp->lock);
  106.     
  107.     return status;
  108. }