mirror of
https://github.com/nickshanks/ResKnife.git
synced 2024-12-22 02:29:56 +00:00
234 lines
6.0 KiB
C++
234 lines
6.0 KiB
C++
|
#include "Utility.h"
|
||
|
|
||
|
/**********************/
|
||
|
/* QUICKDRAW ROUTINES */
|
||
|
/**********************/
|
||
|
|
||
|
/*** SET COLOUR ***/
|
||
|
void SetColour( RGBColor *colour, UInt16 red, UInt16 green, UInt16 blue )
|
||
|
{
|
||
|
colour->red = red;
|
||
|
colour->green = green;
|
||
|
colour->blue = blue;
|
||
|
}
|
||
|
|
||
|
/*** MAKE LOCAL ***/
|
||
|
void MakeLocal( WindowRef window, Point globalPoint, Point *localPoint )
|
||
|
{
|
||
|
GrafPtr oldPort;
|
||
|
GetPort( &oldPort );
|
||
|
SetPortWindowPort( window );
|
||
|
|
||
|
localPoint->h = globalPoint.h;
|
||
|
localPoint->v = globalPoint.v;
|
||
|
GlobalToLocal( localPoint );
|
||
|
|
||
|
SetPort( oldPort );
|
||
|
}
|
||
|
|
||
|
/*** MAKE GLOBAL ***/
|
||
|
void MakeGlobal( WindowRef window, Point localPoint, Point *globalPoint )
|
||
|
{
|
||
|
GrafPtr oldPort;
|
||
|
GetPort( &oldPort );
|
||
|
SetPortWindowPort( window );
|
||
|
|
||
|
globalPoint->h = localPoint.h;
|
||
|
globalPoint->v = localPoint.v;
|
||
|
LocalToGlobal( globalPoint );
|
||
|
|
||
|
SetPort( oldPort );
|
||
|
}
|
||
|
|
||
|
/*****************************/
|
||
|
/* HEX <==> ASCII CONVERSION */
|
||
|
/*****************************/
|
||
|
|
||
|
/*** ASCII TO TEXT ***/
|
||
|
void AsciiToText( char *source, char *dest, unsigned long size )
|
||
|
{
|
||
|
char ascii = 0x00, text = 0x00;
|
||
|
unsigned long sourceOffset = 0, destOffset = 0;
|
||
|
while( sourceOffset < size )
|
||
|
{
|
||
|
ascii = *(source + sourceOffset);
|
||
|
if( ascii < 0x20 || ascii >= 0x7F ) text = (char) 0x2E; // full stop
|
||
|
else if( ascii == 0x20 ) text = (char) 0xCA; // nbsp
|
||
|
else text = ascii;
|
||
|
*(dest + destOffset++) = text;
|
||
|
sourceOffset++;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/*** ASCII TO HEX ***/
|
||
|
void AsciiToHex( char *source, char *dest, unsigned long size )
|
||
|
{
|
||
|
char hex1 = 0x00, hex2 = 0x00;
|
||
|
unsigned long sourceOffset = 0, destOffset = 0;
|
||
|
while( sourceOffset < size )
|
||
|
{
|
||
|
hex1 = *(source + sourceOffset);
|
||
|
hex2 = *(source + sourceOffset);
|
||
|
hex1 >>= 4;
|
||
|
hex1 &= 0x0F;
|
||
|
hex2 &= 0x0F;
|
||
|
hex1 += (hex1 < 10)? 0x30 : 0x37;
|
||
|
hex2 += (hex2 < 10)? 0x30 : 0x37;
|
||
|
|
||
|
*(dest + destOffset++) = hex1;
|
||
|
*(dest + destOffset++) = hex2;
|
||
|
*(dest + destOffset++) = 0x20;
|
||
|
sourceOffset++;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/*** HEX TO ASCII ***/
|
||
|
void HexToAscii( char *source, char *dest, unsigned long size )
|
||
|
{
|
||
|
char currentByte = 0x00, newByte = 0x00, tempByte = 0x00;
|
||
|
unsigned long sourceOffset = 0, destOffset = 0;
|
||
|
while( sourceOffset < size )
|
||
|
{
|
||
|
currentByte = *(source + sourceOffset);
|
||
|
if( currentByte >= 0x30 && currentByte <= 0x39 ) newByte = currentByte - 0x30; // 0 to 9
|
||
|
else if( currentByte >= 0x41 && currentByte <= 0x46 ) newByte = currentByte - 0x37; // A to F
|
||
|
else if( currentByte >= 0x61 && currentByte <= 0x66 ) newByte = currentByte - 0x57; // a to f
|
||
|
else newByte = 0x00;
|
||
|
newByte <<= 4;
|
||
|
currentByte = *(source + sourceOffset +1);
|
||
|
if( currentByte >= 0x30 && currentByte <= 0x39 ) tempByte = currentByte - 0x30; // 0 to 9
|
||
|
else if( currentByte >= 0x41 && currentByte <= 0x46 ) tempByte = currentByte - 0x37; // A to F
|
||
|
else if( currentByte >= 0x61 && currentByte <= 0x66 ) tempByte = currentByte - 0x57; // a to f
|
||
|
else tempByte = 0x00;
|
||
|
newByte += tempByte & 0x0F;
|
||
|
*(dest + destOffset++) = newByte;
|
||
|
sourceOffset += 3;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/*** LONG TO HEX ***/
|
||
|
void LongToHex( char *source, char *dest )
|
||
|
{
|
||
|
// copy of AsciiToHex but with changes as noted
|
||
|
char hex1 = 0x00, hex2 = 0x00;
|
||
|
unsigned long sourceOffset = 0, destOffset = 0;
|
||
|
while( sourceOffset < sizeof(unsigned long) ) // size is always four
|
||
|
{
|
||
|
hex1 = *(source + sourceOffset);
|
||
|
hex2 = *(source + sourceOffset);
|
||
|
hex1 >>= 4;
|
||
|
hex1 &= 0x0F;
|
||
|
hex2 &= 0x0F;
|
||
|
hex1 += (hex1 < 10)? 0x30 : 0x37;
|
||
|
hex2 += (hex2 < 10)? 0x30 : 0x37;
|
||
|
|
||
|
*(dest + destOffset++) = hex1;
|
||
|
*(dest + destOffset++) = hex2; // no space inserted
|
||
|
sourceOffset++;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/*******************/
|
||
|
/* STRING ROUTINES */
|
||
|
/*******************/
|
||
|
|
||
|
/*** C STRING LENGTH ***/
|
||
|
unsigned long CStringLength( char *string )
|
||
|
{
|
||
|
unsigned long length;
|
||
|
Boolean end = false;
|
||
|
for( length = 0; end == false; length++ )
|
||
|
if( *(string + length) == 0x00 ) end = true;
|
||
|
return length;
|
||
|
}
|
||
|
|
||
|
/*** PASCAL STRING LENGTH ***/
|
||
|
unsigned char PStringLength( unsigned char *string )
|
||
|
{
|
||
|
return *string;
|
||
|
}
|
||
|
|
||
|
/*** TYPE TO C STRING ***/
|
||
|
void TypeToCString( const OSType type, char *string )
|
||
|
{
|
||
|
BlockMoveData( &type, &string[0], sizeof(OSType) );
|
||
|
string[sizeof(OSType)] = 0x00;
|
||
|
}
|
||
|
|
||
|
/*** TYPE TO PASCAL STRING ***/
|
||
|
void TypeToPString( const OSType type, Str255 string )
|
||
|
{
|
||
|
string[0] = sizeof(OSType);
|
||
|
BlockMoveData( &type, &string[1], sizeof(OSType) );
|
||
|
}
|
||
|
|
||
|
/*** TYPE TO CORE FOUNDATION STRING ***/
|
||
|
void TypeToCFString( const OSType type, CFStringRef *string )
|
||
|
{
|
||
|
char cString[5];
|
||
|
TypeToCString( type, (char *) &cString );
|
||
|
*string = CFStringCreateWithCString( CFAllocatorGetDefault(), (char *) &cString, kCFStringEncodingMacRoman );
|
||
|
}
|
||
|
|
||
|
/*** COPY C STRING ***/
|
||
|
void CopyCString( UInt8 *source, UInt8 *dest )
|
||
|
{
|
||
|
// #pragma warning off
|
||
|
while( *dest++ = *source++ );
|
||
|
// #pragma warning reset
|
||
|
}
|
||
|
|
||
|
/*** COPY PASCAL STRING ***/
|
||
|
void CopyPString( UInt8 *source, UInt8 *dest )
|
||
|
{
|
||
|
UInt8 length = *source, count;
|
||
|
for( count = 0; count <= length; count++ )
|
||
|
*dest++ = *source++;
|
||
|
}
|
||
|
|
||
|
/*** EQUAL C STRINGS ***/
|
||
|
Boolean EqualCStrings( UInt8 *source, UInt8 *dest )
|
||
|
{
|
||
|
while( *source != 0x00 )
|
||
|
if( *source++ != *dest++ ) return false;
|
||
|
return true;
|
||
|
}
|
||
|
|
||
|
/*** EQUAL PASCAL STRINGS ***/
|
||
|
Boolean EqualPStrings( UInt8 *source, UInt8 *dest )
|
||
|
{
|
||
|
UInt8 length = *source, count;
|
||
|
for( count = 0; count <= length; count++ )
|
||
|
if( *source++ != *dest++ ) return false;
|
||
|
return true;
|
||
|
}
|
||
|
|
||
|
/*** APPEND ONE PASCAL STRING ONTO ANOTHER ***/
|
||
|
void AppendPString( Str255 original, ConstStr255Param added )
|
||
|
{
|
||
|
short numberBytes = added[0]; // length of string to be added
|
||
|
short totalLength = added[0] + original[0];
|
||
|
|
||
|
if( totalLength > 255 ) // too long, adjust number of bytes to add
|
||
|
{
|
||
|
totalLength = 255;
|
||
|
numberBytes = totalLength - original[0];
|
||
|
}
|
||
|
|
||
|
BlockMoveData( &added[1], &original[totalLength-numberBytes + 1], numberBytes );
|
||
|
original[0] = totalLength; // new length of original string
|
||
|
while( ++totalLength <= 255 )
|
||
|
original[totalLength] = 0x00; // set rest of string to zero
|
||
|
}
|
||
|
|
||
|
/*****************/
|
||
|
/* MENU ROUTINES */
|
||
|
/*****************/
|
||
|
|
||
|
/*** ENABLE MENU COMMAND ***/
|
||
|
void EnableCommand( MenuRef menu, MenuCommand command, Boolean enable )
|
||
|
{
|
||
|
if( enable ) EnableMenuCommand( menu, command );
|
||
|
else DisableMenuCommand( menu, command );
|
||
|
}
|