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
| #include <stdio.h>
#include <string.h>
void remplir(char *zone, char *text[])
{
char *pt;
unsigned char num;
unsigned short offset;
unsigned char lg;
for (num=1,pt=zone; *text != NULL; text++, num++)
{
// Calcul longueur texte et offset
lg=strlen(*text);
offset=*(text+1) != NULL ?sizeof(unsigned short) + sizeof(unsigned char) + sizeof(unsigned char) + lg :0;
printf("écriture: pt=%p, num=%d, offset=%d, lg=%d, text=[%s]\n", pt, num, offset, lg, *text);
// Copie offset
memcpy(pt, &offset, sizeof(unsigned short));
pt+=sizeof(unsigned short);
// Copie n° en cours
memcpy(pt, &num, sizeof(unsigned char));
pt+=sizeof(unsigned char);
// Copie longueur
memcpy(pt, &lg, sizeof(unsigned char));
pt+=sizeof(unsigned char);
// Copie texte
memcpy(pt, *text, lg);
pt+=lg;
}
}
void lire(char *zone)
{
char *pt;
unsigned char num;
unsigned char lg;
unsigned short offset;
char data[256];
do
{
pt=zone;
// Récupération offset
offset=*(unsigned short*)pt;
pt+=sizeof(unsigned short);
// Récupération n° en cours
num=*(unsigned char*)pt;
pt+=sizeof(unsigned char);
// Récupération longueur
lg=*(unsigned char*)pt;
pt+=sizeof(unsigned char);
// Récupération datas
memcpy(data, pt, lg);
data[lg]='\0';
printf("lecture: pt=%p, num=%hu, data=[%s]\n", zone, num, data);
// Décalage de la zone (et non pas de pt, attention !!!)
zone+=offset;
} while (offset != 0);
}
unsigned char nb_zone(char *zone)
{
unsigned char nb;
unsigned short offset;
for (nb=1; (offset=*(unsigned short*)zone) != 0; nb++, zone+=offset);
return nb;
}
int main()
{
char zone[1024];
char *mots[]={"Hello", "World", "il", "fait", "beau !!!", NULL};
remplir(zone, mots);
lire(zone);
printf("Nombre morceaux: %hu\n", nb_zone(zone));
} |
Partager