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 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196
|
/*ajoute un tag dasn le tableau des tags, les parametres saisis etant directement les cases du tableau*/
int ajouter_tag(char **tags, int tags_cpt, int *tags_chaine_malloc, char *parametre, int parametre_cpt){
char *chaine;
chaine = realloc(*tags,parametre_cpt*sizeof(char));
*tags_chaine_malloc=parametre_cpt;
if(chaine!=NULL){
strcpy(chaine,parametre);
*tags=chaine;
}
else
return -1;
return 0;
}
/*réalloue une chaine de taille cpt_chaine à une nouvelle taille indice*/
int reallocation_chaine(char **chaine, int *cpt_chaine, int indice){
char *temp;
*cpt_chaine=indice;
temp=realloc(*chaine,*cpt_chaine);
if(temp!=NULL)
*chaine=temp;
else
return-1;
return 0;
}
/*realloue un tableau de chaine "tags" de taille *tags_cpt_malloc en ajoutant +2, tags_chaine_malloc est aussi mis a jour car il contient la taille de chacune des chaines*/
int reallocation_tags(char ***tags, int *tags_cpt_malloc,int **tags_chaine_malloc){
char **temp;
int *temp_chaine;
int i;
temp=realloc(*tags,*tags_cpt_malloc+2); //tableau tags
if(temp==NULL)
return -1;
*tags=temp;
temp_chaine=realloc(*tags_chaine_malloc,*tags_cpt_malloc+2); //tableau avec les tailles des tags
if(temp_chaine==NULL)
return -1;
*tags_chaine_malloc=temp_chaine;
*tags_cpt_malloc+=2;
for(i=*tags_cpt_malloc-2;i<*tags_cpt_malloc;i++){ //initialisation des nouvelles cases des 2 tableaux
*tags[i]=malloc(10*sizeof(char));
if(*tags[i]==NULL)
return -1;
*tags_chaine_malloc[i]=10;
}
return 0;
}
int creer_chaine(char **chaine,int *cpt_chaine,FILE *fichier, char *caractere, char fin){
char *temp=*chaine;
FILE *file=fichier;
int cpt_c=*cpt_chaine;
int cpt=0;
while(*caractere!=fin && *caractere!=EOF){
if(cpt+2>cpt_c){
if(reallocation_chaine(&temp,&cpt_c,cpt_c*2)==-1){
return -1;
}
}
temp[cpt]=*caractere;
*caractere=fgetc(file);
cpt++;
}
*cpt_chaine=cpt+1;
if(reallocation_chaine(&temp,&cpt,cpt+1)==-1)
return -1;
temp[cpt-1]='\0';
*chaine=temp;
*caractere=fgetc(file);
return 0;
}
/*méthode identique a creer_chaine sauf qu'il y a 2 caracteres de fin possibles*/
int creer_chaine2(char **chaine,int *cpt_chaine,FILE *fichier, char *caractere, char fin, char fin2){
char *temp=*chaine;
FILE *file=fichier;
int cpt_c=*cpt_chaine;
int cpt=0;
while(*caractere!=fin && *caractere!=fin2 && *caractere!=EOF){
if(cpt+1>cpt_c){
if(reallocation_chaine(&temp,&cpt_c,cpt_c*2)==-1)
return -1;
}
temp[cpt]=*caractere;
*caractere=fgetc(file);
cpt++;
}
*cpt_chaine=cpt+1;
if(reallocation_chaine(&temp,&cpt,cpt+1)==-1)
return -1;
temp[cpt-1]='\0';
*chaine=temp;
return 0;
}
/*unite est une structure prenant différents parametre mais non utilisés pour l'instant ...donc inutile*/
int unite_init(unite *this,FILE *fichier){
char caractere;
int valide;
int i;
char *parametre;
int parametre_cpt;
char *valeur;
int valeur_cpt;
char ** tags;/*tab de tags*/
int tags_cpt;/*,nombre de tags*/
int tags_cpt_malloc;/*nombre de tags alloués*/
int *tags_chaine_malloc;/*taille de chaque case alloué de tag*/
/*Init*/
caractere=fgetc(fichier);
valide=1;
tags_cpt=0;
parametre=malloc(10*sizeof(char));
if(parametre==NULL)
return -1;
parametre_cpt=10;
valeur=malloc(100*sizeof(char));
if(valeur==NULL)
return -1;
valeur_cpt=100;
tags=malloc(20*sizeof(char));
if(tags==NULL)
return -1;
tags_cpt_malloc=20;
tags_chaine_malloc=malloc(20*sizeof(int));
if(tags_chaine_malloc==NULL)
return -1;
for(i=0;i<20;i++){
tags_chaine_malloc[i]=10;
tags[i]=malloc(10*sizeof(char));
if(tags[i]==NULL)
return -1;
}
/*Premier tag : c'est pour enlever des conditions et arriver directement au premier caractere '['*/
while(caractere!='[')
caractere=fgetc(fichier);
/*Principal : soit on ajoute(enleve) un tag, soit un parametre, soit on passe des caractere*/
while(caractere!=EOF && valide){
if(caractere=='\t' || caractere==' ' || caractere=='\n')
caractere=fgetc(fichier);
else if(caractere=='#' || caractere=='{'){/*cas non traités*/
while(caractere!='}' && caractere!='\n')
caractere=fgetc(fichier);
}
else if(caractere=='['){/*on va ajouter on enlever un tag*/
caractere=fgetc(fichier);
if(caractere=='/'){/*on enleve*/
caractere=fgetc(fichier);
if(creer_chaine(¶metre,¶metre_cpt,fichier,&caractere,']')==-1)
return -1;
if(strcmp(parametre,tags[tags_cpt-1])==0)/*on verifie que le tag correspond bien au tag actuel*/
tags_cpt--;
}
else{/*on va créer un tag et réallouer si nécéssaire*/
tags_cpt++;
if(creer_chaine(¶metre,¶metre_cpt,fichier,&caractere,']')==-1)
return -1;
if(tags_cpt>tags_cpt_malloc){
reallocation_tags(&tags,&tags_cpt_malloc,&tags_chaine_malloc);
}
if(ajouter_tag(&tags[tags_cpt-1],tags_cpt,&tags_chaine_malloc[tags_cpt-1],parametre,parametre_cpt)==-1)
return -1;
}
}
else{/*cas a terminer ... mais non nécéssaire pour l'instant*/
if(creer_chaine(&valeur,&valeur_cpt,fichier,&caractere,'\n')==-1)
return -1;
}
if(tags_cpt==0)
valide=0;
}
return 0;
} |
Partager