Comparer des numéros de version en C
C'est pas évident de comparer des numéro de version et C... Je suis arrivé à ces deux petites fonctions :
/** \brief Compare two version numbers
*
* \return a number greater equals or inferior to 0 if the first version number
* is respectively greater, equal or inferior to the second one.
*/
int compareAppVersion(char currentAppVersion[16], char SDCardAppVersion[16])
{
char *majorCurr,* minorCurr,* revCurr;
char *majorSD,* minorSD,* revSD;
printf("currentAppVersion = %s\n", currentAppVersion);
printf("SDCardAppVersion = %s\n", SDCardAppVersion);
normaliseVersion(currentAppVersion);
printf("Normalized currentAppVersion = %s\n", currentAppVersion);
normaliseVersion(SDCardAppVersion);
printf("Normalized SDCardAppVersion = %s\n", SDCardAppVersion);
majorCurr = strtok(currentAppVersion, ".");
printf("majorCurr = %s\n", majorCurr);
minorCurr = strtok(NULL, ".");
printf("minorCurr = %s\n", minorCurr);
revCurr = strtok(NULL, ".");
printf("revCurr = %s\n", revCurr);
majorSD = strtok(SDCardAppVersion, ".");
printf("majorSD = %s\n", majorSD);
minorSD = strtok(NULL, ".");
printf("minorSD = %s\n", minorSD);
revSD = strtok(NULL, ".");
printf("revSD = %s\n", revSD);
//We compare major numbers
printf("Compare major\n");
if((strcmp(majorCurr, majorSD) > 0 ))
return 1;
else
{
if(strcmp(majorCurr, majorSD) < 0 )
return -1;
else
{
if(strcmp(majorCurr, majorSD) == 0 )
{//We compare minor numbers
printf("Compare minor\n");
if(strcmp(minorCurr, minorSD) > 0)
return 1;
else if(strcmp(minorCurr, minorSD) < 0 )
return -1;
else if(strcmp(minorCurr, minorSD) == 0 )
{
printf("Compare rev\n");
if(strcmp(revCurr, revSD) > 0)
return 1;
else if(strcmp(revCurr, revSD) < 0 )
return -1;
else if(strcmp(revCurr, revSD) == 0 )
return 0;
}
}
}
}
return 0;
}
/** \brief function that adds the missing ".0" version subnumbers
*
* A standard version number is formated X.X.X
* \param version The version number to normalise
*/
void normaliseVersion(char version[16])
{
char * ptr;
int dotCount =0;
char tmp[16];
strcpy(tmp, version);
printf("version to normalize : %s\n", tmp);
while((ptr = strchr(tmp, '.')) != NULL)
{
*ptr = '*';
dotCount++;
}printf("Dots : %d\n", dotCount);
switch(dotCount)
{
case 0 :
strcat(version, ".0.0");
break;
case 1 :
strcat(version, ".0");
break;
case 2 :
break;
}
}
/** \brief Compare two version numbers
*
* \return a number greater equals or inferior to 0 if the first version number
* is respectively greater, equal or inferior to the second one.
*/
int compareAppVersion(char currentAppVersion[16], char SDCardAppVersion[16])
{
char *majorCurr,* minorCurr,* revCurr;
char *majorSD,* minorSD,* revSD;
printf("currentAppVersion = %s\n", currentAppVersion);
printf("SDCardAppVersion = %s\n", SDCardAppVersion);
normaliseVersion(currentAppVersion);
printf("Normalized currentAppVersion = %s\n", currentAppVersion);
normaliseVersion(SDCardAppVersion);
printf("Normalized SDCardAppVersion = %s\n", SDCardAppVersion);
majorCurr = strtok(currentAppVersion, ".");
printf("majorCurr = %s\n", majorCurr);
minorCurr = strtok(NULL, ".");
printf("minorCurr = %s\n", minorCurr);
revCurr = strtok(NULL, ".");
printf("revCurr = %s\n", revCurr);
majorSD = strtok(SDCardAppVersion, ".");
printf("majorSD = %s\n", majorSD);
minorSD = strtok(NULL, ".");
printf("minorSD = %s\n", minorSD);
revSD = strtok(NULL, ".");
printf("revSD = %s\n", revSD);
//We compare major numbers
printf("Compare major\n");
if((strcmp(majorCurr, majorSD) > 0 ))
return 1;
else
{
if(strcmp(majorCurr, majorSD) < 0 )
return -1;
else
{
if(strcmp(majorCurr, majorSD) == 0 )
{//We compare minor numbers
printf("Compare minor\n");
if(strcmp(minorCurr, minorSD) > 0)
return 1;
else if(strcmp(minorCurr, minorSD) < 0 )
return -1;
else if(strcmp(minorCurr, minorSD) == 0 )
{
printf("Compare rev\n");
if(strcmp(revCurr, revSD) > 0)
return 1;
else if(strcmp(revCurr, revSD) < 0 )
return -1;
else if(strcmp(revCurr, revSD) == 0 )
return 0;
}
}
}
}
return 0;
}
/** \brief function that adds the missing ".0" version subnumbers
*
* A standard version number is formated X.X.X
* \param version The version number to normalise
*/
void normaliseVersion(char version[16])
{
char * ptr;
int dotCount =0;
char tmp[16];
strcpy(tmp, version);
printf("version to normalize : %s\n", tmp);
while((ptr = strchr(tmp, '.')) != NULL)
{
*ptr = '*';
dotCount++;
}printf("Dots : %d\n", dotCount);
switch(dotCount)
{
case 0 :
strcat(version, ".0.0");
break;
case 1 :
strcat(version, ".0");
break;
case 2 :
break;
}
}

0 Comments:
Enregistrer un commentaire
<< Home