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
|
Fonction appelante :
...
...
strcpy(tempCode,codePhone(tempCible));
...
...
/**************************************************************
***************** CODEPHONE ********************
**************************************************************/
char *codePhone(char *source){
// Déclaration
int longSource;
int numLin=0;
int k; // compteur de boucle
int decal;
char *reg_exp;
int spos, epos;
int err,match;
int maxLine;
phoneComment[0]=0;
maxLine=codePhon[nivPhone].maxlinePhon;
for(numLin=0;numLin<maxLine;numLin++){
if(strstr(listeVolumePhon,codePhon[nivPhone].listePhon[numLin].volume)!=0){ // test du volume Phonétique
reg_exp=codePhon[nivPhone].listePhon[numLin].ciblePhon;
match=0;
while(match==0){
regex_t preg;
err = regcomp (&preg,reg_exp, REG_EXTENDED); // compilation du motif avec recherche d'erreur
if (err == 0) // pas d'erreur dans le motif
{
size_t nmatch=0;
regmatch_t *pmatch = NULL;
nmatch = preg.re_nsub; // Nombre d'occurence du motif trouvé
// Ligne originale:
//pmatch = malloc (sizeof(*pmatch) * nmatch);
// Remplacée par:
pmatch =(regmatch_t*) malloc (sizeof(*pmatch) * nmatch);
match = regexec (&preg,source, nmatch, pmatch, 0); // Lancer la recherche
regfree (&preg); // libérer la mémoire
/********************************************/
/* le motif a été trouvé */
/********************************************/
if (match == 0){
spos = pmatch[0].rm_so;
epos = pmatch[0].rm_eo;
spos=spos+codePhon[nivPhone].listePhon[numLin].startCible;
epos=spos+codePhon[nivPhone].listePhon[numLin].longCible;
longSource=strlen(source);
char *newPhon=codePhon[nivPhone].listePhon[numLin].newPhon;
// Suppression des caractères inutiles par décalage à gauche
// remplacer boucle par stcpy (+rapide)??
decal=epos-spos-strlen(newPhon);
for(k=epos;k<longSource;k++) source[k-decal]=source[k];
source[longSource-decal]=0;
// recopie de newPhon
for(k=0;k<strlen(newPhon);k++) source[spos+k]=newPhon[k];
// Saut de lignes
numLin=numLin+codePhon[nivPhone].listePhon[numLin].sautPhon;
// Commentaires
strncat(phoneComment,codePhon[nivPhone].listePhon[numLin].commentPhon,strlen(codePhon[nivPhone].listePhon[numLin].commentPhon));
}else {
# include "nomatch.cpp"
}
free(pmatch);
} // if (match==0)
} // fin test err==0
} // fin test Volume
} // fin boucle numlin
return source;
} |
Partager