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);
	}
 
} |