/**=============================================================================
Libreria "items" - versione 1.0.1 - di Aldo Carpanelli, 2/1/2015=>20/7/2017
"items" library - version 1.0.1 - by Aldo Carpanelli, 1/2/2015=>7/20/2017
=============================================================================**/
/*==============================================================================
Per una qualche specie di documentazione is veda il file info_ita.pdf .
For some sort of reference material, have a look at the info_en.pdf file.
==============================================================================*/
#include "items.h"
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
long CountItemsInString( const char *data, int sep ) {
long n = -1;
if( data )
for( n=1; *data; ++data )
*data==sep ? ++n : 0;
return n;
}
long CountItemsInFile( const char *fileName, int sep ) {
FILE *f;
long n;
int c;
if( fileName == NULL ) return -1;
if( *fileName == '\0' ) return -1;
f = fopen( fileName, "r" );
if( f == NULL ) return -1;
for( n=1, c=fgetc(f); c!=EOF; c=fgetc(f) )
if( c == sep ) ++n;
fclose( f );
return n;
}
long TokeniseString( char *data, int sep, const char ***ptrs ) {
long totItems = CountItemsInString( data, sep );
if( totItems > -1 ) {
long i; /* tap = [t]emporary [a]rray of [p]ointers */
const char **tap = calloc( totItems, sizeof(char*) );
for( i=0; i<totItems; ++i ) {
tap[i] = data;
while( *data && *data != sep ) ++data;
*data++ = '\0';
}
*ptrs = tap;
}
return totItems;
}
long GetAllItemsFromString( const char *data, int sep, const char ***ptrs ) {
long totItems = -1;
char *copy;
copy = AllocateCopy( data, -1 );
if( copy == NULL ) return -1;
totItems = TokeniseString( copy, sep, ptrs );
if( totItems == -1 ) free( copy );
return totItems;
}
long GetAllItemsFromFile( const char *fileName, int sep, const char ***ptrs ) {
long totItems = 0;
char *data = NULL;
if( fileName == NULL ) return -1;
if( *fileName == '\0' ) return -1;
data = LoadFile( fileName );
if( data == NULL ) return -1;
totItems = TokeniseString( data, sep, ptrs );
if( totItems == -1 ) free( data );
return totItems;
}
char *GetItemFromString( const char *data, int sep, long nItem ) {
long ci; /* [c]urrent [i]tem */
char *strItem = NULL;
char sp[2] = { sep, '\0' };
if( data == NULL ) return strItem;
for( ci=0;
(ci<nItem)&&(data=strchr(data,sep));
++data, ++ci );
if( ci == nItem )
strItem = AllocateCopy( data, strcspn(data,sp) );
return strItem;
}
char *GetItemFromFile( const char *fileName, int sep, long nItem ) {
long i, start, length, c, ci; /* [c]urrent [i]tem */
char *strItem = NULL;
FILE *f;
if( fileName == NULL ) return strItem;
if( *fileName == '\0' ) return strItem;
f = fopen( fileName, "r" );
if( f == NULL ) return strItem;
for( ci=0, c=fgetc(f); ci!=nItem && c!=EOF; c=fgetc(f) )
if( c == sep ) ++ci;
if( ci == nItem ) {
start = ftell(f)-1;
for( c=fgetc(f); c!=sep&&c!=EOF; c=fgetc(f) );
length = ftell(f)-1-start;
if( (strItem=malloc(length+1)) != NULL ) {
fseek( f, start, SEEK_SET );
for( i=0; i<length; *(strItem+i)=fgetc(f), ++i );
*(strItem+i) = '\0';
}
}
fclose( f );
return strItem;
}
char *LoadFile( const char *fileName ) {
char *auxPtr, *data = NULL;
long dataDim;
int c;
FILE *f;
if( fileName == NULL ) return data;
if( *fileName == '\0' ) return data;
f = fopen( fileName, "r" );
if( f == NULL ) return data;
for( dataDim=0; fgetc(f)!=EOF; ++dataDim );
data = malloc( dataDim+1 );
if( data != NULL ) {
rewind( f );
auxPtr = data;
while( (c=fgetc(f))!=EOF )
*auxPtr++ = c;
*auxPtr = '\0';
}
fclose( f );
return data;
}
char *AllocateCopy( const char *s, long l ) {
long sl; // [s]tring [l]ength
char *copy = NULL;
if( s == NULL ) return copy;
sl = l<0 ? strlen(s) : l;
if( (copy=malloc(sl+1)) != NULL )
{ memcpy(copy,s,sl); copy[sl]='\0'; }
return copy;
}
void FreeStringMemory( char **s ) {
if( *s!= NULL ) {
free( (void*)*s );
*s = NULL;
}
}
void FreeStringsMemory( const char ***ptrs ) {
if( ptrs == NULL ) return;
if( *ptrs == NULL ) return;
if( **ptrs != NULL ) {
free( (void*)(**ptrs) );
**ptrs = NULL;
}
free( (void*)(*ptrs) );
(*ptrs) = NULL;
}