TweetFollow Us on Twitter

Jan 97 Tips

Volume Number: 13 (1997)
Issue Number: 1
Column Tag: Tips & Tidbits

Tips & Tidbits

By Jessica Courtney

When releasing a number of public development, alpha, and beta versions of software, it is a good idea to display the version number within the application - for example, in the splash screen, or about box. However, the format of the 'vers' resource is a little bizarre, making getting to this information a little difficult.

GetVersNumString() is a handy function that reads an application's 'vers' resource, constructs the version number, and returns it in a pascal string. It might not be the most efficient way to do this, but it does the job. My version of this function will not print the third piece of the version number if it equals zero (i.e., print "1.1" not "1.1.0"). The if-statement controlling this decision is easy to remove - more ambitious programmers might make it an optional parameter.

I've also included Str255-copy and Str255-concatenation routines to make this tip complete, just incase you don't already have some available.

/* GetVersNumString
 * Reads 'vers' resource #1 and constructs a string like "\p1.0d3"...
 * If it can't find 'vers' #1, it returns an empty string.
 * NOTE: The application resource file must be the active resource file!
 */
void GetVersNumString(Str255 versStr)
{
 Handle  versHdl;
 long    version;
 unsigned char   ver1,ver2,ver3,relStatus,prerelNum;
 Str255  tmp;

    // clear string;
 versStr[0]=0;

    // read version no. information
 versHdl = GetResource('vers',1);
 if (!versHdl) {
 return;
 }
 version = *((long *)(*versHdl));
 ReleaseResource(versHdl);

    // Set ver1-3, relStatus, prerelNum from the version info.
    // Note that the first two bytes are in an unusual format.
 ver1 = ((char *)&version)[0];
 ver1 = (((ver1 & 0xF0) >> 4) * 10) + (ver1 & 0x0F);
 ver2 = (((char *)&version)[1] & 0xF0) >> 4;
 ver3 = (((char *)&version)[1] & 0x0F);
 relStatus = ((char *)&version)[2];
 prerelNum = ((char *)&version)[3];

    // Insert v1 and v2 into our version string.
 NumToString((long)ver1,tmp);
 PStringCat(versStr,tmp);
 PStringCat(versStr,"\p.");
 NumToString((long)ver2,tmp);
 PStringCat(versStr,tmp);
    // For convenience, we only print the third number if it is  non-zero.
    // If you always want all three numbers, remove the if-statement.
 if (ver3) {
 PStringCat(versStr,"\p.");
 NumToString((long)ver3,tmp);
 PStringCat(versStr,tmp);
 }

    // If the release status is development, alpha, or beta, add a
    // 'd', 'a', or 'b' to our version string.
 switch(relStatus){
 case 0x20: // development
 PStringCat(versStr,"\pd");
 break;
 case 0x40: // alpha
 PStringCat(versStr,"\pa");
 break;
 case 0x60: // beta
 PStringCat(versStr,"\pb");
 break;
 default:
 ;
 }

    // lastly, if we've added a 'd', 'a', or 'b', print the pre-release
    // number at the end.
 if (relStatus != 0x80) {
 NumToString((long)prerelNum,tmp);
 PStringCat(versStr,tmp);
 }
}

/* PStringCopy
 * Copy pascal string a into b.
 */

void PStringCopy(Str255 a, Str255 b)
{
 BlockMove(a,b, a[0] + 1);
}

/* PStringCat
 * Concatenate pascal strings a & b, return in a. If there isn't enough
 * room in our array to join both strings, return what we can.
 */

void PStringCat(Str255 a, Str255 b)
{
 short len;

 if ((a[0] + b[0]) > 255)
 len = 255-a[0];
 else
 len = b[0];

 BlockMove(&(b[1]),&(a[a[0]+1]),len);
 a[0] += len;
}

Michael Trent
mtrent@msn.fullfeed.com

 

Community Search:
MacTech Search:

Software Updates via MacUpdate

Latest Forum Discussions

See All


Price Scanner via MacPrices.net


Jobs Board

All contents are Copyright 1984-2011 by Xplain Corporation. All rights reserved. Theme designed by Icreon.