From: pottier@clipper.ens.fr (Francois Pottier)
Subject: csmp-digest-v3-071
Date: Mon, 28 Nov 1994 18:41:24 +0100 (MET)

C.S.M.P. Digest             Mon, 28 Nov 94       Volume 3 : Issue 71
 
Today's Topics:
 
        (PPC) MDEF's in application code
        Getting The PSN or Sig of AE Client
        Is THINK Pascal dead?
        Newbie Q:Why no DisposeHandle-ReleaseResource call?
        Prograph 2.5
        [Q] Programming with the QuickTime toolkit



The Comp.Sys.Mac.Programmer Digest is moderated by Francois Pottier
(pottier@clipper.ens.fr).
 
The digest is a collection of article threads from the internet newsgroup
comp.sys.mac.programmer.  It is designed for people who read c.s.m.p. semi-
regularly and want an archive of the discussions.  If you don't know what a
newsgroup is, you probably don't have access to it.  Ask your systems
administrator(s) for details.  If you don't have access to news, you may
still be able to post messages to the group by using a mail server like
anon.penet.fi (mail help@anon.penet.fi for more information).
 
Each issue of the digest contains one or more sets of articles (called
threads), with each set corresponding to a 'discussion' of a particular
subject.  The articles are not edited; all articles included in this digest
are in their original posted form (as received by our news server at
nef.ens.fr).  Article threads are not added to the digest until the last
article added to the thread is at least two weeks old (this is to ensure that
the thread is dead before adding it to the digest).  Article threads that
consist of only one message are generally not included in the digest.

The digest is officially distributed by two means, by email and ftp.

If you want to receive the digest by mail, send email to listserv@ens.fr
with no subject and one of the following commands as body:
    help		                Sends you a summary of commands
    subscribe csmp-digest Your Name	Adds you to the mailing list
    signoff csmp-digest			Removes you from the list
Once you have subscribed, you will automatically receive each new
issue as it is created.

The official ftp info is //ftp.dartmouth.edu/pub/csmp-digest.
Questions related to the ftp site should be directed to
scott.silver@dartmouth.edu. Currently no previous volumes of the CSMP
digest are available there.

Also, the digests are available to WAIS users.  To search back issues
with WAIS, use comp.sys.mac.programmer.src. With Mosaic, use
http://www.wais.com/wais-dbs/comp.sys.mac.programmer.html.


-------------------------------------------------------

>From tcarsten@cayman.jpmorgan.com (Tom Carstensen)
Subject: (PPC) MDEF's in application code
Date: 25 Oct 1994 16:25:54 GMT
Organization: J.P. Morgan & Co


Before PPC, I would load a stub 'MDEF' and set the proc ptr:

typedef struct GenericMDEF {
    short		JMPInstruction;
    void		*defProc;
} GenericMDEF;

   mdefHdl = GetResource('MDEF', 200);		/* sub def */
   
    (**((GenericMDEF **) mdefHdl)).defProc = myMdefProc;


NOW, with PPC, I'm doing:

    (**((GenericMDEF **) mdefHdl)).defProc = NewMenuDefProc(myMdefProc);

which, with code warrior, creates a new routine descriptor, and sets it up
appropriately.

This does not work.  I've read IM PowerPC System Software - but it's 
somewhat confusing.  If I'm defining an accelerated resource, than I need
a routine descriptor that tells what kind of code is ahead.  I thought
the above should work, assuming the menu manager uses CallUniversalProc
to call the menu definition procedure.

BTW - I'm using Code warrior in the above example.

Thanks for any hints.

Tom Carstensen
--
--			        ___
Thomas Carstensen	      //__/  60 Wall Street  17th Floor
  tcarsten@jpmorgan.com	  /__//      New York, NY  10260
  tomc@digex.access.net	  Morgan     212.648.4584

+++++++++++++++++++++++++++

>From d88-bli@xbyse.nada.kth.se (Bo Lindbergh)
Date: 31 Oct 1994 16:31:38 GMT
Organization: Royal Institute of Technology, Stockholm, Sweden

In article <TCARSTEN.94Oct25122554@cayman.jpmorgan.com> tcarsten@cayman.jpmorgan.com (Tom Carstensen) writes:

[mostly correct example of stub MDEF hacking deleted]

Try bracketing the struct definition with alignment pragmas:

    #if defined(powerc) || defined (__powerc)
    #pragma options align=mac68k
    #endif

    typedef struct GenericMDEF {
        short       JMPInstruction;
        void        *defProc;
    } GenericMDEF;

    #if defined(powerc) || defined(__powerc)
    #pragma options align=reset
    #endif

Without them, you'll get two bytes of padding between the short and the
void *.


/Bo Lindbergh

+++++++++++++++++++++++++++

>From Graham@impro.demon.co.uk (Graham)
Date: Wed, 9 Nov 1994 17:02:12 GMT
Organization: N/A

I use the following routines to do this- on 68K macs it defaults to the
old way of creating a stub for the jump, on PowerMacs it creates a
routine dscriptor, so the same code works in all cases. try it.

#include	"MixedMode.h"

typedef struct
{
   short   Jmp;			// jmp instruction
   void*   Routine;		// address to jump to
}
JmpInstructionTemplate;


Handle	GetUniversalFunctionHandle(ProcPtr functionAddress,ProcInfoType
pInfo);
void 	PatchJmpInstruction(void* patchAddress, void* jumpAddress);



Handle	GetUniversalFunctionHandle(ProcPtr functionAddress,ProcInfoType
pInfo)
{
	Handle				pHNullProc = NULL;
	ISAType				isa;
	UniversalProcPtr 	axDEFUPP;
	
	isa = GetCurrentISA();
	
	if (isa == kPowerPCISA)
	{
	   pHNullProc = NewHandle(sizeof(RoutineDescriptor));
	   axDEFUPP = NewRoutineDescriptor(functionAddress,pInfo,isa);
	   BlockMove(axDEFUPP, *pHNullProc, sizeof(RoutineDescriptor));
	   DisposeRoutineDescriptor(axDEFUPP);
	}
	else
	{
	   pHNullProc = NewHandle(sizeof(JmpInstructionTemplate));
	   PatchJmpInstruction(*pHNullProc, (void*)functionAddress);
	}
	return(pHNullProc);
}


void PatchJmpInstruction(void* patchAddress, void* jumpAddress)
{
   JmpInstructionTemplate* aJmpInstructionPtr;
   
   aJmpInstructionPtr = (JmpInstructionTemplate *) patchAddress;
   aJmpInstructionPtr->Jmp = 0x4EF9;
   aJmpInstructionPtr->Routine = jumpAddress;
}


You have to pass the proc info type for the routine, which youll have
to look up in the universal headers, and the proc ptr to your MDEF
function, it returns a handle which you simply stuff into the relevant
defProc field.
Apple DTS gave me the bones for this, so it even has the "official"
stamp of approval!

************************************************************************
*
MHROTD, Graham.  (Sorry, I haven't got time to think of
                                       a witty signature)

+++++++++++++++++++++++++++

>From rang@winternet.com (Anton Rang)
Date: 10 Nov 1994 14:33:59 GMT
Organization: Trillium Research, Inc.

In article <Cz0FBo.FvL@demon.co.uk> Graham@impro.demon.co.uk (Graham) writes:
>I use the following routines to do this- on 68K macs it defaults to the
>old way of creating a stub for the jump, [...]

  Don't forget the posting last month from someone who had created a
six-byte handle to hold their 'JMP $xxx' instruction and found that
when the handle was moved by the memory manager, the i-cache wasn't
flushed 'cause the handle was too small.  :)
--
Anton Rang (rang@winternet.com)

+++++++++++++++++++++++++++

>From Bruce@hoult.actrix.gen.nz (Bruce Hoult)
Date: Fri, 11 Nov 1994 05:15:43 +1200 (NZST)
Organization: (none)

rang@winternet.com (Anton Rang) writes:
> In article <Cz0FBo.FvL@demon.co.uk> Graham@impro.demon.co.uk (Graham) writes:
> >I use the following routines to do this- on 68K macs it defaults to the
> >old way of creating a stub for the jump, [...]
> 
>   Don't forget the posting last month from someone who had created a
> six-byte handle to hold their 'JMP $xxx' instruction and found that
> when the handle was moved by the memory manager, the i-cache wasn't
> flushed 'cause the handle was too small.  :)

I missed that one.

But I've never understood why people use the "six-byte resource" trick
when it's so easy to use a "ten-byte resource" trick that is I-cache
safe.

-- Bruce

---------------------------

>From Jonathan Gary <jgary@ssd.kodak.com>
Subject: Getting The PSN or Sig of AE Client
Date: Tue, 8 Nov 1994 19:59:50 GMT
Organization: Eastman Kodak

I'm trying to get the the PSN of the process that sends me an AE. I can
get the
address from the event, but how do I get at the PSN?

+++++++++++++++++++++++++++

>From wysocki@netcom.com (Chris Wysocki)
Date: Fri, 11 Nov 1994 06:52:40 GMT
Organization: NETCOM On-line Communication Services (408 261-4700 guest)

In article <Cyysvr.2yK@newsserver.pixel.kodak.com>,
Jonathan Gary  <jgary@ssd.kodak.com> wrote:

>I'm trying to get the the PSN of the process that sends me an AE. I can
>get the address from the event, but how do I get at the PSN?

The following routine should work:

// ----------------------------------------------------------------------
// CAppleEvent::GetProcessSerialNumber
// ----------------------------------------------------------------------

void CAppleEvent::GetProcessSerialNumber(ProcessSerialNumber& thePSN) const
{
    DescType actualType;
    Size actualSize;
    TargetID theTargetID;
	
    FailOSErr(AEGetAttributePtr(&fMessage, keyAddressAttr, typeTargetID,
              &actualType, &theTargetID, sizeof(theTargetID), &actualSize));
    FailOSErr(GetProcessSerialNumberFromPortName(&theTargetID.name, &thePSN));
}

I believe that the sending process needs to be running on the same
machine as the target process for this to work, since PSNs are only
unique to a particular machine.

Chris.



---------------------------

>From bernier@dialup.francenet.fr (Jean-Yves Bernier)
Subject: Is THINK Pascal dead?
Date: Fri, 04 Nov 1994 11:14:55 +0100
Organization: SPECTRA Soft


Excuse-me if the topic has already been discussed here (I am a newcomer)
but I have see no such thing in the 100 last articles, and I could not
figure a more suitable group.

I am one of the many THINK Pascal users left in the dark by Symantec, after
the PowerPC. I have thousand of lines of Pascal to port to the PowerPC and
I don't want to loose the advantages of THINK Pascal (the wonderful
source-level debugger, among others).

What is the official status of THINK Pascal? Will ever exist a PowerPC
version? Is it dead? I am a registered user, but I receive absolutely no
information from Symantec. Have they e-mail support?

Thanks.



- -------------------------
Jean-Yves Bernier - SPECTRA
bernier@dialup.francenet.fr
- -------------------------


+++++++++++++++++++++++++++

>From nick+@pitt.edu ( nick.c )
Date: Fri, 04 Nov 1994 10:49:30 -0500
Organization: The Pitt, Chemistry


   Yes, very dead.  I would not expect any udates or new versions.
     That said a lot of folks still use it.  It should be possible to
     port your code to CodeWarrrior Pascal (one of the compilers 
     included with the CodeWarrior Gold or Bronze CD).  The Gold
     version runs native (fat - I think) and compiles for PPC.


 Internet: nick+@pitt.edu            _/   _/  _/  _/_/_/   _/   _/  
   eWorld: nick                     _/_/ _/  _/  _/   _/  _/_/_/ 
      CIS: 71232,766               _/ _/_/  _/  _/       _/ _/    
     http://www.pitt.edu/~nick/   _/   _/  _/   _/_/_/  _/   _/     
                    

+++++++++++++++++++++++++++

>From lbotez@picard.cs.wisc.edu (Lynda Botez)
Date: 6 Nov 1994 17:36:45 GMT
Organization: U of Wisconsin CS Dept

Er, Think Pascal isn't really dead, it's just comatose.

If you need to convert stuff over to the powerpc, though, I would suggest
you look into CodeWarrior. They actually have a pascal powerpc compiler
(its in beta, but I would imagine it works pretty good)... and I doubt
Symantec will bother with Think Pascal.  

Also, I think most of the programmers that developed Think Pascal are now
working for Metrowerks (the company that owns CodeWarrior); so you can
imagine that Think Pascal is not long for this world..


+++++++++++++++++++++++++++

>From johnmce@world.std.com (John McEnerney)
Date: Sun, 6 Nov 1994 19:11:16 GMT
Organization: The World Public Access UNIX, Brookline, MA

lbotez@picard.cs.wisc.edu (Lynda Botez) writes:

>Also, I think most of the programmers that developed Think Pascal are now
>working for Metrowerks (the company that owns CodeWarrior); so you can
>imagine that Think Pascal is not long for this world..

For anyone who's interested, the programmers who developed THINK Pascal are:

Me (at Metrowerks these days)
David Neal (director of Symantec's Mac language group)
Rich Siegel (of Bare Bones software fame)
Pete Maruhnic (author of CA's Realizer for Windows)

So only one of us ended up at Metrowerks. Still, the product is pretty 
much dead wrt PowerPC, as much my fault as anyone else's: a lot of the 
code was written in assembly language, the context-switch mechanism would 
probably not survive a port to the PPC, etc. It is rumored that Symantec 
still has plans in the Pascal arena (but as you might imagine they don't 
tell me that sort of thing anymore)

-- John McEnerney, Metrowerks PowerPC Product Architect


+++++++++++++++++++++++++++

>From RobTerrell@vmedia.com (Rob Terrell)
Date: 6 Nov 1994 21:26:52 GMT
Organization: Jecta Development Corp.

John McEnerney said:
> So only one of us ended up at Metrowerks. Still, the product is pretty
> much dead wrt PowerPC, as much my fault as anyone else's: a lot of the
> code was written in assembly language, the context-switch mechanism
> would probably not survive a port to the PPC, etc. It is rumored that
> Symantec still has plans in the Pascal arena (but as you might imagine
> they don't tell me that sort of thing anymore)

Yeah, there was a rumor in MacWeek regarding this. I doubt it. The
Symantec folks were real arrogant on the topic of the death of Pascal
at the WWDC.

So, John, what's happening with Metrowerks' Pascal? I would totally
abandon Think Pascal if CW supported an Object Pascal.


Rob

+++++++++++++++++++++++++++

>From siegel@netcom.com (Rich Siegel)
Date: Mon, 7 Nov 1994 17:57:38 GMT
Organization: Bare Bones Software

In article <39j47d$gfq@spool.cs.wisc.edu> lbotez@picard.cs.wisc.edu (Lynda Botez) writes:
>
>Also, I think most of the programmers that developed Think Pascal are now
>working for Metrowerks (the company that owns CodeWarrior); so you can
>imagine that Think Pascal is not long for this world..
>

That is not true.

Of the four people most directly involved in the development of THINK Pascal:

- one is at Metrowerks
- one is director of the development tools group at Symantec
- one is off doing something else (I don't recall where)
- one is president and CEO of his own software company

When this question was recently posted to Symantec personnel at a
recent BCS MacTechGroup meeting, the response was (basically) that
they plan to work with certain third-party compiler makers to produce
a Pascal solution for Rainbow (their new development environment that
is currently under development).

R.
-- 
Rich Siegel % siegel@netcom.com	% President & CEO, Bare Bones Software Inc.
--> For information about BBEdit, finger bbedit@world.std.com <--

+++++++++++++++++++++++++++

>From peter.lewis@info.curtin.edu.au (Peter N Lewis)
Date: Tue, 08 Nov 1994 11:23:59 +0800
Organization: NCRPDA, Curtin University

In article <39jhms$ja@redstone.interpath.net>, RobTerrell@vmedia.com (Rob
Terrell) wrote:

>Yeah, there was a rumor in MacWeek regarding this. I doubt it. The
>Symantec folks were real arrogant on the topic of the death of Pascal
>at the WWDC.

A Symantec fellow told me that the rumour is crap.  There is no Symantec
plans for a PPC pascal compiler.

>So, John, what's happening with Metrowerks' Pascal? I would totally
>abandon Think Pascal if CW supported an Object Pascal.

You and me both.  I'm strugling on with THINK Pascal waiting for objects
to show up in MW Pascal.  MW Pascal is scheduled to go 1.0 without objects
in January (CW5), and MW Object Pascal is scheduled for CW6 in May (it
better be there, otherwise Greg will have to face down some heckling at
the WWDC :-).

The best you can do to help is to a) make sure MW knows that Object Pascal
is what you need; b) buy MW CW; c) feed any bugs back to the MW bug report
line as precisely as you can.  That's what i've been doing, an Marcel has
been very good at fixing bugs (such that basically every bug I have
reported has been fixed by the next version).

Enjoy,
   Peter.
-- 
Peter N Lewis <peter.lewis@info.curtin.edu.au> - Macintosh TCP fingerpainter
FTP my programs from redback.cs.uwa.edu.au:Others/PeterLewis/ or
amug.org:pub/peterlewis/ or nic.switch.ch:software/mac/peterlewis/

+++++++++++++++++++++++++++

>From ingemar@lysator.liu.se (Ingemar Ragnemalm)
Date: 8 Nov 1994 08:17:05 GMT
Organization: (none)

johnmce@world.std.com (John McEnerney) writes:

>lbotez@picard.cs.wisc.edu (Lynda Botez) writes:

>>Also, I think most of the programmers that developed Think Pascal are now
>>working for Metrowerks (the company that owns CodeWarrior); so you can
>>imagine that Think Pascal is not long for this world..

>For anyone who's interested, the programmers who developed THINK Pascal are:

>Me (at Metrowerks these days)
>David Neal (director of Symantec's Mac language group)
>Rich Siegel (of Bare Bones software fame)
>Pete Maruhnic (author of CA's Realizer for Windows)

>So only one of us ended up at Metrowerks. Still, the product is pretty 
>much dead wrt PowerPC, as much my fault as anyone else's: a lot of the 
>code was written in assembly language, the context-switch mechanism would 
>probably not survive a port to the PPC, etc.

MetroWerks Pascal is sort of ok as replacement. It doesn't have Instant,
it's debugger is far from the elegance of Lightsbug, but it works.

But I wonder, why wasn't the debugger integrated with the compiler?
No flames, but I really didn't think a Think Pascal decveloper would
let so many Think C flaw through.

Why mimick the clumsy Think C when Think Pascal is so much better (language
issues aside). Imagine a system where you step and set breakpoints in the
editor, while the editor and the debugger communicated with Apple Events.
I can't see the problem, as long as we don't demand Instant.

>It is rumored that Symantec 
>still has plans in the Pascal arena (but as you might imagine they don't 
>tell me that sort of thing anymore)

Long ago, I bought Think C. It took several years before I got any feedback
- probably that was after buying Think Pascal. When Symantec now tries to
convince me that I should get SC++, I bought CodeWarrior instead. Much better
C environment, and a future for my Pascal code.

Fortunately, my Think Pascal isn't dead yet. I guess it will stop working
somewhere between 7.5 and 8.0 or so, but not yet.

--
- -
Ingemar Ragnemalm, PhD
Image processing, Mac shareware games
E-mail address: ingemar@isy.liu.se or ingemar@lysator.liu.se

+++++++++++++++++++++++++++

>From palais@binah.cc.brandeis.edu
Date: 12 Nov 1994 19:55:02 GMT
Organization: Brandeis University

One should also mention that Language Systems is making a very
credible effort at developing an industrial strength Pascal
compiler. Unlike CodeWarrior, the LS version runs under
MPW, which you may or may not find an advantage. But for those
of us who got hooked on Object Pascal before Apple pulled the
rug out from under us, it is the only way to go, since it does
compile Object Pascal while CodeWarrior does not.

   R. Palais

---------------------------

>From roxanne@bnr.ca (Roxanne Friesen)
Subject: Newbie Q:Why no DisposeHandle-ReleaseResource call?
Date: Mon, 07 Nov 1994 11:53:32 -0400
Organization: Bell-Northern Research Ltd.

I'm trying to get a better *handle* on when handles should be disposed of
and resources released.

In the first sample function below, I would have thought that the alias
handle should be disposed of once the resource has been written to the
resource file but this function doesn't do that.  Am I wrong, is this
function wrong, or is it simply not necessary, in this case, to dispose of
the handle? (For the sake of simplifying the samples, assume I'm writing
to my apps own resource fork and not a prefs file of some kind ... or does
that make a difference?)

FUNCTION doCreateAlias(fileSpec:FSSpec):OSErr;
VAR
  alisHandle : AliasHandle;
  result : OSErr;

BEGIN
  result := NewAlias(NIL, fileSpec, alisHandle);
  IF (alisHandle <> NIL) THEN BEGIN
    AddResource(Handle(alisHandle), rAliasType, 128, 'File Alias');
    result := ResError;

    IF (result = NoErr) THEN BEGIN
      WriteResource(Handle(alisHandle));
      result := ResError;
    END;
  END;
 
  doCreateAlias := result;
END; {doCreateAlias}


In the second sample function below, again, I would have thought that the
resource should be released once I'm finished with it but, again, this
function doesn't do that.  Am I wrong, is this function wrong, or is it
simply not necessary, in this case, to release the resource?

FUNCTION setResStr(rsrcType:ResType; rsrcID:INTEGER; content:STR255):OSErr;
VAR   
  rsrcHdl : Handle;
  result  : OSErr;
         
BEGIN
  rsrcHdl := GetResource(rsrcType, rsrcID);
  result := ResError;
         
  IF (rsrcHdl <> NIL) THEN BEGIN
    SetHandleSize(rsrcHdl, LENGTH(content) + 1);          
    BlockMove(@content, rsrcHdl^, LENGTH(content) + 1); 
    ChangedResource(rsrcHdl);
    result := ResError;                                              

    IF (result = NoErr) THEN BEGIN
      WriteResource(rsrcHdl);
      result := ResError;
    END;                                       
  END;
  
  setResStr :=
result;                                                                    

END; {setResStr}


Any help, hints, tips, suggestions would be appreciated.
Roxanne.

-- 
Roxanne Friesen
Bell-Northern Research Ltd.
roxanne@bnr.ca

+++++++++++++++++++++++++++

>From jones.794@osu.edu (Matt Jones)
Date: Mon, 07 Nov 1994 19:15:24 +0500
Organization: The Ohio State University

In article <roxanne-0711941153320001@47.221.33.54>, roxanne@bnr.ca (Roxanne
Friesen) wrote:

> I'm trying to get a better *handle* on when handles should be disposed of
> and resources released.
> 
> In the first sample function below, I would have thought that the alias
> handle should be disposed of once the resource has been written to the
> resource file but this function doesn't do that.  Am I wrong, is this
> function wrong, or is it simply not necessary, in this case, to dispose of
> the handle? (For the sake of simplifying the samples, assume I'm writing
> to my apps own resource fork and not a prefs file of some kind ... or does
> that make a difference?)
> 
> FUNCTION doCreateAlias(fileSpec:FSSpec):OSErr;
> VAR
>   alisHandle : AliasHandle;
>   result : OSErr;
> 
> BEGIN
>   result := NewAlias(NIL, fileSpec, alisHandle);
>   IF (alisHandle <> NIL) THEN BEGIN
>     AddResource(Handle(alisHandle), rAliasType, 128, 'File Alias');
>     result := ResError;
> 
>     IF (result = NoErr) THEN BEGIN
>       WriteResource(Handle(alisHandle));
>       result := ResError;
>     END;
>   END;
>  
>   doCreateAlias := result;
> END; {doCreateAlias}
> 
> 
> In the second sample function below, again, I would have thought that the
> resource should be released once I'm finished with it but, again, this
> function doesn't do that.  Am I wrong, is this function wrong, or is it
> simply not necessary, in this case, to release the resource?
> 
> FUNCTION setResStr(rsrcType:ResType; rsrcID:INTEGER; content:STR255):OSErr;
> VAR   
>   rsrcHdl : Handle;
>   result  : OSErr;
>          
> BEGIN
>   rsrcHdl := GetResource(rsrcType, rsrcID);
>   result := ResError;
>          
>   IF (rsrcHdl <> NIL) THEN BEGIN
>     SetHandleSize(rsrcHdl, LENGTH(content) + 1);          
>     BlockMove(@content, rsrcHdl^, LENGTH(content) + 1); 
>     ChangedResource(rsrcHdl);
>     result := ResError;                                              
> 
>     IF (result = NoErr) THEN BEGIN
>       WriteResource(rsrcHdl);
>       result := ResError;
>     END;                                       
>   END;
>   
>   setResStr :=
> result;                                                                    
> 
> END; {setResStr}
> 
> 
> Any help, hints, tips, suggestions would be appreciated.
> Roxanne.
> 
> -- 
> Roxanne Friesen
> Bell-Northern Research Ltd.
> roxanne@bnr.ca

If your compiler is any good, it checks if any of the handles in local
storage are still attached. ( I think ) Otherwise, you would be unable to
find the handles to dispose of them later. However, this is tricky internal
compiler stuff, much like pre-initialized variables. I always explicitly
dispose of handles since the moment you assume your compiler does it for
you, it stops.
- ------------------------------------------------------------------------
| it won't give up it wants me dead | |\  | | |  /| | jones.794          |
| goddamn this noise inside my head | | \ | | | / | |    @ohio-state.edu |
|                   Trent Reznor    | |  \| | |/  | | Stop the Clipper!  |
- ------------------------------------------------------------------------

+++++++++++++++++++++++++++

>From sigurasg@rhi.hi.is (Sigurdur Asgeirsson)
Date: Tue, 08 Nov 1994 09:49:56 -0100
Organization: University of Iceland

In article <roxanne-0711941153320001@47.221.33.54>, roxanne@bnr.ca
(Roxanne Friesen) wrote:

[snip]

> In the first sample function below, I would have thought that the alias
> handle should be disposed of once the resource has been written to the
> resource file but this function doesn't do that.  Am I wrong, is this
> function wrong, or is it simply not necessary, in this case, to dispose of
> the handle?

[snip]

> FUNCTION doCreateAlias(fileSpec:FSSpec):OSErr;
> VAR
>   alisHandle : AliasHandle;
>   result : OSErr;
> 
> BEGIN
>   result := NewAlias(NIL, fileSpec, alisHandle);
>   IF (alisHandle <> NIL) THEN BEGIN
>     AddResource(Handle(alisHandle), rAliasType, 128, 'File Alias');
>     result := ResError;
> 
>     IF (result = NoErr) THEN BEGIN
>       WriteResource(Handle(alisHandle));
>       result := ResError;
>     END;
>   END;
>  
>   doCreateAlias := result;
> END; {doCreateAlias}
> 
> 
[second code example snipped for brevity]

  There is no need in this case to dispose the handle, unless the
AddResource call fails, in which case the handle should be disposed of
with DisposeHandle (since the handle is not a resource if the call fails -
see below). 
  In general there is no need to dispose of resource handles, because they
are the responsibility of the Resource Manager. Resource handles must
NEVER be disposed of via DisposeHandle, since that confuses the Resource
Manager and you end up with heap corruption. (The Resource Manager does a
DisposeHandle for all loaded resources in a resource file when the
resource file is closed). 
  If you feel the need to dispose of a resource handle when you're done
with it (maybe because you'd like to free the memory that the resource is
using) do it with the ReleaseResource call. It's generally better though
to mark your resources as purgeable and leave it up to the Memory and
Resource Managers to free the memory when needed. Be sure however, to use
LoadResource in this case and mark the resource unpurgeable (or lock it)
if you need to be sure that it doesn't "go away" while you're using it.

-- 
Sigurdur Asgeirsson    | "Well you know, C isn't that hard, void (*(*f[])())()
Kambasel 26            | for instance declares f as an array of unspecified
109 Reykjavik, Iceland | size, of pointers to functions that return pointers to
sigurasg@rhi.hi.is     | functions that return void... I think"

+++++++++++++++++++++++++++

>From johns@efn.org (John Selhorst)
Date: Tue, 8 Nov 1994 14:43:55 GMT
Organization: hisself

In article <jones.794-071194191524@slip1-12.acs.ohio-state.edu>,
jones.794@osu.edu (Matt Jones) wrote:

[ stuff from Roxanne deleted ]

> If your compiler is any good, it checks if any of the handles in local
> storage are still attached. ( I think ) Otherwise, you would be unable to
> find the handles to dispose of them later. However, this is tricky internal
> compiler stuff, much like pre-initialized variables. I always explicitly
> dispose of handles since the moment you assume your compiler does it for
> you, it stops.

Wrong.  This is not fancy compiler stuff.  The handles Roxanne was
referring to belong to the resource manager and the resource manager will
dispose of them when it needs to.

Johnny

johns@efn.org

+++++++++++++++++++++++++++

>From Scott.Francis@SuperMac.com (eScott Francisternet alt.bbs.lists alt.bbs.lists.d alt.bbs.majorbbs alt.bbs.metal alt.bbs.pcboard alt.bbs.pcbuucp alt.bbs.renegade alt.bbs.searchlight alt.bbs.unixbbs alt.bbs.unixbbs.uniboard alt.bbs.uupcb alt.bbs.waffle alt.bbs.wildcat alt.beadworld alt.)
Date: Tue, 08 Nov 1994 10:49:31 -0800
Organization: Radius

In article <roxanne-0711941153320001@47.221.33.54>, roxanne@bnr.ca
(Roxanne Friesen) wrote:

> I'm trying to get a better *handle* on when handles should be disposed of
> and resources released.
> 

In both cases the resource handle should be released with
ReleaseResource().  Many programmers have not always done so, particularly
when building apps since the res file will be closed (and all resources
from that file released) when the app quits.  While calling
ReleaseResource() is then not strictly necessary, it is good form, and can
help some types of memory problems.

Another dimension to the problem:  If you will be refetching resources
again and again, you might want to make the preloadable, and *not* release
them.  This will keep them in memory and speed up the calls to
GetResource().

--Scott

+++++++++++++++++++++++++++

>From mxmora@unix.sri.com (Matt Mora)
Date: 8 Nov 1994 15:39:07 -0800
Organization: SRI International, Menlo Park, CA

In article <roxanne-0711941153320001@47.221.33.54> roxanne@bnr.ca (Roxanne Friesen) writes:
>I'm trying to get a better *handle* on when handles should be disposed of
>and resources released.

Simple.  Handle are disposed and Resources are released.

>BEGIN
>  result := NewAlias(NIL, fileSpec, alisHandle);
>  IF (alisHandle <> NIL) THEN BEGIN
>    AddResource(Handle(alisHandle), rAliasType, 128, 'File Alias');

At this point aliasHandle is no longer a plain ol handle. After you
call Addresource the handle you supply becomes a ResourceHandle.

If its a resource handle what are you supposed to do with it? Yep
ReleaseResource. 

DON'T CALL DISPOSEHANDLE AFTER YOU CALLED ADDRESOURCE ON THAT HANDLE.

>
>In the second sample function below, again, I would have thought that the
>resource should be released once I'm finished with it but, again, this
>function doesn't do that.  Am I wrong, is this function wrong, or is it
>simply not necessary, in this case, to release the resource?


In the example that was shown, you don't have to call release resource
if you might use that resource again. If you don't want it around
go ahead and call release resource.

If the resource file is closed, the Resource handles will be released.

Xavier











-- 
___________________________________________________________
Matthew Xavier Mora                       Matt_Mora@sri.com
SRI International                       mxmora@unix.sri.com
333 Ravenswood Ave                    Menlo Park, CA. 94025

+++++++++++++++++++++++++++

>From mxmora@unix.sri.com (Matt Mora)
Date: 8 Nov 1994 15:40:13 -0800
Organization: SRI International, Menlo Park, CA

In article <jones.794-071194191524@slip1-12.acs.ohio-state.edu> jones.794@osu.edu (Matt Jones) writes:

>If your compiler is any good, it checks if any of the handles in local
>storage are still attached. ( I think ) Otherwise, you would be unable to
>find the handles to dispose of them later. However, this is tricky internal
>compiler stuff, much like pre-initialized variables. I always explicitly
>dispose of handles since the moment you assume your compiler does it for
>you, it stops.


Huh?







Xavier

-- 
___________________________________________________________
Matthew Xavier Mora                       Matt_Mora@sri.com
SRI International                       mxmora@unix.sri.com
333 Ravenswood Ave                    Menlo Park, CA. 94025

+++++++++++++++++++++++++++

>From peter.lewis@info.curtin.edu.au (Peter N Lewis)
Date: Wed, 09 Nov 1994 11:27:40 +0800
Organization: NCRPDA, Curtin University

In article <roxanne-0711941153320001@47.221.33.54>, roxanne@bnr.ca
(Roxanne Friesen) wrote:

>In the first sample function below, I would have thought that the alias
>handle should be disposed of once the resource has been written to the
>resource file but this function doesn't do that.  Am I wrong, is this
>function wrong, or is it simply not necessary, in this case, to dispose of
>the handle? (For the sake of simplifying the samples, assume I'm writing
>to my apps own resource fork and not a prefs file of some kind ... or does
>that make a difference?)

First off, you must never call DisposeHandle on a resource handle, nor
ReleaseResource on a non-resource handle.  Bad THings(tm) will happen. 
There are a pair fo inits (DoubleTrouble and DisposeResource or some such)
that catch bugs like this, available from ftp.apple.com:/mac/dts/ I
believe.

Second, when you write a resource to a file, it's not necessayr to release
it afterwards, since it will be automatically released when the resource
file is closed (which tends to be quite soon afterwards anyway).  Also,
you can set the handle to be purged (HPurge) and then it'll be released
when memory is needed, but not until.  Make sure to call GetResource again
to reload the (possibly) purged handle before reusing it.

Enjoy,
   Peter.
-- 
Peter N Lewis <peter.lewis@info.curtin.edu.au> - Macintosh TCP fingerpainter

---------------------------

>From fallside@rahul.net (David C. Fallside)
Subject: Prograph 2.5
Date: 10 Nov 1994 06:39:19 GMT
Organization: a2i network

I recently accepted a $59.95 offer for Prograph 2.5. The promo blurb "Very
High Level Pictorial Object-Oriented Programming Environment" seems to be
accurate, and having worked my way through half of the tutorials, it seems
that it should be possible to develop complex applications. But I'm not a
professional programmer, and haven't found anyone else who has ever heard
of Prograph. Any comments from Netland? Thank you.
David

^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
I'd rather be on the river ....
K1/4, SQRT/3
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

+++++++++++++++++++++++++++

>From nick+@pitt.edu ( nick.c )
Date: Thu, 10 Nov 1994 11:42:38 -0500
Organization: The Pitt, Chemistry

In article <fallside-0911942243270001@382.rahul.net>, fallside@rahul.net
(David C. Fallside) wrote:

> I recently accepted a $59.95 offer for Prograph 2.5. The promo blurb "Very
> High Level Pictorial Object-Oriented Programming Environment" seems to be
> accurate, and having worked my way through half of the tutorials, it seems
> that it should be possible to develop complex applications. But I'm not a
> professional programmer, and haven't found anyone else who has ever heard
> of Prograph. Any comments from Netland? Thank you.


   Prograph was my first environment (not counting hypercard), and
      I consider that a mistake.  Don't get me wrong - prograph is
      both a great concept and a great engineering feet.  I still
      argue that inconic input will be the way we'll all code 10 years
      from now (or sooner).  However, prograph is a dual mode environment,
      it allows you to program at a low level, but defaults to a high
      level environment by use of it's integrated class library.
      As a result, and with the added factor there is very little
      sample code or literature, it's hard to tell where the library
      ends and the toolbox begins.  You can generate nice (albeit
      large and slow) apps with 2.5.2 - nicer ones with CPX - but
      you won't learn anything about Mac programming with it.

   To learn how to program the Mac you'll need to learn a classical
      low level language (Pascal or C would be best), and when you do
      you'll find you can generate much smaller, faster binaries and
      have access to a wealth of established library code and example
      code from all over the world.  My guess is most "professional"
      programmers, don't want to give up those advantages.

   Prograph was marketed as a non-programmers programming language, and
      I think that's still true.  However, as I said above, it does
      allow low level coding, is very powerfull, and has the best
      interface and debugger I've ever seen.  It's a glimpse of the
      future of programming, and worth knowing, just remeber you 
      get paid in the present.


 Internet: nick+@pitt.edu            _/   _/  _/  _/_/_/   _/   _/  
   eWorld: nick                     _/_/ _/  _/  _/   _/  _/_/_/ 
      CIS: 71232,766               _/ _/_/  _/  _/       _/ _/    
     http://www.pitt.edu/~nick/   _/   _/  _/   _/_/_/  _/   _/     
                    

+++++++++++++++++++++++++++

>From pjensen@netcom.com (Peter Jensen)
Date: Thu, 10 Nov 1994 16:53:40 GMT
Organization: NETCOM On-line Communication Services (408 261-4700 guest)

fallside@rahul.net (David C. Fallside) writes:

>I recently accepted a $59.95 offer for Prograph 2.5. The promo blurb "Very
>High Level Pictorial Object-Oriented Programming Environment" seems to be
>accurate, and having worked my way through half of the tutorials, it seems
>that it should be possible to develop complex applications. But I'm not a
>professional programmer, and haven't found anyone else who has ever heard
>of Prograph. Any comments from Netland? Thank you.
>David

Prograph 2.5 is the predecessor of Prograph CPX 1.x, which is the 
Prograph development environment with all the bells and whistles.  $60 is 
a great price for 2.5 which has the full language implementation found in 
CPX.  CPX has a rich class library a'la TCL/MacApp and a user-modifiable 
GUI Builder.  

I use Prograph full-time to develop complex commercial applications.  
There are some very intriguing apps with high-volume potential being 
developed in Prograph right now.  Prograph has arguably one of the best 
debuggers ever implemented (in the interpretive mode).  There is an 
optimizing compiler that generates stand-alone apps.  The code isn't as 
fast or tight as C/C++ but you get RTTI, garbage collection, automatic 
deref of handles/pointers, cool list management stuff, and of course, a 
gorgreous visual syntax that prevents syntax errors via constrained input.

Visual Programming is for real; and Prograph is the most "real" of the new
generation.  It's one of the things that makes the Mac a special
development platform.  Sometime next year there will be a Windows Prograph
and the framework will become cross-platform.  Plus they're developing
DAL/SQL database tools that will allow you to do everything you can do in
Omnis/4D but drop into Prograph if you want real programming power.  For
compute-bound operations it's fairly straightforward to import external
primitives written in C if you feel the need for speed.  In normal usage,
you can't tell whether well-crafted apps were written in Prograph or C++ 
(well, maybe you can, since they're delivered earlier!). 

I'm very happy with Prograph.  net.persons interested in Prograph can join
the commotion over on comp.lang.prograph.  Also, Kurt Schmucker of Apple's
ATG has written an extensive review of CPX in November's MacTech.  Look
for more Prograph articles in coming issues. 

Peter Jensen                                  pjensen@netcom.com
Pepper Tree Design, Inc.                      Santa Clara, CA
   "Software crafted from the choicest of electrons" (tm)

+++++++++++++++++++++++++++

>From howardb@enlil.premenos.com (Howard Berkey)
Date: 10 Nov 1994 17:03:19 GMT
Organization: Premenos Corp

In article <fallside-0911942243270001@382.rahul.net>,
David C. Fallside <fallside@rahul.net> wrote:
>I recently accepted a $59.95 offer for Prograph 2.5. The promo blurb "Very
>High Level Pictorial Object-Oriented Programming Environment" seems to be
>accurate, and having worked my way through half of the tutorials, it seems
>that it should be possible to develop complex applications. But I'm not a
>professional programmer, and haven't found anyone else who has ever heard
>of Prograph. Any comments from Netland? Thank you.
>David
>




I've never used it myself but it gets a lot of praise from those who
have.  

You might want to check out comp.lang.prograph... I'm sure you'll get
a lot of info there.

-H-










---------------------------

>From ladan@cs.umd.edu (Ladan Gharai)
Subject: [Q] Programming with the QuickTime toolkit
Date: 2 Nov 1994 18:52:59 -0500
Organization: U of Maryland, Dept. of Computer Science, Coll. Pk., MD 20742


Hi everyone

I am new to the QuickTime and am trying to understand how it works. I have
a bunch of questions and would appreciate any answers. I need to write a player
with very specific functionality. Going through the Inside the Mac: Quicktime
I have the following questions:

1. A sample is defined as "A single element of a sequence of time-ordered
   data" does this mean that for a vedio a sample would be a frame?

2. What function calls should I use to be able to access a single frame? In the
   Inside the Mac it says that a programmer can access every frame. How?

3. Where does QuickTime store information about the frame rates (fps) of a movie? 
   For example the frame rate that a movie was created with? 

4. Is there a realtionship between frame rate (fps) and playback rate?  

5. When QuickTime does not have enough time to display all the frames of a
   movie, it starts dropping frames. Is there a pattern to this frame dropping?
   For example does it drop everyother frame, or the third in every 3 frames? 
   How does it decide which frames to drop?



thanx
Ladan

+++++++++++++++++++++++++++

>From rich@cs.umd.edu (Richard Gerber)
Date: 2 Nov 1994 19:44:03 -0500
Organization: U of Maryland, Dept. of Computer Science, Coll. Pk., MD 20742

I am interested too.  But specifically: from within a quicktime player is there
any way to dynamically determine -- as the movie is playing -- which particular 
frames are being dropped.  

If not, what's the lowest level of granularity I can get to?

rich

- ----------

Richard Gerber
Assistant Professor
	
Department of Computer Science
University of Maryland
College Park, MD  20742 USA

Email:   rich@cs.umd.edu
Tel:     (301) 405-2710
FAX:     (301) 405-6707
 


+++++++++++++++++++++++++++

>From ivan_cavero_belaunde@avid.com (Ivan Cavero Belaunde)
Date: 8 Nov 1994 00:00:42 GMT
Organization: Avid Technology, Inc.

In article <3998qv$7id@mingus.cs.umd.edu>, ladan@cs.umd.edu (Ladan Gharai)
wrote:
> Hi everyone
> 
> I am new to the QuickTime and am trying to understand how it works. I have
> a bunch of questions and would appreciate any answers. I need to write a
player
> with very specific functionality. Going through the Inside the Mac: Quicktime
> I have the following questions:
> 
> 1. A sample is defined as "A single element of a sequence of time-ordered
>    data" does this mean that for a vedio a sample would be a frame?

Yup.

> 2. What function calls should I use to be able to access a single frame?
In the
>    Inside the Mac it says that a programmer can access every frame. How?

If I want the sample at time 10 on the first track:
   theTrack = GetMovieIndTrack(theMovie, 1);
   theMedia = GetTrackMedia(theTrack);
   mediaTime = TrackTimeToMediaTime(theTrack, 10);
   if (mediaTime != -1) {
      err = GetMediaSample(theMedia, sampleDataHandle, 0, &sampleDataSize,
            mediaTime, nil, nil, sampleDescriptionHandle, nil, 1, nil,
            &sampleFlags);
 
> 
> 3. Where does QuickTime store information about the frame rates (fps) of
a movie? 
>    For example the frame rate that a movie was created with? 

It doesn't since the frame rate can vary over time throughout the movie.
You can estimate it by walking each track by track edits via
GetTrackNextInterestingTime and then figuring out the frame rate for each
edit by looking at the edit rate for each edit as well as the durations of
the samples spanned by the edit.

> 4. Is there a realtionship between frame rate (fps) and playback rate?  

I'm not sure what you mean here. The QuickTime movie will never play at a
better rate than its original stored rate - additionally, it is eminently
possible to create a movie with too high a stored frame rate that will not
play properly and will drop frames.

> 5. When QuickTime does not have enough time to display all the frames of a
>    movie, it starts dropping frames. Is there a pattern to this frame
dropping?
>    For example does it drop everyother frame, or the third in every 3 frames? 
>    How does it decide which frames to drop?

A movie has a "running clock" that tells it what "time" it is within the
movie. When falling behind, QT will drop as many frames as necessary to
catch up the frame being displayed with its running clock. The results are
dependent on boatloads of factors, such as the horsepower of your machine,
the bandwidth of your storage device, the seek speed of your storage
device, the compression scheme used, the frame-differencing
characteristics of the movie, and where within the movie the "playback
head" is. There's no simple answer, sorry.

Hope this helps. Followups redirected to comp.sys.mac.programmer.

-Ivan
- --
Ivan Cavero Belaunde (ivan_cavero_belaunde@avid.com)
Avid VideoShop Lead
Avid Technology, Inc.
Disclaimer:  All views expressed are entirely my own and do not
reflect  the opinions of Avid Technology, Inc.

---------------------------

End of C.S.M.P. Digest
**********************