Files

185 lines
2.4 KiB
C
Raw Permalink Normal View History

2025-11-17 10:28:09 +01:00
#include <stdio.h>
#include <stdlib.h>
#include "array.h"
array * array_new()
{
struct array * v;
v = (struct array *) malloc( sizeof( struct array ) );
v->capacity = ARRAY_INIT_CAPACITY;
v->total = 0;
v->items = malloc(sizeof(void *) * v->capacity);
return v;
}
int array_length(array *v)
{
return v->total;
}
char * array_join( struct array * parts, char * separator ) {
int count = array_length( parts );
char * fullText = "";
for (int i = 0; i < count; ++i)
{
char * currentPart = array_get( parts, i );
fullText = text_concatenate( fullText, currentPart );
if( i < count-1 ) {
fullText = text_concatenate( fullText, separator );
}
printf("join: %s\n", fullText);
//fullText = text_concatenate( fullText, separator );
}
return fullText;
}
static void array_resize( array *v, int capacity )
{
#ifdef DEBUG_ON
printf("array_resize: %d to %d\n", v->capacity, capacity);
#endif
void **items = realloc( v->items, sizeof( void * ) * capacity );
//if (items) {
v->items = items;
v->capacity = capacity;
//}
}
void array_add( array * v, void * item )
{
if ( v->capacity == v->total ){
array_resize( v, v->capacity * 2 );
}
v->items[v->total++] = item;
}
void array_set( array * v, int index, void * item )
{
if (index >= 0 && index < v->total){
v->items[index] = item;
}
}
void * array_get( array *v, int index )
{
if ( index >= 0 && index < v->total ){
return v->items[index];
}
return NULL;
}
int array_push( array * v, void * item ) {
array_add( v, item );
return v->total;
}
void array_unshift( array * v, void * item ) {
int length = v->total;
v->total++;
if ( v->capacity == v->total ){
array_resize( v, v->capacity * 2 );
}
for ( int i = length - 1; i >= 0; --i ) {
v->items[ i + 1 ] = v->items[ i ];
}
v->items[ 0 ] = item;
}
void array_delete( array * v, int index)
{
if ( index < 0 || index >= v->total ){
return;
}
v->items[index] = NULL;
for ( int i = index; i < v->total - 1; i++ ) {
v->items[i] = v->items[i + 1];
v->items[i + 1] = NULL;
}
v->total--;
if ( v->total > 0 && v->total == v->capacity / 4 ){
array_resize( v, v->capacity / 2 );
}
}
void * array_pop( array * v ) {
int count = array_length( v );
void * item = array_get( v, count - 1 );
array_delete( v, count - 1 );
return item;
}
void array_free(array *v)
{
free( v->items );
}