home *** CD-ROM | disk | FTP | other *** search
/ Club Amiga de Montreal - CAM / CAM_CD_2.iso / files / 712b.lha / Struct-Saver_v1.20 / Struct-Saver.c < prev    next >
C/C++ Source or Header  |  1992-11-21  |  13KB  |  520 lines

  1. /* Struct-Saver
  2.  *
  3.  * (c) 1992 Thies Wellpott
  4.  *
  5.  * HISTORY
  6.  *
  7.  * 0.90  03.07.92
  8.  *   first working test version finished
  9.  * 1.00  04.07.92
  10.  *   struct-saving improved (some internal fixes); now uses NULL instead
  11.  *   of (APTR)(NULL); GUI finished
  12.  * 1.01  04.07.92
  13.  *   menu shortcuts didn`t work (because of always active string gadget),
  14.  *   bug fixed
  15.  * 1.10  04.07.92
  16.  *   line_length feature added, expanded saving added
  17.  * 1.20  05.07.92
  18.  *   define-saving added; some bugs fixed; internal improvements
  19.  *
  20.  *
  21.  * TODO
  22.  *
  23.  * - nicer names in source (?)
  24.  * - config option for source-look
  25.  *
  26.  */
  27.  
  28. #include "Struct-Saver.h"
  29.  
  30. #define MY_IDCMP (IDCMP_GADGETUP | IDCMP_CLOSEWINDOW | IDCMP_MENUPICK |\
  31.         IDCMP_REFRESHWINDOW | IDCMP_ACTIVEWINDOW)
  32.  
  33. #define GDG_FNAME 1
  34. #define GDG_WAITTIME 2
  35. #define GDG_LINELEN 3
  36. #define GDG_USE_DEFINES 10
  37. #define GDG_EXPANDED 11
  38. #define GDG_GADGETS 20
  39. #define GDG_MENUS 21
  40.  
  41. /********** externals **********/
  42.  
  43. extern void free_lists(void);
  44. extern void save_menu(struct Menu *), save_gadget(struct Gadget *);
  45.  
  46. /********** Variablen, Daten **********/
  47.  
  48. /* "$VER: " für DOS-Befehl Version */
  49. char version[] = "$VER: Struct-Saver V"VERSION" ("DATE")";
  50. char title_normal[] = "Struct-Saver V"VERSION;
  51.  
  52. struct IntuitionBase *IntuitionBase = NULL;
  53. struct Library *GadToolsBase = NULL;
  54.  
  55. static struct NewWindow newmain_wd =
  56. {
  57.    0,0, 0,0, -1,-1, MY_IDCMP,
  58.    WFLG_DRAGBAR | WFLG_CLOSEGADGET | WFLG_DEPTHGADGET |
  59.       WFLG_SIMPLE_REFRESH | WFLG_ACTIVATE,
  60.    NULL, NULL, title_normal,
  61.    NULL, NULL, 0,0, 0,0, WBENCHSCREEN
  62. };
  63.  
  64. struct Window *main_wd = NULL;
  65. static APTR vinfo = NULL;
  66. static struct Gadget *gad_list = NULL, *fname_gdg, *time_gdg, *linelen_gdg;
  67. static struct TextAttr ta = {"topaz.font", 8, 0x00, 0x00};
  68.  
  69. struct Menu *menu = NULL;
  70. static struct NewMenu menu_data[] =
  71. {
  72.   {NM_TITLE, "Project", NULL, 0, ~0, NULL},
  73.    {NM_ITEM, "Save configuration", NULL, 0, ~0, NULL},
  74.    {NM_ITEM, NM_BARLABEL,       NULL, 0, ~0, NULL},
  75.    {NM_ITEM, "About...",           NULL, 0, ~0, NULL},
  76.    {NM_ITEM, NM_BARLABEL,       NULL, 0, ~0, NULL},
  77.    {NM_ITEM, "Quit",               "Q", 0, ~0, NULL},
  78.   {NM_END, NULL, NULL, 0, ~0, NULL},
  79. };
  80.  
  81. #define MENU_SAVE_CONFIG FULLMENUNUM(0,0,NOSUB)
  82. #define MENU_ABOUT FULLMENUNUM(0,2,NOSUB)
  83. #define MENU_QUIT FULLMENUNUM(0,4,NOSUB)
  84.  
  85. struct config config =              /* default config */
  86. {
  87.    50,30, 5, 75, TRUE, FALSE
  88. };
  89.  
  90. FILE *fhd;
  91. static struct WBStartup *wbmsg = NULL;
  92. BOOL ende = FALSE; /* globales Flag; wenn TRUE, dann wird d. Prg. beendet */
  93.  
  94. static struct EasyStruct AboutES =
  95.    {sizeof(struct EasyStruct), 0, "About...",
  96.    "Struct-Saver V"VERSION" ("DATE")\n© 1992 Thies Wellpott", "Ok"};
  97.  
  98. /********** Routinen **********/
  99.  
  100. void close_all(char *s, int err)
  101. /* alles schließen, freigeben und Programm beenden */
  102. {
  103.    if (main_wd)
  104.    {
  105.       ClearMenuStrip(main_wd);
  106.       CloseWindow(main_wd);
  107.    }
  108.    if (menu) FreeMenus(menu);
  109.    if (gad_list) FreeGadgets(gad_list);
  110.    if (vinfo) FreeVisualInfo(vinfo);
  111.  
  112.    if (GadToolsBase)    CloseLibrary(GadToolsBase);
  113.    if (IntuitionBase)   CloseLibrary((struct Library *)IntuitionBase);
  114.  
  115.    if (s)                              /* wenn ein String angegeben ist, */
  116.    {
  117.       FILE *out;
  118.  
  119.       /* da stdout nicht definiert ist, wird hier ein Window geöffnet,
  120.        * auf dem der String ausgegeben wird */
  121.       if (wbmsg)
  122.      out = fopen("CON:20/20/260/100/Struct-Saver error", "w");
  123.       else
  124.      out = fopen("*", "w");
  125.  
  126.       if (out)
  127.       {
  128.      fputs(s, out);                /* diesen ausgeben */
  129.      fputs("!\n", out);            /* "!" + LF anhängen */
  130.      if (wbmsg)
  131.      {
  132.         fflush(out);    /* wenn von WB gestartet, File-Puffer leeren */
  133.         Delay(150);     /* und 3s warten */
  134.      }
  135.      fclose(out);
  136.       } /* if (out) */
  137.    } /* if (s) */
  138.  
  139.    exit(err);                          /* Programm beenden */
  140. }
  141.  
  142.  
  143. static void load_config(void)
  144. /* loads config file, beeps screen if it can`t read the file */
  145. {
  146.    BPTR f;
  147.    struct config cfg;
  148.  
  149.    if (f = Open("S:Struct-Saver.config", MODE_OLDFILE))
  150.    {
  151.       if (Read(f, &cfg, sizeof(struct config)) == sizeof(struct config))
  152.      config = cfg;         /* loading ok, copy into real struct */
  153.       else
  154.      DisplayBeep(NULL);
  155.       Close(f);
  156.    }
  157.    else
  158.       DisplayBeep(NULL);
  159. }
  160.  
  161.  
  162. static void save_config(void)
  163. /* saves config file, displays error message if it can`t write the file */
  164. {
  165.    BPTR f;
  166.  
  167.    TITLE("Saving configuration...");
  168.    config.wd_x = main_wd->LeftEdge;         /* get window position */
  169.    config.wd_y = main_wd->TopEdge;
  170.  
  171.    if (f = Open("S:Struct-Saver.config", MODE_NEWFILE))
  172.    {
  173.       if (Write(f, &config, sizeof(struct config)) == sizeof(struct config))
  174.      TITLE("Saving done.");
  175.       else
  176.       {
  177.      TITLE("Can`t write config-file!");
  178.      DisplayBeep(NULL);
  179.       }
  180.       Close(f);
  181.    }
  182.    else
  183.    {
  184.       TITLE("Can`t open config-file!");
  185.       DisplayBeep(NULL);
  186.    }
  187. }
  188.  
  189.  
  190. static void do_it(int what)
  191. {
  192.    int i;
  193.    char s[20];
  194.    struct Gadget *gad;
  195.    struct Menu *m;
  196.    ULONG lock;
  197.  
  198.    ModifyIDCMP(main_wd, NULL);               /* disable all input */
  199.    for (i = config.wait_time; i > 0; i--)
  200.    {
  201.       sprintf(s, "Time left: %ds", i);       /* stop watch */
  202.       TITLE(s);
  203.       Delay(50);
  204.    }
  205.  
  206.    if (fhd = fopen(((struct StringInfo *)fname_gdg->SpecialInfo)->Buffer, "w"))
  207.    {
  208.       switch (what)
  209.       {
  210.      case GDG_GADGETS:
  211.         TITLE("Saving gadgets...");
  212. #ifndef DEBUG
  213.         lock = LockIBase(0);
  214. #endif
  215.         if (gad = IntuitionBase->ActiveWindow->FirstGadget)
  216.         {
  217.            save_gadget(gad);
  218.            TITLE("Saving done.");
  219.         }
  220.         else
  221.         {
  222.            TITLE("Window has no gadgets!");
  223.            DisplayBeep(NULL);
  224.         }
  225. #ifndef DEBUG
  226.         UnlockIBase(lock);
  227. #endif
  228.         break;
  229.      case GDG_MENUS:
  230.         TITLE("Saving menus...");
  231. #ifndef DEBUG
  232.         lock = LockIBase(0);
  233. #endif
  234.         if (m = IntuitionBase->ActiveWindow->MenuStrip)
  235.         {
  236.            save_menu(m);
  237.            TITLE("Saving done.");
  238.         }
  239.         else
  240.         {
  241.            TITLE("Window has no menus!");
  242.            DisplayBeep(NULL);
  243.         }
  244. #ifndef DEBUG
  245.         UnlockIBase(lock);
  246. #endif
  247.         break;
  248.       } /* switch (what) */
  249.  
  250.       free_lists();                       /* free lists used by save_... */
  251.       fclose(fhd);
  252.    } /* if (fopen()) */
  253.    else
  254.    {
  255.       TITLE("Can`t open file!");
  256.       DisplayBeep(NULL);
  257.    }
  258.  
  259.    ModifyIDCMP(main_wd, MY_IDCMP);
  260. }
  261.  
  262.  
  263. static void handleIDCMP(void)
  264. {
  265.    struct IntuiMessage *msg;
  266.    ULONG class;
  267.    UWORD code;
  268.    struct Gadget *gad;
  269.  
  270.    TITLE(title_normal);
  271.    while (msg = GT_GetIMsg(main_wd->UserPort))
  272.    {
  273.       class = msg->Class;
  274.       code = msg->Code;
  275.       gad = (struct Gadget *)(msg->IAddress);      /* might be odd!! */
  276.  
  277.       GT_ReplyIMsg(msg);
  278.  
  279.       switch (class)
  280.       {
  281.      case IDCMP_ACTIVEWINDOW:
  282.         ActivateGadget(fname_gdg, main_wd, NULL);
  283.         break;
  284.      case IDCMP_CLOSEWINDOW:
  285.         ende = TRUE;
  286.         break;
  287.      case IDCMP_GADGETUP:
  288.         switch (gad->GadgetID)
  289.         {
  290.            case GDG_FNAME:
  291.           ActivateGadget(time_gdg, main_wd, NULL);
  292.           break;
  293.            case GDG_WAITTIME:
  294.           config.wait_time = ABS(((struct StringInfo *)
  295.                time_gdg->SpecialInfo)->LongInt);
  296.           ActivateGadget(linelen_gdg, main_wd, NULL);
  297.           break;
  298.            case GDG_LINELEN:
  299.           config.line_length = ABS(((struct StringInfo *)
  300.                linelen_gdg->SpecialInfo)->LongInt);
  301.           ActivateGadget(fname_gdg, main_wd, NULL);
  302.           break;
  303.            case GDG_USE_DEFINES:
  304.           config.use_defines ^= TRUE;
  305.           break;
  306.            case GDG_EXPANDED:
  307.           config.expanded ^= TRUE;
  308.           break;
  309.            case GDG_GADGETS:
  310.           do_it(GDG_GADGETS);
  311.           break;
  312.            case GDG_MENUS:
  313.           do_it(GDG_MENUS);
  314.           break;
  315.         }
  316.         break;
  317.      case IDCMP_MENUPICK:
  318.         while (code != MENUNULL)
  319.         {
  320.            switch (code)
  321.            {
  322.           case MENU_SAVE_CONFIG:
  323.              save_config();
  324.              break;
  325.           case MENU_ABOUT:
  326.              EasyRequest(main_wd, &AboutES, NULL, NULL);
  327.              break;
  328.           case MENU_QUIT:
  329.              ende = TRUE;
  330.              break;
  331.            }
  332.            code = (ItemAddress(menu, code))->NextSelect;
  333.         } /* while () */
  334.         break;
  335.      case IDCMP_REFRESHWINDOW:
  336.         GT_BeginRefresh(main_wd);
  337.         GT_EndRefresh(main_wd, TRUE);
  338.         break;
  339.       } /* switch (class) */
  340.    } /* while() */
  341. }
  342.  
  343.  
  344. static void mainloop(void)
  345. {
  346.    ULONG signal;
  347.    ULONG idcmp_bit = 1L << main_wd->UserPort->mp_SigBit;
  348.  
  349. #define break_bit (SIGBREAKF_CTRL_C | SIGBREAKF_CTRL_D)
  350.  
  351.    while (!ende)
  352.    {
  353.       /* auf Aktion warten */
  354.       signal = Wait(idcmp_bit | break_bit);
  355.  
  356.       if (signal & idcmp_bit)
  357.      handleIDCMP();
  358.       if (signal & break_bit)
  359.      ende = TRUE;
  360.    }
  361. }
  362.  
  363.  
  364. static void open_all(void)
  365. /* alles Benötigte öffnen, allokieren, etc. */
  366. {
  367.    if (SysBase->SoftVer < 36)                /* Ist OS 2.0 vorhanden? */
  368.       close_all("You need OS 2.0 or better", 20);
  369.  
  370.    if (!(IntuitionBase = (struct IntuitionBase *)OpenLibrary("intuition.library", 36)))
  371.       close_all("No intuition.lib", 20);
  372.    if (!(GadToolsBase = OpenLibrary("gadtools.library", 36)))
  373.       close_all("No gadtools.lib", 20);
  374. }
  375.  
  376.  
  377. static void open_window(void)
  378. {
  379.    struct Screen *scr;
  380.    struct Gadget *gad;
  381.    struct NewGadget new_gdg;
  382.  
  383.    if (!(scr = LockPubScreen(NULL)))
  384.       close_all("Can`t lock screen", 20);
  385.    if (!(vinfo = GetVisualInfo(scr, TAG_DONE)))
  386.    {
  387.       UnlockPubScreen(NULL, scr);
  388.       close_all("Can`t get visual info", 20);
  389.    }
  390.    if (!(gad = CreateContext(&gad_list)))
  391.    {
  392.       UnlockPubScreen(NULL, scr);
  393.       close_all("Can`t create context", 20);
  394.    }
  395.    newmain_wd.FirstGadget = gad;
  396.  
  397.    new_gdg.ng_LeftEdge = scr->WBorLeft + 94;
  398.    new_gdg.ng_TopEdge = scr->WBorTop + scr->Font->ta_YSize + 1 + INTERHEIGHT;
  399.    new_gdg.ng_Width = 12 + 20*8;
  400.    new_gdg.ng_Height = 13;
  401.    new_gdg.ng_GadgetText = "Filename:";
  402.    new_gdg.ng_GadgetID = GDG_FNAME;
  403.    new_gdg.ng_TextAttr = &ta;
  404.    new_gdg.ng_Flags = PLACETEXT_LEFT;
  405.    new_gdg.ng_VisualInfo = vinfo;
  406.    new_gdg.ng_UserData = NULL;
  407.    if (!(fname_gdg = gad = CreateGadget(STRING_KIND, gad, &new_gdg,
  408.         GTST_MaxChars,80,  TAG_DONE)))
  409.       goto no_gad;
  410.  
  411.    new_gdg.ng_TopEdge += 16;
  412.    new_gdg.ng_Width = 12 + 3*8;
  413.    new_gdg.ng_GadgetText = "Wait time:";
  414.    new_gdg.ng_GadgetID = GDG_WAITTIME;
  415.    if (!(time_gdg = gad = CreateGadget(INTEGER_KIND, gad, &new_gdg,
  416.         GTIN_Number,config.wait_time,  GTIN_MaxChars,2,  TAG_DONE)))
  417.       goto no_gad;
  418.  
  419.    new_gdg.ng_LeftEdge += 12 + 3*8;
  420.    new_gdg.ng_Width = 0;
  421.    new_gdg.ng_GadgetText = "seconds";
  422.    new_gdg.ng_GadgetID = 0;
  423.    new_gdg.ng_Flags = PLACETEXT_RIGHT;
  424.    if (!(gad = CreateGadget(TEXT_KIND, gad, &new_gdg, TAG_DONE)))
  425.       goto no_gad;
  426.  
  427.    new_gdg.ng_LeftEdge -= 12 + 3*8;
  428.    new_gdg.ng_TopEdge += 16;
  429.    new_gdg.ng_Width = 12 + 4*8;
  430.    new_gdg.ng_GadgetText = "Line len:";
  431.    new_gdg.ng_GadgetID = GDG_LINELEN;
  432.    new_gdg.ng_Flags = PLACETEXT_LEFT;
  433.    if (!(linelen_gdg = gad = CreateGadget(INTEGER_KIND, gad, &new_gdg,
  434.         GTIN_Number,config.line_length,  GTIN_MaxChars,3,  TAG_DONE)))
  435.       goto no_gad;
  436.  
  437.    new_gdg.ng_TopEdge += 20;
  438.    new_gdg.ng_LeftEdge -= 16;
  439.    new_gdg.ng_Width = 0;
  440.    new_gdg.ng_GadgetText = "Options:";
  441.    new_gdg.ng_GadgetID = 0;
  442.    if (!(gad = CreateGadget(TEXT_KIND, gad, &new_gdg, TAG_DONE)))
  443.       goto no_gad;
  444.  
  445.    new_gdg.ng_Width = 20;
  446.    new_gdg.ng_GadgetText = "use defines";
  447.    new_gdg.ng_GadgetID = GDG_USE_DEFINES;
  448.    new_gdg.ng_Flags = PLACETEXT_RIGHT;
  449.    if (!(gad = CreateGadget(CHECKBOX_KIND, gad, &new_gdg,
  450.         GTCB_Checked,config.use_defines,  TAG_DONE)))
  451.       goto no_gad;
  452.  
  453.    new_gdg.ng_TopEdge += 12;
  454.    new_gdg.ng_GadgetText = "expanded";
  455.    new_gdg.ng_GadgetID = GDG_EXPANDED;
  456.    if (!(gad = CreateGadget(CHECKBOX_KIND, gad, &new_gdg,
  457.         GTCB_Checked,config.expanded,  TAG_DONE)))
  458.       goto no_gad;
  459.  
  460.    new_gdg.ng_TopEdge += 20;
  461.    new_gdg.ng_LeftEdge = scr->WBorLeft + 38;
  462.    new_gdg.ng_Width = 80;
  463.    new_gdg.ng_GadgetText = "Gadgets";
  464.    new_gdg.ng_GadgetID = GDG_GADGETS;
  465.    new_gdg.ng_Flags = PLACETEXT_IN;
  466.    if (!(gad = CreateGadget(BUTTON_KIND, gad, &new_gdg, TAG_DONE)))
  467.       goto no_gad;
  468.  
  469.    new_gdg.ng_LeftEdge += 80+38;
  470.    new_gdg.ng_GadgetText = "Menus";
  471.    new_gdg.ng_GadgetID = GDG_MENUS;
  472.    if (!(gad = CreateGadget(BUTTON_KIND, gad, &new_gdg, TAG_DONE)))
  473.       goto no_gad;
  474.  
  475.    /*** init menus ***/
  476.    if (!(menu = CreateMenus(menu_data, GTMN_FullMenu,TRUE, TAG_DONE)))
  477.    {
  478.       UnlockPubScreen(NULL, scr);
  479.       close_all("Can`t create menus", 20);
  480.    }
  481.    if (!LayoutMenus(menu, vinfo, TAG_DONE))
  482.    {
  483.       UnlockPubScreen(NULL, scr);
  484.       close_all("Can`t layout menus", 20);
  485.    }
  486.  
  487.    /*** open window ***/
  488.    if (!(main_wd = OpenWindowTags(&newmain_wd, WA_Left,config.wd_x,
  489.         WA_Top,config.wd_y,  WA_InnerWidth,274,  WA_InnerHeight,105,
  490.         WA_AutoAdjust,TRUE,  TAG_DONE)))
  491.    {
  492.       UnlockPubScreen(NULL, scr);
  493.       close_all("Can`t open window", 20);
  494.    }
  495.  
  496.    UnlockPubScreen(NULL, scr);
  497.    GT_RefreshWindow(main_wd, NULL);
  498.    SetMenuStrip(main_wd, menu);
  499.    return;
  500.  
  501. no_gad:
  502.    UnlockPubScreen(NULL, scr);
  503.    close_all("Can`t create gadget", 20);
  504. }
  505.  
  506.  
  507. void main(int argc, char *argv[])
  508. {
  509.    if (argc == 0)
  510.       wbmsg = (struct WBStartup *)argv;
  511.    open_all();
  512.    load_config();
  513.    open_window();
  514.  
  515.    mainloop();
  516.  
  517.    close_all(NULL, 0);
  518. }
  519.  
  520.