1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153
|
#define LINE_BUFFER_SIZE 256
#define xstr(s) str(s)
#define str(s) #s
static double * local_realloc(double * pointeur, size_t const oldsize,size_t const newsize)
{
static const char FCNAME[] = "local_realloc";
double *val_tmp=pointeur;
if (newsize>oldsize)
{
val_tmp=calloc(newsize,sizeof(*val_tmp));
if (val_tmp==NULL)
{
fprintf(stdout,"reallocation error\n");
return val_tmp;
}
else
{
size_t indice=0;
for(indice=0;indice<oldsize;indice++)
val_tmp[indice]=pointeur[indice];
free(pointeur),pointeur=NULL;
pointeur=val_tmp;
}
}
return val_tmp;
}
double *myfscanline(char const*const lineToScan, size_t *const NumberValues, size_t *const TextInLine)
{
static const char FCNAME[] = "myfscanline";
int rbm_er = 0;
unsigned int i=0;
size_t const len = (strlen(lineToScan)>LINE_BUFFER_SIZE?strlen(lineToScan):LINE_BUFFER_SIZE);
char *tmp=calloc(len,sizeof(*tmp));
char *buffer_string=calloc(LINE_BUFFER_SIZE+1,sizeof(*buffer_string));
double *val=calloc(1,sizeof(*val));
double *val_tmp=NULL;
char *tmp_dummy=tmp;
int len_buff=0;
int len_val=0;
size_t global_shift=0L;
strcpy(tmp,lineToScan);
*NumberValues=0;
*TextInLine=0;
do
{
int res1=0;
int res=0;
val[i]=0.;
*buffer_string='\0';
len_buff=0;
len_val=0;
res=sscanf(tmp,"%"xstr(LINE_BUFFER_SIZE)"[a-zA-Z:#;]%n %lf%n ",buffer_string,&len_buff,&val[i],&len_val);
/*si notre chaine contient caractere+nombre */
if (len_val!=0)
{
val_tmp=local_realloc(val,i+1,i+2);
if (val_tmp==NULL)
{
rbm_er = 1;
free(tmp);
free(buffer_string);
free(val);
return NULL;
}
val=val_tmp;
(*NumberValues)++;
(*TextInLine)++;
tmp+=(len_val);
}
else
{
/* si on a juste une chaine de caractere */
if (len_buff!=0)
{
tmp+=(len_buff);
(*TextInLine)++;
continue;
}
else /* buffer vide ou alors juste un chiffre a lire */
{
res1=sscanf(tmp," %lf%n ",val+i,&len_val);
if (len_val!=0)
{
tmp+=len_val;
val_tmp=local_realloc(val,i+1,i+2);
if (val_tmp==NULL)
{
rbm_er = 1;
free(tmp);
free(buffer_string);
free(val);
return NULL;
}
val=val_tmp;
(*NumberValues)++;
}
else
{
break;
}
}
}
i++;
if ((tmp[0]=='\0')||(tmp[0]=='\n'))
break;
/*reallocation de memoire pour tmp afin de s'assurer qu'il puisse toujours contenir les 256 caracteres */
global_shift+=(size_t)tmp - (size_t)tmp_dummy;
tmp=calloc(LINE_BUFFER_SIZE,sizeof(*tmp));
strcpy(tmp,lineToScan+global_shift);
free(tmp_dummy);
tmp_dummy=tmp;
}while(1);
free(tmp_dummy),tmp_dummy=NULL;
free(buffer_string),buffer_string=NULL;
if (rbm_er!=0)
free(val),val=NULL;
return val;
} |
Partager