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
| static void TriCheckList(HWND hwnd, CHKLIST *lpList, char *lParam)
{
char *lpIn, *lpIn2;
char *lpStr;
static int sizeMem;
static int depl, deplIn;
static int offset, offset2;
static int i, j;
static int ll_num;
static char ll[4];
static char tag_info[2];
char szBuffer[100];
char tmp[10];
char tmp2[10];
char *data;
BOOL stop;
data = lParam;
sizeMem = (int)lpList->nMember+1*(lpList->szMax + sizeof(ll) + sizeof(tag_info));
lpIn=(char *)malloc(sizeMem) ;
lpIn2=lpIn;
//Copie dans lpIn
depl=0;
lpStr = lpList->lpStr;
for (j=0; j<lpList->nMember; j++) {
lpStr+=depl; //Long de la zone
lpIn+=depl;
ll_num = atoi(lpStr);
memcpy(lpIn, lpStr, strlen(lpStr)+1);
depl=sizeof(ll);
lpStr+=depl; //Tag Info
lpIn+=depl;
memcpy(lpIn, lpStr, strlen(lpStr)+1);
depl=sizeof(tag_info);
lpStr+=depl; //Zone
lpIn+=depl;
memcpy(lpIn, lpStr, strlen(lpStr)+1);
depl=ll_num+1;
}
stop=FALSE;
depl=0;
offset = 0;
offset2 = 0;
lpStr = lpList->lpStr;
for (i=0; i<lpList->nMember; i++) {
lpStr+=depl; //Long de la zone
ll_num = atoi(lpStr);
lpStr+=sizeof(ll); //Tag Info
offset2+=sizeof(ll);
lpStr+=sizeof(tag_info); //Zone
offset2+=sizeof(tag_info);
if (strcmp(data, lpStr) < 0) {
stop=TRUE;
deplIn=i;
break;
}
lpStr+=(ll_num+1);
offset2+=(ll_num+1);
}
if (stop) {
//Recalage dans lpStr et dans lpIn
lpStr-=sizeof(tag_info);
offset2-=sizeof(tag_info);
lpStr-=sizeof(ll);
offset2-=sizeof(ll);
//Insertion du nouvel Enregistrement
itoa(strlen(data),ll,10);
memcpy(lpStr, ll, strlen(ll)+1);
lpStr+= sizeof(ll);
strcpy(tag_info, "0");
memcpy(lpStr, tag_info, strlen(tag_info)+1);
lpStr+= sizeof(tag_info);
memcpy(lpStr, data, strlen(data)+1);
lpStr+=(strlen(data)+1);
lpList->offset += (sizeof(ll) + sizeof(tag_info) + strlen(data)+1);
//Copie du reste a partir de lpIn dans lpStr --------------------------------------
lpIn=lpIn2;
for (; i<lpList->nMember; i++) {
ll_num = atoi(lpIn+offset2);
memmove(lpStr, lpIn+offset2, strlen(ll)+1);
offset2+= sizeof(ll);
lpStr+=sizeof(ll);
memmove(lpStr, lpIn+offset2, strlen(tag_info)+1);
offset2+= sizeof(tag_info);
lpStr+= sizeof(tag_info);
memmove(lpStr, lpIn+offset2, strlen(lpIn+offset2)+1);
offset2+=(ll_num+1);
lpStr+=(ll_num+1);
}
lpList->nMember++;
}
else {
//Insertion du nouvel Enregistrement
itoa(strlen(data),ll,10);
memcpy(lpStr, ll, strlen(ll)+1);
lpStr+= sizeof(ll);
strcpy(tag_info, "0");
memcpy(lpStr, tag_info, strlen(tag_info)+1);
lpStr+= sizeof(tag_info);
memcpy(lpStr, data, strlen(data)+1);
lpStr+=(strlen(data)+1);
lpList->offset += (sizeof(ll) + sizeof(tag_info) + strlen(data)+1);
lpList->nMember++;
}
if (lpIn=realloc(lpIn, sizeMem) != NULL) {
size = _msize(lpIn);
MessageBox (NULL, itoa(size,tmp,10), "Taille memoire", MB_OK | MB_ICONQUESTION);
free(lpIn);
}
} |
Partager