home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 5 Edit / 05-Edit.zip / flist.zip / flist.c < prev    next >
C/C++ Source or Header  |  1996-11-28  |  13KB  |  446 lines

  1. /*
  2. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  3.  Fast List (For OS/2)
  4.  
  5.   :General file listing and text line processing
  6.  
  7.  Original release:
  8.           Russ Weathersby
  9.           August 1996
  10. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  11. */
  12.  
  13. /*------------------------------Includes-----------------------------------*/
  14. #define INCL_PM
  15. #define INCL_BASE
  16. #define INCL_WORKPLACE
  17. #include <os2.h>
  18. #include <stdio.h>
  19. #include <stdlib.h>
  20. #include <string.h>
  21. #include <process.h>
  22. #include "list.h"
  23. #include "flwin.h"
  24. #include "menu.h"
  25. #include "drag.h"
  26. #include "util.h"
  27.  
  28. /*-------------------------------Defines-----------------------------------*/
  29. #define LOGHEIGHT  250
  30. #define LOGWIDTH   400
  31. #define MAX_LINES  4000
  32. #define MAX_LENGTH 256
  33.  
  34. #define HF_STDIN   0
  35. #define HF_STDOUT  1
  36.  
  37. #define DEFAULT_FONT "8.Courier"
  38.  
  39. /*-------------------------Structs and Typedefs----------------------------*/
  40. typedef struct {
  41.    WNDATTR *wndattr;
  42.    int argc;
  43.    char **argv;
  44. } IN_FILES_ARGS;
  45.  
  46. /*--------------------------Function Prototypes----------------------------*/
  47.  
  48. static MRESULT EXPENTRY SubWndProc( HWND, ULONG, MPARAM, MPARAM );
  49.  
  50. static void SetWin( HAB, int, char*[], CREATEOPS* );
  51. static void InFiles( HWND, int, char*[] );
  52. static void InPipe( HWND );
  53. static void OutPipe( HWND );
  54. static void ReadPipe( void * );
  55. static void ReadFiles( void * );
  56. static int  ReadINI( CREATEOPS*, char* );
  57. static void SaveINI( HWND, CREATEOPS * );
  58. static void ReadArgs( CREATEOPS*, int, char*[] );
  59.  
  60. /*-------------------------------Globals-----------------------------------*/
  61. static PFNWP     OrigWndProc;
  62. static CREATEOPS CreateOps;
  63. static char      INIFileName[PATH_MAX];
  64. static BOOL      NoSave;
  65.  
  66. extern FILEDLG FileDlg;
  67. extern HWND MateScrollWnd;
  68.  
  69. /*----------------------------Main Code Start------------------------------*/
  70. int main( int argc, char *argv[] )
  71. {
  72.  HAB    hab;
  73.  HMQ    hmq;
  74.  HWND   frame, client;
  75.  QMSG   qmsg;
  76.  
  77.    hab = WinInitialize( 0 );
  78.  
  79.    hmq = WinCreateMsgQueue( hab, 0 );
  80.  
  81.    SetWin( hab, argc, argv, &CreateOps );
  82.    frame = FLCreateWindow( &CreateOps );
  83.  
  84.    if (frame != NULLHANDLE) {
  85.       client = WinWindowFromID( frame, FID_CLIENT );
  86.       OrigWndProc = WinSubclassWindow( client, SubWndProc );
  87.  
  88.       CreatePopup( hab, client, frame );
  89.  
  90.       InFiles( client, argc, argv );
  91.  
  92.       InPipe( client );
  93.  
  94.       WinSetFocus( HWND_DESKTOP, client );
  95.  
  96.       while (WinGetMsg( hab, &qmsg, NULLHANDLE, 0, 0 ))
  97.          WinDispatchMsg( hab, &qmsg );
  98.  
  99.       OutPipe( client );
  100.  
  101.       SaveINI( client, &CreateOps );
  102.  
  103.       DestroyPopup();
  104.  
  105.       WinDestroyWindow( frame );
  106.    }
  107.  
  108.    WinDestroyMsgQueue( hmq );
  109.    WinTerminate( hab );
  110.  
  111.    return EXIT_SUCCESS;
  112. }
  113.  
  114. /*---------------------------------------------------------------------------
  115.                                  SetWin
  116. ---------------------------------------------------------------------------*/
  117. void SetWin( HAB hab, int argc, char *argv[], CREATEOPS *create )
  118. {
  119.  
  120.    if (ReadINI( create, argv[0] ) == 0) {
  121.       create->flags = FCF_VERTSCROLL | FCF_SIZEBORDER |
  122.                       FCF_TASKLIST | FCF_ICON | FCF_SHELLPOSITION;
  123.       create->maximize = FALSE;
  124.       create->maxlines = MAX_LINES;
  125.       create->maxlen = MAX_LENGTH;
  126.       create->winheight = LOGHEIGHT;
  127.       create->winwidth = LOGWIDTH;
  128.       create->xpos = create->ypos = 0;
  129.       strcpy( create->font, DEFAULT_FONT );
  130.    }
  131.  
  132.    ReadArgs( create, argc, argv );
  133.  
  134.    create->hab = hab;
  135.  
  136.    return;
  137. }
  138.  
  139. /*---------------------------------------------------------------------------
  140.                                   ReadINI
  141. ---------------------------------------------------------------------------*/
  142. int ReadINI( CREATEOPS *create, char *path )
  143. {
  144.   FILE *fp;
  145.   char *ptr;
  146.   size_t bytes_read = 0;
  147.  
  148.    strcpy( INIFileName, path );
  149.    ptr = strrchr( INIFileName, '.' );
  150.    if (ptr == NULL)
  151.       ptr = INIFileName + strlen( INIFileName );
  152.    strcpy( ptr, ".ini" );
  153.    strlwr( INIFileName );
  154.  
  155.    fp = fopen( INIFileName, "rb" );
  156.    if (fp) {
  157.       bytes_read = fread( create, 1, sizeof(CREATEOPS), fp );
  158.       fclose( fp );
  159.    }
  160.  
  161.    return (bytes_read == sizeof(CREATEOPS));
  162. }
  163. /*---------------------------------------------------------------------------
  164.                                   SaveINI
  165. ---------------------------------------------------------------------------*/
  166. void SaveINI( HWND wnd, CREATEOPS *save )
  167. {
  168.   WNDATTR  *wndattr;
  169.   FILE     *fp;
  170.   SWP       swp;
  171.  
  172.    wndattr = WinQueryWindowPtr( wnd, QWL_USER );
  173.  
  174.    if (wndattr->escape == TRUE || NoSave == TRUE)
  175.       return;
  176.  
  177.    save->flags &= ~FCF_SHELLPOSITION;
  178.  
  179.    WinQueryWindowPos( wndattr->Frame, &swp );
  180.    save->maximize = (swp.fl & SWP_MAXIMIZE) ? TRUE : FALSE;
  181.    if (save->maximize) {
  182.       save->winheight = WinQueryWindowUShort( wndattr->Frame, QWS_CYRESTORE );
  183.       save->winwidth = WinQueryWindowUShort( wndattr->Frame, QWS_CXRESTORE );
  184.       save->xpos = WinQueryWindowUShort( wndattr->Frame, QWS_XRESTORE );
  185.       save->ypos = WinQueryWindowUShort( wndattr->Frame, QWS_YRESTORE );
  186.    } else {
  187.       save->winwidth = swp.cx;
  188.       save->winheight = swp.cy;
  189.       save->xpos = swp.x;
  190.       save->ypos = swp.y;
  191.     }
  192.  
  193.    strcpy( save->font, wndattr->font );
  194.  
  195.    fp = fopen( INIFileName, "wb" );
  196.    if (fp) {
  197.       fwrite( save, sizeof(CREATEOPS), 1, fp );
  198.       fclose( fp );
  199.    }
  200.  
  201.  return;
  202. }
  203. /*---------------------------------------------------------------------------
  204.                                   InFiles
  205. ---------------------------------------------------------------------------*/
  206. void InFiles( HWND client, int argc, char *argv[] )
  207. {
  208.  static IN_FILES_ARGS infargs;
  209.  
  210.    infargs.wndattr = WinQueryWindowPtr( client, QWL_USER );
  211.    infargs.argc = argc;
  212.    infargs.argv = argv;
  213.  
  214.    _beginthread( ReadFiles, NULL, 0x2000, (void*)&infargs );
  215.  
  216.    return;
  217. }
  218.  
  219. /*---------------------------------------------------------------------------
  220.                                 ReadFiles
  221. ---------------------------------------------------------------------------*/
  222. void ReadFiles( void *args )
  223. {
  224.   IN_FILES_ARGS *infargs;
  225.   int i;
  226.   HDIR hdir;
  227.   char path[CCHMAXPATHCOMP];
  228.   char fullname[CCHMAXPATHCOMP];
  229.   char ffbuf3[64];
  230.   ULONG fcount;
  231.   char *argstr;
  232.   APIRET rc;
  233.  
  234.    infargs = args;
  235.  
  236.    for (i = 1;  infargs->argc > 1; ++i, --infargs->argc ) {
  237.       argstr = infargs->argv[i];
  238.       if ((*argstr != '-') && (*argstr != '/')) {
  239.          rc = DosQueryPathInfo( argstr,
  240.                                 FIL_QUERYFULLNAME,
  241.                                 path,
  242.                                 sizeof path );
  243.          if (rc == NO_ERROR) {
  244.             *(strrchr( path, '\\' ) + 1) = '\0';
  245.             fcount = 1;
  246.             hdir = HDIR_CREATE;
  247.             rc = DosFindFirst( argstr,
  248.                                &hdir,
  249.                                FILE_NORMAL,
  250.                                &ffbuf3,
  251.                                sizeof ffbuf3,
  252.                                &fcount,
  253.                                FIL_STANDARD );
  254.             while (rc == NO_ERROR) {
  255.                strcpy( fullname, path );
  256.                strcat( fullname, &ffbuf3[29] );
  257.  
  258.                strcpy( FileDlg.szFullFile, fullname );
  259.                AppendFile( infargs->wndattr, fullname, 0, NULLHANDLE );
  260.  
  261.                rc = DosFindNext( hdir,
  262.                                  &ffbuf3,
  263.                                  sizeof ffbuf3,
  264.                                  &fcount );
  265.             }
  266.          }
  267.          DosFindClose( hdir );
  268.       }
  269.    }
  270.  
  271.    return;
  272. }
  273.  
  274. /*---------------------------------------------------------------------------
  275.                                   InPipe
  276. ---------------------------------------------------------------------------*/
  277. void InPipe( HWND client )
  278. {
  279.    _beginthread( ReadPipe, NULL, 0x1000, (void*)client );
  280.  
  281.   return;
  282. }
  283.  
  284. /*---------------------------------------------------------------------------
  285.                                 ReadPipe
  286. ---------------------------------------------------------------------------*/
  287. void ReadPipe( void *wnd )
  288. {
  289.  WNDATTR *wndattr;
  290.  USHORT   maxlen;
  291.  char    *buffer;
  292.  
  293.    wndattr = WinQueryWindowPtr( (HWND)wnd, QWL_USER );
  294.    maxlen = LPListMaxLen( wndattr->list );
  295.    buffer = (char*)malloc( maxlen + 2 );
  296.    if (buffer == NULL)
  297.       return;
  298.  
  299.    while (fgets( buffer, maxlen, stdin ))
  300.        AppendLine( wndattr, buffer );
  301.  
  302.    free( buffer );
  303.  
  304.   return;
  305. }
  306.  
  307. /*---------------------------------------------------------------------------
  308.                                  OutPipe
  309. ---------------------------------------------------------------------------*/
  310. void OutPipe( HWND client )
  311. {
  312.  WNDATTR *wndattr;
  313.  LPELEM *elem;
  314.  
  315.    wndattr = WinQueryWindowPtr( client, QWL_USER );
  316.    elem = wndattr->list->next;
  317.    errno = 0;
  318.    while (elem != wndattr->list && !errno) {
  319.        fputs( elem->data, stdout );
  320.        fputc( '\n', stdout );
  321.        elem = elem->next;
  322.    }
  323.  
  324.   return;
  325. }
  326.  
  327. /*---------------------------------------------------------------------------
  328.                                  ReadArgs
  329. ---------------------------------------------------------------------------*/
  330. void ReadArgs( CREATEOPS *create, int argc, char *argv[] )
  331. {
  332.  char *option;
  333.  int   number;
  334.  ULONG flags;
  335.  
  336.   while (--argc) {
  337.      option = argv[argc];
  338.      if (*option == '-' || *option == '/') {
  339.         option++;
  340.         number = atoi( option + 1 );
  341.  
  342.         switch (*option) {
  343.            case 'w':case 'W':
  344.               create->maxlen = number;
  345.               break;
  346.            case 'l':case 'L':
  347.               create->maxlines = number;
  348.               break;
  349.            case 't':case 'T':
  350.               flags = FCF_TITLEBAR | FCF_SYSMENU | FCF_MINMAX;
  351.               if (number)
  352.                  create->flags |= flags;
  353.               else
  354.                  create->flags &= ~flags;
  355.               break;
  356.            case 'I':case 'i':
  357.               create->flags |= FCF_SHELLPOSITION;
  358.               create->winheight = LOGHEIGHT;
  359.               create->winwidth = LOGWIDTH;
  360.               NoSave = TRUE;
  361.               break;
  362.            default:
  363.               break;
  364.         }
  365.      }
  366.   }
  367.   return;
  368. }
  369. /*---------------------------------------------------------------------------
  370.                                  SubWndProc
  371.  
  372. Purpose: Intercept messages destined for client window
  373. ---------------------------------------------------------------------------*/
  374. MRESULT EXPENTRY SubWndProc( HWND wnd, ULONG msg, MPARAM mp1, MPARAM mp2 )
  375. {
  376.   WNDATTR *wndattr;
  377.   HAB      hab;
  378.   ULONG    time;
  379.   static ULONG LastTime;
  380.   ULONG    keystate;
  381.  
  382.    wndattr = WinQueryWindowPtr( wnd, QWL_USER );
  383.  
  384.    switch (msg) {
  385.      case WM_DRAWCLIPBOARD:
  386.         hab = WinQueryAnchorBlock( wnd );
  387.         time = WinGetCurrentTime( hab );
  388.         if (time > (LastTime + 300)) { /* some prg paste twice in succession */
  389.            PasteFromClipboard( hab, wnd );
  390.            LastTime = time;
  391.         }
  392.         break;
  393.      case WM_CONTEXTMENU:
  394.         ActMsgContextMenu( wndattr,
  395.                            SHORT1FROMMP( mp1 ),
  396.                            SHORT2FROMMP( mp1 ) );
  397.         break;
  398.      case WM_COMMAND:
  399.         ActMsgCommand( wndattr, mp1, mp2 );
  400.         break;
  401.      case WM_VSCROLL:
  402.         if (MateScrollWnd != NULLHANDLE) {
  403.            keystate = WinGetKeyState( HWND_DESKTOP, VK_CTRL );
  404.            if (!(keystate & 0x8000))
  405.               WinPostMsg( MateScrollWnd, msg, mp1, mp2 );
  406.            keystate = WinGetKeyState( HWND_DESKTOP, VK_ALT );
  407.            if (keystate & 0x8000)
  408.               return MRFROMSHORT( FALSE );
  409.         }
  410.         break;
  411.      case WM_BEGINDRAG:
  412.         if (WinGetKeyState( HWND_DESKTOP, VK_CTRL ) & 0x8000 ||
  413.             WinGetKeyState( HWND_DESKTOP, VK_SHIFT ) & 0x8000 )
  414.              return ActMsgBeginDrag( wndattr );
  415.         break;
  416.      case DM_DRAGOVER:
  417.         return ActMsgDragOver( mp1, mp2 );
  418.         break;
  419.      case DM_DRAGLEAVE:
  420.         return ActMsgDragLeave( );
  421.         break;
  422.      case DM_RENDER:
  423.         return ActMsgRender( wndattr, mp1 );
  424.         break;
  425.      case DM_RENDERCOMPLETE:
  426.         return ActMsgRenderComplete( wndattr, mp1, mp2 );
  427.         break;
  428.      case DM_DROP:
  429.         return ActMsgDrop( wndattr, mp1, mp2 );
  430.         break;
  431.      case DM_ENDCONVERSATION:
  432.         return ActMsgEndConversation();
  433.         break;
  434.      case DM_PRINTOBJECT:
  435.         return ActMsgPrintObject( wndattr, mp1, mp2 );
  436.         break;
  437.      case DM_DISCARDOBJECT:
  438.         return ActMsgDiscardObject( wndattr );
  439.         break;
  440.      default:
  441.         break;
  442.    }
  443.  
  444.    return OrigWndProc( wnd, msg, mp1, mp2 );
  445. }
  446.