File:  [ELWIX - Embedded LightWeight unIX -] / embedaddon / iftop / vector.c
Revision 1.1.1.1 (vendor branch): download - view: text, annotated - select for diffs - revision graph
Tue Feb 21 16:57:34 2012 UTC (12 years, 3 months ago) by misho
Branches: iftop, MAIN
CVS tags: v1_0rc4, v0_17p0, v0_17, HEAD
iftop

    1: /*
    2:  * vector.c:
    3:  * simple vectors
    4:  *
    5:  * Copyright (c) 2001 Chris Lightfoot. All rights reserved.
    6:  *
    7:  */
    8: 
    9: static const char rcsid[] = "$Id: vector.c,v 1.1.1.1 2012/02/21 16:57:34 misho Exp $";
   10: 
   11: #ifdef HAVE_CONFIG_H
   12: /*include "configuration.h"*/
   13: #endif /* HAVE_CONFIG_H */
   14: 
   15: #include <stdlib.h>
   16: #include <string.h>
   17: 
   18: #include "vector.h"
   19: #include "iftop.h"
   20: 
   21: vector vector_new(void) {
   22:     vector v;
   23:     
   24:     v = xcalloc(1, sizeof *v);
   25:     if (!v) return NULL;
   26: 
   27:     v->ary = xcalloc(16, sizeof *v->ary);
   28:     v->n = 16;
   29:     v->n_used = 0;
   30:     return v;
   31: }
   32: 
   33: void vector_delete(vector v) {
   34:     xfree(v->ary);
   35:     xfree(v);
   36: }
   37: 
   38: void vector_delete_free(vector v) {
   39:     item *i;
   40:     vector_iterate(v, i) {
   41:         xfree(i->v);
   42:     }
   43:     xfree(v->ary);
   44:     xfree(v);
   45: }
   46: 
   47: void vector_push_back(vector v, const item t) {
   48:     if (v->n_used == v->n) vector_reallocate(v, v->n * 2);
   49:     v->ary[v->n_used++] = t;
   50: }
   51: 
   52: void vector_pop_back(vector v) {
   53:     if (v->n_used > 0) {
   54:         --v->n_used;
   55:         if (v->n_used < v->n / 2) vector_reallocate(v, v->n / 2);
   56:     }
   57: }
   58: 
   59: item vector_back(vector v) {
   60:     return v->ary[v->n_used - 1];
   61: }
   62: 
   63: item *vector_remove(vector v, item *t) {
   64:     if (t >= v->ary + v->n_used) return NULL;
   65:     if (t < v->ary + v->n_used - 1)
   66:         memmove(t, t + 1, (v->n_used - (t - v->ary)) * sizeof(item));
   67:     memset(v->ary + v->n_used--, 0, sizeof(item));
   68:     if (v->n_used < v->n / 2 && v->n > 16) {
   69:         size_t i = t - v->ary;
   70:         vector_reallocate(v, v->n / 2);
   71:         t = v->ary + i;
   72:     }
   73:     return t;
   74: }
   75: 
   76: void vector_reallocate(vector v, const size_t n) {
   77:     if (n < v->n_used || n <= 0) return;
   78:     v->ary = xrealloc(v->ary, n * sizeof(item));
   79:     memset(v->ary + v->n_used, 0, (v->n - v->n_used) * sizeof(item));
   80:     v->n = n;
   81: }

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>