Dec 93 Tips, Tidbits
Volume Number: | | 9
|
Issue Number: | | 12
|
Column Tag: | | Tips & Tidbits
|
Tips & Tidbits
By Neil Ticktin, Editor-in-Chief
This column is your opportunity to spread the word about little bits of information that you find out about. These tidbits can be programming related or they can be user tips that are particularly useful to programmers.
MacTech Magazine will pay $25 for every tip used, and $50 for the Tip of the Month. Or you can take your award in orders or subscriptions.
To submit a tip, send in a letter to the magazine. E-mail is our preferred method, but feel free to send something via the US Mail. See page two for all addresses. If you do send snail mail, enclose a printed copy and a disk copy of the letter so that it does not have to be retyped.
Tip of the Month: Accelerating MPW's Startup Sequence
This trick is described in the Examples folder that comes with MPW. But in talking to other users, I was surprised to find few people know about it, and even fewer use it.
When MPW is launched, it executes a script named Startup, which sets up environment variables, aliases, custom menus, and so forth. This can take from several seconds to over a minute.
It is easy to optimize this startup sequence. After launching MPW normally, copy the following lines into the MPW Worksheet window. Then highlight them as a block and press Enter:
/* 1 */
Rename "{MPW}"Startup "{MPW}"Startup.Old
Begin
Set
Export
Alias
AddMenu
End > "{MPW}"Startup
This creates an optimized Startup script that will typically execute two to ten times faster than the original. The initial Rename command saves the original Startup script, so you can revert to it if you decide you dont like the results. But if you do before and after timings, I think youll be happy with the speed improvement.
There are a couple of caveats though. First, the optimized Startup script is not organized and commented the same way the original is. If you frequently change your MPW configuration, you might find the optimized script harder to read and edit. Or you might find it to be easier; the point is that it is different.
Second, if you have UserStartup files that are often modified (such as UserStartupRunMenu, described in MacTech Magazine, October, 1993), you may wish to add a line to the end of the optimized Startup script to forcibly execute the UserStartup commands. With UserStartupRunMenu as an example, heres what the command would look like:
Execute "{PrefsFolder}"UserStartupRunMenu
In doing this, you will cause some startup commands to be executed more than once (since some commands from the UserStartup will appear in the optimized Startup script as well). As a final tweak, you should then edit the optimized Startup script to delete any commands which will be carried out by forcibly executed UserStartup scripts.
- Lee David Rimar, Absoft Corporation
Strings that go both ways
When writing programs in C on the Macintosh, one thing that we need to deal with is the two possible formats of strings: C-style and Pascal-style. To save the repeated conversion time between the two formats, I sometimes use a format I call the two-in-one format that has both at once.
The C-style string uses a terminating zero character (null) at the end of the string to mark its length. The Pascal-style string uses a length byte as the first byte of the string (see figure). Both are allocated by allocating the space for the maximum number of characters the string will hold plus one for either the length byte or the termination byte. My two-in-one format uses both a length byte as its first byte and the zero byte as its last. To allocate this, take the data size and add two for both the Pascal-style length byte and the C-style terminator. The illustration shows how the length byte, string data, and terminator are laid out.
To use this as a Pascal string, simply use it normally. To use it as a C string, pass the string address as string + 1. Of course, if the size of the string is changed, then either the length byte or the terminator will need to adjusted. If you use calls that treat it as a C string, then the length byte will need adjusting. If you use Pascal-style calls, the terminator will need adjusting. The adjusting isnt always as hard as you might think.
The following code fragment illustrates using the two-in-one string format:
/* 2 */
Str255 stringOne;
char stringTwo[50];
...
/* #1 Toolbox call uses Pascal-style string. */
GetIText (dialogItemHandle, stringOne);
stringOne[stringOne[0] + 1] = \0; // Add term. byte
...
/* #2 Uses C-style string and returns the num. of characters. */
stringTwo[0] = sprintf (stringTwo + 1, foobar);
...
/* #3 Two-in-one style, notice the length plus two. */
BlockMove (stringOne, stringTwo, stringOne[0] + 2);
In #1, the toolbox call returns a Pascal-style string, so, for the two-in-one format weve got to add the terminator. We know that stringOne[0] is the length byte and we know that stringOne[length] is the last byte of data in the string. So, the length plus one is the terminator byte.
In #2, were using the string as a C-style string. Notice that the C-style string starts at an offset of one, this avoids the Pascal-style length byte. Fortunately, sprintf returns the number of bytes (characters) written if theres no error so we can use it to adjust the length byte. Other C library calls like printf, scanf and their derivatives also return the number of characters processed.
In #3, were using the Toolbox call BlockMove() to copy a two-in-one format string. Since the length is the length of the data, weve got to add two to allow for the length byte and the terminator byte.
Ive found that judicious use of this string format can save a lot of conversion in string-heavy programs.
- Malcolm Teas
Step-step
In Think Pascal, the option key allows you to step-step through the code. Hold down the option key and pull down the RUN menu. You will see the step-step option. Step-step walks through your source code one line at a time, stepping into functions and procedures. Its like a guided tour through your own program. Hold down the option key and browse through the Think Pascal menus. You may be surprised how much the option key modifies in the menus.
- Lillian Thompson, Reno, Nevada