TweetFollow Us on Twitter

May 96 Tips
Volume Number:12
Issue Number:5
Column Tag:Tips & Tidbits

Tips & Tidbits

By Steve Sisak

Note: Source code files accompanying article are located on MacTech CD-ROM or source code disks.

Invoking Handlers in Scripts, by Name

This is completely undocumented, as far as I know, but it may help. Suppose you have a script application containing a function:

on DoSomething(param1,param2)
 return param1+param2
end DoSomething

From C, you just have to send the script application an Apple event like this one:

CLASS: ascr

type: psbr

direct object: "----" "LIST"

(the list of AEDescs of parameters to pass to the script function)

additional parameter: "snam" "TEXT"

containing the name of the function to call (in our example: “DoSomething”)

et voilà.

This method allows to write “clean” scripts, using more memorable handler names, not using the «CLASStype» syntax.

Pierre-Loic Raynaud

[This event is called “Subroutine Call” and is described in more detail in Chapter 10 of the Apple Event Registry, “The AppleScript Suite”. On the Developer Mailing Reference Library CD, the pdf file is named “AppleScript Suite”, and the information is on pdf page 5 (paper page 7). - jk]

Swapping Bytes in a High Level Language,
the Saga Continues!

You have probably been swamped with everyone’s comments regarding the “Anti-Tip of the Month” that appeared in MacTech Magazine 11.10 (October 1995).

Greg Poole had the right idea when he submitted his tip about byte-swapping. You can tweak code until your fingers fall off, but often the best way to make something faster is by finding a better way of doing the same thing.

I have attached two files to this message: ByteSwap.c & ByteSwap.h. In a nutshell, we do our swapping as follows:

ByteSwap.h
#define SwapShort(myUnsignedShort)  \
 ((myUnsignedShort)>>8)|((myUnsignedShort)<<8)

In use:

{
    unsigned short someValue = 0x3210;
    someValue = SwapShort(someValue);
}

We quite simply move the hi-byte right, and the lo-byte left, then OR them back together.


ByteSwap.c
#include "byteswap.h"

unsigned long TransposeLong(unsigned long value)
{
  unsigned long   returnValue;
  ((unsigned char *) &returnValue)[3] = 
 ((unsigned char *) &value)[0];
  ((unsigned char *) &returnValue)[2] = 
 ((unsigned char *) &value)[1];
  ((unsigned char *) &returnValue)[1] = 
 ((unsigned char *) &value)[2];
  ((unsigned char *) &returnValue)[0] = 
 ((unsigned char *) &value)[3];
  return returnValue;
}

David Most

The Technical Editor Responds

There are quite a few methods available for byte swapping, but which algorithm is the best depends a great deal on the compiler and processor you are using. For instance, the PowerPC (and many other processors) have instructions specifically for this purpose. Unfortunately, since the C and C++ languages have not kept up with current processors (C is basically processor-independent PDP-11 assembly language), it is our job to trick the compiler into generating the correct code.

Some compilers provide directives for this purpose. For instance, if you are using CodeWarrior on a PowerPC you can just say:

inline long SwapLong(long val)
{
    return __XXXXX(val);  //  <<<need intrinsic for load byte-swapped>>>
}

You may notice that I’m using C++ inline functions here instead of C #defines. To quote the “Apple Unofficial C++ Style Guide” (develop 2, p. 209): “One of the most powerful features of the C++ language is the C preprocessor. Don’t use it.” Inline functions are not only more readable than preprocessor macros, but, because they limit side effects, allow the compiler more latitude in optimizing your code.

Barring that, we need to find something that we can say in C that can get bytes swapped without generating egregiously bad code. David’s solution is probably a good one for shorts because it is a pure mathematical expression, allowing the compiler to optimize it in any way it chooses. For longs, his solution is one of the safest, if you know nothing about the compiler and/or processor you’re building for. (I would, however, convert both to inline functions.)

However, if you do know something about your processor, you can do better. In the case of the PPC, you really want to get your compiler to emit a load byte-swapped instruction. On a 680x0, you have a little latitude. One trick that comes to mind is that the 680x0 has predecrement and postincrement addressing modes. This means that:

foo = *p++ and foo = *--p

are fast and (1 instruction)

foo = *++p and foo = *p--

are slow (3 instructions). Therefore we can swap a long on a 680x0 with:

inline long SwapLong(long val)
{
    Byte* p = ((Byte*) val)[4];  // 680x0’s are big-endian

 long val = *--p;
 val  = (val << 8) | *--p;
 val  = (val << 8) | *--p;
  return (val << 8) | *--p;
}

The PowerPC has only post-increment instructions, so this will generate lousy code. (If someone would like to time a bunch of approaches, I’d be glad to publish the results.)

I must say that the bottom line is: this is all a bunch of work that would be completely unnecessary if the C language had kept up with reality. Here’s my proposal to the ANSI committee:

Make littleendian and bigendian storage classifiers like const and volatile. Then I could just type:

typedef struct Foo
{
    littleendian long    bar;
    bigendian short      baz;
} Foo;

void blah(Foo* foo)
{
    long  bar = foo->bar;
    short baz = foo->baz;

    ...
}

...and let the compiler deal with it while I spend my time writing code which does real work.

- sgs

Fix For Tip Of The Month, January 1996

I’m sending this short note just to point out that, although Greg Poole is right in writing that a file or directory can be moved by the CatMove function only if both the source and destination are on the same volume, he seems to forget that every Macintosh volume, not just the System volume, has a Trash folder.

Thus, if we pass to the FindFolder function the volume reference number of the file to be deleted instead of the constant kOnSystemDisk, we will be able to find the directory ID of the local Trash.

Line #44 of “FSpTrashFile.c” source file should be changed from:

theErr = FindFolder( kOnSystemDisk, kTrashFolderType, 
  kDontCreateFolder, &vRefNum, &dirID );

to:

theErr = FindFolder( (*theFile).vRefNum, kTrashFolderType, 
  kDontCreateFolder, &vRefNum, &dirID );

Live Long and Prosper!

Luigi Belverato

 

Community Search:
MacTech Search:

Software Updates via MacUpdate

Latest Forum Discussions

See All

Combo Quest (Games)
Combo Quest 1.0 Device: iOS Universal Category: Games Price: $.99, Version: 1.0 (iTunes) Description: Combo Quest is an epic, time tap role-playing adventure. In this unique masterpiece, you are a knight on a heroic quest to retrieve... | Read more »
Hero Emblems (Games)
Hero Emblems 1.0 Device: iOS Universal Category: Games Price: $2.99, Version: 1.0 (iTunes) Description: ** 25% OFF for a limited time to celebrate the release ** ** Note for iPhone 6 user: If it doesn't run fullscreen on your device... | Read more »
Puzzle Blitz (Games)
Puzzle Blitz 1.0 Device: iOS Universal Category: Games Price: $1.99, Version: 1.0 (iTunes) Description: Puzzle Blitz is a frantic puzzle solving race against the clock! Solve as many puzzles as you can, before time runs out! You have... | Read more »
Sky Patrol (Games)
Sky Patrol 1.0.1 Device: iOS Universal Category: Games Price: $1.99, Version: 1.0.1 (iTunes) Description: 'Strategic Twist On The Classic Shooter Genre' - Indie Game Mag... | Read more »
The Princess Bride - The Official Game...
The Princess Bride - The Official Game 1.1 Device: iOS Universal Category: Games Price: $3.99, Version: 1.1 (iTunes) Description: An epic game based on the beloved classic movie? Inconceivable! Play the world of The Princess Bride... | Read more »
Frozen Synapse (Games)
Frozen Synapse 1.0 Device: iOS iPhone Category: Games Price: $2.99, Version: 1.0 (iTunes) Description: Frozen Synapse is a multi-award-winning tactical game. (Full cross-play with desktop and tablet versions) 9/10 Edge 9/10 Eurogamer... | Read more »
Space Marshals (Games)
Space Marshals 1.0.1 Device: iOS Universal Category: Games Price: $4.99, Version: 1.0.1 (iTunes) Description: ### IMPORTANT ### Please note that iPhone 4 is not supported. Space Marshals is a Sci-fi Wild West adventure taking place... | Read more »
Battle Slimes (Games)
Battle Slimes 1.0 Device: iOS Universal Category: Games Price: $1.99, Version: 1.0 (iTunes) Description: BATTLE SLIMES is a fun local multiplayer game. Control speedy & bouncy slime blobs as you compete with friends and family.... | Read more »
Spectrum - 3D Avenue (Games)
Spectrum - 3D Avenue 1.0 Device: iOS Universal Category: Games Price: $2.99, Version: 1.0 (iTunes) Description: "Spectrum is a pretty cool take on twitchy/reaction-based gameplay with enough complexity and style to stand out from the... | Read more »
Drop Wizard (Games)
Drop Wizard 1.0 Device: iOS Universal Category: Games Price: $1.99, Version: 1.0 (iTunes) Description: Bring back the joy of arcade games! Drop Wizard is an action arcade game where you play as Teo, a wizard on a quest to save his... | Read more »

Price Scanner via MacPrices.net

Our MacBook Price Trackers will show you the...
Our Apple award-winning MacBook Price Trackers are continually updated with the latest information on prices, bundles, and availability for 16″ and 14″ MacBook Pros along with 13″ and 15″ MacBook... Read more
Amazon is offering a 10% discount on Apple’s...
Don’t pay full price! Amazon has 16-inch M4 Pro MacBook Pros (Silver and Black colors) on sale today for 10% off Apple’s MSRP. Shipping is free. These are the lowest prices currently available for 16... Read more
13-inch M4 MacBook Airs on sale for $150 off...
Amazon has new 13″ M4 MacBook Airs on sale for $150 off MSRP right now, starting at $849. Sale prices apply to most colors and configurations. Be sure to select Amazon as the seller, rather than a... Read more
15-inch M4 MacBook Airs on sale for $150 off...
Amazon has new 15″ M4 MacBook Airs on sale for $150 off Apple’s MSRP, starting at $1049. Be sure to select Amazon as the seller, rather than a third-party: – 15″ M4 MacBook Air (16GB/256GB): $1049, $... Read more
Amazon is offering a $50 discount on Apple’s...
Amazon has Apple’s 11th-generation A16 iPads in stock on sale for $50 (or a little more) off MSRP this week. Shipping is free: – 11″ 11th-generation 128GB WiFi iPads: $299 $50 off MSRP – 11″ 11th-... Read more
Clearance 13-inch M1 MacBook Airs available f...
Walmart has clearance, but new, Apple 13″ M1 MacBook Airs (8GB RAM, 256GB SSD) available online for $649, $360 off original MSRP, in Space Gray, Silver, and Gold colors. These are new MacBooks for... Read more
iPad minis on sale for $100 off Apple’s MSRP...
Amazon is offering $100 discounts (up to 20% off) on Apple’s newest 2024 WiFi iPad minis, each with free shipping. These are the lowest prices available for new minis among the Apple retailers we... Read more
AirPods Max headphones on sale for $479, $70...
Amazon has AirPods Max with USB-C on sale for $479.99 in all colors. Shipping is free. Their price is $70 off Apple’s MSRP, and it’s the lowest price available today for AirPods Max. Keep an eye on... Read more
14-inch M4 Pro/M4 Max MacBook Pros on sale th...
Don’t pay full price! Get a new 14″ MacBook Pro with an M4 Pro or M4 Max CPU for up to $320 off Apple’s MSRP this weekend at these retailers…they are the lowest prices available for these MacBook... Read more
Get a 15-inch M4 MacBook Air for $150 off App...
A couple of Apple retailers are offering $150 discounts on new 15″ M4 MacBook Airs this weekend. Prices at these retailers start at $1049: (1): Amazon has new 15″ M4 MacBook Airs on sale for $150 off... Read more

Jobs Board

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