home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 5 Edit / 05-Edit.zip / flist.zip / menu.c < prev    next >
C/C++ Source or Header  |  1996-09-02  |  20KB  |  667 lines

  1. /*
  2. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  3.  menu.c
  4.  
  5.  'Fast List' menu and command controls
  6. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  7. */
  8. #define INCL_PM
  9. #define INCL_BASE
  10. #include <os2.h>
  11. #include <stdio.h>
  12. #include <stdlib.h>
  13. #include <string.h>
  14. #include <process.h>
  15. #include <ctype.h>
  16. #include "list.h"
  17. #include "flwin.h"
  18. #include "menu.h"
  19. #include "res.h"
  20. #include "util.h"
  21.  
  22. /*--------------------------------Macros----------------------------------*/
  23. #define FNEXT 0
  24. #define FPREV 1
  25.  
  26. /*-------------------------Structs and Typedefs----------------------------*/
  27.  
  28. /*------------------------Function Declarations---------------------------*/
  29. static void CmdAppendFile( WNDATTR * );
  30. static void CmdSaveAs( WNDATTR * );
  31. static void CmdCopy( WNDATTR * );
  32. static void CmdPaste( WNDATTR * );
  33. static void CmdUnmark( WNDATTR * );
  34. static void CmdAccum( WNDATTR * );
  35. static void CmdFind( WNDATTR * );
  36. static void CmdMarkFind( WNDATTR * );
  37. static void CmdMate( WNDATTR * );
  38. static void CmdSpawn( WNDATTR * );
  39. static void CmdQuit( WNDATTR * );
  40.  
  41. static MRESULT EXPENTRY FindWndProc( HWND, ULONG, MPARAM, MPARAM );
  42. static MRESULT EXPENTRY AboutWndProc( HWND, ULONG, MPARAM, MPARAM );
  43. static MRESULT EXPENTRY MateWndProc( HWND, ULONG, MPARAM, MPARAM );
  44.  
  45. static int  FindIt( LPLIST *, LPELEM*, int );
  46. static void MoveToMark( WNDATTR*, int );
  47.  
  48. static void SetAttr( USHORT, USHORT, BOOL );
  49.  
  50. /*------------------------------Globals-----------------------------------*/
  51. static HWND   Popup;
  52.  
  53. static struct {
  54.    char text[40];
  55.    int  sense;
  56. }FindDat;
  57.  
  58. static PFNWP  OldWndProc;
  59.  
  60. /* These are shared with flist.c */
  61. HWND MateScrollWnd;
  62. FILEDLG FileDlg;
  63.  
  64. extern char **_argv;
  65.  
  66. /*-------------------------------------------------------------------------
  67.                               CreatePopup
  68. --------------------------------------------------------------------------*/
  69. void CreatePopup( HAB hab, HWND client, HWND frame )
  70. {
  71.  HACCEL haccel;
  72.  
  73.    if (Popup != NULLHANDLE)
  74.       DestroyPopup();
  75.  
  76.    Popup = WinLoadMenu( client,
  77.                         NULL,
  78.                         ID_POPUP );
  79.  
  80.    haccel = WinLoadAccelTable( hab, NULLHANDLE, ID_ACCEL );
  81.    WinSetAccelTable( hab, haccel, frame );
  82.  
  83.    return;
  84. }
  85. /*-------------------------------------------------------------------------
  86.                               DestroyPopup
  87. --------------------------------------------------------------------------*/
  88. void DestroyPopup()
  89. {
  90.   WinDestroyWindow( Popup );
  91.   Popup = NULLHANDLE;
  92.   return;
  93. }
  94. /*-------------------------------------------------------------------------
  95.                             ActMsgContextMenu
  96. --------------------------------------------------------------------------*/
  97. MRESULT ActMsgContextMenu( WNDATTR *wndattr, USHORT x, USHORT y )
  98. {
  99.  BOOL state;
  100.  
  101.    if (Popup == NULLHANDLE)
  102.       return MRFROMSHORT( TRUE );
  103.  
  104.    if (MateScrollWnd != NULLHANDLE) {
  105.       if (WinIsWindow( wndattr->hab, MateScrollWnd ) == FALSE)
  106.          MateScrollWnd = NULLHANDLE;
  107.    }
  108.  
  109.    state = (LPListMarkedLines( wndattr->list ) == 0);
  110.    SetAttr( CMD_COPY, MIA_DISABLED, state );
  111.    SetAttr( CMD_UNMARK, MIA_DISABLED, state );
  112.    SetAttr( CMD_REARRANGE, MIA_DISABLED, state );
  113.  
  114.    WinOpenClipbrd( wndattr->hab );
  115.    state = (WinQueryClipbrdData( wndattr->hab, CF_TEXT ) == 0);
  116.    WinCloseClipbrd( wndattr->hab );
  117.    SetAttr( CMD_PASTE, MIA_DISABLED, state );
  118.  
  119.    state = (WinQueryClipbrdViewer( wndattr->hab ) == wndattr->Client);
  120.    SetAttr( CMD_ACCUM, MIA_CHECKED, state );
  121.  
  122.    state = (MateScrollWnd != NULLHANDLE);
  123.    SetAttr( CMD_MATE, MIA_CHECKED, state );
  124.  
  125.    WinPopupMenu( wndattr->Frame,
  126.                  wndattr->Frame,
  127.                  Popup,
  128.                  x, y, CMD_ABOUT,
  129.                  PU_HCONSTRAIN | PU_VCONSTRAIN | PU_POSITIONONITEM |
  130.                  PU_KEYBOARD | PU_MOUSEBUTTON1 | PU_MOUSEBUTTON2 );
  131.  
  132.    return MRFROMSHORT( FALSE );
  133. }
  134.  
  135. /*-------------------------------------------------------------------------
  136.                               ActMsgCommand
  137. --------------------------------------------------------------------------*/
  138. MRESULT ActMsgCommand( WNDATTR *wndattr, MPARAM mp1, MPARAM mp2 )
  139. {
  140.  USHORT cmd;
  141.  int    offset;
  142.  
  143.    cmd = SHORT1FROMMP( mp1 );
  144.  
  145.    switch (cmd) {
  146.       case CMD_APPEND:
  147.          CmdAppendFile( wndattr );
  148.          break;
  149.       case CMD_SAVE:
  150.          CmdSaveAs( wndattr );
  151.          break;
  152.       case CMD_COPY:
  153.          CmdCopy( wndattr );
  154.          break;
  155.       case CMD_PASTE:
  156.          CmdPaste( wndattr );
  157.          break;
  158.       case CMD_UNMARK:
  159.          CmdUnmark( wndattr );
  160.          break;
  161.       case CMD_REARRANGE:
  162.          CmdRearrange( wndattr );
  163.          break;
  164.       case CMD_ABOUT:
  165.          CmdAbout( wndattr );
  166.          break;
  167.       case CMD_ACCUM:
  168.          CmdAccum( wndattr );
  169.          break;
  170.       case CMD_FIND:
  171.          CmdFind( wndattr );
  172.          break;
  173.       case CMD_MARKFIND:
  174.          CmdMarkFind( wndattr );
  175.          break;
  176.       case CMD_FINDNEXT:
  177.          offset = FindIt( wndattr->list, wndattr->current, FNEXT );
  178.          CorrectScroll( wndattr, offset );
  179.          break;
  180.       case CMD_FINDPREV:
  181.          offset = FindIt( wndattr->list, wndattr->current, FPREV );
  182.          CorrectScroll( wndattr, offset );
  183.          break;
  184.       case CMD_NEXTMARK:
  185.          MoveToMark( wndattr, FNEXT );
  186.          break;
  187.       case CMD_PREVMARK:
  188.          MoveToMark( wndattr, FPREV );
  189.          break;
  190.       case CMD_MATE:
  191.          CmdMate( wndattr );
  192.          break;
  193.       case CMD_SPAWN:
  194.          CmdSpawn( wndattr );
  195.          break;
  196.       case CMD_QUIT:
  197.          CmdQuit( wndattr );
  198.          break;
  199.       default:
  200.          return MRFROMSHORT( TRUE );
  201.          break;
  202.    }
  203.  
  204.    return MRFROMSHORT( FALSE );
  205. }
  206.  
  207. /*---------------------------------------------------------------------------
  208.                                   SetAttr
  209. ---------------------------------------------------------------------------*/
  210. void SetAttr( USHORT id, USHORT attr, BOOL value )
  211. {
  212.  USHORT setval;
  213.  
  214.    setval = value ? attr : 0;
  215.  
  216.    WinSendMsg( Popup, MM_SETITEMATTR,
  217.                MPFROM2SHORT( id, TRUE ),
  218.                MPFROM2SHORT( attr, setval ) );
  219.  
  220.    return;
  221. }
  222.  
  223. /*---------------------------------------------------------------------------
  224.                                CmdAppendFile
  225. ---------------------------------------------------------------------------*/
  226. void CmdAppendFile( WNDATTR *wndattr )
  227. {
  228.  char *filename;
  229.  
  230.  
  231.    FileDlg.cbSize = sizeof( FILEDLG );
  232.    FileDlg.fl = FDS_CENTER | FDS_OPEN_DIALOG;
  233.  
  234.    WinFileDlg( HWND_DESKTOP, wndattr->Client, &FileDlg );
  235.  
  236.    filename = FileDlg.szFullFile;
  237.    if (FileDlg.lReturn == DID_OK) {
  238.       if (*filename != '\0') {
  239.          AppendFile( wndattr, filename, TRUE, NULLHANDLE );
  240.       }
  241.    }
  242.  
  243.    return;
  244. }
  245.  
  246. /*---------------------------------------------------------------------------
  247.                                  CmdSaveAs
  248. ---------------------------------------------------------------------------*/
  249. void CmdSaveAs( WNDATTR *wndattr )
  250. {
  251.  char *filename;
  252.  
  253.    FileDlg.cbSize = sizeof( FILEDLG );
  254.    FileDlg.fl = FDS_CENTER | FDS_SAVEAS_DIALOG | FDS_ENABLEFILELB;
  255.  
  256.    WinFileDlg( HWND_DESKTOP, wndattr->Client, &FileDlg );
  257.  
  258.    filename = &( FileDlg.szFullFile );
  259.    if (*filename == '\0' || FileDlg.lReturn != DID_OK)
  260.       return;
  261.  
  262.    SaveList( filename, wndattr->list, FALSE, TRUE );
  263.  
  264.    return;
  265. }
  266. /*---------------------------------------------------------------------------
  267.                                   CmdCopy
  268. ---------------------------------------------------------------------------*/
  269. void CmdCopy( WNDATTR *wndattr )
  270. {
  271.  LPELEM *elem;
  272.  ULONG   length;
  273.  void   *text;
  274.  
  275.    length = 0;
  276.    elem = wndattr->list->nextmk;
  277.    while (elem != wndattr->list) {
  278.       length += strlen( elem->data );
  279.       elem = elem->nextmk;
  280.    }
  281.    if (length == 0)
  282.       return;
  283.  
  284.    DosAllocSharedMem( &text, NULL, length,
  285.                       PAG_COMMIT | OBJ_GIVEABLE | PAG_WRITE );
  286.    elem = wndattr->list->next;
  287.    while (elem != wndattr->list) {
  288.       if (elem->nextmk != NULL) {
  289.          strcat( text, elem->data );
  290.          strcat( text, "\r\n" );
  291.       };
  292.       elem = elem->next;
  293.    }
  294.  
  295.    WinOpenClipbrd( wndattr->hab );
  296.    WinSetClipbrdData( wndattr->hab, ( ULONG )text, CF_TEXT, CFI_POINTER );
  297.    WinCloseClipbrd( wndattr->hab );
  298.  
  299.    return;
  300. }
  301. /*---------------------------------------------------------------------------
  302.                                   CmdPaste
  303. ---------------------------------------------------------------------------*/
  304. void CmdPaste( WNDATTR *wndattr )
  305. {
  306.    PasteFromClipboard( wndattr->hab, wndattr->Client );
  307.  
  308.    return;
  309. }
  310.  
  311. /*---------------------------------------------------------------------------
  312.                                   CmdUnmark
  313. ---------------------------------------------------------------------------*/
  314. void CmdUnmark( WNDATTR *wndattr )
  315. {
  316.  LPLIST *list;
  317.  
  318.   list = wndattr->list;
  319.   while (list->nextmk != list) {
  320.      LPElemUnmark( list, list->nextmk );
  321.   }
  322.  
  323.   WinInvalidateRect( wndattr->Client, NULL, TRUE );
  324.  
  325.   return;
  326. }
  327. /*---------------------------------------------------------------------------
  328.                                 CmdRearrange
  329. ---------------------------------------------------------------------------*/
  330. void CmdRearrange( WNDATTR *wndattr )
  331. {
  332.  LPELEM *elem, *mark;
  333.  
  334.   elem = wndattr->list->next;
  335.   mark = wndattr->list->nextmk;
  336.  
  337.   while (elem != wndattr->list) {
  338.      if (elem->nextmk != NULL) {
  339.         LPElemExchange( wndattr->list, elem, mark );
  340.         elem = mark;
  341.         mark = mark->nextmk;
  342.      }
  343.      elem = elem->next;
  344.   }
  345.  
  346.   wndattr->current = LPElemTrack( wndattr->list,
  347.                                   wndattr->list,
  348.                                   wndattr->scrollpos );
  349.  
  350.   WinInvalidateRect( wndattr->Client, NULL, TRUE );
  351.  
  352.   return;
  353. }
  354. /*---------------------------------------------------------------------------
  355.                                   CmdAbout
  356. ---------------------------------------------------------------------------*/
  357. void CmdAbout( WNDATTR *wndattr )
  358. {
  359.      WinDlgBox( HWND_DESKTOP,
  360.                 wndattr->Client,
  361.                 AboutWndProc,
  362.                 NULLHANDLE,
  363.                 ID_ABOUTDLG,
  364.                 NULL );
  365.  return;
  366. }
  367. /*---------------------------------------------------------------------------
  368.                                 AboutWndProc
  369. ---------------------------------------------------------------------------*/
  370. MRESULT EXPENTRY AboutWndProc( HWND wnd, ULONG msg, MPARAM mp1, MPARAM mp2 )
  371. {
  372.  WNDATTR *wndattr;
  373.  MRESULT  MRes;
  374.  HWND     frame, client;
  375.  char     number[10];
  376.  
  377.    switch (msg) {
  378.      case WM_INITDLG:
  379.            PositionDialog( wnd );
  380.  
  381.            frame = WinQueryWindow( wnd, QW_OWNER );
  382.            client = WinWindowFromID( frame, FID_CLIENT );
  383.            wndattr = (WNDATTR*)WinQueryWindowPtr( client, QWL_USER );
  384.  
  385.            ltoa( LPListLines( wndattr->list ), number, 10 );
  386.            WinSetDlgItemText( wnd, ID_LINES, number );
  387.            ltoa( LPListMarkedLines( wndattr->list ), number, 10 );
  388.            WinSetDlgItemText( wnd, ID_MARKED, number );
  389.            ltoa( LPListMaxLines( wndattr->list ), number, 10 );
  390.            WinSetDlgItemText( wnd, ID_MAXLINES, number );
  391.            ltoa( LPListMaxLen( wndattr->list ), number, 10 );
  392.            WinSetDlgItemText( wnd, ID_MAXLENGTH, number );
  393.  
  394.            break;
  395.      default:
  396.         MRes = WinDefDlgProc( wnd, msg, mp1, mp2 );
  397.         break;
  398.    }
  399.  
  400.   return MRes;
  401. }
  402.  
  403. /*---------------------------------------------------------------------------
  404.                                   CmdAccum
  405. ---------------------------------------------------------------------------*/
  406. void CmdAccum( WNDATTR *wndattr )
  407. {
  408.  MRESULT mres;
  409.  HWND    wnd;
  410.  USHORT  state;
  411.  
  412.    mres = WinSendMsg( Popup,
  413.                       MM_QUERYITEMATTR,
  414.                       MPFROMSHORT( CMD_ACCUM ),
  415.                       MPFROMSHORT( MIA_CHECKED ) );
  416.  
  417.    state = SHORT1FROMMR( mres );
  418.  
  419.    if (state != MIA_CHECKED)
  420.       wnd = wndattr->Client;
  421.    else
  422.       wnd = NULLHANDLE;
  423.  
  424.    WinOpenClipbrd( wndattr->hab );
  425.    WinSetClipbrdViewer( wndattr->hab, wnd );
  426.    WinCloseClipbrd( wndattr->hab );
  427.  
  428.    return;
  429. }
  430.  
  431. /*---------------------------------------------------------------------------
  432.                                   CmdFind
  433. ---------------------------------------------------------------------------*/
  434. void CmdFind( WNDATTR *wndattr )
  435. {
  436.  int offset;
  437.  
  438.     WinDlgBox( HWND_DESKTOP,
  439.                wndattr->Client,
  440.                FindWndProc,
  441.                NULLHANDLE,
  442.                ID_FINDDLG,
  443.                NULL );
  444.  
  445.     if (strlen( FindDat.text )) {
  446.         offset = FindIt( wndattr->list, wndattr->current, FNEXT );
  447.         CorrectScroll( wndattr, offset );
  448.     }
  449.  
  450.  return;
  451. }
  452. /*---------------------------------------------------------------------------
  453.                                CmdMarkFind
  454. ---------------------------------------------------------------------------*/
  455. void CmdMarkFind( WNDATTR *wndattr )
  456. {
  457.  LPELEM *current;
  458.  int     offset;
  459.  
  460.     WinDlgBox( HWND_DESKTOP,
  461.                wndattr->Client,
  462.                FindWndProc,
  463.                NULLHANDLE,
  464.                ID_FINDDLG,
  465.                NULL );
  466.  
  467.     if (strlen( FindDat.text )) {
  468.         current = wndattr->list;
  469.         offset = FindIt( wndattr->list, current, FNEXT );
  470.         while (offset) {
  471.             current = LPElemTrack( wndattr->list, current, offset );
  472.             if (current != wndattr->list)
  473.                LPElemMark( wndattr->list, current );
  474.             offset = FindIt( wndattr->list, current, FNEXT );
  475.         }
  476.         WinInvalidateRect( wndattr->Client, NULL, TRUE );
  477.     }
  478.  
  479.  return;
  480. }
  481. /*---------------------------------------------------------------------------
  482.                                 FindWndProc
  483. ---------------------------------------------------------------------------*/
  484. MRESULT EXPENTRY FindWndProc( HWND wnd, ULONG msg, MPARAM mp1, MPARAM mp2 )
  485. {
  486.  MRESULT  MRes;
  487.  HWND     entryfield;
  488.  
  489.    switch (msg) {
  490.      case WM_INITDLG:
  491.            PositionDialog( wnd );
  492.            entryfield = WinWindowFromID( wnd, ID_FINDENTRY );
  493.            WinSendMsg( entryfield, EM_SETTEXTLIMIT,
  494.                        MPFROMSHORT( sizeof FindDat.text - 1 ), 0 );
  495.            WinSetDlgItemText( wnd, ID_FINDENTRY, FindDat.text );
  496.            WinSendMsg( entryfield, EM_SETSEL,
  497.                        MPFROM2SHORT( 0, sizeof FindDat.text ), 0 );
  498.            MRes = MRFROMSHORT( FALSE );
  499.            break;
  500.      case WM_CHAR:
  501.         if (SHORT2FROMMP( mp2 ) == VK_NEWLINE) {
  502.            WinQueryDlgItemText( wnd,
  503.                                 ID_FINDENTRY,
  504.                                 sizeof FindDat.text - 1,
  505.                                 FindDat.text );
  506.            FindDat.sense = WinQueryButtonCheckstate( wnd, ID_FINDCHECK );
  507.            WinDismissDlg( wnd, 0 );
  508.         }
  509.      default:
  510.         MRes = WinDefDlgProc( wnd, msg, mp1, mp2 );
  511.         break;
  512.    }
  513.  
  514.   return MRes;
  515. }
  516.  
  517. /*---------------------------------------------------------------------------
  518.                                   FindIt
  519. ---------------------------------------------------------------------------*/
  520. int FindIt( LPLIST *list, LPELEM *current, int direction )
  521. {
  522.  LPELEM *elem;
  523.  int     delta;
  524.  char    cmp[3];
  525.  int     len;
  526.  char   *ptr;
  527.  
  528.   len = strlen( FindDat.text );
  529.   if (len == 0)
  530.      return 0;
  531.  
  532.   if (direction == FNEXT)
  533.      elem = current->next;
  534.   else
  535.      elem = current->prev;
  536.  
  537.   delta = 0;
  538.  
  539.   if (FindDat.sense) {
  540.      while (elem != list) {
  541.         delta += (direction == FNEXT) ? 1 : -1;
  542.         if (strstr( elem->data, FindDat.text ))
  543.            return delta;
  544.         elem = (direction == FNEXT) ? elem->next : elem->prev;
  545.      }
  546.   } else {
  547.      cmp[0] = toupper( FindDat.text[0] );
  548.      cmp[1] = tolower( FindDat.text[0] );
  549.      cmp[2] = '\0';
  550.      while (elem != list) {
  551.         delta += (direction == FNEXT) ? 1 : -1;
  552.         ptr = elem->data;
  553.         while (ptr = strpbrk( ptr, cmp )) {
  554.            if (memicmp( FindDat.text, ptr, len ) == 0)
  555.               return delta;
  556.            ++ptr;
  557.         }
  558.         elem = (direction == FNEXT) ? elem->next : elem->prev;
  559.      }
  560.   }
  561.   return 0;
  562. }
  563.  
  564. /*---------------------------------------------------------------------------
  565.                                 MoveToMark
  566. ---------------------------------------------------------------------------*/
  567. void MoveToMark( WNDATTR *wndattr, int direction )
  568. {
  569.  LPELEM *elem;
  570.  int scrollpos;
  571.  
  572.   elem = wndattr->current;
  573.   scrollpos = 0;
  574.  
  575.   if (direction == FNEXT) {
  576.      while (elem->nextmk && elem != wndattr->list) {
  577.         elem = elem->next;
  578.         scrollpos++;
  579.      }
  580.      while (elem->nextmk == NULL) {
  581.         elem = elem->next;
  582.         scrollpos++;
  583.      }
  584.   } else {
  585.      do {
  586.         elem = elem->prev;
  587.         scrollpos--;
  588.      } while (elem->nextmk == NULL);
  589.  
  590.      while (elem->nextmk && elem != wndattr->list) {
  591.         elem = elem->prev;
  592.         scrollpos--;
  593.      }
  594.      if (elem->next->nextmk) {
  595.         scrollpos++;
  596.         elem = elem->next;
  597.      }
  598.   }
  599.  
  600.   if (elem != wndattr->list)
  601.      CorrectScroll( wndattr, scrollpos );
  602.  
  603.   return;
  604. }
  605. /*---------------------------------------------------------------------------
  606.                                   CmdMate
  607. ---------------------------------------------------------------------------*/
  608. void CmdMate( WNDATTR *wndattr )
  609. {
  610.   if (MateScrollWnd != NULLHANDLE)
  611.      MateScrollWnd = NULLHANDLE;
  612.   else
  613.      OldWndProc = WinSubclassWindow( wndattr->Client, MateWndProc );
  614.  
  615.   return;
  616. }
  617.  
  618. /*---------------------------------------------------------------------------
  619.                                 MateWndProc
  620. ---------------------------------------------------------------------------*/
  621. MRESULT EXPENTRY MateWndProc( HWND wnd, ULONG msg, MPARAM mp1, MPARAM mp2 )
  622. {
  623.  WNDATTR *wndattr;
  624.  
  625.    switch (msg) {
  626.      case WM_FOCUSCHANGE:
  627.         if (SHORT1FROMMP( mp2 ) == FALSE) {
  628.            wndattr = (WNDATTR*)WinQueryWindowPtr( wnd, QWL_USER );
  629.            MateScrollWnd = HWNDFROMMP( mp1 );
  630.            WinSubclassWindow( wndattr->Client, OldWndProc );
  631.         }
  632.         break;
  633.      default:
  634.         break;
  635.    }
  636.  
  637.   return OldWndProc( wnd, msg, mp1, mp2 );
  638. }
  639.  
  640. /*---------------------------------------------------------------------------
  641.                                   CmdSpawn
  642. ---------------------------------------------------------------------------*/
  643. void CmdSpawn( WNDATTR *wndattr )
  644. {
  645.   char args[CCHMAXPATHCOMP + 4];
  646.   int len;
  647.   RESULTCODES result;
  648.  
  649.    len = strlen( _argv[0] ) + 1;
  650.    memcpy( args, _argv[0], len );
  651.    memcpy( args + len, "-i\0", 4 );
  652.  
  653.    DosExecPgm( NULL, 0, EXEC_ASYNC,
  654.                args, NULL, &result, _argv[0] );
  655.  
  656.    return;
  657. }
  658.  
  659. /*---------------------------------------------------------------------------
  660.                                   CmdQuit
  661. ---------------------------------------------------------------------------*/
  662. void CmdQuit( WNDATTR *wndattr )
  663. {
  664.    WinPostMsg( wndattr->Client, WM_QUIT, 0, 0 );
  665.    return;
  666. }
  667.