Blame stack.c

Packit Service 80a84b
/*
Packit Service 80a84b
	Copyright(C) 2016, Red Hat, Inc., Stanislav Kozina
Packit Service 80a84b
Packit Service 80a84b
	This program is free software: you can redistribute it and/or modify
Packit Service 80a84b
	it under the terms of the GNU General Public License as published by
Packit Service 80a84b
	the Free Software Foundation, either version 3 of the License, or
Packit Service 80a84b
	(at your option) any later version.
Packit Service 80a84b
Packit Service 80a84b
	This program is distributed in the hope that it will be useful,
Packit Service 80a84b
	but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit Service 80a84b
	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
Packit Service 80a84b
	GNU General Public License for more details.
Packit Service 80a84b
Packit Service 80a84b
	You should have received a copy of the GNU General Public License
Packit Service 80a84b
	along with this program.  If not, see <http://www.gnu.org/licenses/>.
Packit Service 80a84b
*/
Packit Service 80a84b
Packit Service 80a84b
/*
Packit Service 80a84b
 * A trivial stack implementation.
Packit Service 80a84b
 */
Packit Service 80a84b
Packit Service 80a84b
#include <stdio.h>
Packit Service 80a84b
#include <stdlib.h>
Packit Service 80a84b
#include <stdbool.h>
Packit Service 80a84b
#include <string.h>
Packit Service 80a84b
Packit Service 80a84b
#include "utils.h"
Packit Service 80a84b
#include "stack.h"
Packit Service 80a84b
Packit Service 80a84b
#define	INIT_CAPACITY	10
Packit Service 80a84b
Packit Service 80a84b
stack_t *stack_init(void)
Packit Service 80a84b
{
Packit Service 80a84b
	stack_t *st = safe_zmalloc(sizeof(*st));
Packit Service 80a84b
Packit Service 80a84b
	st->st_capacity = INIT_CAPACITY;
Packit Service 80a84b
	st->st_count = 0;
Packit Service 80a84b
	st->st_data = safe_zmalloc(st->st_capacity * sizeof(*st->st_data));
Packit Service 80a84b
Packit Service 80a84b
	return st;
Packit Service 80a84b
}
Packit Service 80a84b
Packit Service 80a84b
void stack_destroy(stack_t *st)
Packit Service 80a84b
{
Packit Service 80a84b
	if (st->st_count > 0)
Packit Service 80a84b
		fail("Stack not empty!\n");
Packit Service 80a84b
Packit Service 80a84b
	free(st->st_data);
Packit Service 80a84b
	(void) memset(st, 0, sizeof(*st));
Packit Service 80a84b
	free(st);
Packit Service 80a84b
}
Packit Service 80a84b
Packit Service 80a84b
void stack_push(stack_t *st, void *data)
Packit Service 80a84b
{
Packit Service 80a84b
	if (st->st_count == st->st_capacity) {
Packit Service 80a84b
		st->st_capacity *= 2;
Packit Service 80a84b
		st->st_data = realloc(st->st_data,
Packit Service 80a84b
		    st->st_capacity * sizeof(*st->st_data));
Packit Service 80a84b
	}
Packit Service 80a84b
Packit Service 80a84b
	st->st_data[st->st_count] = data;
Packit Service 80a84b
	st->st_count++;
Packit Service 80a84b
}
Packit Service 80a84b
Packit Service 80a84b
void *stack_pop(stack_t *st)
Packit Service 80a84b
{
Packit Service 80a84b
	if (st->st_count == 0)
Packit Service 80a84b
		return NULL;
Packit Service 80a84b
Packit Service 80a84b
	st->st_count--;
Packit Service 80a84b
	return st->st_data[st->st_count];
Packit Service 80a84b
}
Packit Service 80a84b
Packit Service 80a84b
void *stack_head(stack_t *st)
Packit Service 80a84b
{
Packit Service 80a84b
	if (st->st_count == 0)
Packit Service 80a84b
		return NULL;
Packit Service 80a84b
Packit Service 80a84b
	return st->st_data[st->st_count-1];
Packit Service 80a84b
}
Packit Service 80a84b
Packit Service 80a84b
void walk_stack(stack_t *st, void (*cb)(void *, void *), void *arg)
Packit Service 80a84b
{
Packit Service 80a84b
	unsigned int i;
Packit Service 80a84b
Packit Service 80a84b
	for (i = 0; i < st->st_count; i++)
Packit Service 80a84b
		cb(st->st_data[i], arg);
Packit Service 80a84b
}
Packit Service 80a84b
Packit Service 80a84b
void walk_stack_backward(stack_t *st, void (*cb)(void *, void *), void *arg)
Packit Service 80a84b
{
Packit Service 80a84b
	unsigned int i;
Packit Service 80a84b
Packit Service 80a84b
	for (i = st->st_count; i > 0; i--)
Packit Service 80a84b
		cb(st->st_data[i - 1], arg);
Packit Service 80a84b
}