TweetFollow Us on Twitter

Feb 90 Letters
Volume Number:6
Issue Number:2
Column Tag:Letters

CheckAbort() Revised

By David E. Smith, Editor & Publisher, MacTutor

Let’s Doodat!

Greg King, Ph.D.

SCIEX

Ontario, Canada

This letter is to point out 2 bugs in Lee Neuse’s “check_abort” routine (Three Doodats, Sept. 89).

The first bug occurs when the command period event is the last event in the queue. Mr. Neuse’s code removes the event and then tests to see if it was the last event. This will never succeed because the event has been removed. The result is usually a bus error because the qLink field of the last event contains a -1. The funny thing is that the routine will not crash if the command-period is the only event in the queue.

The second bug is more subtle. Dequeue does not de-allocate the memory for the event entry being removed from the queue, this is the responsibility of the program calling it (IM2-383). Mr. Neuse doesn’t do this so every time an event is removed it hangs around the heap.

Below is my version of a command-period handler that addresses the above stated problems. It has been tested for the past week in the print and update loops of a 400K application. It is a scientific application that often has to plot many thousands of data points on the screen, and it is often desirable to be able to both abort long updates and queue up multiple keystroke commands. Please excuse my style, I was originally a Pascal programmer.

/* 1 */

Boolean CmdPeriod()
{
EvQElPtreq_p, theEntry;
Boolean f_found, last, dispose_entry;

f_found = FALSE;
last = FALSE;

/* Start at head of internal queue. */
eq_p = (EvQElPtr) (EventQueue.qHead);

do {
 /* Test for end of queue first. */
 if (eq_p == (EvQElPtr) EventQueue.qTail)
 last = TRUE;

 /* Is this a cmd-period event. */
 if ((eq_p->evtQWhat == keyDown 
 || eq_p->evtQWhat == autoKey) 
 && (eq_p->evtQModifiers & cmdKey) 
 && (eq_p->evtQMessage & charCodeMask) == ‘.’)
 {
 /* Remove the event from the queue. */
 Dequeue((QElemPtr) eq_p, &EventQueue);
 f_found = TRUE;
 /* Setup for disposal */
 dispose_entry = TRUE;
 /* Point to the beginning of entry. */
 theEntry = (EvQElPtr) ((long) eq_p - 4);
 }
 else
 dispose_entry = FALSE;
 
 if (!last)
 /* Continue with next queue entry. */
 eq_p = (EvQElPtr) (eq_p->qLink);

 /* Dequeue doesn’t deallocate entry */
 if (dispose_entry)
 DisposPtr((Ptr) theEntry);
 }
while (!last);

return (f_found);
}

On the whole, I found Mr. Neuse’s article well written and informative.

SCIEX is a Canadian company that produces high end mass spectrometers for environmental, security, biotech, and research applications. Our latest product uses a Macintosh II for data aquisition and processing. We are dedicated to using the Macintosh for scientific applications.

Let’s Doodat Again

J. Peter Alfke

Tucson, AZ

The idea of “doodats” as presented by Lee A. Neuse (“Three Doodats”, September 1989, p. 82) is a good one. Unfortunately, the checkAbort() doodat (which checks for Cmd-”.”) has at least two bugs, one apparently harmless, the other fatal.

The harmless bug concerns the most common case: an empty event. As written, checkAbort() charges ahead and examines the event-queue element pointed to by EventQueue.qTail. Unfortunately, if the event queue is empty this value is NIL. Fortunately, whatever data is at NIL doesn’t usually look like a Cmd-”.” keypress, and the routine exits with false.

But consider another case: there are at least two entries in the queue, the last of which is a bona-fide Cmd-”.”. The last queue entry gets dequeued and then checked to see if it matches EventQueue.qTail. Of course, it can never match since it was just removed from the queue. So the routine always goes around again to the next queue element. But the next element is reference through the old one’s qLink field, which is NIL since it was the last entry in the queue.

Now we are looking at the queue entry at NIL, just like in the other bug, But this time EventQueue.qTail isn’t conveniently NIL (it’s pointing to the last remaining event) so we jump to the next entry instead of exiting. This involves dereferencing NIL and we are on a runaway journey to Bus Error Land.

After sitting in the THINK C debugger for a while figuring all this out. I came up with a revised version, as shown below:

/* 2 */

bool
checkAbort(void)
{
 EvQElPtr q, nextq;
 bool last;
 bool found = false;

 q = (EvQElPtr) EventQueue.qHead;
 if (q) /* Ignore empty event queue */
 do {
 last = (q == (EvQElPtr) EventQueue.qTail); /* Last event? */
 nextq = (EvQEl*) q->qLink; /* the next one */
 if ((q->evtQWhat == keyDown || q-> evtQWhat == autoKey) && q->evtQModifiers 
& cmdKey 
 && (q->evtQModifiers & shiftKey) == 0
 && (q->evtQMessage & charCodeMask) == ‘.’) {
 Dequeue(q, &EventQueue);
 found = true;
 }
 q = nextq;
 } while (!last);
 
 return found;
}

My routine also ignores Cmd-Shift-”.” (i.e. Cmd-”>”), which many applications (such as mine, along with Microsoft Word) uses as an Increment-Point-Size command.

Doodat One More Time

Joe Rice

Doodat #1 in your C Workshop feature in the September issue encouraged me to implement a solution to a problem we were having in the application on which I’m currently working. In some areas of our application, we’re running real-time loops that cannot afford to be interrupted by Multifinder yet need to be able to test for several events, not just Cmd-Period. While the sample code provided an excellent starting, it had a few bugs.

First, it doesn’t check for an empty queue before plunging into the loop.

Second, it retrieves a value (qLink) from the queue element pointed to by eq_p after the element has potentially been dequeued.

Third, dequeuing elements from the EventQueue confuses the Event Manager big time. My guess is that when the Event Manager dequeues an element, it probably enqueues that element outside onto a queue of “free” elements so that it can be reused. Dequeuing the element outside of the Event Manager appears to shorten the EventQueue permanently causing the application to grind to a halt within short order. The solution is to change the event to a null event rather than dequeuing it.

The code that we implemented is below. It’s organized somewhat differently than the example code in MacTutor so that it would be a bit more general.

/* 3 */

/**********************
Name:  CheckForEvent
Purpose:  check the event queue for an event without calling Get/WaitNextEvent. 
 Note that this routine removes all events which pass the test from the 
Event queue, not just the first.

TestMDown and TestCmdPeriod are two TestProcs for CheckForEvent.

CheckForEvent((ProcPtr) TestMDown) will return TRUE if the mouse has 
been clicked.

CheckForEvent((ProcPtr) TestCmdPeriod) will return TRUE if a Cmd-Period 
has been typed.
**********************/

Boolean CheckForEvent(TestProc)
ProcPtr TestProc;
{
EvQElPtreqPtr, nextEqPter;
Boolean found;
OSErr status;

found = FALSE;

eqPtr = (EvQElPtr) (EventQueue.qHead);
while (eqPtr != 0) {
 if ((*TestProc) (eqPtr)) {
 eqPtr->evtQWhat = nullEvent;
 found = TRUE;
 }

 if (eqPtr == (EvQElPtr) EventQueue.qTail)
 break;
 
 eqPtr = (EvQEl *) (eqPtr->qLink);
 }
return found;
}

Boolean TestCmdPeriod (eqPtr)
EvQElPtreqPtr;
{
if ((eqPtr->evtQWhat == keyDown 
 || eqPtr->evtQWhat == autoKey) 
 && (eqPtr->evtQModifiers & cmdKey) 
 && (eqPtr->evtQMessage & charCodeMask) == ‘.’)
 return TRUE;

return FALSE;
}

Boolean TestMDown (eqPtr)
EvQElPtreqPtr;
{
if ((eqPtr->evtQWhat == mouseDown)
 return TRUE;

return FALSE;
}

[Although each of the three previous letters deal with the bug in the original article. I thought their solutions were interesting in their own right to be printed here. The first letter dealt with deallocation of memory. The second deals with Cmd-’.’ over Cmd-’>’. The third takes a unique approach by setting the event type to null rather than removing the event. It also gives a mouse down event remover.-ed]

Ken Manly

Buffalo Chip Software

Buffalo, NY

Your readers may be amused by an ‘undocumented feature’ that Forrest Tanaka (MacDTS) and I discovered. If you create an Apple menu using ResEdit, there are two ways you can type the apple symbol into the menu title field. If you type control-T, the value stored will be $14, and all will be well.

If you type shift-command-K (which is what Key Caps suggests) you will get a menu which looks and acts like an Apple menu, but it is not recognized by Notification Manager routines (in System 6.x). The first symptom is that when your alarm clock goes off while your application is running, the alarm icon (which should alternate with the apple) never appears. Thanks to Forrest for guessing there was something wrong with my apple, although he had no way of knowing what.

ADB??

Kirk Chase

Anaheim CA

It seems someone did not know what the acronym “ADB” meant in a recent article. “ADB” stands for “Apple’s Desktop Bus”. It was introduced with the new keyboard. It allows the chaining of serial devices such as keyboards, mice, tablets, and so on to the Mac.

If you would like more information on ADB, there is an article by Dave Kelly and David Smith in the March '89 issue. It explains some of the concepts. It also references Tech Note #206. You can also find information on the Apple Desktop Bus in Inside Macintosh Vol. V.

MacFortran subroutines from MPW Assembler

Bob Robinson

Plainfield NJ 07060

One of the first things I needed after buying MPW was a way to get the files from the assembler into a format that could be used as a subroutine by Absoft MacFortran (chemists aren’t instructed in ‘C’ in college or grad school.) MacFortran subroutines can be speeded up dramatically (also true of other languages) by hand-tuning the compiler’s assembly language output. The Fortran program listed below strips out the unneeded bytes from the MPW assembler object file. The resulting file is callable from MacFortran as a subroutine, which can be loaded dynamically or linked in with the main program. Also listed below is a short assembly language Fortran function for compilation by MPW. The function locks down a Mac memory manager handle and returns a pointer. MacFortran expects function results to be returned in register D0, so the subroutine must save the result in D0 before exiting (the toolbox traps used here happen to use D0.) If it’s to be loaded dynamically by MacFortran, the subroutine must preserve A0. Note: makesub displays the subroutine name in the menu bar, to avoid the Fortran TTY window (compile with ‘O’ option.)

*4

*****************************************************************************************
 program makesub
* R.S. Robinson 6/12/89
* Converts MPW Asm ‘.a.o’ files into MacFortran ‘.sub’ files.
* File name is obtained from clipboard.
* Removes 1st 36 bytes, and last 8 bytes (44 bytes smaller)
 implicit none   ! always a good idea
 include toolbx.par! MacFortran toolbox definitions
 integer i,j,toolbx,htoptr,length,scrap_h,scrapptr
 integer*1 subr(16384)  ! can make bigger if needed
 character*6 fname ! subroutine names always ¾ 6 chars long plus ‘.sub’
 logical*4 exists! error checking
 scrap_h=toolbx(NEWHANDLE,0)! needs a dummy handle
 length=toolbx(GETSCRAP,scrap_h,”TEXT”,i)    ! we don’t use i
* funct ‘htoptr’ locks handle & returns 32bit comptble ptr;
* or use toolbox calls: call toolbx(HLOCK,scrap_h);scrapptr=LONG(scrap_h)
 scrapptr=htoptr(scrap_h)
 fname=’’;if (length>6) length=6
 do (i=1,length);fname(i:i)=CHAR(BYTE(scrapptr+i-1));repeat
 call toolbx(HUNLOCK,scrap_h) ! finished with the scrap, release the 
handle
 inquire (file=TRIM(fname)//’.a.o’,exist=exists)
 if (.NOT.exists) stop
 call toolbx(INSERTMENU,toolbx(NEWMENU,20,char(length)//fname),0)
 call toolbx(DRAWMENUBAR) ! show that we found the file
 open(20,file=fname//’.a.o’,form=’unformatted’,recl=1)
 do (i=1,36);read(20,end=100) subr(i);repeat ! skip 1st 36 bytes
 do (i=1,16384);read(20,end=100) subr(i);repeat ! read the ‘.a.o’ file
100close(20);i=i-9 ! ignore last 8 bytes plus loop overrun
 open(20,file=fname//’.sub’,status=’new’,form=’unformatted’,recl=1)
 do (j=1,i);write(20) subr(j);repeat;close(20) ! write ‘.sub’ file
 end

*****************************************************************************************
* Assemble the code below with MPW Asm, then run ‘makesub’ after copying 
‘htoptr’
* to the clipboard in MPW. The ‘makesub’ program will produce a MacFortran-compatible
* subroutine from the MPW ‘a.o’ file. As set up here, ‘makesub’ must 
be in the same
* folder as the ‘.a.o’ file. The MPW command sequence is:
*
*(copy ‘htoptr’ to clipboard, then)
*Asm [pathname:]htoptr.a
*[pathname:]makesub (must remove ‘ apl’ extension from Fortran program)
*
;integer*4 function htoptr(handle)
; R.S. Robinson 6/12/89
; Takes ‘handle’ as argument, returns locked pointer as function result.
; Function results are obtained by MacFortran from register D0.
;
 INCLUDE ‘Traps.a’ ; MPW equates
Start PROC; needed for MPW
HTOPTR: MOVE.L A0,A2 ; preserve A0 for MacFortran
 MOVEA.L4(A7),A0 ; load pointer to ‘handle’ argument
 MOVE.L (A0),A0  ; load ‘handle’
 _MoveHHi ; move handle to top of heap zone
 _HLock ; lock it
 MOVE.L (A0),D0  ; convert to pointer, ready to strip
 _StripAddress   ; it’s now ’32-bit clean;’ result is in D0
 MOVE.L A2,A0    ; restore A0
 RTS    ; all done; return to Fortran
 END

 

Community Search:
MacTech Search:

Software Updates via MacUpdate

Lyn 1.8.8 - Lightweight image browser an...
Lyn is a fast, lightweight image browser and viewer designed for photographers, graphic artists, and Web designers. Featuring an extremely versatile and aesthetically pleasing interface, it delivers... Read more
Adobe Animate CC 2017 16.2.0 - Advanced...
Animate CC 2017 is available as part of Adobe Creative Cloud for as little as $19.99/month (or $9.99/month if you're a previous Flash Professional customer). Animate CC 2017 (was Flash CC) lets you... Read more
Tunnelblick 3.7.0 - GUI for OpenVPN.
Tunnelblick is a free, open source graphic user interface for OpenVPN on OS X. It provides easy control of OpenVPN client and/or server connections. It comes as a ready-to-use application with all... Read more
DEVONthink Pro 2.9.11 - Knowledge base,...
DEVONthink Pro is your essential assistant for today's world, where almost everything is digital. From shopping receipts to important research papers, your life often fills your hard drive in the... Read more
DiskCatalogMaker 6.8.1 - Catalog your di...
DiskCatalogMaker is a simple disk management tool which catalogs disks. Simple, light-weight, and fast Finder-like intuitive look and feel Super-fast search algorithm Can compress catalog data for... Read more
OmniGraffle 7.3 - Create diagrams, flow...
OmniGraffle helps you draw beautiful diagrams, family trees, flow charts, org charts, layouts, and (mathematically speaking) any other directed or non-directed graphs. We've had people use Graffle to... Read more
OmniGraffle Pro 7.3 - Create diagrams, f...
OmniGraffle Pro helps you draw beautiful diagrams, family trees, flow charts, org charts, layouts, and (mathematically speaking) any other directed or non-directed graphs. We've had people use... Read more
A Better Finder Rename 10.15 - File, pho...
A Better Finder Rename is the most complete renaming solution available on the market today. That's why, since 1996, tens of thousands of hobbyists, professionals and businesses depend on A Better... Read more
Adobe Dreamweaver CC 2017 17.0.2.9391 -...
Dreamweaver CC 2017 is available as part of Adobe Creative Cloud for as little as $19.99/month (or $9.99/month if you're a previous Dreamweaver customer). Adobe Dreamweaver CC 2017 allows you to... Read more
BBEdit 11.6.5 - Powerful text and HTML e...
BBEdit is the leading professional HTML and text editor for the Mac. Specifically crafted in response to the needs of Web authors and software developers, this award-winning product provides a... Read more

Dynasty Blades new update introduces a n...
Sharpen your weapons -- Dynasty Blades is back with new and improved hack n’ slash stylings. The Romance of the Three Kingdoms-inspired action MMORPG introduces a bunch of fun new features in its latest update. For the uninitiated, Dynasty Blades... | Read more »
Meganoid(2017) (Games)
Meganoid(2017) 1.0 Device: iOS Universal Category: Games Price: $3.99, Version: 1.0 (iTunes) Description: LAUNCH DISCOUNT 20% UNTIL APRIL 2nd! Support, tip and tricks: http://www.orangepixel.net/forum/ Subscribe to our newsletter... | Read more »
Telltale's Guardians of the Galaxy...
Telltale will be releasing their rendition of Guardians of the Galaxy later this month. The first episode, Tangled Up in Blue, features familiar faces including Star-Lord, Groot, Rocket, Gamora, and Drax. If the first episode's title is any... | Read more »
Royal Dungeon (Games)
Royal Dungeon 1.0 Device: iOS Universal Category: Games Price: $2.99, Version: 1.0 (iTunes) Description: The king and his queen are trapped in their castle which suddenly turned out as a very dangerous place. The goal is to escape... | Read more »
Tom Clancy's ShadowBreak is a real-...
Ubisoft is treating Tom Clancy fans to the series' very first mobile-exclusive game in ShadowBreak, a real-time, multiplayer shooter in which players snipe at enemies in fast-paced tactics-driven combat. [Read more] | Read more »
Power Rangers: Legacy Wars beginner...
Rita Repulsa is back, but this time she's invading your mobile phone in Power Rangers: Legacy Wars. What looks to be a straightforward beat 'em up is actually a tough-as-nails multiplayer strategy game that requires some deft tactical maneuvering.... | Read more »
Hearthstone celebrates the upcoming Jour...
Hearthstone gets a new expansion, Journey to Un'Goro, in a little over a week, and they'll be welcoming the Year of the Mammoth, the next season, at the same time. There's a lot to be excited about, so Blizzard is celebrating in kind. Players will... | Read more »
4 smart and stylish puzzle games like Ty...
TypeShift launched a little over a week ago, offering some puzzling new challenges for word nerds equipped with an iOS device. Created by Zach Gage, the mind behind Spelltower, TypeShift boasts, like its predecessor, a sleak design and some very... | Read more »
The best deals on the App Store this wee...
Deals, deals, deals. We're all about a good bargain here on 148Apps, and luckily this was another fine week in App Store discounts. There's a big board game sale happening right now, and a few fine indies are still discounted through the weekend.... | Read more »
The best new games we played this week
It's been quite the week, but now that all of that business is out of the way, it's time to hunker down with some of the excellent games that were released over the past few days. There's a fair few to help you relax in your down time or if you're... | Read more »

Price Scanner via MacPrices.net

Is Apple Planning An iPhone Based Modular Doc...
Today’s more powerful and larger-screened smartphones and phablets are becoming the default anchor computing device for more and more users computing devices, but even a five or six inch panel is not... Read more
Razer Launches New Razer Blade Pro World’s Fi...
Razer, the gaming and high performance hardware specialists, have announced the new Razer Blade Pro laptop — the first laptop to be qualified for THX Mobile Certification, an accreditation reserved... Read more
Gro CRM’s Apple Small Business Mac And iOS CR...
Gro Software, developers of the Mac CRM software for small business and enterprise, are included in FinancesOnline 2017 CRM Rising Stars and Great User Experience lists by business software review... Read more
Deal alert! 15-inch and 13-inch MacBook Pros...
B&H Photo has the new 2016 15″ and 13″ Apple MacBook Pros in stock today and on sale for up to $200 off MSRP. Shipping is free, and B&H charges NY sales tax only: - 15″ 2.7GHz Touch Bar... Read more
Save up to $420 on a new MacBook Pro with App...
Apple is offering Certified Refurbished 2016 15″ and 13″ MacBook Pros, including some Touch Bar models, for up to $420 off original MSRP. An Apple one-year warranty is included with each model, and... Read more
12-inch 1.2GHz Retina MacBooks on sale for $1...
B&H has 12″ 1.2GHz Retina MacBooks on sale for up to $200 off MSRP. Shipping is free, and B&H charges NY sales tax only: - 12″ 1.2GHz Space Gray Retina MacBook: $1449 $150 off MSRP - 12″ 1.... Read more
Is A New 10.5-inch iPad Still Coming In April...
There was no sign or mention of a long-rumored and much anticipated 10.5-inch iPad Pro in Apple’s product announcements last week. The exciting iPad news was release of an upgraded iPad Air with a... Read more
T-Mobile’s Premium Device Protection Now Incl...
Good news for T-Mobile customers who love their iPhones and iPads. The “Un-carrier” has become the first national wireless company to give customers AppleCare Services at zero additional cost as part... Read more
FileWave Ensures Support for Latest Apple OS...
FileWave multi-platform device management providers announced support for Apple’s release yesterday of iOS 10.3, macOS Sierra 10.12.4, and tvOS 11.2. FileWave has a history of providing zero-day... Read more
Use Apple’s Education discount to save up to...
Purchase a new Mac or iPad using Apple’s Education Store and take up to $300 off MSRP. All teachers, students, and staff of any educational institution qualify for the discount. Shipping is free: -... Read more

Jobs Board

Fulltime aan de slag als shopmanager in een h...
Ben jij helemaal gek van Apple -producten en vind je het helemaal super om fulltime shopmanager te zijn in een jonge en hippe elektronicazaak? Wil jij werken in Read more
Fulltime aan de slag als shopmanager in een h...
Ben jij helemaal gek van Apple -producten en vind je het helemaal super om fulltime shopmanager te zijn in een jonge en hippe elektronicazaak? Wil jij werken in Read more
Desktop Analyst - *Apple* Products - Montef...
…technology to improve patient care. JOB RESPONSIBILITIES: Provide day-to-day support for Apple Hardware and Software in the environment based on the team's support Read more
*Apple* Mobile Master - Best Buy (United Sta...
**493168BR** **Job Title:** Apple Mobile Master **Location Number:** 000827-Denton-Store **Job Description:** **What does a Best Buy Apple Mobile Master do?** At Read more
Fulltime aan de slag als shopmanager in een h...
Ben jij helemaal gek van Apple -producten en vind je het helemaal super om fulltime shopmanager te zijn in een jonge en hippe elektronicazaak? Wil jij werken in Read more
All contents are Copyright 1984-2011 by Xplain Corporation. All rights reserved. Theme designed by Icreon.