home *** CD-ROM | disk | FTP | other *** search
/ Gold Fish 2 / goldfish_vol2_cd1.bin / files / util / cdity / runlist-reinert / source / runlistbig1.1.c < prev    next >
Encoding:
C/C++ Source or Header  |  1994-10-09  |  19.4 KB  |  681 lines

  1. /*
  2.  *  Source machine generated by GadToolsBox V2.0b
  3.  *  which is (c) Copyright 1991-1993 Jaba Development
  4.  *
  5.  *  GUI Designed by : -- Heinz Reinert --
  6.  */
  7.  
  8. #include <exec/types.h>
  9. #include <intuition/intuition.h>
  10. #include <intuition/classes.h>
  11. #include <intuition/classusr.h>
  12. #include <intuition/imageclass.h>
  13. #include <intuition/gadgetclass.h>
  14. #include <libraries/gadtools.h>
  15. #include <graphics/displayinfo.h>
  16. #include <graphics/gfxbase.h>
  17. #include <clib/exec_protos.h>
  18. #include <clib/intuition_protos.h>
  19. #include <clib/gadtools_protos.h>
  20. #include <clib/graphics_protos.h>
  21. #include <clib/utility_protos.h>
  22. #include <proto/intuition.h>
  23. #include <proto/graphics.h>
  24. #include <proto/exec.h>
  25. #include <proto/dos.h>
  26. #include <proto/gadtools.h>
  27. #include <exec/memory.h>
  28. #include <string.h>
  29.  
  30. /***********************************************/
  31.  
  32. #define GetString( g )      ((( struct StringInfo * )g->SpecialInfo )->Buffer  )
  33. #define GetNumber( g )      ((( struct StringInfo * )g->SpecialInfo )->LongInt )
  34.  
  35. #define GD_list                                0
  36. #define GD_gadtxt                              1
  37. #define GD_command                             2
  38. #define GD_command2                            3
  39. #define GD_new                                 4
  40. #define GD_del                                 5
  41. #define GD_start                               6
  42. #define GD_save                                7
  43. #define GD_req                                 8
  44. #define GD_Gadget90                            9
  45. #define GD_Gadget100                           10
  46.  
  47. #define GDX_list                               0
  48. #define GDX_gadtxt                             1
  49. #define GDX_command                            2
  50. #define GDX_command2                           3
  51. #define GDX_new                                4
  52. #define GDX_del                                5
  53. #define GDX_start                              6
  54. #define GDX_save                               7
  55. #define GDX_req                                8
  56. #define GDX_Gadget90                           9
  57. #define GDX_Gadget100                          10
  58.  
  59. #define Project0_CNT 11
  60.  
  61. UBYTE *vers = "\0$VER: RunListBig 1.1";
  62.  
  63. extern struct IntuitionBase *IntuitionBase;
  64. extern struct Library       *GadToolsBase;
  65.  
  66. extern struct Screen        *Scr;
  67. extern UBYTE                 *PubScreenName;
  68. extern APTR                  VisualInfo;
  69. extern struct Window        *Project0Wnd;
  70. extern struct Gadget        *Project0GList;
  71. extern struct Gadget        *Project0Gadgets[11];
  72. extern UWORD                 Project0Left;
  73. extern UWORD                 Project0Top;
  74. extern UWORD                 Project0Width;
  75. extern UWORD                 Project0Height;
  76. extern UBYTE                *Project0Wdt;
  77. extern struct TextAttr       topaz8;
  78. extern UWORD                 Project0GTypes[];
  79. extern struct NewGadget      Project0NGad[];
  80. extern ULONG                 Project0GTags[];
  81.  
  82.  
  83. extern int SetupScreen( void );
  84. extern void CloseDownScreen( void );
  85. extern int OpenProject0Window( void );
  86. extern void CloseProject0Window( void );
  87.  
  88. /***********************************************/
  89.  
  90. #define GetString( g )      ((( struct StringInfo * )g->SpecialInfo )->Buffer  )
  91. #define GetNumber( g )      ((( struct StringInfo * )g->SpecialInfo )->LongInt )
  92.  
  93. #define GD_list                                0
  94. #define GD_gadtxt                              1
  95. #define GD_command                             2
  96. #define GD_command2                            3
  97. #define GD_new                                 4
  98. #define GD_del                                 5
  99. #define GD_start                               6
  100. #define GD_save                                7
  101. #define GD_req                                 8
  102. #define GD_Gadget90                            9
  103. #define GD_Gadget100                           10
  104.  
  105. #define GDX_list                               0
  106. #define GDX_gadtxt                             1
  107. #define GDX_command                            2
  108. #define GDX_command2                           3
  109. #define GDX_new                                4
  110. #define GDX_del                                5
  111. #define GDX_start                              6
  112. #define GDX_save                               7
  113. #define GDX_req                                8
  114. #define GDX_Gadget90                           9
  115. #define GDX_Gadget100                          10
  116.  
  117. #define Project0_CNT 11
  118.  
  119. extern struct IntuitionBase *IntuitionBase;
  120. extern struct Library       *GadToolsBase;
  121.  
  122. extern struct Screen        *Scr;
  123. extern UBYTE                 *PubScreenName;
  124. extern APTR                  VisualInfo;
  125. extern struct Window        *Project0Wnd;
  126. extern struct Gadget        *Project0GList;
  127. extern struct Gadget        *Project0Gadgets[11];
  128. extern UWORD                 Project0Left;
  129. extern UWORD                 Project0Top;
  130. extern UWORD                 Project0Width;
  131. extern UWORD                 Project0Height;
  132. extern UBYTE                *Project0Wdt;
  133. extern struct TextAttr       topaz8;
  134. extern UWORD                 Project0GTypes[];
  135. extern struct NewGadget      Project0NGad[];
  136. extern ULONG                 Project0GTags[];
  137.  
  138.  
  139. extern int SetupScreen( void );
  140. extern void CloseDownScreen( void );
  141. extern int OpenProject0Window( void );
  142. extern void CloseProject0Window( void );
  143.  
  144. /***********************************************/
  145.  
  146. struct Screen         *Scr = NULL;
  147. UBYTE                 *PubScreenName = NULL;
  148. APTR                   VisualInfo = NULL;
  149. struct Window         *Project0Wnd = NULL;
  150. struct Gadget         *Project0GList = NULL;
  151. struct Gadget         *Project0Gadgets[11];
  152. UWORD                  Project0Left = 347;
  153. UWORD                  Project0Top = 10;
  154. UWORD                  Project0Width = 305;
  155. UWORD                  Project0Height = 0;
  156. UBYTE                 *Project0Wdt = (UBYTE *)">> RUN LIST B. v1.1 <<  ";
  157.  
  158. struct TextAttr topaz8 = {
  159.         ( STRPTR )"topaz.font", 8, 0x00, 0x01 };
  160.  
  161. UWORD Project0GTypes[] = {
  162.         LISTVIEW_KIND,
  163.         STRING_KIND,
  164.         STRING_KIND,
  165.         STRING_KIND,
  166.         BUTTON_KIND,
  167.         BUTTON_KIND,
  168.         BUTTON_KIND,
  169.         BUTTON_KIND,
  170.         BUTTON_KIND,
  171.         TEXT_KIND,
  172.         TEXT_KIND
  173. };
  174.  
  175. struct NewGadget Project0NGad[] = {
  176.         20, 9, 161, 152, NULL, NULL, GD_list, 0, NULL, NULL,
  177.         20, 159, 161, 12, NULL, NULL, GD_gadtxt, 0, NULL, NULL,
  178.         7, 184, 272, 12, NULL, NULL, GD_command, 0, NULL, NULL,
  179.         7, 196, 272, 12, NULL, NULL, GD_command2, 0, NULL, NULL,
  180.         184, 10, 78, 11, (UBYTE *)"NEW", NULL, GD_new, PLACETEXT_IN, NULL, NULL,
  181.         184, 25, 78, 11, (UBYTE *)"DELETE", NULL, GD_del, PLACETEXT_IN, NULL, NULL,
  182.         184, 70, 78, 101, (UBYTE *)"RUN", NULL, GD_start, PLACETEXT_IN, NULL, NULL,
  183.         184, 40, 78, 11, (UBYTE *)"SAVE", NULL, GD_save, PLACETEXT_IN, NULL, NULL,
  184.         184, 55, 78, 11, (UBYTE *)"REQUEST", NULL, GD_req, PLACETEXT_IN, NULL, NULL,
  185.         14, 6, 255, 169, NULL, NULL, GD_Gadget90, 0, NULL, NULL,
  186.         7, 3, 269, 177, NULL, NULL, GD_Gadget100, 0, NULL, NULL
  187. };
  188.  
  189. ULONG Project0GTags[] = {
  190.         (TAG_DONE),
  191.         (GTST_MaxChars), 256, (TAG_DONE),
  192.         (GTST_MaxChars), 256, (TAG_DONE),
  193.         (GTST_MaxChars), 256, (TAG_DONE),
  194.         (TAG_DONE),
  195.         (TAG_DONE),
  196.         (TAG_DONE),
  197.         (TAG_DONE),
  198.         (TAG_DONE),
  199.         (GTTX_Border), TRUE, (TAG_DONE),
  200.         (GTTX_Border), TRUE, (TAG_DONE)
  201. };
  202.  
  203. int SetupScreen( void )
  204. {
  205.         if ( ! ( Scr = LockPubScreen( PubScreenName )))
  206.                 return( 1L );
  207.  
  208.         if ( ! ( VisualInfo = GetVisualInfo( Scr, TAG_DONE )))
  209.                 return( 2L );
  210.  
  211.         return( 0L );
  212. }
  213.  
  214. void CloseDownScreen( void )
  215. {
  216.         if ( VisualInfo ) {
  217.                 FreeVisualInfo( VisualInfo );
  218.                 VisualInfo = NULL;
  219.         }
  220.  
  221.         if ( Scr        ) {
  222.                 UnlockPubScreen( NULL, Scr );
  223.                 Scr = NULL;
  224.         }
  225. }
  226.  
  227. int OpenProject0Window( void )
  228. {
  229.         struct NewGadget        ng;
  230.         struct Gadget   *g;
  231.         UWORD           lc, tc;
  232.         UWORD           offx = Scr->WBorLeft, offy = Scr->WBorTop + Scr->RastPort.TxHeight + 1;
  233.  
  234.         if ( ! ( g = CreateContext( &Project0GList )))
  235.                 return( 1L );
  236.  
  237.         for( lc = 0, tc = 0; lc < Project0_CNT; lc++ ) {
  238.  
  239.                 CopyMem((char * )&Project0NGad[ lc ], (char * )&ng, (long)sizeof( struct NewGadget ));
  240.  
  241.                 ng.ng_VisualInfo = VisualInfo;
  242.                 ng.ng_TextAttr   = &topaz8;
  243.                 ng.ng_LeftEdge  += offx;
  244.                 ng.ng_TopEdge   += offy;
  245.  
  246.                 Project0Gadgets[ lc ] = g = CreateGadgetA((ULONG)Project0GTypes[ lc ], g, &ng, ( struct TagItem * )&Project0GTags[ tc ] );
  247.  
  248.                 while( Project0GTags[ tc ] ) tc += 2;
  249.                 tc++;
  250.  
  251.                 if ( NOT g )
  252.                         return( 2L );
  253.         }
  254.  
  255.         if ( ! ( Project0Wnd = OpenWindowTags( NULL,
  256.                                 WA_Left,        Project0Left,
  257.                                 WA_Top,         Project0Top,
  258.                                 WA_Width,       Project0Width,
  259.                                 WA_Height,      Project0Height + offy,
  260.                                 WA_IDCMP,       LISTVIEWIDCMP|
  261.                                                 STRINGIDCMP|
  262.                                                 BUTTONIDCMP|
  263.                                                 TEXTIDCMP|
  264.                                                 IDCMP_CLOSEWINDOW|
  265.                                                 IDCMP_NEWSIZE|
  266.                                                 IDCMP_SIZEVERIFY|
  267.                                                 IDCMP_REFRESHWINDOW,
  268.                                 WA_Flags,       WFLG_SIZEGADGET|
  269.                                                 WFLG_DRAGBAR|
  270.                                                 WFLG_DEPTHGADGET|
  271.                                                 WFLG_CLOSEGADGET|
  272.                                                 WFLG_SMART_REFRESH,
  273.                                 WA_Gadgets,     Project0GList,
  274.                                 WA_Title,       Project0Wdt,
  275.                                 WA_ScreenTitle, "RunList by Heinz Reinert 1994",
  276.                                 WA_PubScreen,   Scr,
  277.                                 WA_MinWidth,    305,
  278.                                 WA_MinHeight,   224,
  279.                                 WA_MaxWidth,    305,
  280.                                 WA_MaxHeight,   224,
  281.                                 TAG_DONE )))
  282.         return( 4L );
  283.  
  284.         GT_RefreshWindow( Project0Wnd, NULL );
  285.  
  286.         return( 0L );
  287. }
  288.  
  289. void CloseProject0Window( void )
  290. {
  291.         if ( Project0Wnd        ) {
  292.                 CloseWindow( Project0Wnd );
  293.                 Project0Wnd = NULL;
  294.         }
  295.  
  296.         if ( Project0GList      ) {
  297.                 FreeGadgets( Project0GList );
  298.                 Project0GList = NULL;
  299.         }
  300. }
  301.  
  302. /***************************************/
  303.  
  304. /* Main Program Part */
  305.  
  306. /* Structur for Data-Entries */
  307.  
  308. struct PRJ {
  309.  
  310.     char    Name[0];
  311.  
  312.     char    gadtxt[20];
  313.     char    command[75];
  314.     char    command2[75];
  315.     USHORT  new;
  316.     USHORT  del;
  317.     USHORT  save;
  318.     USHORT  req;
  319.     USHORT  start;
  320. };
  321.  
  322. struct PRJnode {
  323.         struct  Node n;
  324.         struct  PRJ d;
  325. };
  326.  
  327. /* PRJ-Nodes are in this List */
  328.  
  329. struct List prjlist;
  330.  
  331. /* The actual Entry */
  332.  
  333. struct PRJnode *currentprj;
  334.  
  335. /* String-Gadgets */
  336.  
  337. void gt_SetString( struct Gadget        *gad,
  338.                                    struct Window        *w,
  339.                                    char                         *string )
  340. {
  341.         GT_SetGadgetAttrs( gad, w, NULL, GTST_String, string, TAG_DONE );
  342. }
  343.  
  344. char * gt_GetString( struct Gadget      *gad )
  345. {
  346.         struct StringInfo *si = gad->SpecialInfo;
  347.  
  348.         if( si )
  349.                 return( ( char * ) si->Buffer );
  350.         else
  351.                 return( NULL );
  352. }
  353.  
  354. /* Manage Lists for Listview-Gadgets */
  355. /* Add List */
  356.  
  357. void gt_AttachList(     struct Gadget   *lv,
  358.                                         struct Window   *w,
  359.                                         struct List     *list )
  360. {
  361.         GT_SetGadgetAttrs( lv, w, NULL, GTLV_Labels, list, TAG_DONE );
  362. }
  363.  
  364. /* Put Actuel Entry */
  365.  
  366. void gt_SetLV( struct Gadget    *gad,
  367.                            struct Window        *w,
  368.                            ULONG                        value)
  369. {
  370.         GT_SetGadgetAttrs( gad, w, NULL, GTLV_Selected, value, TAG_DONE );
  371. }
  372.  
  373. /* get x-Entry from Exec-List */
  374.  
  375. struct Node * gt_GetListEntry( struct List *l,
  376.                                                            int num )
  377. {
  378.         int count = 0;
  379.         struct Node *n = l->lh_Head;
  380.  
  381.         while( n->ln_Succ )
  382.         {
  383.                 if( num==count ) return( n );
  384.                 n = n->ln_Succ;
  385.                 count++;
  386.         }
  387.         return( NULL );
  388. }
  389.  
  390. /* Number of a Node in List? */
  391.  
  392. int gt_GetListEntryNum( struct List *l,
  393.                                                 struct Node *n )
  394. {
  395.         int count = 0;
  396.         struct Node *r = l->lh_Head;
  397.  
  398.         while( r->ln_Succ )
  399.         {
  400.                 if( r==n ) return( count );
  401.                 r = r->ln_Succ;
  402.                 count++;
  403.         }
  404.         return( -1 );
  405. }
  406.  
  407. /* Count Entries of List */
  408.  
  409. int gt_GetListNumEntries( struct List *l )
  410. {
  411.         int count = 0;
  412.         struct Node *n = l->lh_Head;
  413.  
  414.         while( n->ln_Succ )
  415.         {
  416.                 n = n->ln_Succ;
  417.                 count++;
  418.         }
  419.  
  420.         return( count );
  421. }
  422.  
  423. /************************************************************************/
  424.  
  425. /* Load Command.DAT */
  426.  
  427. void loadprjlist( void )
  428. {
  429.         struct PRJ new;
  430.         struct PRJnode *n;
  431.         BPTR f;
  432.  
  433.         /* Init List */
  434.         NewList( &prjlist );
  435.         currentprj = NULL;
  436.  
  437.         /* Open Command.DAT */
  438.         f = Open( "S:Command.DAT", MODE_OLDFILE );
  439.         if( !f )
  440.                 return;
  441.  
  442.         /* Inputs read in */
  443.         while( Read( f, &new, sizeof( new ) ) == sizeof( new ) )
  444.         {
  445.                /* New Node */
  446.                 n = AllocVec( sizeof( *n ), 0 );
  447.                 if( !n )
  448.                         break;
  449.  
  450.         /* Copy Structur and add to List */
  451.                 n->d = new;
  452.                 n->n.ln_Name = n->d.Name;
  453.                 n->n.ln_Pri      = - n->d.Name[0];
  454.                 Enqueue( &prjlist, (struct Node *) n );
  455.         }
  456.  
  457.         Close( f );
  458. }
  459.  
  460. /* Saves List and Frees it */
  461. void save_and_freeprjlist( void )
  462. {
  463.         struct PRJnode *n;
  464.         BPTR f;
  465.  
  466.         f = Open( "S:Command.DAT", MODE_NEWFILE );
  467.  
  468.         while( ( n = (struct PRJnode * ) RemHead( &prjlist ) ) )
  469.         {
  470.             /* Save Node */
  471.                 if( f )
  472.                         Write( f, &n->d, sizeof( struct PRJ ) );
  473.             /* Free Node */
  474.                 FreeVec( n );
  475.         }
  476.  
  477.         if( f )
  478.                 Close( f );
  479. }
  480.  
  481.  
  482. /************************************************************************/
  483.  
  484. /* Puts actual Structur-Values to Gadgets */
  485.  
  486. void setgadvals( void )
  487. {
  488.  
  489.         if( !currentprj )
  490.             return;
  491.  
  492.         gt_SetString(   Project0Gadgets[ GD_gadtxt ], Project0Wnd,
  493.                                                        currentprj->d.Name );
  494.  
  495.         gt_SetString(   Project0Gadgets[ GD_command ], Project0Wnd,
  496.                                                     currentprj->d.command );
  497.  
  498.         gt_SetString(   Project0Gadgets[ GD_command2 ], Project0Wnd,
  499.                                                     currentprj->d.command2 );
  500.  
  501. }
  502.  
  503. /* Create a new Empty Input */
  504.  
  505. void newprj( void )
  506. {
  507.         struct PRJnode *new;
  508.  
  509.         new = AllocVec( sizeof( *new ), MEMF_CLEAR );
  510.  
  511.         if( !new )
  512.                 return;
  513.  
  514.         currentprj = new;
  515.  
  516.         new->n.ln_Name = new->d.Name;
  517.  
  518.         strcpy( new->d.Name, "new" );
  519.  
  520.         gt_AttachList( Project0Gadgets[GD_list], Project0Wnd,
  521.                                                       (struct List *) ~0 );
  522.  
  523.         new->n.ln_Pri    = - new->d.Name[0];
  524.         Enqueue( &prjlist, (struct Node *) new );
  525.  
  526.         gt_AttachList( Project0Gadgets[GD_list], Project0Wnd, &prjlist );
  527.  
  528.         gt_SetLV( Project0Gadgets[GD_list], Project0Wnd,
  529.                                      gt_GetListEntryNum( &prjlist, new ) );
  530.         setgadvals();
  531. }
  532.  
  533. /* Work on Gadget-Event */
  534. void dogadup( struct IntuiMessage *im )
  535. {
  536.         struct Gadget *g = im->IAddress;
  537.  
  538.         switch( g->GadgetID )
  539.         {
  540.  
  541. /*** Enter List ***/
  542. case GD_list:
  543.         currentprj = (struct PRJnode *) gt_GetListEntry( &prjlist, im->Code );
  544.         setgadvals();
  545.         break;
  546.  
  547. /*** New ***/
  548. case GD_new:
  549.         newprj();
  550.         break;
  551.  
  552. /*** Delete ***/
  553. case GD_del:
  554.         if( currentprj )
  555.         {
  556.         gt_AttachList( Project0Gadgets[ GD_list ], Project0Wnd,
  557.                                                        (struct List *) ~0 );
  558.         Remove( currentprj );
  559.         FreeVec( currentprj );
  560.         currentprj = FALSE;
  561.         gt_AttachList( Project0Gadgets[ GD_list ], Project0Wnd, &prjlist );
  562.         gt_SetLV( Project0Gadgets[ GD_list ], Project0Wnd, ~0 );
  563.         }
  564.         break;
  565. /*** Program Name ***/
  566. case GD_gadtxt:
  567.         if( currentprj )
  568.         {
  569.         gt_AttachList( Project0Gadgets[ GD_list ], Project0Wnd,
  570.                                                          (struct List *) ~0 );
  571.    strcpy( currentprj->d.Name, gt_GetString( Project0Gadgets[ GD_gadtxt ] ) );
  572.         gt_AttachList( Project0Gadgets[ GD_list ], Project0Wnd, &prjlist );
  573.         }
  574.         break;
  575.  
  576. /*** Command-string ***/
  577. case GD_command:
  578.         if( currentprj )
  579.         strcpy( currentprj->d.command,
  580.                              gt_GetString( Project0Gadgets[ GD_command ] ) );
  581.         break;
  582.  
  583. /*** Command-string ***/
  584. case GD_command2:
  585.         if( currentprj )
  586.         strcpy( currentprj->d.command2,
  587.                              gt_GetString( Project0Gadgets[ GD_command2 ] ) );
  588.         break;
  589.  
  590. /*** Start Program ***/
  591. case GD_start:
  592.         Execute(currentprj->d.command, NULL, Output());
  593.         Execute("WAIT 2 secs ", NULL, Output());
  594.         Execute(currentprj->d.command2, NULL, Output());
  595.         break;
  596.  
  597. /*** Save List ***/
  598. case GD_save:
  599.         {
  600.             save_and_freeprjlist();
  601.             loadprjlist();
  602.         }
  603.         break;
  604.  
  605. /*** Requester ***/
  606. case GD_req:
  607.            Execute("RUN >NIL: Shellwin", NULL, Output());
  608.         break;
  609.         }
  610. }
  611.  
  612. /* Program start */
  613.  
  614. int main( void )
  615. {
  616.  
  617.         struct IntuiMessage     *im,imsg;
  618.         BOOL   Done = FALSE;
  619.  
  620.         /*** Open Screen and Window ***/
  621.         SetupScreen();
  622.         OpenProject0Window();
  623.  
  624.         /*** Load List ***/
  625.         loadprjlist();
  626.  
  627.         /*** Show List ***/
  628.         gt_AttachList( Project0Gadgets[GD_list], Project0Wnd, &prjlist );
  629.  
  630.         /*** Main Loop ***/
  631.         while( !Done )
  632.         {
  633.                 /*** Wait for IntuiMessage ***/
  634.  
  635.                 while( !( im=GT_GetIMsg( Project0Wnd->UserPort ) ) )
  636.                         WaitPort( Project0Wnd->UserPort );
  637.  
  638.                 /*** Copy ***/
  639.                 imsg = *im;
  640.                 GT_ReplyIMsg( im );
  641.  
  642.                 switch( imsg.Class )
  643.                 {
  644.             /*** CLOSEWINDOW: Close Window ***/
  645.                         case IDCMP_CLOSEWINDOW:
  646.                                 Done = TRUE;
  647.                                 break;
  648.  
  649.             /*** Gadgetup; Gadget selected ***/
  650.                         case GADGETUP:
  651.                                 dogadup( &imsg );
  652.                                 break;
  653.  
  654.             /*** REFRESH: Graphicobjects (Boxen) redraw ***/
  655.                         case IDCMP_REFRESHWINDOW:
  656.                                 GT_BeginRefresh( Project0Wnd );
  657.                                 GT_EndRefresh( Project0Wnd, TRUE );
  658.                                 break;
  659.  
  660.                 }
  661.  
  662.         }
  663.  
  664.         /*** Close Window and Screen ***/
  665.         CloseProject0Window();
  666.         CloseDownScreen();
  667.  
  668.         /*** Save List ***/
  669.         save_and_freeprjlist();
  670.  
  671.         return(0);
  672. }
  673.  
  674.  
  675.  
  676.  
  677.  
  678.  
  679.  
  680.  
  681.