Blame libs/gst/check/libcheck/check_list.c

Packit a6ee4b
/*
Packit a6ee4b
 * Check: a unit test framework for C
Packit a6ee4b
 * Copyright (C) 2001, 2002 Arien Malec
Packit a6ee4b
 *
Packit a6ee4b
 * This library is free software; you can redistribute it and/or
Packit a6ee4b
 * modify it under the terms of the GNU Lesser General Public
Packit a6ee4b
 * License as published by the Free Software Foundation; either
Packit a6ee4b
 * version 2.1 of the License, or (at your option) any later version.
Packit a6ee4b
 *
Packit a6ee4b
 * This library is distributed in the hope that it will be useful,
Packit a6ee4b
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit a6ee4b
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
Packit a6ee4b
 * Lesser General Public License for more details.
Packit a6ee4b
 *
Packit a6ee4b
 * You should have received a copy of the GNU Lesser General Public
Packit a6ee4b
 * License along with this library; if not, write to the
Packit a6ee4b
 * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston,
Packit a6ee4b
 * MA 02110-1301, USA.
Packit a6ee4b
 */
Packit a6ee4b
Packit a6ee4b
#include "libcompat/libcompat.h"
Packit a6ee4b
Packit a6ee4b
#include <stdlib.h>
Packit a6ee4b
#include <string.h>
Packit a6ee4b
Packit a6ee4b
#include "check_list.h"
Packit a6ee4b
#include "check_error.h"
Packit a6ee4b
Packit a6ee4b
Packit a6ee4b
enum
Packit a6ee4b
{
Packit a6ee4b
  LINIT = 1,
Packit a6ee4b
  LGROW = 2
Packit a6ee4b
};
Packit a6ee4b
Packit a6ee4b
struct List
Packit a6ee4b
{
Packit a6ee4b
  unsigned int n_elts;
Packit a6ee4b
  unsigned int max_elts;
Packit a6ee4b
  int current;                  /* pointer to the current node */
Packit a6ee4b
  int last;                     /* pointer to the node before END */
Packit a6ee4b
  void **data;
Packit a6ee4b
};
Packit a6ee4b
Packit a6ee4b
static void
Packit a6ee4b
maybe_grow (List * lp)
Packit a6ee4b
{
Packit a6ee4b
  if (lp->n_elts >= lp->max_elts) {
Packit a6ee4b
    lp->max_elts *= LGROW;
Packit a6ee4b
    lp->data =
Packit a6ee4b
        (void **) erealloc (lp->data, lp->max_elts * sizeof (lp->data[0]));
Packit a6ee4b
  }
Packit a6ee4b
}
Packit a6ee4b
Packit a6ee4b
List *
Packit a6ee4b
check_list_create (void)
Packit a6ee4b
{
Packit a6ee4b
  List *lp;
Packit a6ee4b
Packit a6ee4b
  lp = (List *) emalloc (sizeof (List));
Packit a6ee4b
  lp->n_elts = 0;
Packit a6ee4b
  lp->max_elts = LINIT;
Packit a6ee4b
  lp->data = (void **) emalloc (sizeof (lp->data[0]) * LINIT);
Packit a6ee4b
  lp->current = lp->last = -1;
Packit a6ee4b
  return lp;
Packit a6ee4b
}
Packit a6ee4b
Packit a6ee4b
void
Packit a6ee4b
check_list_add_front (List * lp, void *val)
Packit a6ee4b
{
Packit a6ee4b
  if (lp == NULL)
Packit a6ee4b
    return;
Packit a6ee4b
  maybe_grow (lp);
Packit a6ee4b
  memmove (lp->data + 1, lp->data, lp->n_elts * sizeof lp->data[0]);
Packit a6ee4b
  lp->last++;
Packit a6ee4b
  lp->n_elts++;
Packit a6ee4b
  lp->current = 0;
Packit a6ee4b
  lp->data[lp->current] = val;
Packit a6ee4b
}
Packit a6ee4b
Packit a6ee4b
void
Packit a6ee4b
check_list_add_end (List * lp, void *val)
Packit a6ee4b
{
Packit a6ee4b
  if (lp == NULL)
Packit a6ee4b
    return;
Packit a6ee4b
  maybe_grow (lp);
Packit a6ee4b
  lp->last++;
Packit a6ee4b
  lp->n_elts++;
Packit a6ee4b
  lp->current = lp->last;
Packit a6ee4b
  lp->data[lp->current] = val;
Packit a6ee4b
}
Packit a6ee4b
Packit a6ee4b
int
Packit a6ee4b
check_list_at_end (List * lp)
Packit a6ee4b
{
Packit a6ee4b
  if (lp->current == -1)
Packit a6ee4b
    return 1;
Packit a6ee4b
  else
Packit a6ee4b
    return (lp->current > lp->last);
Packit a6ee4b
}
Packit a6ee4b
Packit a6ee4b
void
Packit a6ee4b
check_list_front (List * lp)
Packit a6ee4b
{
Packit a6ee4b
  if (lp->current == -1)
Packit a6ee4b
    return;
Packit a6ee4b
  lp->current = 0;
Packit a6ee4b
}
Packit a6ee4b
Packit a6ee4b
Packit a6ee4b
void
Packit a6ee4b
check_list_free (List * lp)
Packit a6ee4b
{
Packit a6ee4b
  if (lp == NULL)
Packit a6ee4b
    return;
Packit a6ee4b
Packit a6ee4b
  free (lp->data);
Packit a6ee4b
  free (lp);
Packit a6ee4b
}
Packit a6ee4b
Packit a6ee4b
void *
Packit a6ee4b
check_list_val (List * lp)
Packit a6ee4b
{
Packit a6ee4b
  if (lp == NULL)
Packit a6ee4b
    return NULL;
Packit a6ee4b
  if (lp->current == -1 || lp->current > lp->last)
Packit a6ee4b
    return NULL;
Packit a6ee4b
Packit a6ee4b
  return lp->data[lp->current];
Packit a6ee4b
}
Packit a6ee4b
Packit a6ee4b
void
Packit a6ee4b
check_list_advance (List * lp)
Packit a6ee4b
{
Packit a6ee4b
  if (lp == NULL)
Packit a6ee4b
    return;
Packit a6ee4b
  if (check_list_at_end (lp))
Packit a6ee4b
    return;
Packit a6ee4b
  lp->current++;
Packit a6ee4b
}
Packit a6ee4b
Packit a6ee4b
Packit a6ee4b
void
Packit a6ee4b
check_list_apply (List * lp, void (*fp) (void *))
Packit a6ee4b
{
Packit a6ee4b
  if (lp == NULL || fp == NULL)
Packit a6ee4b
    return;
Packit a6ee4b
Packit a6ee4b
  for (check_list_front (lp); !check_list_at_end (lp); check_list_advance (lp))
Packit a6ee4b
    fp (check_list_val (lp));
Packit a6ee4b
Packit a6ee4b
}
Packit a6ee4b
Packit a6ee4b
bool
Packit a6ee4b
check_list_contains (List * lp, void *val)
Packit a6ee4b
{
Packit a6ee4b
  for (check_list_front (lp); !check_list_at_end (lp); check_list_advance (lp)) {
Packit a6ee4b
    if (check_list_val (lp) == val) {
Packit a6ee4b
      return true;
Packit a6ee4b
    }
Packit a6ee4b
  }
Packit a6ee4b
Packit a6ee4b
  return false;
Packit a6ee4b
}