home *** CD-ROM | disk | FTP | other *** search
/ Gold Fish 2 / goldfish_vol2_cd1.bin / files / dev / c / cpump / cpump17.c < prev    next >
C/C++ Source or Header  |  1994-04-04  |  26KB  |  1,002 lines

  1. /*
  2.  * CPump.c:  An Amiga Intuition-based C development environment.
  3.  * © Copyright 1992, 1993, David A. Faught,  All rights reserved.
  4.  * This information is provided "as is"; no warranties are made.
  5.  * All use is at your own risk. No liability or responsibility is assumed.
  6.  * Version 1.7
  7.  */
  8.  
  9. #define INTUITION_IOBSOLETE_H
  10.  
  11. #include <workbench/startup.h>
  12. #include <intuition/screens.h>
  13. #include <graphics/displayinfo.h>
  14. #include <exec/libraries.h>
  15. #include <exec/types.h>
  16. #include <intuition/intuition.h>
  17. #include <intuition/gadgetclass.h>
  18. #include <libraries/gadtools.h>
  19. #include <libraries/asl.h>
  20. #include <dos/dostags.h>
  21. #include <dos/var.h>
  22.  
  23. #ifndef pdc
  24. #ifndef __GNUC__
  25. #include <clib/exec_protos.h>
  26. #include <clib/graphics_protos.h>
  27. #include <clib/intuition_protos.h>
  28. #include <clib/gadtools_protos.h>
  29. #include <clib/asl_protos.h>
  30. #include <clib/alib_stdio_protos.h>
  31. #endif
  32. #endif
  33.  
  34. #ifdef __GNUC__
  35. #include <tagdefs.h>
  36. #endif
  37.  
  38. void exit ();
  39. void main ();
  40. void leave ();
  41. void AddToCommand (), InitCommand ();
  42. void MakeFileName (), GetFiles ();
  43. void InEnv (), OutEnv ();
  44. int GoRunCommand (), ZipRunCommand ();
  45. void HandleButton1 (), HandleButton2 (), HandleButton3 ();
  46. void HandleButton4 (), HandleButton5 (), HandleList1 ();
  47. BOOL HandleGadgetEvent ();
  48. BOOL HandleVanillaKey ();
  49. struct Gadget *CreateAllGadgets ();
  50.  
  51. #define GAD_BUTTON1  1
  52. #define GAD_CYCLE1   2
  53. #define GAD_BUTTON2  3
  54. #define GAD_CYCLE2   4
  55. #define GAD_BUTTON3  5
  56. #define GAD_CYCLE3   6
  57. #define GAD_CHECK1   7
  58. #define GAD_CHECK2   8
  59. #define GAD_CHECK3   9
  60. #define GAD_BUTTON4  10
  61. #define GAD_CYCLE4   11
  62. #define GAD_BUTTON5  12
  63. #define GAD_STRING1  13
  64. #define GAD_LISTVIEW1 14
  65.  
  66. #define EOS '\000'
  67.  
  68. struct TextAttr Topaz80 =
  69. {
  70.    "topaz.font",
  71.    8,
  72.    0,
  73.    0,
  74. };
  75.  
  76. UBYTE *vers = "$VER: CPump 1.7 (" __DATE__ ")";
  77.  
  78. extern struct Library *SysBase;
  79. struct GfxBase *GfxBase = NULL;
  80. struct IntuitionBase *IntuitionBase = NULL;
  81. struct Library *GadToolsBase = NULL;
  82. struct TextFont *font = NULL;
  83. struct Screen *mysc = NULL;
  84. struct Gadget *glist = NULL;
  85. struct Window *mywin = NULL;
  86. void *vi = NULL;
  87. struct Library *AslBase;
  88. struct WBArg *wbargs;
  89. struct FileRequester *fr;
  90.  
  91. STRPTR OpenDests[] =
  92. {
  93.    "RAM:",
  94.    "RAD:",
  95.    NULL,
  96. };
  97. STRPTR Editors[] =
  98. {
  99.    "ED",
  100.    "DME",
  101.    "MEmacs",
  102.    "Textra",
  103.    NULL,
  104. };
  105. STRPTR CCTypes[] =
  106. {
  107.    "DICE",
  108.    "PDC",
  109.    "LC",
  110.    "GCC",
  111.    "EC",
  112.    NULL,
  113. };
  114. STRPTR TestTypes[] =
  115. {
  116.    "RUN",
  117.    "Debug",
  118.    "RX Debug",
  119.    NULL,
  120. };
  121.  
  122. struct MinList ListView1List =
  123. {
  124.    (struct Node *) 0l, (struct Node *) 0l, (struct Node *) 0l };
  125.  
  126. struct Node ListView1Nodes[] =
  127. {
  128.    &ListView1Nodes[1], (struct Node *) & ListView1List.mlh_Head,
  129.    0, 0, "MuchMore",
  130.    &ListView1Nodes[2], &ListView1Nodes[0], 0, 0,   "EdTag Bld",
  131.    &ListView1Nodes[3], &ListView1Nodes[1], 0, 0,   "EdTag Cnt",
  132.    &ListView1Nodes[4], &ListView1Nodes[2], 0, 0,   "EdErr",
  133.    &ListView1Nodes[5], &ListView1Nodes[3], 0, 0,   "Delete",
  134.    &ListView1Nodes[6], &ListView1Nodes[4], 0, 0,   "(ADocs)",
  135.    &ListView1Nodes[7], &ListView1Nodes[5], 0, 0,   "Make",
  136.    &ListView1Nodes[8], &ListView1Nodes[6], 0, 0,   "Make clean",
  137.    &ListView1Nodes[9], &ListView1Nodes[7], 0, 0,   "Makemake #?.c",
  138.    &ListView1Nodes[10], &ListView1Nodes[8], 0, 0,  "DW",
  139.    &ListView1Nodes[11], &ListView1Nodes[9], 0, 0,  "Cref >Cref.lst",
  140.    &ListView1Nodes[12], &ListView1Nodes[10], 0, 0, "Calls >Calls.lst",
  141.    &ListView1Nodes[13], &ListView1Nodes[11], 0, 0, "Indent",
  142.    (struct Node *) & ListView1List.mlh_Tail, &ListView1Nodes[12],
  143.        0, 0, "Touch"};
  144.  
  145. ULONG x;
  146. UWORD code1 = 0, code2 = 0, code3 = 0, code4 = 0, code5 = 0;
  147. UWORD altsize[4] =
  148. {510, 10, 130, 10};
  149. char Command[200];
  150. char *EndCommand = Command;
  151. char filename[255], dirname[255] = "DF0:";
  152. char retcode[10], envbuff[60];
  153. BOOL terminated = FALSE;
  154. BOOL Vchecked = FALSE, Cchecked = FALSE, Schecked = FALSE;
  155. struct Gadget *cycle1, *cycle2, *cycle3, *cycle4;
  156. struct Gadget *check1, *check2, *check3, *string1;
  157. struct Gadget *text1, *text2;
  158.  
  159. void
  160. main (void)
  161. {
  162.    struct IntuiMessage *imsg;
  163.    struct Gadget *gad;
  164.    ULONG imsgClass;
  165.    UWORD imsgCode;
  166.    UWORD topborder;
  167.  
  168.    if (!(AslBase = OpenLibrary ("asl.library", 36L)))
  169.       leave (20, "Requires V36 asl.library");
  170.  
  171.    if (!(GfxBase = (struct GfxBase *)
  172.          OpenLibrary ("graphics.library", 36L)))
  173.       leave (20, "Requires V36 graphics.library");
  174.  
  175.    if (!(IntuitionBase = (struct IntuitionBase *)
  176.          OpenLibrary ("intuition.library", 36L)))
  177.       leave (20, "Requires V36 intuition.library");
  178.  
  179.    if (!(GadToolsBase = OpenLibrary ("gadtools.library", 36L)))
  180.       leave (20, "Requires V36 gadtools.library");
  181.  
  182.    if (!(font = OpenFont (&Topaz80)))
  183.       leave (20, "Failed to open Topaz 80");
  184.  
  185.    if (!(mysc = LockPubScreen (NULL)))
  186.       leave (20, "Couldn't lock default public screen");
  187.  
  188.    if (!(vi = GetVisualInfo (mysc,
  189.               TAG_DONE)))
  190.       leave (20, "GetVisualInfo() failed");
  191.  
  192.    InEnv ();
  193.  
  194.    topborder = mysc->WBorTop + (mysc->Font->ta_YSize + 1);
  195.  
  196.    ListView1List.mlh_Head = &ListView1Nodes[0];
  197.    ListView1List.mlh_TailPred = &ListView1Nodes[13];
  198.  
  199.    if (!CreateAllGadgets (&glist, vi, topborder))
  200.      {
  201.         leave (20, "CreateAllGadgets() failed");
  202.      }
  203.    if (!(mywin = OpenWindowTags (NULL,
  204.                   WA_Left, 220,
  205.                   WA_Width, 420,
  206.                   WA_InnerHeight, 72,
  207.                   WA_Activate, TRUE,
  208.                   WA_DragBar, TRUE,
  209.                   WA_DepthGadget, TRUE,
  210.                   WA_CloseGadget, TRUE,
  211.                   WA_SizeGadget, FALSE,
  212.                   WA_SimpleRefresh, TRUE,
  213.                   WA_IDCMP, IDCMP_CLOSEWINDOW | IDCMP_REFRESHWINDOW | \
  214.                     IDCMP_VANILLAKEY | BUTTONIDCMP | LISTVIEWIDCMP,
  215.                   WA_MinWidth, 0,
  216.                   WA_MinHeight, 0,
  217.                   WA_MaxWidth, 0,
  218.                   WA_MaxHeight, 0,
  219.                   WA_Zoom, altsize,
  220.                   WA_Title, "CPump 1.7, ©1992-4 David A. Faught",
  221.                   WA_Gadgets, glist,
  222.                   TAG_DONE)))
  223.       leave (20, "OpenWindow() failed");
  224.  
  225.    GT_RefreshWindow (mywin, NULL);
  226.  
  227.    if (!(fr = (struct FileRequester *)
  228.          AllocAslRequestTags (ASL_FileRequest,
  229.                ASL_TopEdge, 0L, ASL_LeftEdge, 0L,
  230.                ASL_Height, 200L, ASL_Width, 320L,
  231.                ASL_Hail, (ULONG) "CPump",
  232.                ASL_Dir, (ULONG) dirname,
  233.                ASL_File, (ULONG) "source.c",
  234.                ASL_Pattern, (ULONG) "#?",
  235.                ASL_FuncFlags, FILF_MULTISELECT | FILF_PATGAD,
  236.                ASL_Window, mywin,
  237.                TAG_DONE)))
  238.       leave (20, "AllocAslRequestTags() failed");
  239.  
  240.    while (!terminated)
  241.      {
  242.         Wait (1 << mywin->UserPort->mp_SigBit);
  243.         while ((!terminated) && (imsg = GT_GetIMsg (mywin->UserPort)))
  244.           {
  245.              imsgClass = imsg->Class;
  246.              imsgCode = imsg->Code;
  247.              gad = (struct Gadget *) imsg->IAddress;
  248.              GT_ReplyIMsg (imsg);
  249.              switch (imsgClass)
  250.                {
  251.                case IDCMP_GADGETDOWN:
  252.                case IDCMP_MOUSEMOVE:
  253.                case IDCMP_GADGETUP:
  254.                   terminated = HandleGadgetEvent (mywin, gad, imsgCode);
  255.                   break;
  256.  
  257.                case IDCMP_VANILLAKEY:
  258.                   terminated = HandleVanillaKey (mywin, imsgCode);
  259.                   break;
  260.  
  261.                case IDCMP_CLOSEWINDOW:
  262.                   terminated = TRUE;
  263.                   break;
  264.  
  265.                case IDCMP_REFRESHWINDOW:
  266.                   GT_BeginRefresh (mywin);
  267.                   GT_EndRefresh (mywin, TRUE);
  268.                   break;
  269.                }
  270.           }
  271.      }
  272.    OutEnv ();
  273.    leave (0, NULL);
  274. }
  275.  
  276. void
  277. leave (code, error)
  278.      int code;
  279.      STRPTR error;
  280.  
  281. {
  282.    if (fr)
  283.      {
  284.         FreeAslRequest (fr);
  285.      }
  286.    if (mywin)
  287.      {
  288.         CloseWindow (mywin);
  289.      }
  290.    if (GadToolsBase)
  291.      {
  292.         FreeVisualInfo (vi);
  293.         FreeGadgets (glist);
  294.         CloseLibrary (GadToolsBase);
  295.      }
  296.    if (mysc)
  297.      {
  298.         UnlockPubScreen (NULL, mysc);
  299.      }
  300.    if (font)
  301.      {
  302.         CloseFont (font);
  303.      }
  304.    if (IntuitionBase)
  305.      {
  306.         CloseLibrary (IntuitionBase);
  307.      }
  308.    if (GfxBase)
  309.      {
  310.         CloseLibrary (GfxBase);
  311.      }
  312.    if (AslBase)
  313.      {
  314.         CloseLibrary (AslBase);
  315.      }
  316.    if (error)
  317.      {
  318.         printf ("Error: %s\n", error);
  319.      }
  320.    exit (code);
  321. }
  322.  
  323. BOOL
  324. HandleGadgetEvent (win, gad, code)
  325.      struct Window *win;
  326.      struct Gadget *gad;
  327.      UWORD code;
  328.  
  329. {
  330.    BOOL terminated = FALSE;
  331.  
  332.    switch (gad->GadgetID)
  333.      {
  334.      case GAD_BUTTON1:
  335.         HandleButton1 ();
  336.         break;
  337.      case GAD_CYCLE1:
  338.         code1 = code;
  339.         GT_SetGadgetAttrs (cycle1, mywin, NULL,
  340.                  GTCY_Active, code,
  341.                  TAG_DONE);
  342.         break;
  343.      case GAD_BUTTON2:
  344.         HandleButton2 ();
  345.         break;
  346.      case GAD_CYCLE2:
  347.         code2 = code;
  348.         GT_SetGadgetAttrs (cycle2, mywin, NULL,
  349.                  GTCY_Active, code,
  350.                  TAG_DONE);
  351.         break;
  352.      case GAD_BUTTON3:
  353.         HandleButton3 ();
  354.         break;
  355.      case GAD_CYCLE3:
  356.         code3 = code;
  357.         GT_SetGadgetAttrs (cycle3, mywin, NULL,
  358.                  GTCY_Active, code,
  359.                  TAG_DONE);
  360.         break;
  361.      case GAD_CHECK1:
  362.         if (!(gad->Flags & GFLG_SELECTED))
  363.           {
  364.              Vchecked = FALSE;
  365.           }
  366.         else
  367.           {
  368.              Vchecked = TRUE;
  369.           }
  370.         break;
  371.      case GAD_CHECK2:
  372.         if (!(gad->Flags & GFLG_SELECTED))
  373.           {
  374.              Schecked = FALSE;
  375.           }
  376.         else
  377.           {
  378.              Schecked = TRUE;
  379.           }
  380.         break;
  381.      case GAD_CHECK3:
  382.         if (!(gad->Flags & GFLG_SELECTED))
  383.           {
  384.              Cchecked = FALSE;
  385.           }
  386.         else
  387.           {
  388.              Cchecked = TRUE;
  389.           }
  390.         break;
  391.      case GAD_BUTTON4:
  392.         HandleButton4 ();
  393.         break;
  394.      case GAD_CYCLE4:
  395.         code4 = code;
  396.         GT_SetGadgetAttrs (cycle4, mywin, NULL,
  397.                  GTCY_Active, code,
  398.                  TAG_DONE);
  399.         break;
  400.      case GAD_BUTTON5:
  401.         HandleButton5 ();
  402.         break;
  403.      case GAD_STRING1:
  404.         strcpy (dirname, ((struct StringInfo *) gad->SpecialInfo)->Buffer);
  405.         break;
  406.      case GAD_LISTVIEW1:
  407.         code5 = code;
  408.         HandleList1 ();
  409.         break;
  410.  
  411.      }
  412.    return (terminated);
  413. }
  414.  
  415. BOOL
  416. HandleVanillaKey (win, code)
  417.      struct Window *win;
  418.      UWORD code;
  419. {
  420.    switch (code)
  421.      {
  422.      case 'o':
  423.      case 'O':
  424.         HandleButton1 ();
  425.         break;
  426.      case 'e':
  427.      case 'E':
  428.         HandleButton2 ();
  429.         break;
  430.      case 'c':
  431.      case 'C':
  432.         HandleButton3 ();
  433.         break;
  434.      case 't':
  435.      case 'T':
  436.         HandleButton4 ();
  437.         break;
  438.      case 's':
  439.      case 'S':
  440.         HandleButton5 ();
  441.         break;
  442.      }
  443.    return (FALSE);
  444. }
  445.  
  446. void
  447. OutEnv ()
  448. {
  449.    ULONG flags = GVF_GLOBAL_ONLY;
  450.  
  451.    sprintf (envbuff, "%d,%d,%d,%d,%s", code1, code2, code3, code4, dirname);
  452.    if (!(SetVar ("CPump.env", envbuff, -1L, flags)))
  453.       leave (10, "SetVar() failed");
  454. }
  455.  
  456. void
  457. InEnv ()
  458. {
  459.    LONG len, flds;
  460.    LONG c1, c2, c3, c4;
  461.    char tempname[60];
  462.    len = GetVar ("CPump.env", envbuff, 60, NULL);
  463.    if (len <= 0)
  464.       printf ("%s%d\n", "GetVar for CPump.env failed code ", len);
  465.    else
  466.      {
  467.         /* This is a little bit of a kludge because apparently DICE */
  468.         /* doesn't understand %h for short integers.                */
  469.         flds = sscanf (envbuff, "%d,%d,%d,%d,%s", &c1, &c2, &c3, &c4, tempname);
  470.         if (flds == 5L)
  471.           {
  472.              code1 = c1;
  473.              code2 = c2;
  474.              code3 = c3;
  475.              code4 = c4;
  476.              (void) strcpy (dirname, tempname);
  477.           }
  478.         else
  479.            printf ("%s\n", "CPump.env is invalid and was ignored");
  480.      }
  481. }
  482.  
  483. int
  484. ZipRunCommand ()
  485. {
  486.    int success;
  487.  
  488.    ZipWindow (mywin);
  489.    success = GoRunCommand ();
  490.    ZipWindow (mywin);
  491.    return (success);
  492. }
  493.  
  494. int
  495. GoRunCommand ()
  496. {
  497.    struct TagItem stags[3];
  498.    int success;
  499.  
  500.    if (Vchecked)
  501.       printf ("%s\n", Command);
  502.    GT_SetGadgetAttrs (text1, mywin, NULL,
  503.             GTTX_Text, "   Running",
  504.             TAG_DONE);
  505.  
  506.    stags[0].ti_Tag = SYS_Input;
  507.    stags[0].ti_Data = Input ();
  508.    stags[1].ti_Tag = SYS_Output;
  509.    stags[1].ti_Data = Output ();
  510.    stags[2].ti_Tag = TAG_DONE;
  511.    success = System (Command, stags);
  512.  
  513.    GT_SetGadgetAttrs (text1, mywin, NULL,
  514.             GTTX_Text, "   Waiting",
  515.             TAG_DONE);
  516.    (void) sprintf (retcode, "   RC %i", success);
  517.    GT_SetGadgetAttrs (text2, mywin, NULL,
  518.             GTTX_Text, retcode,
  519.             TAG_DONE);
  520.  
  521.    if (Vchecked)
  522.       printf ("Command returned %i\n", success);
  523.    return (success);
  524. }
  525.  
  526. void
  527. HandleButton1 ()
  528. {
  529.    if (AslRequestTags (fr,
  530.              ASL_Hail, (ULONG) "OPEN From",
  531.              ASL_Dir, (ULONG) dirname,
  532.              ASL_Pattern, (ULONG) "#?",
  533.              ASL_FuncFlags, FILF_MULTISELECT | FILF_PATGAD,
  534.              TAG_DONE))
  535.      {
  536.         if (fr->rf_NumArgs)
  537.           {
  538.              wbargs = fr->rf_ArgList;
  539.              for (x = 0; x < fr->rf_NumArgs; x++)
  540.                {
  541.                   MakeFileName (fr->rf_Dir, wbargs[x].wa_Name);
  542.                   InitCommand ();
  543.                   AddToCommand (" COPY %s", filename);
  544.                   AddToCommand (" TO %s", OpenDests[code1]);
  545.                   (void) GoRunCommand ();
  546.                }
  547.           }
  548.         else
  549.           {
  550.              MakeFileName (fr->rf_Dir, fr->rf_File);
  551.              InitCommand ();
  552.              AddToCommand (" COPY %s", filename);
  553.              AddToCommand (" TO %s", OpenDests[code1]);
  554.              (void) GoRunCommand ();
  555.           }
  556.         strcpy (dirname, fr->rf_Dir);
  557.         GT_SetGadgetAttrs (string1, mywin, NULL,
  558.                  GTST_String, dirname,
  559.                  TAG_DONE);
  560.      }
  561. }
  562.  
  563. void
  564. HandleButton2 ()
  565. {
  566.    InitCommand ();
  567.    /* all editors need a filename argument */
  568.    if (AslRequestTags (fr,
  569.              ASL_Hail, (ULONG) "Edit",
  570.              ASL_Dir, (ULONG) OpenDests[code1],
  571.              ASL_Pattern, (ULONG) "#?",
  572.              ASL_FuncFlags, FILF_PATGAD,
  573.              TAG_DONE))
  574.      {
  575.         AddToCommand (" RUN %s", Editors[code2]);
  576.         MakeFileName (fr->rf_Dir, fr->rf_File);
  577.         AddToCommand (" %s", filename);
  578.         (void) GoRunCommand ();
  579.      }
  580. }
  581.  
  582. void
  583. HandleButton3 ()
  584. {
  585.    char basename[255], *split;
  586.  
  587.    if (AslRequestTags (fr,
  588.              ASL_Hail, (ULONG) "Compile",
  589.              ASL_Dir, (ULONG) OpenDests[code1],
  590.              ASL_Pattern, (ULONG) "#?",
  591.              ASL_FuncFlags, FILF_PATGAD,
  592.              TAG_DONE))
  593.      {
  594.         InitCommand ();
  595.         switch (code3)
  596.           {
  597.           case 0:
  598.              MakeFileName (fr->rf_Dir, fr->rf_File);
  599.              AddToCommand (" DCC %s", filename);
  600.              (void) strcpy (basename, filename);
  601.              if ((split = strrchr (basename, '.')) == NULL)
  602.                 (void) strcat (basename, ".exe");
  603.              else
  604.                 *split = EOS;
  605.              AddToCommand (" -o %s", basename);
  606.              AddToCommand (" -E %s.err", basename);
  607.              if (Vchecked)
  608.                 AddToCommand (" %s", "-v");
  609.              if (Schecked)
  610.                 AddToCommand (" %s", "-s");
  611.              if (Cchecked)
  612.                 AddToCommand (" %s", "-c");
  613.              break;
  614.           case 1:
  615.              MakeFileName (fr->rf_Dir, fr->rf_File);
  616.              AddToCommand (" %s", "CCX");
  617.              if (Vchecked)
  618.                 AddToCommand (" %s", "-V");
  619.              if (Schecked)
  620.                 AddToCommand (" %s", "-g");
  621.              if (Cchecked)
  622.                 AddToCommand (" %s", "-c");
  623.              AddToCommand (" %s", filename);
  624.              break;
  625.           case 2:
  626.              MakeFileName (fr->rf_Dir, fr->rf_File);
  627.              AddToCommand (" %s", "LC");
  628.              if (Schecked)
  629.                 AddToCommand (" %s", "-d");
  630.              if (!Cchecked)
  631.                 AddToCommand (" %s", "-L");
  632.              AddToCommand (" %s", filename);
  633.              break;
  634.           case 3:
  635.              MakeFileName (fr->rf_Dir, fr->rf_File);
  636.              AddToCommand (" %s", "GCC");
  637.              if (Vchecked)
  638.                 AddToCommand (" %s", "-v");
  639.              if (Schecked)
  640.                 AddToCommand (" %s", "-g");
  641.              if (Cchecked)
  642.                 AddToCommand (" %s", "-c");
  643.              AddToCommand (" %s", filename);
  644.              (void) strcpy (basename, filename);
  645.              if ((split = strrchr (basename, '.')) == NULL)
  646.                 (void) strcat (basename, ".exe");
  647.              else {
  648.                if ((strcmp(split,".cc") == NULL) ||
  649.                    (strcmp(split,".cxx") == NULL))
  650.                   AddToCommand (" %s", "-lg++");
  651.                *split = EOS;
  652.                } 
  653.              AddToCommand (" -o %s", basename);
  654.              break;
  655.           case 4:
  656.              MakeFileName (fr->rf_Dir, fr->rf_File);
  657.              (void) strcpy (basename, filename);
  658.              if ((split = strrchr (basename, '.')) != NULL)
  659.                 *split = EOS;
  660.              AddToCommand (" %s", "EC");
  661.              if (Cchecked)
  662.                 AddToCommand (" %s", "-s");
  663.              AddToCommand (" %s", basename);
  664.              break;
  665.           }
  666.         (void) ZipRunCommand ();
  667.      }
  668. }
  669.  
  670. void
  671. HandleButton4 ()
  672. {
  673.    if (AslRequestTags (fr,
  674.              ASL_Hail, (ULONG) "Test",
  675.              ASL_Dir, (ULONG) OpenDests[code1],
  676.              ASL_Pattern, (ULONG) "#?",
  677.              ASL_FuncFlags, FILF_PATGAD,
  678.              TAG_DONE))
  679.      {
  680.         InitCommand ();
  681.         AddToCommand (" %s", TestTypes[code4]);
  682.         MakeFileName (fr->rf_Dir, fr->rf_File);
  683.         AddToCommand (" %s", filename);
  684.         (void) ZipRunCommand ();
  685.      }
  686. }
  687.  
  688. void
  689. HandleList1 ()
  690. {
  691.    char basename[255], *split;
  692.    int fileok;
  693.  
  694.    InitCommand ();
  695.    fileok = TRUE;
  696.    switch (code5)    /* do filerequester for those that need it */
  697.      {
  698.      case 0:
  699.      case 3:
  700.      case 4:
  701.      case 6:
  702.      case 7:
  703.      case 10:
  704.      case 11:
  705.      case 12:
  706.      case 13:
  707.         fileok = AslRequestTags (fr,
  708.                   ASL_Hail, (ULONG) "Utility",
  709.                   ASL_Dir, (ULONG) OpenDests[code1],
  710.                   ASL_Pattern, (ULONG) "#?",
  711.                   ASL_FuncFlags, NULL,
  712.                   TAG_DONE);
  713.         if (fileok)
  714.            MakeFileName (fr->rf_Dir, fr->rf_File);
  715.         break;
  716.      }
  717.    if (fileok)    /* if everything is still ok */
  718.      {
  719.         switch (code5)/* format the command and run it */
  720.           {
  721.           case 1: /* Edtag Bld */
  722.           case 2: /* Edtag Cnt */
  723.              AddToCommand (" rx %s %s", ListView1Nodes[code5].ln_Name,
  724.                  Editors[code2]);
  725.              (void) GoRunCommand ();
  726.              break;
  727.           case 3: /* EdErr */
  728.              AddToCommand (" rx %s %s", ListView1Nodes[code5].ln_Name, filename);
  729.              (void) ZipRunCommand ();
  730.              break;
  731.           case 5: /* (ADocs) */
  732.              AddToCommand (" %s", "run AmigaGuide AutoDocs");
  733.              (void) GoRunCommand ();
  734.              break;
  735.           case 6: /* Make */
  736.              if (code3 == 0)  /* the zeroth compiler is "Dice" */
  737.                 AddToCommand (" Dmake -f %s", filename);
  738.              else
  739.                 AddToCommand (" Make -f %s", filename);
  740.              (void) ZipRunCommand ();
  741.              break;
  742.           case 7: /* Make clean */
  743.              if (code3 == 0)  /* the zeroth compiler is "Dice" */
  744.                 AddToCommand (" Dmake -f %s clean", filename);
  745.              else
  746.                 AddToCommand (" Make -f %s clean", filename);
  747.              (void) ZipRunCommand ();
  748.              break;
  749.           case 8: /* Makemake */
  750.           case 9: /* DW */
  751.              AddToCommand (" %s", ListView1Nodes[code5].ln_Name);
  752.              (void) ZipRunCommand ();
  753.              break;
  754.           default:
  755.              AddToCommand (" %s %s", ListView1Nodes[code5].ln_Name, filename);
  756.              (void) ZipRunCommand ();
  757.           }
  758.      }
  759. }
  760.  
  761. void
  762. HandleButton5 ()
  763. {
  764.    if (AslRequestTags (fr,
  765.              ASL_Hail, (ULONG) "SAVE From",
  766.              ASL_Dir, (ULONG) "RAM:",
  767.              ASL_Pattern, (ULONG) "#?",
  768.              ASL_FuncFlags, FILF_MULTISELECT,
  769.              TAG_DONE))
  770.      {
  771.         if (fr->rf_NumArgs)
  772.           {
  773.              wbargs = fr->rf_ArgList;
  774.              for (x = 0; x < fr->rf_NumArgs; x++)
  775.                {
  776.                   MakeFileName (fr->rf_Dir, wbargs[x].wa_Name);
  777.                   InitCommand ();
  778.                   AddToCommand (" COPY %s", filename);
  779.                   AddToCommand (" TO %s", dirname);
  780.                   (void) GoRunCommand ();
  781.                }
  782.           }
  783.         else
  784.           {
  785.              MakeFileName (fr->rf_Dir, fr->rf_File);
  786.              InitCommand ();
  787.              AddToCommand (" COPY %s", filename);
  788.              AddToCommand (" TO %s", dirname);
  789.              (void) GoRunCommand ();
  790.           }
  791.      }
  792. }
  793.  
  794. void
  795. InitCommand ()
  796. {
  797.    Command[0] = EOS;
  798.    EndCommand = &Command[0];
  799. }
  800.  
  801. void
  802. AddToCommand (fmt, arg1, arg2, arg3)
  803.      char *fmt;
  804.      char *arg1, *arg2, *arg3;
  805. {
  806.    register int length;
  807.    register char *s;
  808.    auto char buffer[255];
  809.    auto char word[64];
  810.  
  811.    (void) sprintf (buffer, fmt, arg1, arg2, arg3);
  812.    length = strlen (buffer);
  813.    if ((EndCommand - Command) + length >= sizeof (Command))
  814.       leave (20, "Command line too long");
  815.  
  816.    else
  817.      {
  818.         (void) strcat (EndCommand, buffer);
  819.         EndCommand += length;
  820.      }
  821. }
  822.  
  823. void
  824. MakeFileName (arg1, arg2)
  825.      char *arg1, *arg2;
  826. {
  827.    UWORD lastchr;
  828.    lastchr = strlen (arg1) - 1;
  829.    if (arg1[lastchr] == ':')
  830.       (void) sprintf (filename, "%s%s", arg1, arg2);
  831.    else
  832.       (void) sprintf (filename, "%s/%s", arg1, arg2);
  833. }
  834.  
  835. struct Gadget *
  836. CreateAllGadgets (glistptr, vi, topborder)
  837.      struct Gadget **glistptr;
  838.      void *vi;
  839.      UWORD topborder;
  840.  
  841. {
  842.    struct NewGadget ng;
  843.    struct Gadget *gad;
  844.  
  845.    gad = CreateContext (glistptr);
  846.  
  847.    ng.ng_TextAttr = &Topaz80;
  848.    ng.ng_VisualInfo = vi;
  849.  
  850.    ng.ng_LeftEdge = 4;
  851.    ng.ng_TopEdge = topborder;
  852.    ng.ng_Width = 70;
  853.    ng.ng_Height = 12;
  854.    ng.ng_GadgetText = "_Open";
  855.    ng.ng_GadgetID = GAD_BUTTON1;
  856.    ng.ng_Flags = 0;
  857.    gad = CreateGadget (BUTTON_KIND, gad, &ng,
  858.              GT_Underscore, '_',
  859.              TAG_DONE);
  860.  
  861.    ng.ng_LeftEdge += 120;
  862.    ng.ng_Width = 100;
  863.    ng.ng_GadgetText = "To";
  864.    ng.ng_GadgetID = GAD_CYCLE1;
  865.    ng.ng_Flags = NG_HIGHLABEL;
  866.    cycle1 = gad = CreateGadget (CYCLE_KIND, gad, &ng,
  867.                  GTCY_Labels, OpenDests,
  868.                  GTCY_Active, code1,
  869.                  TAG_DONE);
  870.  
  871.    ng.ng_LeftEdge = 4;
  872.    ng.ng_TopEdge += 12;
  873.    ng.ng_Width = 70;
  874.    ng.ng_GadgetText = "_Edit";
  875.    ng.ng_GadgetID = GAD_BUTTON2;
  876.    ng.ng_Flags = 0;
  877.    gad = CreateGadget (BUTTON_KIND, gad, &ng,
  878.              GT_Underscore, '_',
  879.              TAG_DONE);
  880.  
  881.    ng.ng_LeftEdge += 120;
  882.    ng.ng_Width = 100;
  883.    ng.ng_GadgetText = "With";
  884.    ng.ng_GadgetID = GAD_CYCLE2;
  885.    ng.ng_Flags = NG_HIGHLABEL;
  886.    cycle2 = gad = CreateGadget (CYCLE_KIND, gad, &ng,
  887.                  GTCY_Labels, Editors,
  888.                  GTCY_Active, code2,
  889.                  TAG_DONE);
  890.  
  891.    ng.ng_LeftEdge += 100;
  892.    ng.ng_GadgetText = "Status";
  893.    ng.ng_Flags = PLACETEXT_ABOVE | NG_HIGHLABEL;
  894.    text1 = gad = CreateGadget (TEXT_KIND, gad, &ng,
  895.                 GTTX_Text, "   Waiting",
  896.                 TAG_DONE);
  897.  
  898.    ng.ng_LeftEdge += 92;
  899.    ng.ng_Width = 100;
  900.    ng.ng_Height = 60;
  901.    ng.ng_GadgetText = "Utilities";
  902.    ng.ng_GadgetID = GAD_LISTVIEW1;
  903.    ng.ng_Flags = PLACETEXT_ABOVE | NG_HIGHLABEL;
  904.    gad = CreateGadget (LISTVIEW_KIND, gad, &ng,
  905.              GTLV_Labels, &ListView1List, TAG_DONE);
  906.  
  907.    ng.ng_LeftEdge = 4;
  908.    ng.ng_TopEdge += 12;
  909.    ng.ng_Width = 70;
  910.    ng.ng_Height = 12;
  911.    ng.ng_GadgetText = "_Compile";
  912.    ng.ng_GadgetID = GAD_BUTTON3;
  913.    ng.ng_Flags = 0;
  914.    gad = CreateGadget (BUTTON_KIND, gad, &ng,
  915.              GT_Underscore, '_',
  916.              TAG_DONE);
  917.  
  918.    ng.ng_LeftEdge += 120;
  919.    ng.ng_Width = 100;
  920.    ng.ng_GadgetText = "With";
  921.    ng.ng_GadgetID = GAD_CYCLE3;
  922.    ng.ng_Flags = NG_HIGHLABEL;
  923.    cycle3 = gad = CreateGadget (CYCLE_KIND, gad, &ng,
  924.                  GTCY_Labels, CCTypes,
  925.                  GTCY_Active, code3,
  926.                  TAG_DONE);
  927.  
  928.    ng.ng_LeftEdge += 100;
  929.    ng.ng_GadgetText = "";
  930.    ng.ng_Flags = 0;
  931.    text2 = gad = CreateGadget (TEXT_KIND, gad, &ng,
  932.                 GTTX_Text, "   00",
  933.                 TAG_DONE);
  934.  
  935.    ng.ng_TopEdge += 12;
  936.    ng.ng_LeftEdge = 70;
  937.    ng.ng_GadgetText = "Verbose";
  938.    ng.ng_GadgetID = GAD_CHECK1;
  939.    ng.ng_Flags = NG_HIGHLABEL;
  940.    check1 = gad = CreateGadget (CHECKBOX_KIND, gad, &ng,
  941.                  GTCB_Checked, Vchecked,
  942.                  TAG_DONE);
  943.  
  944.    ng.ng_LeftEdge += 120;
  945.    ng.ng_GadgetText = "DbugInfo";
  946.    ng.ng_GadgetID = GAD_CHECK2;
  947.    check2 = gad = CreateGadget (CHECKBOX_KIND, gad, &ng,
  948.                  GTCB_Checked, Schecked,
  949.                  TAG_DONE);
  950.  
  951.    ng.ng_LeftEdge += 100;
  952.    ng.ng_GadgetText = "NoLink";
  953.    ng.ng_GadgetID = GAD_CHECK3;
  954.    check2 = gad = CreateGadget (CHECKBOX_KIND, gad, &ng,
  955.                  GTCB_Checked, Cchecked,
  956.                  TAG_DONE);
  957.  
  958.    ng.ng_LeftEdge = 4;
  959.    ng.ng_TopEdge += 11;
  960.    ng.ng_Width = 70;
  961.    ng.ng_GadgetText = "_Test";
  962.    ng.ng_GadgetID = GAD_BUTTON4;
  963.    ng.ng_Flags = 0;
  964.    gad = CreateGadget (BUTTON_KIND, gad, &ng,
  965.              GT_Underscore, '_',
  966.              TAG_DONE);
  967.  
  968.    ng.ng_LeftEdge += 120;
  969.    ng.ng_Width = 100;
  970.    ng.ng_GadgetText = "With";
  971.    ng.ng_GadgetID = GAD_CYCLE4;
  972.    ng.ng_Flags = NG_HIGHLABEL;
  973.    cycle4 = gad = CreateGadget (CYCLE_KIND, gad, &ng,
  974.                  GTCY_Labels, TestTypes,
  975.                  GTCY_Active, code4,
  976.                  TAG_DONE);
  977.  
  978.    ng.ng_LeftEdge = 4;
  979.    ng.ng_TopEdge += 12;
  980.    ng.ng_Width = 70;
  981.    ng.ng_Height = 13;
  982.    ng.ng_GadgetText = "_Save";
  983.    ng.ng_GadgetID = GAD_BUTTON5;
  984.    ng.ng_Flags = 0;
  985.    gad = CreateGadget (BUTTON_KIND, gad, &ng,
  986.              GT_Underscore, '_',
  987.              TAG_DONE);
  988.  
  989.    ng.ng_LeftEdge += 120;
  990.    ng.ng_Width = 191;
  991.    ng.ng_Height = 13;
  992.    ng.ng_GadgetText = "To";
  993.    ng.ng_GadgetID = GAD_STRING1;
  994.    ng.ng_Flags = NG_HIGHLABEL;
  995.    string1 = gad = CreateGadget (STRING_KIND, gad, &ng,
  996.                   GTST_String, dirname,
  997.                   GTST_MaxChars, 50,
  998.                   TAG_DONE);
  999.  
  1000.    return (gad);
  1001. }
  1002.