[net.sources.mac] C Declare Once more time...

ALAN@NCSUVM.BITNET (01/31/86)

--- da (shell script for aztec C) --
#
#  Aztec Shell script to compile, link and install the C Declare
#  desk accessory.
#
set -x
cc -bu cdcl.c
ln -an "C Declare" cdcl.o -lc
cprsrc -f DRVR 31 cdcl sys:system
--- SNIP HERE FOR CDCL.C ---
/*
 * C Declare -- a desk accessory written in Aztec C
 *
 * This DA assists you in declaring C variables and functions.
 *
 * Written by Michael P. Hecht, 10jan86
 */
#asm
main
   dc.w $0400               ;ctl-enable
   dc.w 0              ;no update
   dc.w $014a               ;detect mouse and key down events
   dc.w 0              ;menu ID number (none)
     
   dc.w open_-main          ;open routine
   dc.w nop_-main      ;prime routine
   dc.w control_-main       ;control routine
   dc.w nop_-main      ;status routine
   dc.w close_-main         ;close routine
     
title_
   dc.b 9
   dc.b "C Declare"
   ds        0                   ;for alignment
     
   public    _Uend_,_Dorg_,_Cend_
     
save_
   lea       main+(_Uend_-_Dorg_)+(_Cend_-main),a4        ;set up globals
   move.l    a0,Pbp_                                                ;save pb pointer
   move.l    a1,Dp_                                                 ;save DCE pointer
   rts
     
restore_
   move.l    Pbp_,a0
   rts
#endasm
     
#define _DRIVER
#include <quickdraw.h>
#include <event.h>
#include <window.h>
#include <control.h>
#include <textedit.h>
#include <dialog.h>
#include <desk.h>
#include <scrap.h>
#include <toolutil.h>
#include <memory.h>
#include <pb.h>
#include <osutil.h>
     
#define SP        (*(struct storage **)Dp->dCtlStorage)
     
/* Dialog item numbers */
#define FUNC_RET  1
#define ARRAY_OF  2
#define PTR_TO         3
#define TEXT      4
     
/* Owned resource id equates */
#define OWNED          0xc000
#define BY_DRVR        0x0000
#define BY_WDEF        0x0800
#define BY_MDEF        0x1000
#define BY_CDEF        0x1800
#define BY_PDEF        0x2000
#define BY_PACK        0x2800
#define BY_ID_SHIFT    5
     
DCEPtr Dp;
ParmBlkPtr Pbp;
     
/* Private storage */
struct storage :
   int            first;
   ControlHandle       func_button;
   ControlHandle       array_button;
   Handle              text;
   StringHandle        init;
:;
     
open()
:
   register struct DCE      *dp;
   register struct storage       *sp;
   register WindowPtr       wp;
   register StringHandle         s;
   register int             dlog_id;
   int                 junk;
   Rect                box;
     
     
   save();
   dp = Dp;
   wp = dp->dCtlWindow;
     
   /* First open?  Allocate private storage if so. */
   if( !wp ) :
        dp->dCtlStorage = NewHandle(( long )sizeof( struct storage ));
   :
     
   /* Lock it down and dereference it */
   HLock( dp->dCtlStorage );
   sp = SP;
     
   /* First open?  Allocate DLOG and init other stuff if so. */
   if( !wp ) :
        /* Compute resource id of DLOG at runtime */
        dlog_id = -( dp->dCtlRefNum + 1 );
        dlog_id <<= BY_ID_SHIFT;
        dlog_id |= OWNED | BY_DRVR | 0;
     
        /* Bring up the window */
        dp->dCtlWindow = wp = GetNewDialog( dlog_id, 0L, -1L );
     
        /* Grab control handles for the buttons we want to hilite */
        GetDItem( wp, FUNC_RET, &junk, &sp->func_button,  &box );
        GetDItem( wp, ARRAY_OF, &junk, &sp->array_button, &box );
     
        /* Grab TE handle so we can modify the text quickly */
        GetDItem( wp, TEXT,     &junk, &sp->text,         &box );
     
        /* Grab the initial text in a resizable handle */
        s = NewHandle(( long )sizeof( Str255 ));
        HLock( s );
        GetIText( sp->text, *s );
        HUnlock( s );
        SetHandleSize( s, ( long )(( *s )->length + 1 ));
        sp->init = s;
        sp->first = TRUE;
     
   :
   /* Otherwise, reset if reopened from the front, reset */
   else if( wp == FrontWindow()) :
        (( WindowPeek )wp )->windowKind = dialogKind;
     
        HiliteControl( sp->func_button,  0 );
        HiliteControl( sp->array_button, 0 );
     
        s = sp->init;
        HLock( s );
        SetIText( sp->text, *s );
        HUnlock( s );
     
        sp->first = TRUE;
   :
     
   (( WindowPeek )wp )->windowKind = dp->dCtlRefNum;
   HUnlock( dp->dCtlStorage );
   restore();
   return 0;
:
     
close()
:
   register struct DCE *dp;
   register WindowPtr wp;
     
     
   save();
   dp = Dp;
     
   wp = dp->dCtlWindow;
   (( WindowPeek )wp )->windowKind = dialogKind;
   DisposDialog( wp );
   dp->dCtlWindow = 0;
     
   DisposHandle( SP->init );
   DisposHandle( dp->dCtlStorage );
     
   restore();
   return 0;
:
     
nop()
:
   return 0;
:
     
control()
:
   register struct DCE      *dp;
   register struct storage       *sp;
   register WindowPtr       wp;
   register int             what;
   EventRecord              fakenull;
     
     
   save();
   dp = Dp;
   HLock( dp->dCtlStorage );
   sp = SP;
     
   wp = dp->dCtlWindow;
   /* Change windowKind so the dialog mgr will recognize it */
   (( WindowPeek )wp )->windowKind = dialogKind;
     
   what = Pbp->u.cp.csCode;
     
   switch( what ) :
     
        case accEvent:
             event( sp, *( EventRecord ** )&Pbp->u.cp.csParam,
                  wp );
             break;
     
        case accCursor:
             /* This blinks the caret */
             fakenull.what = nullEvent;
             DialogSelect( &fakenull, 0L, 0L );
             break;
     
        default:
             /* Assume it's an edit something */
             edit( what, sp, wp );
             break;
   :
     
   HUnlock( dp->dCtlStorage );
   (( WindowPeek )wp )->windowKind = dp->dCtlRefNum;
     
   restore();
   return 0;
:
     
event( sp, ep, wp )
register struct storage *sp;
register EventRecord *ep;
WindowPtr wp;
:
   register StringHandle    s;
   register int        eventcode;
   int            item;
     
     
   /* Keydown with command modifier? */
   if( ep->what == keyDown ) :
        switch(( char )( ep->message & charCodeMask )) :
             case 'Z':
             case 'z':
                  eventcode = accUndo;
                  break;
             case 'X':
             case 'x':
                  eventcode = accCut;
                  break;
             case 'C':
             case 'c':
                  eventcode = accCopy;
                  break;
             case 'V':
             case 'v':
                  eventcode = accPaste;
                  break;
             case '\t':
                  SelIText( wp, TEXT, 0, 0x7fff );
                  return;
             default:
                  eventcode = -1;
                  break;
        :
        if( eventcode >= 0 && ep->modifiers & cmdKey ) :
             edit( eventcode, sp, wp );
             return;
        :
   :
     
   if( !DialogSelect( ep, &wp, &item ))
        return;
     
   /* Grab the current text in a resizable handle */
   s = NewHandle(( long )sizeof( Str255 ));
   HLock( s );
   GetIText( sp->text, *s );
   HUnlock( s );
   SetHandleSize( s, ( long )(( *s )->length + 1 ));
     
   switch( item ) :
        case FUNC_RET:
             HiliteControl( sp->func_button,  255 );
             HiliteControl( sp->array_button, 255 );
     
             if( !sp->first )
                  paren( s );
             else
                  sp->first = FALSE;
     
             PtrAndHand( "()", s, 2L );
             ( *s )->length += 2;
             break;
     
        case ARRAY_OF:
             HiliteControl( sp->func_button,  255 );
     
             if( !sp->first )
                  paren( s );
             else
                  sp->first = FALSE;
     
             PtrAndHand( "[]", s, 2L );
             ( *s )->length += 2;
             break;
     
        case PTR_TO:
             HiliteControl( sp->func_button,  0 );
             HiliteControl( sp->array_button, 0 );
     
             sp->first = FALSE;
     
             Munger( s, 1L, 0L, 0L, "*", 1L );
             ( *s )->length++;
             break;
   :
   HLock( s );
   SetIText( sp->text, *s );
   DisposHandle( s );
:
     
paren( s )
register StringHandle  s;
:
   Munger( s, 1L, 0L, 0L, "(", 1L );
   PtrAndHand( ")", s, 1L );
   ( *s )->length += 2;
:
     
edit( code, sp, wp )
int                    code;
register struct storage          *sp;
register WindowPtr          wp;
:
   switch( code ) :
        case accUndo:
             /* Not supported */
             break;
     
        case accCut:
             DlgCut( wp );
             break;
     
        case accCopy:
             DlgCopy( wp );
             break;
     
        case accPaste:
             DlgPaste( wp );
             break;
     
        case accClear:
             DlgDelete( wp );
             break;
     
        default:
             return;
   :
   ZeroScrap();
   TEToScrap();
: