#include <string.h>
#include <ctype.h>
#include <stdlib.h>
#include <stdio.h>
#include <malloc.h>
typedef struct ptoken
{
int PIelements;
int PImemory;
} INFOTOKEN;
int Tokenizer(char *filename, char** memory, INFOTOKEN *result)
{
if(!result){ printf("Parser: Nessun riferimento per recuperare informazioni.\n"); return 0; }
if(!memory){ printf("Parser: Nessun indirizzo base da allocare.\n"); return -1; }
FILE *f=fopen(filename,"r");
if(!f){ printf("Parser: Nessun file definito.\n"); return -1; }
char c, c2=0; // caratteri di buffers
char ir[5*1024]=""; // buffer istruzione
int j=0, k=0; // contatori
int len=0; // lunghezza parola da allocare
int flag_write=0; // flag di scrittura
// fin quando posso leggere dal file
while( ( c=fgetc(f) ) != EOF )
{
if( isalnum(c) ){ ir[j]=c; j++; }
else if( isspace(c) ) flag_write=1;
else{ c2=c; flag_write=1; }
if(flag_write==1)
{
ir[j]='\0'; // mette il fine stringa
j=0;
len=strlen(ir); // ricavo la lunghezza, se la lunghezza è accettabile scrive.
if(len > 0)
{
// allocazione dinamica
memory=(char**)realloc(memory, _msize(memory) + sizeof(char*) );
if(!memory) return -1;
memory[k]=(char*)calloc( len+1,sizeof(char) );
if(!memory[k]) return -1;
strcpy(memory[k],ir);
k++;
}
if(c2!=0) // allochiamo un simbolo di un solo byte
{
// allocazione dinamica per un simbolo
memory=(char**)realloc(memory,_msize(memory)+sizeo f(char*) );
if(!memory) return -1;
memory[k]=(char*)calloc( 2, sizeof(char) );
if(!memory[k]) return -1;
strcpy(memory[k],&c2);
k++;
c2=0;
}
// riazzero c2
flag_write=0;
} // endif 2
} // end while
if(j>0)
{
ir[j]='\0';
j=0;
len=strlen(ir); // ricavo la lunghezza, se la lunghezza è accettabile scrive.
if(len > 0)
{
// allocazione dinamica
memory=(char**)realloc(memory,_msize(memory)+sizeo f(char*) );
if(!memory) return -1;
memory[k]=(char*)calloc( len+1 , sizeof(char) );
if(!memory[k]) return -1;
strcpy(memory[k],ir);
}
}
if(c2!=0) // allochiamo un simbolo di un solo byte
{
memory=(char**)realloc(memory,_msize(memory)+sizeo f(char*) );
if(!memory) return -1;
memory[k]=(char*)calloc( 2 , sizeof(char) );
if(!memory[k]) return -1;
strcpy(memory[k],&c2);
c2=0;
}
// k-=1; // ripristino contatore dopo l'errore
fclose(f);
result->PIelements=k;
result->PImemory=_msize(memory);
return k;
}
void allocazione(char **array)
{
array=(char**)realloc( array , _msize(array)+10*sizeof(char*) );
}
int main(int argc, char *argv[])
{
//char **memory=(char**)malloc(1*sizeof(char*));
char *filename=argv[1];
INFOTOKEN p_info;
char **memory=(char**)malloc(0);
int esito=Tokenizer(filename, memory, &p_info);
char **array=(char**)malloc(0);
printf("Esito dell'operazione=%d elementi letti\n",esito);
printf("Elementi: %d\nMemoria occupata: %d\n", p_info.PIelements, p_info.PImemory );
printf("Memoria attuale occupata(in bytes): %d\n\n",_msize(memory) );
allocazione(array);
printf("dimensione di array=%d\n",_msize(array));
allocazione(array);
printf("nuova dimensione di array=%d\n\n",_msize(array));
free(memory);
free(array);
}