Add array utility functions
This commit is contained in:
parent
f6ed7844e1
commit
37bc30c8d9
3 changed files with 178 additions and 1 deletions
|
@ -38,7 +38,7 @@ DESTDIR=
|
||||||
|
|
||||||
HASH_OBJ = @HASH_OBJ@
|
HASH_OBJ = @HASH_OBJ@
|
||||||
|
|
||||||
OBJS = cmdparse.o conf.o local.o logging.o main.o memory.o mkdirpp.o \
|
OBJS = array.o cmdparse.o conf.o local.o logging.o main.o memory.o mkdirpp.o \
|
||||||
reference.o regress.o rtc.o sched.o sources.o sourcestats.o stubs.o \
|
reference.o regress.o rtc.o sched.o sources.o sourcestats.o stubs.o \
|
||||||
sys.o tempcomp.o util.o $(HASH_OBJ)
|
sys.o tempcomp.o util.o $(HASH_OBJ)
|
||||||
|
|
||||||
|
|
121
array.c
Normal file
121
array.c
Normal file
|
@ -0,0 +1,121 @@
|
||||||
|
/*
|
||||||
|
chronyd/chronyc - Programs for keeping computer clocks accurate.
|
||||||
|
|
||||||
|
**********************************************************************
|
||||||
|
* Copyright (C) Miroslav Lichvar 2014
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or modify
|
||||||
|
* it under the terms of version 2 of the GNU General Public License as
|
||||||
|
* published by the Free Software Foundation.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful, but
|
||||||
|
* WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
* General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License along
|
||||||
|
* with this program; if not, write to the Free Software Foundation, Inc.,
|
||||||
|
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||||
|
*
|
||||||
|
**********************************************************************
|
||||||
|
|
||||||
|
=======================================================================
|
||||||
|
|
||||||
|
Functions implementing an array with automatic memory allocation.
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "config.h"
|
||||||
|
|
||||||
|
#include "sysincl.h"
|
||||||
|
|
||||||
|
#include "array.h"
|
||||||
|
#include "memory.h"
|
||||||
|
|
||||||
|
struct ARR_Instance_Record {
|
||||||
|
void *data;
|
||||||
|
unsigned int elem_size;
|
||||||
|
unsigned int used;
|
||||||
|
unsigned int allocated;
|
||||||
|
};
|
||||||
|
|
||||||
|
ARR_Instance
|
||||||
|
ARR_CreateInstance(unsigned int elem_size)
|
||||||
|
{
|
||||||
|
ARR_Instance array;
|
||||||
|
|
||||||
|
array = MallocNew(struct ARR_Instance_Record);
|
||||||
|
|
||||||
|
array->data = NULL;
|
||||||
|
array->elem_size = elem_size;
|
||||||
|
array->used = 0;
|
||||||
|
array->allocated = 0;
|
||||||
|
|
||||||
|
return array;
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
ARR_DestroyInstance(ARR_Instance array)
|
||||||
|
{
|
||||||
|
Free(array->data);
|
||||||
|
Free(array);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
realloc_array(ARR_Instance array, unsigned int min_size)
|
||||||
|
{
|
||||||
|
if (array->allocated >= min_size && array->allocated <= 2 * min_size)
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (array->allocated < min_size) {
|
||||||
|
while (array->allocated < min_size)
|
||||||
|
array->allocated = array->allocated ? 2 * array->allocated : 1;
|
||||||
|
} else {
|
||||||
|
array->allocated = min_size;
|
||||||
|
}
|
||||||
|
|
||||||
|
array->data = Realloc(array->data, array->elem_size * array->allocated);
|
||||||
|
}
|
||||||
|
|
||||||
|
void *
|
||||||
|
ARR_GetNewElement(ARR_Instance array)
|
||||||
|
{
|
||||||
|
array->used++;
|
||||||
|
realloc_array(array, array->used);
|
||||||
|
return ARR_GetElement(array, array->used - 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
void *
|
||||||
|
ARR_GetElement(ARR_Instance array, unsigned int index)
|
||||||
|
{
|
||||||
|
assert(index < array->used);
|
||||||
|
return (void *)((char *)array->data + index * array->elem_size);
|
||||||
|
}
|
||||||
|
|
||||||
|
void *
|
||||||
|
ARR_GetElements(ARR_Instance array)
|
||||||
|
{
|
||||||
|
return array->data;
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
ARR_AppendElement(ARR_Instance array, void *element)
|
||||||
|
{
|
||||||
|
void *e;
|
||||||
|
|
||||||
|
e = ARR_GetNewElement(array);
|
||||||
|
memcpy(e, element, array->elem_size);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
ARR_SetSize(ARR_Instance array, unsigned int size)
|
||||||
|
{
|
||||||
|
realloc_array(array, size);
|
||||||
|
array->used = size;
|
||||||
|
}
|
||||||
|
|
||||||
|
unsigned int
|
||||||
|
ARR_GetSize(ARR_Instance array)
|
||||||
|
{
|
||||||
|
return array->used;
|
||||||
|
}
|
56
array.h
Normal file
56
array.h
Normal file
|
@ -0,0 +1,56 @@
|
||||||
|
/*
|
||||||
|
chronyd/chronyc - Programs for keeping computer clocks accurate.
|
||||||
|
|
||||||
|
**********************************************************************
|
||||||
|
* Copyright (C) Miroslav Lichvar 2014
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or modify
|
||||||
|
* it under the terms of version 2 of the GNU General Public License as
|
||||||
|
* published by the Free Software Foundation.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful, but
|
||||||
|
* WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
* General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License along
|
||||||
|
* with this program; if not, write to the Free Software Foundation, Inc.,
|
||||||
|
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||||
|
*
|
||||||
|
**********************************************************************
|
||||||
|
|
||||||
|
=======================================================================
|
||||||
|
|
||||||
|
Header file for array functions.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef GOT_ARRAY_H
|
||||||
|
#define GOT_ARRAY_H
|
||||||
|
|
||||||
|
typedef struct ARR_Instance_Record *ARR_Instance;
|
||||||
|
|
||||||
|
/* Create a new array with given element size */
|
||||||
|
extern ARR_Instance ARR_CreateInstance(unsigned int elem_size);
|
||||||
|
|
||||||
|
/* Destroy the array */
|
||||||
|
extern void ARR_DestroyInstance(ARR_Instance array);
|
||||||
|
|
||||||
|
/* Return pointer to a new element added to the end of the array */
|
||||||
|
extern void *ARR_GetNewElement(ARR_Instance array);
|
||||||
|
|
||||||
|
/* Return element with given index */
|
||||||
|
extern void *ARR_GetElement(ARR_Instance array, unsigned int index);
|
||||||
|
|
||||||
|
/* Return pointer to the internal array of elements */
|
||||||
|
extern void *ARR_GetElements(ARR_Instance array);
|
||||||
|
|
||||||
|
/* Add a new element to the end of the array */
|
||||||
|
extern void ARR_AppendElement(ARR_Instance array, void *element);
|
||||||
|
|
||||||
|
/* Set the size of the array */
|
||||||
|
extern void ARR_SetSize(ARR_Instance array, unsigned int size);
|
||||||
|
|
||||||
|
/* Return current size of the array */
|
||||||
|
extern unsigned int ARR_GetSize(ARR_Instance array);
|
||||||
|
|
||||||
|
#endif
|
Loading…
Reference in a new issue