TweetFollow Us on Twitter

Think C Tutor
Volume Number:5
Issue Number:10
Column Tag:MacOOPs!

A First Look At THINK C 4.0

By Alastair Dallas, Glendale, CA

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

Think C 4.0 First Look

[Alastair Dallas is the president of Software Magic, a developer of (as yet unreleased) Macintosh software. He moonlights as a Sr. Software Designer for the IBM PC side of Ashton-Tate, publisher of FullWrite Professional, Full Impact and dBASE Mac, none of which Mr. Dallas had anything to do with.]

If you are like me, you were surprised by Symantec’s announcement at the end of July that a brand new, object-oriented version of their popular C compiler would be available soon. Rumors that principal author Michael Kahl was working on object-oriented extensions to his LightspeedC package predate the June, 1988 release of version 3.0. When Apple warned us this spring that “you’d better learn object-oriented programming” if you want to program your Mac in the future, perhaps you, like me, were hoping for an object-oriented programming system (oops) that was as accessible as THINK’s LightspeedC to learn with.

THINK C (they dropped the name Lightspeed with this release) is nearly the C version of MacApp we’ve been waiting for. The new version supports Object Pascal-style extensions and a generic application which you can customize. And it’s available now. Symantec must have waited until THINK C 4.0 was ready to ship before announcing it, because my upgrade order was filled in less than a week-much faster than the upgrade to 3.0. The upgrade price is $69 to registered owners, and the retail price of 4.0 is said to be over 50% higher than 3.0.

What do you get for your money? A lot. In addition to the popular integrated compiler, linker, editor, source-level debugger and make facility, this release includes version 1.0 of the THINK Class Library (TCL) which encapsulates most of the standard Macintosh user interface. The C compiler includes improvements making it 95% conformant with the draft ANSI C standard as well as object-oriented extensions which make the THINK Class Library possible.

THINK C 4.0 arrives on four disks, including full source code to a 100% ANSI-conformant library, Macintosh ROM Toolbox “glue” libraries, several example programs (non-oops examples from 3.0 and Art Class, a fairly full-featured MacPaint-type application written using TCL), and template projects (Starter and Pedestal) which you can use to build your own applications.

Two soft-cover books describe the product. The 512-page User’s manual is essentially the 3.0 user’s manual with 250 pages of object-oriented material added as section four. The 37 Core Classes of the TCL are described here, one to a chapter. While the size of the other book, the Standard Libraries Reference, is about the same as it was in 3.0, the content has changed profoundly because the functions and header files are now organized according to the ANSI standard.

If you are familiar with version 3.0, you’ll want to hear exactly what’s new about 4.0:

• Object extensions to C (described below)

• THINK Class Library (almost MacApp for C)

• ANSI C compatibility

• Prototypes for function definitions

• # (stringize) and ## (concatenate) preprocessor operators

• long double type, long double literals

• ANSI standard library w/ glass tty example

• Inline assembler extensions for 68020 and 68881 instructions

• “Once-only” headers

• Multi-segment code resources

• Better cdev (control panel device) support

• Inline assembler functions (makes glue functions more efficient)

Introduction to Object-Oriented Programming

The lecturer at a recent seminar explained that if he wanted to sell his cat just now (to a bunch of programmers), he would advertise it as an object-oriented cat. Object-oriented, the buzzword, has been around since the late 1970s, when BYTE magazine broke the story about Smalltalk (which, legend has it, got Steve Jobs interested in Xerox PARC in the first place).

The term object-oriented may be used to describe almost anything, including a cat, but it almost always promises reusable code. THINK C (TC) is no exception; the system makes it easy to take a generic piece of code and customize it by overriding one or more of its functions. Once you customize the generic window code so that sizing the window maintains its aspect ratio (width / height), you then have a new type of generic window object that you can specialize in other ways for your next project.

Objects are a way of grouping data together with the functions which manipulate that data. All the books tell you that objects mimic the real world, but I think a better example is that objects mimic Macintosh user interface elements. Take windows, for example. A window object has data (the WindowRecord, which includes a grafPort, and perhaps some other variables) and it has certain operations it knows about. These operations are called methods in the literature, but they’re implemented as functions in THINK C. For example, a window can change size, move (drag), hide, show and so on. An application might have several windows, each capable of the same operations, but each window would have a different WindowRecord.

In THINK C, you essentially address the WindowRecord (actually the Window object) and say “hide yourself.” THINK C knows how to find the functions which all Window objects have in common. If you want to customize the Window object as I described above, for example, you create a new object type (called a class) that is derived from the Window class with, in this case, a special “change size” function. If you tell your special Window to do something ordinary like hide itself, THINK C will use the same function that any Window would use for that command-your special Window object only provides the code that makes it different from a normal Window.

For more reading about object-oriented concepts as they apply to the Macintosh, I recommend “Object-Oriented Programming for the Macintosh” by Kurt Schmucker (Hasbrouck Heights, NJ:Hayden, 1986, ISBN 0-8104-6565-5). This book emphasizes MacApp, but describes the Macintosh user interface in object-oriented terms and provides an overview of several oops languages as well, such as Lisa Clascal, Smalltalk and Objective-C.

The most famous object-oriented C is described in “The C++ Programming Language” by Bjarne Stroustrup (Reading, MA:Addison-Wesley, 1986, ISBN 0-201-12078-X). The THINK C manual (p. 9) claims that THINK’s syntax resembles C++ and states that “The extensions are upward-compatible with C++ (i.e., C++ compilers can compile THINK C programs, but THINK C cannot compile all C++ programs).” Because C++ is a superset of the C language, this statement is strictly true, but it is misleading to consider THINK C an implementation of C++. C++ v1.0 implemented several concepts which THINK C left out, and C++ v2.0 has just been released with even more features. The following C++ features are not implemented in THINK C:

• Operator overloading (the ability to define operators like ‘+’ in the context of a particular object)

• Special automatic constructor and destructor methods (all calls are explicit in TC)

• Public vs. private class variables and methods (all are public in TC)

• Friend functions for access to private variables

• Virtual functions

• Inline code expansion (functions defined within class definitions)

• The // characters start a comment that extends to end of the line

• Multiple inheritance (C++ v2.0)

THINK C reserves no new keywords. Instead, identifiers indirect, direct, this and inherited are “interpreted specially in context.” In contrast, C++ programs use the following reserved words:

class

delete

friend

inline

new

operator

overload

public

this

virtual

Like C++, THINK C uses structures for class definitions; methods use the ‘::’ scope resolution operator, as in “myClass::myMethod”; and objects can reference themselves using “this.”

Although on the surface THINK C could be called “C++ Lite,” the two languages are more alike than, say, C and Smalltalk. And the implementation of THINK C is “close to the machine,” in that it was designed specifically to make programming a Macintosh efficient, rather than to satisfy purist notions of language design.

Object Extensions to THINK C

In conventional C, a data structure may be defined without creating a variable or reserving storage space; multiple variable declarations can then reference this structure definition. The structure is an abstract definition and the variables are concrete instances. In THINK C, objects are much the same.

An abstract description of an object is called a class. A class is a structure definition containing variables and functions, as in:

/* 1 */

struct classname : superclass
 
 /* instance variables */
 int myVar; /* for example */
 char myStr[255];
 Rect bounds;

 /* by convention, methods follow instance variables */
 void Init(void);
 void Destroy(void);
 Boolean Hit(Point where);

Superclass is the class from which this class is derived, such as CObject using TCL (root classes have superclass direct or indirect, described in more detail in the manual). The classname can be used without the keyword struct, because THINK C thoughtfully assumes that you want:

typedef struct classname classname

Objects are specific instances of a class. Objects are usually implemented as handles (direct root objects and their descendants are pointers), but THINK C adds an automatic level of indirection for you, so that you declare objects as pointers, and reference their members with the ‘->’ operator:

classname *object;

object->method(myPt);

The file <oops.h> declares functions which act on objects in general: new() creates a new instance of an object class; delete() disposes of an instance; member() tests whether a particular object is a member of a specified class; and bless() assigns an object (loaded externally from a resource, for example) to a particular class.

Any methods (functions) declared for a class must be defined using syntax like:

Boolean classname::Hit (Point where)
 
 return (PtInRect(where, &bounds));

Note that in this example, bounds is an instance variable of this object-THINK C provides an implicit declaration. The variable this is implicitly declared, as well, to allow an object’s methods to refer to themselves. Minimizing global variables is an important part of making code reusable, and objects encourage this practice.

The THINK Class Library

THINK C 4.0 includes a set of predefined classes which implement the standard Macintosh user interface. The 37 Core Classes are described in the User’s Manual. A few highlights (class names begin with ‘C’ by convention):

CApplication - top of the chain of command, supervises documents

CDocument - “the essence of a Macintosh application,” manages a file and a window

CSwitchboard - routes events to all objects

CBartender - handles menu choices (and menuKeys)

CBureaucrat - implements a “chain of command” starting with the current gopher (usually a part of a window). Each link in the chain, like all good bureaucrats, passes anything it doesn’t understand up the chain to its supervisor.

CWindow - handles a window, consisting of one or more panes

CPane - part of a window, e.g., content, scroll bar, grow box, etc.

CPanorama - a scrollable pane (it’s actually a little more complicated-more object classes are involved)

CChore - background or urgent tasks

TCL goes considerably beyond menus, windows and documents. The library (actually a template application) supports printing, file I/O, show/hide clipboard, pictures and editable text. It even makes Undo fairly easy to implement, because each command is an integer and the chain of command is unambiguous.

TCL was apparently entirely written by Gregory H. Dow, who also wrote the Art Class example program. To implement some of the trickier features of Art Class, he extended the Core Classes of TCL and Symantec provides source code to these extensions (More Classes), as well. Although they didn’t make it into the user’s manual, More Classes include:

CTearOffMenu - how much would you pay to avoid figuring these out? But wait, before you answer-you also get...

CSelectorMDEF - supports custom tool and pattern menus

CPictFile - reads, writes MacDraw™ (PICT) files

CPNTGFile - reads, writes MacPaint™ files

CBitMap - displays bitmaps (CBitMapPane makes them scrollable)

CColorWindow - color windows

The beauty of the TCL (and MacApp) is that your application is reduced to the elements which make it distinct from a standard application. It’s no longer necessary to ferret out the specifics by wading through pages of event loop and DoContentClick() code. The main() function of any program using TCL looks something like:

/* 2 */

#include <CApplication.h>

extern CApplication *gApplication;

void main()
 
 gApplication = new(CYourApp);
 ((CYourApp *) gApplication)->IYourApp();

 gApplication->Run();
 gApplication->Exit();

 /* main */

A Simple Example

The manual recommends that your classes (you must override certain classes, such as CApplication) be defined in a “.h” file and implemented in a “.c” file each with the name of the class. That is, a typical project might include:

app.c
CmyApp.c, CmyApp.h
CmyDoc.c, CmyDoc.h

This convention makes a lot of sense and encourages reuse of common classes in multiple projects. However, it means looking at a lot of files in the beginning when you’re trying to figure out how it all works.

On the theory that more than one sort of example helps the learning process-you have to see anything from more than one side to understand it-I’ve written a really simple program using TCL which does far less than the templates provided with THINK C. I’ve grouped the code into one module, too, so that you can see the extent of it.

This example leans on TCL to provide a standard Macintosh application which puts up a window (not a document). TCL implements desk accessories, dragging and sizing the window, MultiFinder support and one command: Quit.

It was necessary to define three new classes: CTutorApp, CTutorDir and CTutorWindow. The standard TCL classes CApplication and CDirector are called abstract classes because they are not pre-implemented and must be overridden (in C++ terms, they are virtual), so we implement our own initialization methods for them.

CTutorApp::ITutorApp calls the standard CApplication::IApplication() function with some boilerplate memory constraints and creates and initializes an instance of CTutorDir, which will control our window.

CTutorDir::ITutorDir calls the standard CDirector::IDirector() function and passes the address of our application object (gApplication) as supervisor. Then it creates and initializes an instance of CTutorWindow.

The only method we override in the standard CWindow class is Close(). We do this so that clicking in the close box of the window will have the effect of Quitting the application. Our CTutorWindow::Close() function performs the window close task by calling inherited::Close() first, and then sends the message Quit() to our application, which performs several shutdown tasks and ends up returning from the Run() function. Our main() then calls gApplication->Exit() to tell our application that we’re really leaving now and finally exits to shell by falling off the end of main().

To compile this application, I “borrowed” a copy of the Pedestal project resource file. Using ResEdit, I changed the MENU resource for the File menu so that only the Quit item remained, and I set the title of the WIND 2000 resource to “Mac Tutor Class Act.” Using a copy of the Pedestal project folder, I included most of the THINK Class Library as separate files, and THINK C did the rest.

Conclusion

If you want to write programs for the Macintosh, you will have to become familiar with object-oriented programming techniques. It makes sense for a lot of reasons, not the least of which is that Apple is warning developers that oops is a prerequisite to many of the things they’re working on. The Macintosh interface is just too complicated to let reinventing the wheel get in the way of writing insanely great applications.

Until now, the only mainstream way to get the benefits of oops was to buy the Macintosh Programmer’s Workshop, buy MacApp and learn to program in Object Pascal. Apple will eventually offer MPW C++ and they plan to offer MacApp for C++ as well. Standards, especially those promulgated by Apple, are a very good thing. But LightspeedC became a de facto standard by being “firstest with the mostest,” and the same could happen with the THINK Class Library. Meanwhile, everything is converging, anyway-MacApp is being ported to C, THINK Pascal will support MacApp eventually, and so on.

The point is, there is no reason to wait for object-oriented programming to come to you. The time is now to dive in and get used to the new programming paradigm. I have seen the future, and it’s object-oriented.

/* MacTutor.c */
#include <CApplication.h>
#include <CDesktop.h>
#include <CDirector.h>
#include <commands.h>

struct CTutorApp : CApplication
 {
 /* no instance variables */
 /* instance methods */
 void ITutorApp(void);
 void DoCommand(long theCommand);
 };
 
struct CTutorDir : CDirector
 {
 /* CDirector is an abstract class, so we must override it */
 void ITutorDir(void);
 };

struct CTutorWindow : CWindow
 {
 /* want to override close for our own nefarious purposes */
 void Close();
 };

extern CApplication *gApplication;
extern CDesktop *gDesktop;

void main(void)
{
 gApplication = new(CTutorApp);
 ((CTutorApp*)gApplication)->ITutorApp();

 gApplication->Run();
 
 gApplication->Exit();  
}/* main */

void CTutorApp::DoCommand(long theCommand)
{
 /* not strictly necessary-here in case we ever want to handle a command 
*/
 switch (theCommand)
 {
 
 default:
 inherited::DoCommand(theCommand);
 break;
 
 } /* switch */
 
 return;
}/* CTutorApp::DoCommand */

void CTutorApp::ITutorApp()
{
 CTutorDir *ourDirector;

 CApplication::IApplication(4, 20000L, 2000L);
 
 ourDirector = new(CTutorDir);
 ourDirector->ITutorDir();
 
 return;
}/* CTutorApp::ITutorApp */

void CTutorDir::ITutorDir()
{
 CDirector::IDirector(gApplication);
 
 itsWindow = (CWindow *) new(CTutorWindow);
 itsWindow->IWindow(2000, FALSE, gDesktop, this);
 
 return;
}/* CTutorDir::ITutorDir */

void CTutorWindow::Close(void)
{
 inherited::Close();
 gApplication->Quit();
 
 return;
}/* CTutorWindow::Close */

/* EOF: MacTutor.c */

 

Community Search:
MacTech Search:

Software Updates via MacUpdate

OmniOutliner Pro 4.2 - Pro version of th...
OmniOutliner Pro is a flexible program for creating, collecting, and organizing information. Give your creativity a kick start by using an application that's actually designed to help you think. It's... Read more
VLC Media Player 2.2.1 - Popular multime...
VLC Media Player is a highly portable multimedia player for various audio and video formats (MPEG-1, MPEG-2, MPEG-4, DivX, MP3, OGG, ...) as well as DVDs, VCDs, and various streaming protocols. It... Read more
Nisus Writer Pro 2.1.1 - Multilingual wo...
Nisus Writer Pro is a powerful multilingual word processor, similar to its entry level products, but brings new features such as table of contents, indexing, bookmarks, widow and orphan control,... Read more
Tinderbox 6.2.0 - Store and organize you...
Tinderbox is a personal content management assistant. It stores your notes, ideas, and plans. It can help you organize and understand them. And Tinderbox helps you share ideas through Web journals... Read more
OmniOutliner 4.2 - Organize your ideas,...
OmniOutliner is a flexible program for creating, collecting, and organizing information. Give your creativity a kick start by using an application that's actually designed to help you think. It's... Read more
Things 2.5.4 - Elegant personal task man...
Things is a task management solution that helps to organize your tasks in an elegant and intuitive way. Things combines powerful features with simplicity through the use of tags and its intelligent... Read more
NeoOffice 2014.10 - Mac-tailored, OpenOf...
NeoOffice is a complete office suite for OS X. With NeoOffice, users can view, edit, and save OpenOffice documents, PDF files, and most Microsoft Word, Excel, and PowerPoint documents. NeoOffice 3.x... Read more
iPhoto Library Manager 4.2 - Manage mult...
iPhoto Library Manager allows you to organize your photos among multiple iPhoto libraries, rather than having to store all of your photos in one giant library. You can browse the photos in all your... Read more
Web Snapper 3.3.8 - Capture entire Web p...
Web Snapper lets you capture Web pages exactly as they appear in your browser. You can send them to a file as images or vector-based, multi-page PDFs. It captures the whole Web page - eliminating the... Read more
TeamViewer 10.0.41404 - Establish remote...
TeamViewer gives you remote control of any computer or Mac over the Internet within seconds, or can be used for online meetings. Find out why more than 200 million users trust TeamViewer! Free for... Read more

The Apple Watch Could Revolutionize the...
It’s not here yet but there’s that developing sneaky feeling that the Apple Watch, despite its price tag and low battery life, might yet change quite a lot about how we conduct our lives. While I don’t think it’s going to be an overnight... | Read more »
Mad Skills Motocross 2 Version 2.0 is He...
Mad Skills Motocross 2 fans got some good news this week as Turborilla has given the game its biggest update yet. Now you'll have access to Versus mode where you can compete against your friends in timed challenges. Turborilla has implemented a... | Read more »
Kids Can Practice Healthy Living With Gr...
Bobaka is releasing a new interactive book called Green Riding Hood  in May. The app teaches kids about yoga and organic style of life through mini-games and a fun take on the classic Little Red Riding Hood fairy tale. | Read more »
Chainsaw Warrior: Lords of the Night has...
It's time to put the Darkness back in its place now that Chainsaw Warrior: Lords of the Night has officially made it to iOS. | Read more »
A World of Ice and Fire Lets You Stalk 2...
George R. R. Martin’s A World of Ice and Fire, by Random House, is a mobile guide to the epic series. The new update gives you the Journeys map feture that will let you track the movements of 25 different characters. But don't worry, you can protect... | Read more »
Gameloft Announces Battle Odyssey, a New...
Battle Odyssey, Gameloft's newest puzzle RPG, is coming to the App Store next week. Set in the world of Pondera, you will need to control the power of the elements to defend the world from evil. You'll be able to entlist over 500 allies to aid you... | Read more »
Here's How You Can Get 5 Free Pro D...
It's only been a couple of days since Gamevil released MLB Perfect Inning 15, so building up a decent roster could still take a little time. If you'd like to speed things up a bit, then we've got a deal for you. How does five free Pro drafts sound?... | Read more »
Fusion - HDR Camera (Photography)
Fusion - HDR Camera 1.0.0 Device: iOS Universal Category: Photography Price: $1.99, Version: 1.0.0 (iTunes) Description: Fusion creates HDR (high dynamic range) photos by capturing different exposures and then combining them into one... | Read more »
Sago Mini Toolbox (Education)
Sago Mini Toolbox 1.1 Device: iOS Universal Category: Education Price: $2.99, Version: 1.1 (iTunes) Description: Come build with the Sago Mini friends! Use a wrench, try a saw, or hammer some nails. From sewing hand puppets to... | Read more »
You Should Probably Grab Hitman GO While...
Hitman GO is a surprisingly cool (yet also incredibly drastic) departure from the Hitman series. It's well worth playing for any puzzle game fans out there, and at the moment you can get your hands - or garrotte if you will - on it for a mere $0.99... | Read more »

Price Scanner via MacPrices.net

TigerText Introduces First Secure Enterprise...
TigerText, a provider of secure, real-time messaging for the enterprise, has announced the launch of TigerText for the Apple Watch. TigerText for the Apple Watch enables users to securely send and... Read more
The Conservation Fund Partners with Apple To...
The Conservation Fund has announced that it will partner with Apple to help protect working forests in the United States. The Apple initiative will conserve more than 36,000 acres of working... Read more
Clearance 13-inch 2.6GHz Retina MacBook Pro a...
B&H Photo has clearance 2014 13″ 2.6GHz/128GB Retina MacBook Pros now available for $1099, or $200 off original MSRP. Shipping is free, and B&H charges NY sales tax only. Read more
Apple refurbished 2014 13-inch Retina MacBook...
The Apple Store has Apple Certified Refurbished 2014 13″ Retina MacBook Pros available for up to $400 off original MSRP, starting at $979. An Apple one-year warranty is included with each model, and... Read more
iMacs on sale for up to $205 off MSRP, NY tax...
B&H Photo has 21″ and 27″ iMacs on sale for up to $205 off MSRP including free shipping plus NY sales tax only: - 21″ 1.4GHz iMac: $1019 $80 off - 21″ 2.7GHz iMac: $1189 $110 off - 21″ 2.9GHz... Read more
Sale! 16GB iPhone 5S for $1 with service
Best Buy is offering 16GB iPhone 5Ss for $1.00 with 2-year activation at a participating cellular provider. Choose free home shipping and activation, or buy online and activate during in-store pickup... Read more
Apple refurbished 2014 MacBook Airs available...
The Apple Store has Apple Certified Refurbished 2014 MacBook Airs available starting at $679. An Apple one-year warranty is included with each MacBook, and shipping is free. These are currently the... Read more
27-inch 3.5GHz 5K iMac on sale for $2349, sav...
 Adorama has the 27″ 3.5GHz 5K iMac in stock today and on sale for $2349 including free shipping plus NY & NJ sales tax only. Their price is $150 off MSRP. For a limited time, Adorama will... Read more
Save up to $380 on an iMac with Apple refurbi...
The Apple Store has Apple Certified Refurbished iMacs available for up to $380 off the cost of new models. Apple’s one-year warranty is standard, and shipping is free: - 27″ 3.5GHz 5K iMac – $2119 $... Read more
iFixIt Teardown Awards 12-IInch Retina MacBoo...
iFixIt has posted its illustrated teardown of the new 12-inch MacBook Retina. They note that this new MacBook is less than half the thickness of the last Apple notebook called just “MacBook” back in... Read more

Jobs Board

Sr. Project Engineer, *Apple* Education Pro...
**Job Summary** Apple Professional Services (APS) has an opening for a senior technical position that contributes to Apple 's efforts for strategic and transactional Read more
Event Director, *Apple* Retail Marketing -...
…This senior level position is responsible for leading and imagining the Apple Retail Team's global engagement strategy and team. Delivering an overarching brand Read more
*Apple* Retail - Multiple Positions (US) - A...
Sales Specialist - Retail Customer Service and Sales Transform Apple Store visitors into loyal Apple customers. When customers enter the store, you're also the Read more
Communication Manager - *Apple* Pay - Apple...
**Job Summary** This position works within the Apple Pay Merchant Solutions team to create, as well as oversee the development of, materials for use by Apple Pay Read more
Project Manager / Business Analyst, WW *Appl...
…a senior project manager / business analyst to work within our Worldwide Apple Fulfillment Operations and the Business Process Re-engineering team. This role will work Read more
All contents are Copyright 1984-2011 by Xplain Corporation. All rights reserved. Theme designed by Icreon.