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
| void characters(void* user_data, const xmlChar *ch, int len) {
if (_inID && len) {
// On va enregistrer l'ID, mais en supprimant les espaces qui semblent s'être introduits <ID> 5 </ID>
while(len>1 && *ch==32) {
len--;
ch+=sizeof(xmlChar);
}
// On supprime également les espaces qui suivent la valeur.
while(len>1 && *(ch+len-1)==32)
len--;
_concepts[_currentCpt].ID = (char*)malloc(len+1);
strncpy(_concepts[_currentCpt].ID, ch, len);
*(_concepts[_currentCpt].ID+len) = 0;
_inID = 0;
}
else if ((_inIntent || _inUpperCovers || _inExtent) && len)
{
// lien vers les references du concept courant
REF** source;
REF* ref;
REF* newRef;
if (_inIntent)
source = &(_concepts[_currentCpt].intent);
else if (_inUpperCovers)
source = &(_concepts[_currentCpt].upperCovers);
else if (_inExtent)
source = &(_concepts[_currentCpt].extent);
ref = *source;
// on créé une nouvelle reference
newRef = (REF*)calloc(1, sizeof(REF));
// permet de relier la nouvelle reference a la structure (liste chainee)
if (ref) {
// La liste contient au moins une cellule.
// On va parcourir la liste a la recherche de la dernière cellule (celle qui à le pointeur next à NULL)
while(ref->next)
ref = (REF*)ref->next;
ref->next = newRef;
}
else
*source = newRef; // Première cellule de la liste chainée
// on recopie la donnée
newRef->reference = (char*)malloc(len+1);
strncpy(newRef->reference, ch, len);
// 0 terminal de la chaine de caractères
*(newRef->reference+len) = 0;
// Remise à 0 des flags de position
_inIntent = _inUpperCovers = _inExtent = 0;
}
} |