home *** CD-ROM | disk | FTP | other *** search
/ Club Amiga de Montreal - CAM / CAM_CD_1.iso / files / 640b.lha / Skew / Source / skew2.c < prev    next >
C/C++ Source or Header  |  1992-05-16  |  17KB  |  512 lines

  1.  
  2. /*
  3.  *              skew2.c  --  SKEleton Writer, part 2
  4.  */
  5.  
  6.  
  7. #include <exec/types.h>
  8. #include <intuition/intuition.h>
  9. #include <intuition/gadgetclass.h>
  10. #include <libraries/gadtools.h>
  11. #include <libraries/asl.h>
  12. #include <graphics/displayinfo.h>
  13. #include <clib/exec_protos.h>
  14. #include <clib/intuition_protos.h>
  15. #include <clib/gadtools_protos.h>
  16. #include <clib/asl_protos.h>
  17. #include <stdio.h>
  18.  
  19. #include "skew.h"
  20.  
  21. BOOL Really_Quit = FALSE;   /* TRUE when positive answer to ReallyQuit? */
  22. BOOL Writing_Done = FALSE;  /* TRUE when work was saved and no gadget hit */
  23.  
  24. extern int Display_num;
  25.  
  26. extern struct Window  *Wnd;
  27. extern struct TagItem gc_CTags[];
  28.  
  29. /* flags for cycle gadgets on display #3 */
  30. int WaitingMode_FLAG, Variables_FLAG, Comments_FLAG, FillIns_FLAG;
  31. int WaitingMode_START, Variables_START, Comments_START, FillIns_START;
  32.  
  33.  
  34. /* stuff for IDCMPWindow name */
  35. extern char *IDCMP_WIN_BUF;
  36. extern char IDCMP_WIN_NAME[ 40 ];
  37.  
  38. /* stuff for top-level function name */
  39. extern char *TOP_LEVEL_BUF;
  40. extern char TOP_LEVEL_NAME[ 40 ];
  41.  
  42. /* prefix & suffix for the names of generated functions */
  43. extern char *PREFIX_BUF, *SUFFIX_BUF;
  44. extern char PREFIX_NAME[ 20 ];
  45. extern char SUFFIX_NAME[ 20 ];
  46.  
  47. struct Gadget *GList = 0L;
  48. struct Gadget *Gadgets[ 55 ];
  49.  
  50. /* flags related to gadgets & output file */
  51. long Flag1  = 1L;                       /* 'Class' is preset */
  52. long Flag2A, Flag2B, Flag3;
  53.  
  54. char OutFileName[ 80 ];
  55.  
  56. struct FileRequester            *gc_GenC = 0l;
  57.  
  58. UBYTE                            gc_CPatt[32]  = "#?.c";
  59. UBYTE                            gc_CFile[32]  = "skew_file.c";
  60. UBYTE                            gc_CPath[256];
  61.  
  62. UWORD                            gc_TagOffset, gc_GadOffset, gc_ScreenOffset;
  63.  
  64. struct TagItem                   gc_CTags[] = {
  65.     ASL_Hail,                   "Save C Source As...",
  66.     ASL_Window,                 0l,
  67.     ASL_File,                   gc_CFile,
  68.     ASL_Dir,                    gc_CPath,
  69.     ASL_Pattern,                gc_CPatt,
  70.     ASL_OKText,                 "Save",
  71.     ASL_FuncFlags,              FILF_SAVE | FILF_PATGAD,
  72.     TAG_DONE };
  73.  
  74.  
  75. /*  function prototypes  */
  76. void HandleIDCMP( void );
  77. static void HandleGadgets( USHORT, APTR );
  78. static void HandleQuitGad( void );
  79. static BOOL AskYesNo(  char *, char *, char * );
  80. static int  GetOutFileName( void );
  81. extern int  GenerateCode( *FILE );
  82. extern long MakeDisplay( int );
  83.  
  84. void HandleIDCMP( void )
  85. {
  86.     struct IntuiMessage  *msg;
  87.     ULONG   class;
  88.     USHORT  code;
  89.     APTR    iaddress;
  90.  
  91.     while ( Really_Quit == FALSE ) {
  92.         WaitPort( Wnd->UserPort );
  93.  
  94.         while ( msg = GT_GetIMsg( Wnd->UserPort )) {
  95.  
  96.         class    = msg->Class;
  97.         code     = msg->Code;
  98.         iaddress = msg->IAddress;
  99.  
  100.         GT_ReplyIMsg( msg );
  101.  
  102.         switch ( class ) {
  103.             case IDCMP_REFRESHWINDOW:
  104.                 GT_BeginRefresh( Wnd );
  105.                 GT_EndRefresh( Wnd, TRUE );
  106.                 break;
  107.             case IDCMP_GADGETUP:
  108.                 HandleGadgets( code, iaddress );
  109.                 break;
  110.             case IDCMP_MENUPICK:
  111.                                             /* just swallow */
  112.                 break;
  113.             }
  114.         }
  115.     }
  116. }
  117.  
  118.  
  119. void HandleGadgets( USHORT code, APTR gad_address )
  120. {
  121.     switch ( Display_num ) {
  122.  
  123.         /* window #0 */
  124.         case 0 :
  125.             if ( gad_address == Gadgets[ GD_IDCMPWindow ] ) {
  126.                 strcpy( IDCMP_WIN_NAME,
  127.   ((struct StringInfo *) Gadgets[ GD_IDCMPWindow ]->SpecialInfo)->Buffer );
  128.  
  129.             }
  130.  
  131.             else if( gad_address == Gadgets[ GD_Class ] ) {
  132.                 Flag1 ^= CLASS_FLAG;
  133.             }
  134.             else if( gad_address == Gadgets[ GD_Code ] ) {
  135.                 Flag1 ^= CODE_FLAG;
  136.             }
  137.             else if( gad_address == Gadgets[ GD_Qualifier ] ) {
  138.                 Flag1 ^= QUALIFIER_FLAG;
  139.             }
  140.             else if( gad_address == Gadgets[ GD_MouseX ] ) {
  141.                 Flag1 ^= MOUSEX_FLAG;
  142.             }
  143.             else if( gad_address == Gadgets[ GD_MouseY ] ) {
  144.                 Flag1 ^= MOUSEY_FLAG;
  145.             }
  146.             else if( gad_address == Gadgets[ GD_Seconds ] ) {
  147.                 Flag1 ^= SECONDS_FLAG;
  148.             }
  149.             else if( gad_address == Gadgets[ GD_Micros ] ) {
  150.                 Flag1 ^= MICROS_FLAG;
  151.             }
  152.             else if( gad_address == Gadgets[ GD_IAddress ] ) {
  153.                 Flag1 ^= IADDRESS_FLAG;
  154.             }
  155.             else if( gad_address == Gadgets[ GD_QUIT1 ] ) {
  156.                 HandleQuitGad( );
  157.             }
  158.             else {          /* gad_address == Gadgets[ GD_GO_ON1 ] ) */
  159.                 RemoveGList( Wnd, GList, -1 );
  160.                 ZipWindow( Wnd );
  161.                 ZipWindow( Wnd );
  162.                 MakeDisplay( ++Display_num );
  163.             }
  164.         break;
  165.  
  166.         /* window #1 */
  167.         case 1 :
  168.             if ( gad_address == Gadgets[ GD_MOUSEBUTTONS ]  ) {
  169.                 Flag2A ^= MOUSEBUTTONS_FLAG;
  170.             }
  171.             else if ( gad_address == Gadgets[ GD_MOUSEBUTTONS_F ] ) {
  172.                 Flag2A ^= MOUSEBUTTONS_F_FLAG;
  173.             }
  174.             else if ( gad_address == Gadgets[ GD_MOUSEMOVE ] ) {
  175.                 Flag2A ^= MOUSEMOVE_FLAG;
  176.             }
  177.             else if ( gad_address == Gadgets[ GD_MOUSEMOVE_F ] ) {
  178.                 Flag2A ^= MOUSEMOVE_F_FLAG;
  179.             }
  180.             else if ( gad_address == Gadgets[ GD_DELTAMOVE ] ) {
  181.                 Flag2A ^= DELTAMOVE_FLAG;
  182.             }
  183.             else if ( gad_address == Gadgets[ GD_DELTAMOVE_F ] ) {
  184.                 Flag2A ^= DELTAMOVE_F_FLAG;
  185.             }
  186.             else if ( gad_address == Gadgets[ GD_GADGETDOWN ] ) {
  187.                 Flag2A ^= GADGETDOWN_FLAG;
  188.             }
  189.             else if ( gad_address == Gadgets[ GD_GADGETDOWN_F ] ) {
  190.                 Flag2A ^= GADGETDOWN_F_FLAG;
  191.             }
  192.             else if ( gad_address == Gadgets[ GD_GADGETUP ] ) {
  193.                 Flag2A ^= GADGETUP_FLAG;
  194.             }
  195.             else if ( gad_address == Gadgets[ GD_GADGETUP_F ] ) {
  196.                 Flag2A ^= GADGETUP_F_FLAG;
  197.             }
  198.             else if ( gad_address == Gadgets[ GD_CLOSEWINDOW ] ) {
  199.                 Flag2A ^= CLOSEWINDOW_FLAG;
  200.             }
  201.             else if ( gad_address == Gadgets[ GD_CLOSEWINDOW_F ] ) {
  202.                 Flag2A ^= CLOSEWINDOW_F_FLAG;
  203.             }
  204.             else if ( gad_address == Gadgets[ GD_MENUPICK ] ) {
  205.                 Flag2A ^= MENUPICK_FLAG;
  206.             }
  207.             else if ( gad_address == Gadgets[ GD_MENUPICK_F ] ) {
  208.                 Flag2A ^= MENUPICK_F_FLAG;
  209.             }
  210.             else if ( gad_address == Gadgets[ GD_MENUVERIFY ] ) {
  211.                 Flag2A ^= MENUVERIFY_FLAG;
  212.             }
  213.             else if ( gad_address == Gadgets[ GD_MENUVERIFY_F ] ) {
  214.                 Flag2A ^= MENUVERIFY_F_FLAG;
  215.             }
  216.             else if ( gad_address == Gadgets[ GD_MENUHELP ] ) {
  217.                 Flag2A ^= MENUHELP_FLAG;
  218.             }
  219.             else if ( gad_address == Gadgets[ GD_MENUHELP_F ] ) {
  220.                 Flag2A ^= MENUHELP_F_FLAG;
  221.             }
  222.             else if ( gad_address == Gadgets[ GD_RAWKEY ] ) {
  223.                 Flag2A ^= RAWKEY_FLAG;
  224.             }
  225.             else if ( gad_address == Gadgets[ GD_RAWKEY_F ] ) {
  226.                 Flag2A ^= RAWKEY_F_FLAG;
  227.             }
  228.             else if ( gad_address == Gadgets[ GD_VANILLAKEY ] ) {
  229.                 Flag2A ^= VANILLAKEY_FLAG;
  230.             }
  231.             else if ( gad_address == Gadgets[ GD_VANILLAKEY_F ] ) {
  232.                 Flag2A ^= VANILLAKEY_F_FLAG;
  233.             }
  234.             else if ( gad_address == Gadgets[ GD_REQSET ] ) {
  235.                 Flag2A ^= REQSET_FLAG;
  236.             }
  237.             else if ( gad_address == Gadgets[ GD_REQSET_F ] ) {
  238.                 Flag2A ^= REQSET_F_FLAG;
  239.             }
  240.             else if ( gad_address == Gadgets[ GD_REQCLEAR ] ) {
  241.                 Flag2A ^= REQCLEAR_FLAG;
  242.             }
  243.             else if ( gad_address == Gadgets[ GD_REQCLEAR_F ] ) {
  244.                 Flag2A ^= REQCLEAR_F_FLAG;
  245.             }
  246.             else if ( gad_address == Gadgets[ GD_REQVERIFY ] ) {
  247.                 Flag2A ^= REQVERIFY_FLAG;
  248.             }
  249.             else if ( gad_address == Gadgets[ GD_REQVERIFY_F ] ) {
  250.                 Flag2A ^= REQVERIFY_F_FLAG;
  251.             }
  252.             else if ( gad_address == Gadgets[ GD_NEWSIZE ] ) {
  253.                 Flag2B ^= NEWSIZE_FLAG;
  254.             }
  255.             else if ( gad_address == Gadgets[ GD_NEWSIZE_F ] ) {
  256.                 Flag2B ^= NEWSIZE_F_FLAG;
  257.             }
  258.             else if ( gad_address == Gadgets[ GD_SIZEVERIFY ] ) {
  259.                 Flag2B ^= SIZEVERIFY_FLAG;
  260.             }
  261.             else if ( gad_address == Gadgets[ GD_SIZEVERIFY_F ] ) {
  262.                 Flag2B ^= SIZEVERIFY_F_FLAG;
  263.             }
  264.             else if ( gad_address == Gadgets[ GD_ACTIVEWINDOW ] ) {
  265.                 Flag2B ^= ACTIVEWINDOW_FLAG;
  266.             }
  267.             else if ( gad_address == Gadgets[ GD_ACTIVEWINDOW_F ] ) {
  268.                 Flag2B ^= ACTIVEWINDOW_F_FLAG;
  269.             }
  270.             else if ( gad_address == Gadgets[ GD_INACTIVEWINDOW ] ) {
  271.                 Flag2B ^= INACTIVEWINDOW_FLAG;
  272.             }
  273.             else if ( gad_address == Gadgets[ GD_INACTIVEWINDOW_F ] ) {
  274.                 Flag2B ^= INACTIVEWINDOW_F_FLAG;
  275.             }
  276.             else if ( gad_address == Gadgets[ GD_CHANGEWINDOW ] ) {
  277.                 Flag2B ^= CHANGEWINDOW_FLAG;
  278.             }
  279.             else if ( gad_address == Gadgets[ GD_CHANGEWINDOW_F ] ) {
  280.                 Flag2B ^= CHANGEWINDOW_F_FLAG;
  281.             }
  282.             else if ( gad_address == Gadgets[ GD_REFRESHWINDOW ] ) {
  283.                 Flag2B ^= REFRESHWINDOW_FLAG;
  284.             }
  285.             else if ( gad_address == Gadgets[ GD_REFRESHWINDOW_F ] ) {
  286.                 Flag2B ^= REFRESHWINDOW_F_FLAG;
  287.             }
  288.             else if ( gad_address == Gadgets[ GD_DISKINSERTED ] ) {
  289.                 Flag2B ^= DISKINSERTED_FLAG;
  290.             }
  291.             else if ( gad_address == Gadgets[ GD_DISKINSERTED_F ] ) {
  292.                 Flag2B ^= DISKINSERTED_F_FLAG;
  293.             }
  294.             else if ( gad_address == Gadgets[ GD_DISKREMOVED ] ) {
  295.                 Flag2B ^= DISKREMOVED_FLAG;
  296.             }
  297.             else if ( gad_address == Gadgets[ GD_DISKREMOVED_F ] ) {
  298.                 Flag2B ^= DISKREMOVED_F_FLAG;
  299.             }
  300.             else if ( gad_address == Gadgets[ GD_NEWPREFS ] ) {
  301.                 Flag2B ^= NEWPREFS_FLAG;
  302.             }
  303.             else if ( gad_address == Gadgets[ GD_NEWPREFS_F ] ) {
  304.                 Flag2B ^= NEWPREFS_F_FLAG;
  305.             }
  306.             else if ( gad_address == Gadgets[ GD_INTUITICKS ] ) {
  307.                 Flag2B ^= INTUITICKS_FLAG;
  308.             }
  309.             else if ( gad_address == Gadgets[ GD_INTUITICKS_F ] ) {
  310.                 Flag2B ^= INTUITICKS_F_FLAG;
  311.             }
  312.             else if ( gad_address == Gadgets[ GD_IDCMPUPDATE ] ) {
  313.                 Flag2B ^= IDCMPUPDATE_FLAG;
  314.             }
  315.             else if ( gad_address == Gadgets[ GD_IDCMPUPDATE_F ] ) {
  316.                 Flag2B ^= IDCMPUPDATE_F_FLAG;
  317.             }
  318.             else if ( gad_address == Gadgets[ GD_LONELYMESSAGE ] ) {
  319.                 Flag2B ^= LONELYMESSAGE_FLAG;
  320.             }
  321.             else if ( gad_address == Gadgets[ GD_LONELYMESSAGE_F ] ) {
  322.                 Flag2B ^= LONELYMESSAGE_F_FLAG;
  323.             }
  324.             else if ( gad_address == Gadgets[ GD_QUIT2 ] ) {
  325.                 HandleQuitGad( );
  326.             }
  327.             else if ( gad_address == Gadgets[ GD_GO_ON2 ] ) {
  328.                 RemoveGList( Wnd, GList, -1 );
  329.                 ZipWindow( Wnd );
  330.                 ZipWindow( Wnd );
  331.                 MakeDisplay( ++Display_num );
  332.             }
  333.             else {      /* gad_address == Gadgets[ GD_STEP_BACK2 ] ) */
  334.                 RemoveGList( Wnd, GList, -1 );
  335.                 ZipWindow( Wnd );
  336.                 ZipWindow( Wnd );
  337.                 MakeDisplay( --Display_num );
  338.             }
  339.         break;
  340.  
  341.         /* window #2 */
  342.         case 2 :
  343.             if ( gad_address == Gadgets[ GD_TopLevelName ] ) {
  344.                 Writing_Done = FALSE;
  345.                 strcpy( TOP_LEVEL_NAME,
  346.   ((struct StringInfo *) Gadgets[ GD_TopLevelName ]->SpecialInfo)->Buffer );
  347.             }
  348.             else if ( gad_address == Gadgets[ GD_Prefix ] ) {
  349.                 Writing_Done = FALSE;
  350.                 strcpy( PREFIX_NAME,
  351.   ((struct StringInfo *) Gadgets[ GD_Prefix ]->SpecialInfo)->Buffer );
  352.             }
  353.             else if ( gad_address == Gadgets[ GD_Suffix ] ) {
  354.                 Writing_Done = FALSE;
  355.                 strcpy( SUFFIX_NAME,
  356.   ((struct StringInfo *) Gadgets[ GD_Suffix ]->SpecialInfo)->Buffer );
  357.             }
  358.             else if ( gad_address == Gadgets[ GD_Skeletons ] ) {
  359.                 Writing_Done = FALSE;
  360.                 Flag3 ^= Skeletons_FLAG;
  361.             }
  362.             else if ( gad_address == Gadgets[ GD_Prototypes ] ) {
  363.                 Writing_Done = FALSE;
  364.                 Flag3 ^= Prototypes_FLAG;
  365.             }
  366.             else if ( gad_address == Gadgets[ GD_gadtools ] ) {
  367.                 Writing_Done = FALSE;
  368.                 Flag3 ^= gadtools_FLAG;
  369.             }
  370.             else if ( gad_address == Gadgets[ GD_WaitingMode ] ) {
  371.                 Writing_Done = FALSE;
  372.                 WaitingMode_FLAG = (WaitingMode_START + code) % 2;
  373.             }
  374.             else if ( gad_address == Gadgets[ GD_Variables ] ) {
  375.                 Writing_Done = FALSE;
  376.                 Variables_FLAG = (Variables_START + code) % 2;
  377.             }
  378.             else if ( gad_address == Gadgets[ GD_Comments ] ) {
  379.                 Writing_Done = FALSE;
  380.                 Comments_FLAG = (Comments_START + code) % 3;
  381.             }
  382.             else if ( gad_address == Gadgets[ GD_FillIns ] ) {
  383.                 Writing_Done = FALSE;
  384.                 FillIns_FLAG = (FillIns_START + code) % 4;
  385.             }
  386.             else if ( gad_address == Gadgets[ GD_QUIT3 ] ) {
  387.                 if ( NOT Writing_Done ) {
  388.                     HandleQuitGad( );
  389.                 }
  390.                 else {
  391.                     Really_Quit = TRUE;
  392.                 }
  393.             }
  394.             else if( gad_address == Gadgets[ GD_WRITE_C ] ) {
  395.                 Writing_Done = FALSE;
  396.                 GetOutFileName();
  397.             }
  398.             else {      /* gad_address == Gadgets[ GD_STEP_BACK3 ] ) */
  399.                 Writing_Done = FALSE;
  400.                 RemoveGList( Wnd, GList, -1 );
  401.                 ZipWindow( Wnd );
  402.                 ZipWindow( Wnd );
  403.                 MakeDisplay( --Display_num );
  404.             }
  405.         break;
  406.     }
  407. }
  408.  
  409.  
  410. void HandleQuitGad( void )
  411. {
  412.     Really_Quit = AskYesNo( "Do you really want to quit?", " YES ", " NO " );
  413. }
  414.  
  415.  
  416. BOOL AskYesNo( char *hail_text, char *pos_text, char *neg_text )
  417. {
  418.     struct IntuiText prompt, yprompt, nprompt;
  419.     BOOL return_val = FALSE;
  420.  
  421.     prompt.FrontPen     = 0;
  422.     prompt.BackPen      = 1;
  423.     prompt.DrawMode     = JAM1;
  424.     prompt.LeftEdge     = 25;
  425.     prompt.TopEdge      = 15;
  426.     prompt.ITextFont    = NULL;
  427.     prompt.IText        = hail_text;
  428.     prompt.NextText     = NULL;
  429.  
  430.     yprompt.FrontPen     = 0;
  431.     yprompt.BackPen      = 1;
  432.     yprompt.DrawMode     = JAM1;
  433.     yprompt.LeftEdge     = 15;
  434.     yprompt.TopEdge      = 3;
  435.     yprompt.ITextFont    = NULL;
  436.     yprompt.IText        = pos_text;
  437.     yprompt.NextText     = NULL;
  438.  
  439.     nprompt.FrontPen     = 0;
  440.     nprompt.BackPen      = 1;
  441.     nprompt.DrawMode     = JAM1;
  442.     nprompt.LeftEdge     = 15;
  443.     nprompt.TopEdge      = 3;
  444.     nprompt.ITextFont    = NULL;
  445.     nprompt.IText        = neg_text;
  446.     nprompt.NextText     = NULL;
  447.  
  448.     return_val = AutoRequest( Wnd, &prompt, &yprompt,
  449.                        &nprompt, NULL, NULL, 120, 100 );
  450. }
  451.  
  452.  
  453.  
  454. /* so far we do nothing with the returned value, but we have negative
  455. integers for errors and positive for user cancelling; 0 means O.K! DONE */
  456.  
  457. int GetOutFileName( void )
  458. {
  459.     char tmp_str[ 290 ];
  460.     char *tmp_dir, *tmp_file;
  461.     FILE *out_ptr;
  462.  
  463.     if ( NOT ( gc_GenC = AllocAslRequest( ASL_FileRequest, TAG_DONE ) ) )
  464.         return( -10 );
  465.  
  466.     gc_CTags[1].ti_Data = Wnd;
  467.  
  468.     if ( AslRequest( gc_GenC, gc_CTags )) {
  469.  
  470.         tmp_dir     =   gc_GenC->rf_Dir;
  471.         tmp_file    =   gc_GenC->rf_File;
  472.  
  473.         if ( strlen( tmp_dir ) != 0 ) {     /* not default dir */
  474.             if ( strcspn( tmp_dir, ":" ) != ( strlen( tmp_dir ) - 1 ) )
  475.             {
  476.                 strcpy( tmp_str, tmp_dir );
  477.                 strcat( tmp_str, "/" );
  478.                 strcat( tmp_str, tmp_file );
  479.             }
  480.             else {
  481.                 strcpy( tmp_str, tmp_dir );
  482.                 strcat( tmp_str, tmp_file );
  483.             }
  484.         }
  485.         else {
  486.             strcpy( tmp_str, tmp_file );
  487.         }
  488.  
  489.         /* if file already exists */
  490.         if ( NOT access( tmp_str, 0 ) ) {
  491.             if ( NOT AskYesNo( "File already exists! Overwrite it?", "YES", "NO" ) ) {
  492.                 return( 2 );            /* he didn't want to overwrite */
  493.             }
  494.         }
  495.     }
  496.     else
  497.         return( 1 );                        /* user hit 'CANCEL' */
  498.  
  499.     if ( ( out_ptr = fopen( tmp_str, "w" ) ) == NULL ) {
  500.         AskYesNo( "File has NOT been opened!", "CANCEL", "CANCEL" );
  501.         return( -5 );
  502.     }
  503.  
  504.     GenerateCode( out_ptr );
  505.  
  506.     Writing_Done = TRUE;
  507.  
  508.     fclose( out_ptr );
  509.  
  510.     return( 0 );
  511. }
  512.