
/*
 *  	skew3.c 	--  	stuff needed for writing output file
 *
 */

#include <dos/dos.h>

#include "skew.h"

/* flags related to gadgets & output file */
extern LONG Flag1, Flag2A, Flag2B, Flag3;

/* flags for cycle gadgets on display #2 (zero indexing) */
extern LONG
		WaitingMode_FLAG, Variables_FLAG, Comments_FLAG, FillIns_FLAG,
		WaitingMode_START, Variables_START, Comments_START, FillIns_START,
		TopArgs_FLAG, TopReturn_FLAG, TestVarScope_FLAG;

/* name for top-level function, as well as prefix & suffix for the rest */
extern char *IDCMP_WIN_BUF, *TOP_LEVEL_BUF, *PREFIX_BUF, *SUFFIX_BUF,
            *TEST_VAR_BUF;

BOOL Writing_Done = FALSE;  /* TRUE when work was saved and no gadget hit */


/*  we hope AmigaDOS will handle error checking for us */
__regargs VOID GenerateCode( BPTR );

static VOID WriteHeader( VOID );
static VOID WriteGlobalDefs( VOID );
static VOID WriteLocalDefs( VOID );
static VOID WriteProtos( VOID );
static VOID WriteTopLevelF( VOID );
static VOID WriteCases( VOID );
static VOID WriteFSkeletons( VOID );
static VOID WriteFillIn( VOID );
static VOID Pad( VOID );

static VOID WriteRefreshTopL( VOID );
static VOID lowWriteRefreshTopL( VOID );
static VOID WriteRefreshSkel( VOID );
static VOID lowWriteRefreshSkel( VOID );

__regargs static VOID lowWriteProtos( BOOL, LONG, UBYTE * );
__regargs static VOID lowWriteCases( BOOL, LONG, LONG, UBYTE *, UBYTE * );
__regargs static VOID lowWriteFSkeletons( BOOL, LONG, UBYTE * );


VOID
GenerateCode( BPTR fh )
{
	SelectOutput( fh );

	if ( Comments_FLAG != NO_COMMENTS )
		WriteHeader();
	else
		PutStr( "\n" ); 				/* start one line lower */

    if ( TestVarScope_FLAG == TestVar_GLOBAL ) {
        	PutStr( "BOOL " );
            PutStr( TEST_VAR_BUF );
            PutStr( " = FALSE;\n" );
    }

	if ( Variables_FLAG == GLOBAL )
		WriteGlobalDefs();

	if ( Flag3 & Prototypes_FLAG )
		WriteProtos();

	WriteTopLevelF();

	if ( Flag3 & Skeletons_FLAG )
		WriteFSkeletons();

	Writing_Done = TRUE;
}


VOID
WriteHeader()
{
  	PutStr( "\n/*\n *      Code generated by SKEleton Writer v1.20\n */\n\n" );
}


VOID
WriteGlobalDefs()
{
	PutStr( "\n" );

	if ( ( Flag1 & CLASS_FLAG ) | Flag2A | Flag2B )
		PutStr( "ULONG  Class;\n" );

	if ( Flag1 & CODE_FLAG && Flag1 & QUALIFIER_FLAG )
		PutStr( "USHORT Code, Qualifier;\n" );
    else if ( Flag1 & CODE_FLAG )
        PutStr( "USHORT Code;" );
	else if ( Flag1 & QUALIFIER_FLAG )
        PutStr( "USHORT Qualifier;\n" );

	if ( Flag1 & IADDRESS_FLAG )
		PutStr( "APTR   IAddress;\n" );

    if ( Flag1 & MOUSEX_FLAG && Flag1 & MOUSEY_FLAG )
        PutStr( "SHORT  MouseX, MouseY;\n" );
	else if ( Flag1 & MOUSEX_FLAG )
		PutStr( "SHORT  MouseX;\n" );
	else if ( Flag1 & MOUSEY_FLAG )
		PutStr( "SHORT  MouseY;\n" );

    if ( Flag1 & SECONDS_FLAG && Flag1 & MICROS_FLAG )
        PutStr( "ULONG  Seconds, Micros;\n" );
	else if ( Flag1 & SECONDS_FLAG )
		PutStr( "ULONG  Seconds;\n" );
	else if ( Flag1 & MICROS_FLAG )
		PutStr( "ULONG  Micros;\n" );
}


VOID
WriteLocalDefs()
{
	PutStr( "\n" );


	if ( ( Flag1 & CLASS_FLAG ) | Flag2A | Flag2B )
		PutStr( "    ULONG  class;\n" );

	if ( Flag1 & CODE_FLAG && Flag1 & QUALIFIER_FLAG )
		PutStr( "    USHORT code, qualifier;\n" );
    else if ( Flag1 & CODE_FLAG )
        PutStr( "    USHORT code;" );
	else if ( Flag1 & QUALIFIER_FLAG )
        PutStr( "    USHORT qualifier;\n" );

	if ( Flag1 & IADDRESS_FLAG )
		PutStr( "    APTR   iaddress;\n" );

    if ( Flag1 & MOUSEX_FLAG && Flag1 & MOUSEY_FLAG )
        PutStr( "    SHORT  mouse_x, mouse_y;\n" );
	else if ( Flag1 & MOUSEX_FLAG )
		PutStr( "    SHORT  mouse_x;\n" );
	else if ( Flag1 & MOUSEY_FLAG )
		PutStr( "    SHORT  mouse_y;\n" );

    if ( Flag1 & SECONDS_FLAG && Flag1 & MICROS_FLAG )
        PutStr( "    ULONG  seconds, micros;\n" );
	else if ( Flag1 & SECONDS_FLAG )
		PutStr( "    ULONG  seconds;\n" );
	else if ( Flag1 & MICROS_FLAG )
		PutStr( "    ULONG  micros;\n" );
}


VOID
WriteProtos()
{
	PutStr( "\n" );

	if ( TopArgs_FLAG ) {
        if ( TopReturn_FLAG )
		    VPrintf( "LONG %s( struct Window * );\n\n", (LONG *)&TOP_LEVEL_BUF );
        else
		    VPrintf( "VOID %s( struct Window * );\n\n", (LONG *)&TOP_LEVEL_BUF );
    }
	else {
        if ( TopReturn_FLAG )
		    VPrintf( "LONG %s( VOID );\n\n", (LONG *)&TOP_LEVEL_BUF );
        else
		    VPrintf( "VOID %s( VOID );\n\n", (LONG *)&TOP_LEVEL_BUF );
    }

	/* still lots of brute force, but less... */

	/* Flag2A */
	lowWriteProtos( TRUE,	MOUSEBUTTONS_F_FLAG,	"MouseButtons" );
	lowWriteProtos( TRUE,	MOUSEMOVE_F_FLAG,		"MouseMove" );
	lowWriteProtos( TRUE,	GADGETDOWN_F_FLAG,		"GadgetDown" );
	lowWriteProtos( TRUE,	GADGETUP_F_FLAG,		"GadgetUp" );
	lowWriteProtos( TRUE,	CLOSEWINDOW_F_FLAG,		"CloseWindow" );
	lowWriteProtos( TRUE,	MENUPICK_F_FLAG,		"MenuPick" );
	lowWriteProtos( TRUE,	MENUVERIFY_F_FLAG,		"MenuVerify" );
	lowWriteProtos( TRUE,	MENUHELP_F_FLAG,		"MenuHelp" );
	lowWriteProtos( TRUE,	RAWKEY_F_FLAG,			"RawKey" );
	lowWriteProtos( TRUE,	VANILLAKEY_F_FLAG,		"VanillaKey" );
	lowWriteProtos( TRUE,	REQSET_F_FLAG, 			"ReqSet" );
	lowWriteProtos( TRUE,	REQCLEAR_F_FLAG, 		"ReqClear" );
	lowWriteProtos( TRUE,	REQVERIFY_F_FLAG, 		"ReqVerify" );

	/* Flag2B */
	lowWriteProtos( FALSE,	NEWSIZE_F_FLAG, 		"NewSize" );
	lowWriteProtos( FALSE,	SIZEVERIFY_F_FLAG, 		"SizeVerify" );
	lowWriteProtos( FALSE,	ACTIVEWINDOW_F_FLAG, 	"ActiveWindow" );
	lowWriteProtos( FALSE,	INACTIVEWINDOW_F_FLAG, 	"InactiveWindow" );
	lowWriteProtos( FALSE,	CHANGEWINDOW_F_FLAG, 	"ChangeWindow" );
	lowWriteProtos( FALSE,	REFRESHWINDOW_F_FLAG, 	"RefreshWindow" );
	lowWriteProtos( FALSE,	DISKINSERTED_F_FLAG, 	"DiskInserted" );
	lowWriteProtos( FALSE,	DISKREMOVED_F_FLAG, 	"DiskRemoved" );
	lowWriteProtos( FALSE,	NEWPREFS_F_FLAG, 		"NewPrefs" );
	lowWriteProtos( FALSE,	INTUITICKS_F_FLAG, 		"IntuiTicks" );
	lowWriteProtos( FALSE,	IDCMPUPDATE_F_FLAG, 	"IDCMPUpdate" );
	lowWriteProtos( FALSE,	LONELYMESSAGE_F_FLAG,	"LonelyMessage" );
}


VOID
lowWriteProtos( BOOL fA, LONG flag, UBYTE *name )
{
	LONG our_flag = ( fA ) ? Flag2A : Flag2B;

	if ( our_flag & flag ) {
		if ( Variables_FLAG == LOCAL ) {
			WriteFillIn();
			Pad();
			PutStr( PREFIX_BUF );
			PutStr( name );
			VPrintf( "%s(", (LONG *)&SUFFIX_BUF );
			Pad();
			WriteFillIn();
			Pad();
			PutStr( ");\n" );
		}
		else {
			VPrintf( "VOID %s", (LONG *)&PREFIX_BUF );
			PutStr( name );
			VPrintf( "%s( VOID );\n", (LONG *)&SUFFIX_BUF );
		}
	}
}



VOID
WriteTopLevelF()
{
	if ( TopArgs_FLAG ) {
        if ( TopReturn_FLAG )
		    VPrintf( "\n\nLONG %s( struct Window *wnd )\n{", (LONG *)&TOP_LEVEL_BUF );
	    else
		    VPrintf( "\n\nVOID %s( struct Window *wnd )\n{", (LONG *)&TOP_LEVEL_BUF );
    }
	else {
        if ( TopReturn_FLAG )
		    VPrintf( "\n\nLONG %s()\n{", (LONG *)&TOP_LEVEL_BUF );
	    else
		    VPrintf( "\n\nVOID %s()\n{", (LONG *)&TOP_LEVEL_BUF );
    }

	PutStr( "\n    struct IntuiMessage *msg;\n" );

	if ( Variables_FLAG == LOCAL )
		WriteLocalDefs();

	PutStr( "\n" );

    if ( TestVarScope_FLAG == TestVar_LOCAL ) {
        	PutStr( "    BOOL   " );
            PutStr( TEST_VAR_BUF );
            PutStr( " = FALSE;\n\n" );
    }

	PutStr( "    while ( ! " );
    PutStr( TEST_VAR_BUF );
    PutStr( " ) {\n" );

	if ( WaitingMode_FLAG == PASSIVE ) {
		if ( TopArgs_FLAG )
			PutStr( "        WaitPort( wnd->UserPort );\n" );
		else
  			VPrintf( "        WaitPort( %s->UserPort );\n",
													(LONG *)&IDCMP_WIN_BUF );
	}
	else {
		PutStr( "\n        " );
		WriteFillIn();

		if ( Comments_FLAG == VERBOSE_COMMENTS ) {
			PutStr( "  /* do your thing while you're looping */\n\n" );
		}
		else {
			PutStr( "\n\n" );
		}
	}

	if ( Flag1 & gadtools_FLAG ) {
		if ( TopArgs_FLAG ) {
			PutStr( "        while ( msg = (struct IntuiMessage *)GT_GetIMsg( wnd->UserPort ) ) {\n" );
		}
		else {
  			VPrintf( "        while ( msg = (struct IntuiMessage *)GT_GetIMsg( %s->UserPort ) ) {\n",
					(LONG *)&IDCMP_WIN_BUF );
		}
	}
	else {
		if ( TopArgs_FLAG ) {
			PutStr( "        while ( msg = (struct IntuiMessage *)GetMsg( wnd->UserPort ) ) {\n" );
		}
		else {
  			VPrintf( "        while ( msg = (struct IntuiMessage *)GetMsg( %s->UserPort ) ) {\n",
					(LONG *)&IDCMP_WIN_BUF );
		}
	}

	PutStr( "\n" );

	/* assignements */
	if ( ( Flag1 & CLASS_FLAG ) | Flag2A | Flag2B ) {
		if ( Variables_FLAG == LOCAL )
			PutStr( "            class     =  msg->Class;\n" );
		else
			PutStr( "            Class     =  msg->Class;\n" );
	}

	if ( Flag1 & CODE_FLAG ) {
		if ( Variables_FLAG == LOCAL )
			PutStr( "            code      =  msg->Code;\n" );
		else
			PutStr( "            Code      =  msg->Code;\n" );
	}

	if ( Flag1 & QUALIFIER_FLAG ) {
		if ( Variables_FLAG == LOCAL )
			PutStr( "            qualifier =  msg->Qualifier;\n" );
		else
			PutStr( "            Qualifier =  msg->Qualifier;\n" );
	}

	if ( Flag1 & IADDRESS_FLAG ) {
		if ( Variables_FLAG == LOCAL )
			PutStr( "            iaddress  =  msg->IAddress;\n" );
		else
			PutStr( "            IAddress  =  msg->IAddress;\n" );
	}

	if ( Flag1 & MOUSEX_FLAG ) {
		if ( Variables_FLAG == LOCAL )
			PutStr( "            mouse_x   =  msg->MouseX;\n" );
		else
			PutStr( "            MouseX    =  msg->MouseX;\n" );
	}

	if ( Flag1 & MOUSEY_FLAG ) {
		if ( Variables_FLAG == LOCAL )
			PutStr( "            mouse_y   =  msg->MouseY;\n" );
		else
			PutStr( "            MouseY    =  msg->MouseY;\n" );
	}

	if ( Flag1 & SECONDS_FLAG ) {
		if ( Variables_FLAG == LOCAL )
			PutStr( "            seconds   =  msg->Seconds;\n" );
		else
			PutStr( "            Seconds   =  msg->Seconds;\n" );
	}

	if ( Flag1 & MICROS_FLAG ) {
		if ( Variables_FLAG == LOCAL )
			PutStr( "            micros    =  msg->Micros;\n" );
		else
			PutStr( "            Micros    =  msg->Micros;\n" );
	}

	PutStr( "\n" );

	/* we are replying the message... */
	if ( Flag1 & gadtools_FLAG )
		PutStr( "            GT_ReplyIMsg( msg );\n" );
	else
		PutStr( "            ReplyMsg( msg );\n" );

	/* switch */
	if ( Variables_FLAG == LOCAL ) {
		PutStr( "\n            switch ( class ) {\n" );
	}
	else {
		PutStr( "\n            switch ( Class ) {\n" );
	}

	if ( !Flag2A && !Flag2B )
		PutStr( "\n\n" );
	else
		WriteCases();

	PutStr( "                default:\n" );
	PutStr( "                    " );
	WriteFillIn();
	PutStr( "\n                    break;\n" );
	PutStr( "            }\n        }\n    }\n\n" );

    /* write stuff for replying outstanding messages */

	if ( Comments_FLAG == VERBOSE_COMMENTS )
		PutStr( "    /* reply all outstanding messages */\n" );

	if ( Flag1 & gadtools_FLAG ) {
		if ( TopArgs_FLAG ) {
			PutStr( "    while ( msg = (struct IntuiMessage *)GT_GetIMsg( wnd->UserPort ) )\n" );
		}
		else {
  			VPrintf( "    while ( msg = (struct IntuiMessage *)GT_GetIMsg( %s->UserPort ) )\n",
					(LONG *)&IDCMP_WIN_BUF );
		}
        PutStr( "        GT_ReplyIMsg( msg );\n" );
	}
	else {
		if ( TopArgs_FLAG ) {
			PutStr( "    while ( msg = (struct IntuiMessage *)GetMsg( wnd->UserPort ) )\n" );
		}
		else {
  			VPrintf( "    while ( msg = (struct IntuiMessage *)GetMsg( %s->UserPort ) )\n",
					(LONG *)&IDCMP_WIN_BUF );
		}
        PutStr( "        ReplyMsg( msg );\n" );
	}

    if ( TopReturn_FLAG ) {
        PutStr( "\n    return( " );
        WriteFillIn();
        PutStr( " );\n" );
    }

	PutStr( "}\n" );
}


VOID
WriteCases()
{
	/* Flag2A */
	lowWriteCases( TRUE,	MOUSEBUTTONS_FLAG,	MOUSEBUTTONS_F_FLAG,		"MouseButtons",      "IDCMP_MOUSEBUTTONS" );
	lowWriteCases( TRUE,	MOUSEMOVE_FLAG, 	MOUSEMOVE_F_FLAG,		 	"MouseMove",         "IDCMP_MOUSEMOVE" );
	lowWriteCases( TRUE,	GADGETDOWN_FLAG, 	GADGETDOWN_F_FLAG,			"GadgetDown",        "IDCMP_GADGETDOWN" );
	lowWriteCases( TRUE,	GADGETUP_FLAG,		GADGETUP_F_FLAG,			"GadgetUp",          "IDCMP_GADGETUP" );
	lowWriteCases( TRUE,	CLOSEWINDOW_FLAG,	CLOSEWINDOW_F_FLAG,			"CloseWindow",       "IDCMP_CLOSEWINDOW" );
	lowWriteCases( TRUE,	MENUPICK_FLAG,		MENUPICK_F_FLAG,			"MenuPick",          "IDCMP_MENUPICK" );
	lowWriteCases( TRUE,	MENUVERIFY_FLAG,	MENUVERIFY_F_FLAG,			"MenuVerify",        "IDCMP_MENUVERIFY" );
	lowWriteCases( TRUE,	MENUHELP_FLAG,		MENUHELP_F_FLAG,			"MenuHelp",          "IDCMP_MENUHELP" );
	lowWriteCases( TRUE,	RAWKEY_FLAG,		RAWKEY_F_FLAG,				"RawKey",            "IDCMP_RAWKEY" );
	lowWriteCases( TRUE,	VANILLAKEY_FLAG,	VANILLAKEY_F_FLAG,			"VanillaKey",        "IDCMP_VANILLAKEY" );
	lowWriteCases( TRUE,	REQSET_FLAG,		REQSET_F_FLAG,				"ReqSet",            "IDCMP_REQSET" );
	lowWriteCases( TRUE,	REQCLEAR_FLAG, 		REQCLEAR_F_FLAG,			"ReqClear",          "IDCMP_REQCLEAR" );
	lowWriteCases( TRUE,	REQVERIFY_FLAG, 	REQVERIFY_F_FLAG,			"ReqVerify",         "IDCMP_REQVERIFY" );

	/* Flag2B */
	lowWriteCases( FALSE,	NEWSIZE_FLAG,		NEWSIZE_F_FLAG,				"NewSize",           "IDCMP_NEWSIZE" );
	lowWriteCases( FALSE,	SIZEVERIFY_FLAG, 	SIZEVERIFY_F_FLAG,		   	"SizeVerify",        "IDCMP_SIZEVERIFY" );
	lowWriteCases( FALSE,	ACTIVEWINDOW_FLAG, 	ACTIVEWINDOW_F_FLAG,		"ActiveWindow",      "IDCMP_ACTIVEWINDOW" );
	lowWriteCases( FALSE,	INACTIVEWINDOW_FLAG,	INACTIVEWINDOW_F_FLAG,	"InactiveWindow",    "IDCMP_INACTIVEWINDOW" );
	lowWriteCases( FALSE,	CHANGEWINDOW_FLAG, 	CHANGEWINDOW_F_FLAG,		"ChangeWindow",      "IDCMP_CHANGEWINDOW" );

	/* we refresh window automatically if gadtools are used! */
	if ( Flag1 & gadtools_FLAG || Flag2B & REFRESHWINDOW_FLAG || Flag2B & REFRESHWINDOW_F_FLAG )
		WriteRefreshTopL();

	lowWriteCases( FALSE,	DISKINSERTED_FLAG, 	DISKINSERTED_F_FLAG,		"DiskInserted",      "IDCMP_DISKINSERTED" );
	lowWriteCases( FALSE,	DISKREMOVED_FLAG, 	DISKREMOVED_F_FLAG,			"DiskRemoved",       "IDCMP_DISKREMOVED" );
	lowWriteCases( FALSE,	NEWPREFS_FLAG, 		NEWPREFS_F_FLAG,			"NewPrefs",          "IDCMP_NEWPREFS" );
	lowWriteCases( FALSE,	INTUITICKS_FLAG, 	INTUITICKS_F_FLAG,		   	"IntuiTicks",        "IDCMP_INTUITICKS" );
	lowWriteCases( FALSE,	IDCMPUPDATE_FLAG, 	IDCMPUPDATE_F_FLAG,			"IDCMPUpdate",       "IDCMP_IDCMPUPDATE" );
	lowWriteCases( FALSE,	LONELYMESSAGE_FLAG,	LONELYMESSAGE_F_FLAG,	   	"LonelyMessage",     "IDCMP_LONELYMESSAGE" );
}


VOID
lowWriteCases( 	BOOL fA, LONG flag, LONG f_flag,
				UBYTE *low_name, UBYTE *up_name )
{
	LONG our_flag = ( fA ) ? Flag2A : Flag2B;

	if ( our_flag & flag || our_flag & f_flag ) {
	  PutStr( "                case " );
	  PutStr( up_name );
	  PutStr( ":\n" );
		if ( our_flag & f_flag ) {
  			PutStr( "                    " );
			PutStr( (UBYTE *)PREFIX_BUF );
			PutStr( low_name );
			VPrintf( "%s(", (LONG *)&SUFFIX_BUF );
			Pad();
			if ( Variables_FLAG == LOCAL )
				WriteFillIn();
			Pad();
			PutStr( ");\n" );
		}
		else {
			PutStr( "                    " );
			WriteFillIn();
			PutStr( "\n" );
		}
		PutStr( "                    break;\n" );
	}
}


VOID
WriteRefreshTopL()
{
	PutStr( "                case " );
	PutStr( "IDCMP_REFRESHWINDOW" );
	PutStr( ":\n" );
	if ( Flag2B & REFRESHWINDOW_F_FLAG ) {
 		PutStr( "                    " );
		PutStr( (UBYTE *)PREFIX_BUF );
		PutStr( "RefreshWindow" );
		VPrintf( "%s(", (LONG *)&SUFFIX_BUF );
		Pad();
		if ( Variables_FLAG == LOCAL )
			WriteFillIn();
		Pad();
		PutStr( ");\n" );
	}
	else {
		PutStr( "                    " );
			lowWriteRefreshTopL();
			PutStr( "\n" );
	}
	PutStr( "                    break;\n" );
}


VOID
lowWriteRefreshTopL()
{
	if ( Flag1 & gadtools_FLAG ) {

		/* O.K. -- the guy explicitly asked for refreshing... */
		if (Flag2B & REFRESHWINDOW_FLAG || Flag2B & REFRESHWINDOW_F_FLAG ) {
			if ( TopArgs_FLAG ) {
				PutStr( "GT_BeginRefresh( wnd );\n\n" );
				if ( Comments_FLAG == VERBOSE_COMMENTS )
					PutStr( "                    /* own rendering (if needed) here */\n\n" );
				PutStr( "                    GT_EndRefresh( wnd, TRUE );" );
			}
			else {
				VPrintf( "GT_BeginRefresh( %s );\n\n", (LONG *)&IDCMP_WIN_BUF );
				if ( Comments_FLAG == VERBOSE_COMMENTS ) {
					PutStr( "                    /* own rendering (if needed) here */\n\n" );
				}
				VPrintf( "                    GT_EndRefresh( %s, TRUE );", (LONG *)&IDCMP_WIN_BUF );
			}
		}

		/* he gets refreshing AGINST his will! */
		else {
			if ( TopArgs_FLAG ) {
				PutStr( "GT_BeginRefresh( wnd );" );
				if ( Comments_FLAG != NO_COMMENTS )
					PutStr( "    /* NECESSARY with gadtools! */" );
		  		PutStr( "\n                    GT_EndRefresh( wnd, TRUE );" );
			}
			else {
				VPrintf( "GT_BeginRefresh( %s );", (LONG *)&IDCMP_WIN_BUF );
				if ( Comments_FLAG != NO_COMMENTS )
					PutStr( "    /* NECESSARY with gadtools! */" );
				VPrintf( "\n                    GT_EndRefresh( %s, TRUE );", (LONG *)&IDCMP_WIN_BUF );
			}
		}
	}

	/* he says NO GADTOOLS required -- if so -- no AI needed either */
	else {
		if ( TopArgs_FLAG ) {
			PutStr( "BeginRefresh( wnd );\n\n" );
			if ( Comments_FLAG == VERBOSE_COMMENTS ) {
				PutStr( "                    /* own rendering (if needed) here */\n\n" );
			}
			PutStr( "                    EndRefresh( wnd, TRUE );" );
		}
		else {
			VPrintf( "BeginRefresh( %s );\n\n", (LONG *)&IDCMP_WIN_BUF );
			if ( Comments_FLAG == VERBOSE_COMMENTS ) {
				PutStr( "                    /* own rendering (if needed) here */\n\n" );
			}
			VPrintf( "                    EndRefresh( %s, TRUE );", (LONG *)&IDCMP_WIN_BUF );
		}
	}
}


VOID
WriteFSkeletons()
{
	PutStr( "\n\n" );

	/* still lots of raw force; perhaps should use arrays,
	** but in fact this ain't bad...
	*/

	/* Flag2A */
	lowWriteFSkeletons( TRUE,	MOUSEBUTTONS_F_FLAG,	"MouseButtons" );
	lowWriteFSkeletons( TRUE,	MOUSEMOVE_F_FLAG,		"MouseMove" );
	lowWriteFSkeletons( TRUE,	GADGETDOWN_F_FLAG,		"GadgetDown" );
	lowWriteFSkeletons( TRUE,	GADGETUP_F_FLAG,		"GadgetUp" );
	lowWriteFSkeletons( TRUE,	CLOSEWINDOW_F_FLAG,		"CloseWindow" );
	lowWriteFSkeletons( TRUE,	MENUPICK_F_FLAG,		"MenuPick" );
	lowWriteFSkeletons( TRUE,	MENUVERIFY_F_FLAG,		"MenuVerify" );
	lowWriteFSkeletons( TRUE,	MENUHELP_F_FLAG,		"MenuHelp" );
	lowWriteFSkeletons( TRUE,	RAWKEY_F_FLAG,			"RawKey" );
	lowWriteFSkeletons( TRUE,	VANILLAKEY_F_FLAG,		"VanillaKey" );
	lowWriteFSkeletons( TRUE,	REQSET_F_FLAG, 			"ReqSet" );
	lowWriteFSkeletons( TRUE,	REQCLEAR_F_FLAG, 		"ReqClear" );
	lowWriteFSkeletons( TRUE,	REQVERIFY_F_FLAG, 		"ReqVerify" );

	/* Flag2B */
	lowWriteFSkeletons( FALSE,	NEWSIZE_F_FLAG, 		"NewSize" );
	lowWriteFSkeletons( FALSE,	SIZEVERIFY_F_FLAG, 		"SizeVerify" );
	lowWriteFSkeletons( FALSE,	ACTIVEWINDOW_F_FLAG, 	"ActiveWindow" );
	lowWriteFSkeletons( FALSE,	INACTIVEWINDOW_F_FLAG, 	"InactiveWindow" );
	lowWriteFSkeletons( FALSE,	CHANGEWINDOW_F_FLAG, 	"ChangeWindow" );

	if ( Flag2B & REFRESHWINDOW_F_FLAG )
		WriteRefreshSkel();

	lowWriteFSkeletons( FALSE,	DISKINSERTED_F_FLAG, 	"DiskInserted" );
	lowWriteFSkeletons( FALSE,	DISKREMOVED_F_FLAG, 	"DiskRemoved" );
	lowWriteFSkeletons( FALSE,	NEWPREFS_F_FLAG, 		"NewPrefs" );
	lowWriteFSkeletons( FALSE,	INTUITICKS_F_FLAG, 		"IntuiTicks" );
	lowWriteFSkeletons( FALSE,	IDCMPUPDATE_F_FLAG, 	"IDCMPUpdate" );
	lowWriteFSkeletons( FALSE,	LONELYMESSAGE_F_FLAG,	"LonelyMessage" );
}



VOID
lowWriteFSkeletons( BOOL fA, LONG flag, UBYTE *name )
{
	LONG our_flag = ( fA ) ? Flag2A : Flag2B;

	if ( our_flag & flag ) {
		if ( Variables_FLAG == LOCAL ) {
			WriteFillIn();
			Pad();
			PutStr( (UBYTE *)PREFIX_BUF );
			PutStr( name );
			VPrintf( "%s(", (LONG *)&SUFFIX_BUF );
			Pad();
			WriteFillIn();
			Pad();
			PutStr( ")\n{\n    " );
			WriteFillIn();
			PutStr( "\n}\n\n" );
		}
		else {
			PutStr( "\nVOID " );
			PutStr( (UBYTE *)PREFIX_BUF );
			PutStr( name );
			VPrintf( "%s() \n{\n    ", (LONG *)&SUFFIX_BUF );
			WriteFillIn();
			PutStr( "\n}\n\n" );
		}
	}
}


VOID
WriteRefreshSkel()
{
	if ( Variables_FLAG == LOCAL ) {
		WriteFillIn();
		Pad();
		PutStr( (UBYTE *)PREFIX_BUF );
		PutStr( "RefreshWindow" );
		if ( TopArgs_FLAG ) {
			VPrintf( "%s( struct Window *wnd )\n{n    ", (LONG *)&SUFFIX_BUF );
			lowWriteRefreshSkel();
		}
		else {
			VPrintf( "%s(", (LONG *)&SUFFIX_BUF );
			Pad();
			WriteFillIn();
			Pad();
			PutStr( ")\n{\n    " );
			lowWriteRefreshSkel();
		}
	}
	else {
		PutStr( "\nVOID " );
		PutStr( "RefreshWindow" );
		if ( TopArgs_FLAG ) {
			VPrintf( "%s( struct Window *wnd )\n{\n    ", (LONG *)&SUFFIX_BUF );
			lowWriteRefreshSkel();
		}
		else {
			VPrintf( "%s() \n{\n    ", (LONG *)&SUFFIX_BUF );
			lowWriteRefreshSkel();
		}
	}
}


VOID
lowWriteRefreshSkel()
{
	if ( Flag1 & gadtools_FLAG ) {
		if ( TopArgs_FLAG ) {
			PutStr( "GT_BeginRefresh( wnd );\n\n");
			if ( Comments_FLAG == VERBOSE_COMMENTS ) {
				PutStr( "    /* own rendering (if needed) here */\n\n" );
			}
			PutStr( "    GT_EndRefresh( wnd, TRUE );");
		}
		else {
			VPrintf( "GT_BeginRefresh( %s );\n\n", (LONG *)&IDCMP_WIN_BUF );
			if ( Comments_FLAG == VERBOSE_COMMENTS ) {
				PutStr( "    /* own rendering (if needed) here */\n\n" );
			}
			VPrintf( "    GT_EndRefresh( %s, TRUE );", (LONG *)&IDCMP_WIN_BUF );
		}
	}
	else {
		if ( TopArgs_FLAG ) {
			PutStr( "BeginRefresh( wnd );\n\n");
			if ( Comments_FLAG == VERBOSE_COMMENTS ) {
				PutStr( "    /* own rendering (if needed) here */\n\n" );
			}
			PutStr( "    EndRefresh( wnd, TRUE );");
		}
		else {
			VPrintf( "BeginRefresh( %s );\n\n", (LONG *)&IDCMP_WIN_BUF );
			if ( Comments_FLAG == VERBOSE_COMMENTS ) {
				PutStr( "    /* own rendering (if needed) here */\n\n" );
			}
			VPrintf( "    EndRefresh( %s, TRUE );", (LONG *)&IDCMP_WIN_BUF );
		}
	}

	PutStr( "\n}\n\n" );
}


VOID
WriteFillIn()
{
	switch ( FillIns_FLAG ) {
		case 0:
			return;
		case 1:
			PutStr( "@@@@@@@@@@" );
			break;
		case 2:
			PutStr( "/* @@ */" );
			break;
		case 3:
			PutStr( "@@" );
			break;
	}
}


VOID
Pad()
{
	if ( FillIns_FLAG != FILLS_NONE && Variables_FLAG == LOCAL )
		PutStr( " " );
}

