Thread View: comp.sys.mac.oop.macapp3
1 messages
1 total messages
Started by Mail Delivery Subsystem
Sun, 13 Dec 1992 20:11
Returned mail: Unable to deliver mail
Author: Mail Delivery Subsystem
Date: Sun, 13 Dec 1992 20:11
Date: Sun, 13 Dec 1992 20:11
302 lines
8525 bytes
8525 bytes
----- Transcript of session follows -----
554 POST-MACAPP-BETA-3... Recipient names must be specified
----- Unsent message follows -----
Received: by alink-gw.apple.com (5.65/27-Sep-1991-eef)
id AA11338; Sun, 13 Dec 92 12:11:52 -0800
for
Date: 12 Dec 92 23:25 GMT
From: Gateway@AppleLink.Apple.COM (to Internet/BITNET/UUCP)
Subject: Re: TAppl.InstallCohandler mo
To: MACAPP3TECH$@AppleLink.Apple.COM (MacApp 3 Technical Discussion)
Message-Id: <9212131953.AA24322@apple.com>
X-Original-Document-Id: <9212131953.AA24322@apple.com>
From:
References: , ,, <724097388.6934764@AppleLink.Apple.COM>
Organization: (Evil Eye Creature from Mars, Inc.)
Sender: macapp.admin@applelink.apple.com
To: MacApp3Tech$@Applelink.apple.com
In article <724097388.6934764@AppleLink.Apple.COM>,
DEWAELE.W@AppleLink.Apple.COM (De Waele Willy - Gent,BE,IHD) wrote:
>
>
>
> Indeed, Mark, debug versions (of frameworks and our own applications - MacApp
> and others) should be defensive programmed (which save a lot of time), i use
> the following technique taking your example:
>
> TFoo::Something()
> {...
> #if qDebug
> if (!IsObject(aCohandler)) {
> SysBreakStr("TFoo::Something - aCohandler is invalid!");
> return; }
> #endif
> ...
> }
> SADE must be started up, but i think this is no problem because when working
> with MacApp 3.x, we need a lot of meg's (i don't like limited resources! -
*The
> sky's the limit!*).
SysBreakStr are kind of evil, unless SADE is running you usually get a
System crash. Here's an ASSERT package I worked a little bit on two
weeks ago, it's not yet complete but it could provide material for
someone else writing similar stuff. Yes, I know of the Assertion MacApp
version, but I wanted more flexibility in my ASSERT package. Note that
this is not a full example, you need to add an Alert resource and a couple
of other small things -- but the main thing was to stimulate the idea
of writing similar flexible ASSERT packages. And this one should be ready
within a month or so (and will then be available on the developer CD).
Kent
---- snippet stuff starts here ----
// TESTING, used for flagging that we use test code inside the classes and
frameworks
// TESTLEVEL0 - user friendly alerts as part of the application
// TESTLEVEL1 - minor test level (detailed error message in alert box)
// TESTLEVEL2 - semi-major test level (high level debuggers)
// TESTLEVEL3 - major test level (low level debuggers)
// TESTLOG1 - trigger a file log of information
// TESTLOG2 - trigger a file log of information from a low level
debugger
#define TESTLEVEL3
//
_____________________________________________________________________________
____________________________
//
// 2. STRING FUNCTIONS
// return the len of a C string
inline short clen(char *cptr)
{
short i;
for (i = 0; cptr[i]; ++i)
;
return(i);
}
// Convert a c-string to a pascal-string
inline void c2p(char *cptr)
{
char len;
BlockMove(cptr, cptr + 1, len = clen(cptr));
*cptr = len;
}
// Convert a pascal-string to a c-string
inline void p2c(StringPtr cptr)
{
char len;
BlockMove(cptr + 1, cptr, len = *cptr);
cptr[len] = 0;
}
// Copy two Pascal strings
inline void Pstrcpy(StringPtr d, StringPtr s)
{
short i;
i = *s;
do {
d[i] = s[i];
} while (i--);
}
// Concatenate two Pascal strings
inline void ConcatPStrings(Str255 first,
Str255 second)
{
short charsToCopy;
// Truncate if concatenated string would be longer than 255 chars
charsToCopy = Min(second[0], 255 - first[0]);
BlockMove(second + 1, first + first[0] + 1, (long)charsToCopy);
first[0] += charsToCopy;
}
//
_____________________________________________________________________________
____________________________
//
// MACROS AND DEBUGGING
// ASSERT Function, used for testing conditions and flagging error states.
// Example: vdebugstr("The error message from Foo is %i", fError);
// We need to load in certain include files if we want to use the alert
boxes for
// high level ASSERT functions (we also need to include the
GUIApplication.r file
// into the project).
#if (defined TESTLEVEL0 || defined TESTLEVEL1)
#include "ApplicationResources.h"
#endif
// Define this flag if you want file and line information as part of the
message.
#define FILELINEINFO
// fileinfo will keep track of the current file and line in a global.
static char fileNameArray[32];
static char lineNumberArray[32];
#if (defined TESTLEVEL0 || defined TESTLEVEL1)
inline void AlertUser(Str255 theMessage)
{
short itemHit;
if(!(AEInteractWithUser(kNoTimeOut, nil, nil)))
// could we interact
with the user?
{
ParamText(theMessage, 0, 0,0);
itemHit = Alert(kUserAlert, nil);
}
}
#endif
inline void fileinfo(char *file, int line)
{
sprintf(fileNameArray, "File %s ", file);
sprintf(lineNumberArray, " Line %d #", line);
}
// vxdebugstr that also prints out by default __FILE__ and __LINE__
information
inline void vxdebugstr(char* format,...)
{
char buff[255];
char final[255];
va_list arglist;
va_start(arglist,format);
vsprintf(buff,format,arglist);
va_end(arglist);
#ifdef FILELINEINFO
strcat(final,fileNameArray);
#ifdef TESTLEVEL2
strcat(final, " ;");
// MacsBug does not like embedded ;s
#endif
strcat(final, lineNumberArray);
#endif
strcat(final, buff);
c2p(final);
// Print out the message, based on the testing level
#ifdef TESTLEVEL1
AlertUser((Str255)final);
#endif
#ifdef TESTLEVEL2
SysBreakStr((Str255)final);
// for high level debuggers
#endif
#ifdef TESTLEVEL3
DebugStr((Str255)final);
#endif
}
// ASSERT MACROS
// ASSERT, small (and quick assert), if assertion is false it will print
out
// a message
// Use: ASSERT(false, "Problems with TSoundRecorder");
#if (defined TESTLEVEL0 || defined TESTLEVEL1)
#define ASSERT(condition,debugMsg) do {
\
if(condition == 0)
\
{
\
AlertUser(debugMsg);
\
}
\
} while (0)
\
#elif (defined TESTLEVEL2 || defined TESTLEVEL3)
#define ASSERT(condition,debugMsg) do {
\
if(condition == 0)
\
{
\
DebugStr(debugMsg);
\
}
\
} while (0)
#else
#define ASSERT(condition,debugMsg) ((void) 0)
#endif
// VASSERT, if assertion is false it will print out file, line, message
and
possible variable
// Use: VASSERT(false,("Problems with %d", anErr));
#if (defined TESTLEVEL0)
##define VASSERT(condition,debugMsg) do {
\
if(condition == 0)
\
{
\
vxdebugstr debugMsg;
\
}
\
} while (0)
#elif (defined TESTLEVEL1 || defined TESTLEVEL2 || defined TESTLEVEL3)
#define VASSERT(condition,debugMsg) do {
\
if(condition == 0)
\
{
\
fileinfo(__FILE__, __LINE__);
\
vxdebugstr debugMsg;
\
}
\
} while (0)
#else
#define (condition,debugMsg) ((void) 0)
#endif
-------------------
Kent Sandvik (UUCP: ....!apple!ksand; INTERNET: ksand@apple.com)
DISCLAIMER: Private activities on the Net.
Thread Navigation
This is a paginated view of messages in the thread with full content displayed inline.
Messages are displayed in chronological order, with the original post highlighted in green.
Use pagination controls to navigate through all messages in large threads.
Back to All Threads