TweetFollow Us on Twitter

XCMD in App
Volume Number:9
Issue Number:7
Column Tag:C Workshop

XCMD’s in Standalone Applications

Here’s a way to write XCMD’s so they’re usable for more than HyperCard

By Gerry H. Kenner, Magna, Utah

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

About the author

Gerry Kenner is a professional electrical and computer engineering consultant, university researcher and sometimes writer who specializes in image analysis systems for investigative scientists.

INTRODUCTION

This paper shows how to access HyperCard XCMDs which have been incorporated into the resource file of a standalone application. This is done by creating a function named LoadXCMD which takes the name and parameters of an XCMD and provides glue code for accessing them. In addition, code is provided for responding to callbacks by the HyperCard utility functions.

HyperCard stacks are unequaled as dynamic front ends for interfacing with scientific instruments. Hypercard facilitates entering data and displaying results by using buttons and text fields. Elaborate front ends can be thrown together in a matter of hours and the resulting scripts can be altered within minutes when rapid changes in the interface are required.

One major problem with HyperCard stacks is the slow execution speed of the HyperTalk scripts. Fortunately, they can be speeded up by liberal use of XCMD’s and XFCN’s for time intensive operations.

A price is paid for these advantages. Most obvious is that HyperCard stacks can become very large. Another disadvantage is that they are susceptible to damage. One quickly learns to keep at least two back-up copies of working stacks. A more subtle problem is that of bullet-proofing large Hypercard programs so that the average technical person can run them.

Once the stacks become finalized, one alternative is to replace them with standalone applications developed using THINK C with objects. The THINK Class Libraries can be used to provide the replacement interface. The XCMD’a and XFCN’s could be modified into modules which could be called by the application or else incorporated directly using the system described in this paper. An application prototyper such as AppMaker or Marksman would be invaluable for this.

I obtained some insights on how to incorporate XCMD’s into standalone applications from a note in the October 1989 MacTutor by Peter B. Nagel of Denver, CO. With this information as a basis I proceeded to write the demo code published here.

Disclaimer

As in my previous articles I am only including the code necessary to understand the project. This code is enough for an intermediate programmer to fill in what is missing. Typically, I do not declare variables or state which header files must be included. A copy of the complete project is available on the MacTutor Disk.

STANDALONE APPLICATION

The standalone program passes the number 5 and the message “Return to application” to a modified version of Apple’s Flash XCMD demo which inverts the screen 5 times (flashes) and returns a message which is then displayed in a window.

The program requires two files, pTest and pXCMD. PTest is an entry file containing the main function which needs code for initializing the toolbox, creating a window, calling the XCMD and outputting the return value to the window. The XCMD function call is as follows.

/* 1 */

TempHdl = LoadXCMD(3, “pXFCN”, “5”, “Hello World!”);

Three is the number of parameters being passed, pXFCN is the name of the XCMD code resource, 5 is the number of beeps requested while “Hello World” is the string which will be returned by the XCMD. TempHdl points to the return string.

Although the memory allocated to TempHdl was assigned elsewhere, it must be deallocated with a call to DisposHandle.

The pXFCN.h file references HyperXcmd.h and declares prototypes of four functions. The function declarations are as follows.

/* 2 */

Handle LoadXCMD(short Count, ...);
void JumpToXCMD(XCmdPtr ParamPtr, Handle CodeAddr);
void SwitchXCMD(void);
char *StrCpy(char *s1, char *s2);

It also contains an enum list of Apple’s HyperCard request codes. Complete lists of these can be found in the pre 1988 HyperCard header files. To facilitate identification, I am including a partial list here.

enum {  
 xreqSendCardMessage = 1,
 xreqEvalExpr,
 xreqSendHCMessage = 5;
 xreqSendHCMessage = 8;
 
 ...

 xreqScanToReturn,
 xreqScanToZero = 39   // was suppose to be 29!  Oops!
};

The function LoadXCMD takes the parameters passed, converts them into XCMD readable form and then calls the code resource. The code is as follows.

/* 3 */

1. Handle LoadXCMD(short Count, ...)
2. {
3. void *ListPtr;
4. char *CharPtr;
5. Handle CodeAddr, TempHdl;
6. shorti, Err;
7. size_t Size;
 
8. Count = Count - 1;
9. ListPtr = &Count + 1;
10.CharPtr = *(*(char***)&ListPtr)++;
11.CtoPstr(CharPtr);
12.CodeAddr = GetNamedResource(‘XFCN’, CharPtr);
13.MoveHHi(CodeAddr);
14.HLock(CodeAddr);

15.ParamPtr = (XCmdPtr)NewPtr(128L);
16.ParamPtr->entryPoint = (Ptr)SwitchXCMD;

17.ParamPtr->paramCount = Count;
18.for (i = 0; i < ParamPtr->paramCount; ++i)
19.{
20.ParamPtr->params[i] = NewHandle(256);
21.HLock(ParamPtr->params[i]);
22.CharPtr = *(*(char***)&ListPtr)++;
23.strcpy((char*)*(ParamPtr->params[i]), CharPtr);
24.}
 
25.JumpToXCMD(ParamPtr, CodeAddr);
26.Size = strlen(*(ParamPtr->returnValue));
27.TempHdl = NewHandle((long)Size);
28.strcpy((char*)*TempHdl, 
 (char*)*(ParamPtr->returnValue));
29.HLock(TempHdl);
 
30.for (i = 0; i < ParamPtr->paramCount; ++i)
31.{
32.HUnlock(ParamPtr->params[i]);
33.DisposHandle(ParamPtr->params[i]);
34.}
35.HUnlock(CodeAddr);
36.HUnlock(ParamPtr->returnValue);
 
37.DisposHandle(ParamPtr->returnValue);
38.DisposPtr((XCmdPtr)ParamPtr);
39.ReleaseResource(CodeAddr);
 
40.return(TempHdl);
41.}

Instruction 8 retrieves the number of parameters passed. Instructions 9 through 12 get the name of the XCMD and load the resource code. The address of the XCMD is obtained by using GetResource to load the code resource into memory and get a handle to its location. Instruction 15 allocates memory for the XcmdBlock pointed to by ParamPtr. ParamPtr was declared as a global since it is used both here and by SwitchXCMD. Instruction 16 sets up the function SwitchXCMD as the entry point for HyperCard XCMD utility calls. Instructions 17 through 24 finish setting up the XcmdBlock for the XCMD call. Note that space was not allocated for returnValue even though the code disposes of a handle to this value before terminating. Variables were assigned to params[0] and params[1].

Instruction 25 calls the function JumpToXCMD which is an assembly lanquage glue routine for placing the address of the XCmdBlock on the stack and then jumping to the address of the XCMD (actually XFCN in this case). Instructions 26 through 29 prepare the contents of returnValue for passing back to the calling function. The final portion of the function disposes of the various handles and pointers created in the program. CodeAddr was disposed of with ReleaseResource.

After returning from JumpToXCMD, the function StrCpy was used to copy returnValue into a temporary string. StrCpy was used rather than the ANSI library routine strcpy to avoid the possibility of LoadSeg being called with attendent movement of memory. This is necessary because the compiler will not permit the locking of the handle returnValue, apparently because the handle was not created within the function.

Here is the code for JumpToXCMD.

/* 4 */

1. void JumpToXCMD(XCmdPtr ParamPtr, Handle CodeAddr)
2. {
3. asm
4. {
5. move.l ParamPtr(a6), -(a7)
6. move.l CodeAddr(a6), a0
7. move.l (a0), a0
8. jsr  (a0)
9. }
10.}

The address of the XCmdBlock is moved on to the stack in line 5 while the handle pointing to the code resource is moved into register A0, dereferenced twice and then jumped to in lines 6 to 8.

Remember that the address of the function SwitchXCmd was placed in the entryPoint field of the XCmdBlock. This is the code which is jumped to when HyperCard utility functions are called. It consists of a switch statement which identifies the code for each utility function. I am only going to show the code for PasToZero and SendHCMessage but the principal applies to accessing all the functions. The code itself is self-explanatory and doesn’t require a detailed explanation.

/* 5 */

void SwitchXCMD(void)
{
 WindowPtrTempWindow, OldPort;
 Handle TempHandle;
 long   TempLong;
 Str255 TempStr;
 Rect   TempRect;
 
 switch (ParamPtr->request)
 {
 case xreqZeroToPas:
 strcpy((char*)ParamPtr->inArgs[1], 
 (char*)ParamPtr->inArgs[0]);
 CtoPstr((char*)ParamPtr->inArgs[1]);
 break;
 
 case xreqSendHCMessage:
 GetPort(&OldPort);
 SetRect(&TempRect, 20, screenBits.bounds.bottom - 80, 
 480, screenBits.bounds.bottom - 20);
 TempWindow = NewWindow(0L, &TempRect, “\pHC Message”, 
 TRUE, plainDBox, (WindowPtr)-1L, TRUE, 0L);
 SetPort(TempWindow);
 MoveTo(10, 30);
 DrawString((char*)ParamPtr->inArgs[0]);
 Delay(90L, &TempLong);
 DisposeWindow(TempWindow);
 SetPort(OldPort);
 break;
 
 default:
 break;
 }
}

Writing to code for StrCpy is left as an exercise for the reader. My version is written in assembly lanquage.

THE XCMD (XFCN)

For completeness I have included a partial listing of CFlash, the modified XCMD which is called by pXFCN. This example uses the HyperCard utilites SendHCMessage and ZeroToPas. In addition it uses several Toolbox function calls and the C library call strcpy.

There is a problem with some of the C library calls. Functions which do not use globals referenced from A5 or A4 appear to work without problems. Thus, strcpy and strcat can be used. Routines such as atoi and atol which use globals will not run properly in the program as written and attempts to use them often result in crashs.

/* 6 */

 RememberA4();
 SetUpA4();
 
 HLock(paramPtr);
 paramPtr->returnValue = NewHandle(256L);
 StrPtr = (StringPtr)NewPtr(256L);
 
 ZeroToPas(paramPtr, (char*)*(paramPtr->params[0]), StrPtr);
 StringToNum(StrPtr, &TempLong);
 flashCount = (int)TempLong;
 
 GetPort(&port);
 for (again = 1; again <= flashCount; again++) 
 {
 InvertRect(&port->portRect);
 InvertRect(&port->portRect);
 }
 
 SendHCMessage(paramPtr, 
 (StringPtr) ”\pput \”This is a message\” into msg”);
 Delay(60L, &TempLong);
 
 strcpy((char*)*(paramPtr->returnValue), 
 (char*)*(paramPtr->params[1]));
 DisposPtr(StrPtr);
 RestoreA4();
 HUnlock(paramPtr);

ADDING XCMD CODE RESOURCES TO THE .RSRC FILE

This can be done directly in THINK C 5.0 by using the merge option when building the code resource. For other versions of C use ResEdit to add the files.

DISCUSSION

Initially I was disturbed to discover I could not use some of the C library routines in XCMD’s which I eventually planned to use in standalone applications. Upon reflection, combined with some insights gained while writing the programs for this article, I finally decided that for me at least the problem was minor, if not non-existent.

The insights referred to above were the discovery that the inclusion of atoi increased the size of the XCMD from 3k to 10k. This is catatrophic if one hopes to write a large program which includes perhaps 100 XCMD’s. It is a nuisance with smaller routines.

The reflection says that the complete object code of a C library routine would have to be included in every XCMD which made use of it. The redundancy would quickly get out of hand.

The Toolbox and the SANE library have functions for almost everything that needs to be done in a program or code resource. This code is in the ROM and is always available for use without adding to the overhead. Portability considerations aside, it is desirable to take advantage of it whenever possible while writing Macintosh specific applications.

CONCLUSION

A practical method of using XCMD’s in standalone C applications was presented. An evaluation of the memory size problems encountered while developing this procedure would indicate that high-level lanquage library routines (C, Pascal, etc.) should be avoided in XCMD’s used by Hypercard as well as those written for standalone applications.

I can be reached on internet at ghkenner@cc.utah.edu, on Prodigy at BSSX14B and Apple Link at UUTL.

 
AAPL
$474.83
Apple Inc.
+7.47
MSFT
$32.39
Microsoft Corpora
-0.48
GOOG
$883.30
Google Inc.
-2.21

MacTech Search:
Community Search:

Software Updates via MacUpdate

TrailRunner 3.7.746 - Route planning for...
Note: While the software is classified as freeware, it is actually donationware. Please consider making a donation to help stimulate development. TrailRunner is the perfect companion for runners,... Read more
VueScan 9.2.23 - Scanner software with a...
VueScan is a scanning program that works with most high-quality flatbed and film scanners to produce scans that have excellent color fidelity and color balance. VueScan is easy to use, and has... Read more
Acorn 4.1 - Bitmap image editor. (Demo)
Acorn is a new image editor built with one goal in mind - simplicity. Fast, easy, and fluid, Acorn provides the options you'll need without any overhead. Acorn feels right, and won't drain your bank... Read more
Mellel 3.2.3 - Powerful word processor w...
Mellel is the leading word processor for OS X, and has been widely considered the industry standard since its inception. Mellel focuses on writers and scholars for technical writing and multilingual... Read more
Iridient Developer 2.2 - Powerful image...
Iridient Developer (was RAW Developer) is a powerful image conversion application designed specifically for OS X. Iridient Developer gives advanced photographers total control over every aspect of... Read more
Delicious Library 3.1.2 - Import, browse...
Delicious Library allows you to import, browse, and share all your books, movies, music, and video games with Delicious Library. Run your very own library from your home or office using our... Read more
Epson Printer Drivers for OS X 2.15 - Fo...
Epson Printer Drivers includes the latest printing and scanning software for OS X 10.6, 10.7, and 10.8. Click here for a list of supported Epson printers and scanners.OS X 10.6 or laterDownload Now Read more
Freeway Pro 6.1.0 - Drag-and-drop Web de...
Freeway Pro lets you build websites with speed and precision... without writing a line of code! With it's user-oriented drag-and-drop interface, Freeway Pro helps you piece together the website of... Read more
Transmission 2.82 - Popular BitTorrent c...
Transmission is a fast, easy and free multi-platform BitTorrent client. Transmission sets initial preferences so things "Just Work", while advanced features like watch directories, bad peer blocking... Read more
Google Earth Web Plug-in 7.1.1.1888 - Em...
Google Earth Plug-in and its JavaScript API let you embed Google Earth, a true 3D digital globe, into your Web pages. Using the API you can draw markers and lines, drape images over the terrain, add... Read more

The D.E.C Provides Readers With An Inter...
The D.E.C Provides Readers With An Interactive Comic Book Platform Posted by Andrew Stevens on August 13th, 2013 [ permalink ] | Read more »
Choose ‘Toons: Choose Your Own Adventure...
As a huge fan of interactive fiction thanks to a childhood full of Fighting Fantasy and Choose Your Own Adventure books, it’s been a pretty exciting time on the App Store of late. Besides Tin Man Games’s steady conquering of all things Fighting... | Read more »
Premier League Kicks Off This Week; Watc...
Premier League Kicks Off This Week; Watch Every Single Match Live Via NBC Sports Live Extra and Your iPhone or iPad Posted by Jeff Scott on August 13th, 2013 [ permalink ] | Read more »
Meet Daniel Singer, the Thirteen-Year-Ol...
Ever had the idea for an app, but felt like the lack of programming and design ability was a bit of a non-starter? Well, 13-year-old Daniel Singer has made an app. He’s the designer of Backdoor, a chat app that lets users chat with their friends... | Read more »
Flashout 2 Gets Revealed, Offers Up An E...
Flashout 2 Gets Revealed, Offers Up An Enhanced Career Mode and Exciting New Circuits Posted by Andrew Stevens on August 13th, 2013 [ permalink ] | Read more »
Mickey Mouse Clubhouse Paint and Play HD...
Mickey Mouse Clubhouse Paint and Play HD Review By Amy Solomon on August 13th, 2013 Our Rating: :: 3-D FUNiPad Only App - Designed for the iPad Color in areas of the Mickey Mouse Clubhouse with a variety of art supplies for fun 3-... | Read more »
Strategy & Tactics: World War II Upd...
Strategy & Tactics: World War II Update Adds Two New Scenarios Posted by Andrew Stevens on August 12th, 2013 [ permalink ] Universal App - Designed for iPhone and iPad | Read more »
Expenses Planner Review
Expenses Planner Review By Angela LaFollette on August 12th, 2013 Our Rating: :: PLAIN AND SIMPLEUniversal App - Designed for iPhone and iPad Expenses Planner keeps track of future bills through due date reminders, and it also... | Read more »
Kinesis: Strategy in Motion Brings An Ad...
Kinesis: Strategy in Motion Brings An Adaptation Of The Classic Strategic Board Game To iOS Posted by Andrew Stevens on August 12th, 2013 [ | Read more »
Z-Man Games Creates New Studio, Will Bri...
Z-Man Games Creates New Studio, Will Bring A Digital Version of Pandemic! | Read more »

Price Scanner via MacPrices.net

Apple refurbished iPads and iPad minis availa...
 Apple has Certified Refurbished iPad 4s and iPad minis available for up to $140 off the cost of new iPads. Apple’s one-year warranty is included with each model, and shipping is free: - 64GB Wi-Fi... Read more
Snag an 11-inch MacBook Air for as low as $74...
 The Apple Store has Apple Certified Refurbished 2012 11″ MacBook Airs available starting at $749. An Apple one-year warranty is included with each model, and shipping is free: - 11″ 1.7GHz/64GB... Read more
15″ 2.3GHz MacBook Pro (refurbished) availabl...
 The Apple Store has Apple Certified Refurbished 15″ 2.3GHz MacBook Pros available for $1449 or $350 off the cost of new models. Apple’s one-year warranty is standard, and shipping is free. Read more
15″ 2.7GHz Retina MacBook Pro available with...
 Adorama has the 15″ 2.7GHz Retina MacBook Pro in stock for $2799 including a free 3-year AppleCare Protection Plan ($349 value), free copy of Parallels Desktop ($80 value), free shipping, plus NY/NJ... Read more
13″ 2.5GHz MacBook Pro on sale for $150 off M...
B&H Photo has the 13″ 2.5GHz MacBook Pro on sale for $1049.95 including free shipping. Their price is $150 off MSRP plus NY sales tax only. B&H will include free copies of Parallels Desktop... Read more
iPod touch (refurbished) available for up to...
The Apple Store is now offering a full line of Apple Certified Refurbished 2012 iPod touches for up to $70 off MSRP. Apple’s one-year warranty is included with each model, and shipping is free: -... Read more
27″ Apple Display (refurbished) available for...
The Apple Store has Apple Certified Refurbished 27″ Thunderbolt Displays available for $799 including free shipping. That’s $200 off the cost of new models. Read more
Apple TV (refurbished) now available for only...
The Apple Store has Apple Certified Refurbished 2012 Apple TVs now available for $75 including free shipping. That’s $24 off the cost of new models. Apple’s one-year warranty is standard. Read more
AnandTech Reviews 2013 MacBook Air (11-inch)...
AnandTech is never the first out with Apple new product reviews, but I’m always interested in reading their detailed, in-depth analyses of Macs and iDevices. AnandTech’s Vivek Gowri bought and tried... Read more
iPad, Tab, Nexus, Surface, And Kindle Fire: W...
VentureBeat’s John Koetsier says: The iPad may have lost the tablet wars to an army of Android tabs, but its still first in peoples hearts. Second place, however, belongs to a somewhat unlikely... Read more

Jobs Board

Sales Representative - *Apple* Honda - Appl...
APPLE HONDA AUTOMOTIVE CAREER FAIR! NOW HIRING AUTO SALES REPS, AUTO SERVICE BDC REPS & AUTOMOTIVE BILLER! NO EXPERIENCE NEEDED! Apple Honda is offering YOU a Read more
*Apple* Developer Support Advisor - Portugue...
Changing the world is all in a day's work at Apple . If you love innovation, here's your chance to make a career of it. You'll work hard. But the job comes with more than Read more
RBB - *Apple* OS X Platform Engineer - Barc...
RBB - Apple OS X Platform Engineer Ref 63198 Country USA…protected by law. Main Function | The engineering of Apple OS X based solutions, in line with customer and Read more
RBB - Core Software Engineer - Mac Platform (...
RBB - Core Software Engineer - Mac Platform ( Apple OS X) Ref 63199 Country USA City Dallas Business Area Global Technology Contract Type Permanent Estimated publish end Read more
*Apple* Desktop Analyst - Infinity Consultin...
Job Title: Apple Desktop Analyst Location: Yonkers, NY Job Type: Contract to hire Ref No: 13-02843 Date: 2013-07-30 Find other jobs in Yonkers Desktop Analyst The Read more
All contents are Copyright 1984-2011 by Xplain Corporation. All rights reserved. Theme designed by Icreon.