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

  1. /*
  2. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  3.  util.c
  4.  
  5.  useful routines
  6. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  7. */
  8. #define INCL_PM
  9. #define INCL_DOS
  10. #include <os2.h>
  11. #include <string.h>
  12. #include <stdio.h>
  13. #include <stdlib.h>
  14. #include <process.h>
  15. #include "list.h"
  16. #include "flwin.h"
  17. #include "util.h"
  18.  
  19. /*--------------------------------Macros----------------------------------*/
  20.  
  21. /*-------------------------Structs and Typedefs----------------------------*/
  22.  
  23. typedef struct {
  24.    FILE   *fp;
  25.    LPLIST *list;
  26.    BOOL    marked;
  27. } SAVEARGS;
  28.  
  29. typedef struct {
  30.   HWND    wnd;
  31.   HEV     hev;
  32.   LPLIST *list;
  33.   char   *text;
  34. } APPLINES_ARGS;
  35.  
  36. typedef struct {
  37.   FILE    *fp;
  38.   WNDATTR *wndattr;
  39.   HEV      hev;
  40. } APPFILE_ARGS;
  41.  
  42. /*-------------------------Function Prototypes----------------------------*/
  43. BOOL AddLine( LPLIST*, char*, USHORT );
  44.  
  45. /*------------------------------Globals-----------------------------------*/
  46. extern char **_argv;
  47.  
  48. /*---------------------------------------------------------------------------
  49.                                 SaveList
  50. ---------------------------------------------------------------------------*/
  51. BOOL SaveList( char *filename, LPLIST *list, BOOL marked, BOOL threaded )
  52. {
  53.  void savethread( void * );
  54.  SAVEARGS *args;
  55.  FILE     *fp;
  56.  
  57.   fp = fopen( filename, "w" );
  58.   if (fp == NULL)
  59.      return FALSE;
  60.  
  61.   args = (SAVEARGS*)malloc( sizeof(SAVEARGS) );
  62.   args->fp = fp;
  63.   args->list = list;
  64.   args->marked = marked;
  65.   if (threaded == TRUE)
  66.      _beginthread( savethread, NULL, 0x2000, (void*)args );
  67.   else
  68.      savethread( (void*)args );
  69.  
  70.  return TRUE;
  71. }
  72. /*---------------------------------------------------------------------------
  73.                                 savethread
  74. ---------------------------------------------------------------------------*/
  75. void savethread( void *args )
  76. {
  77.  LPELEM   *elem;
  78.  SAVEARGS *sargs;
  79.  int       writeit;
  80.  
  81.    sargs = args;
  82.    elem = sargs->list->next;
  83.    while (elem != sargs->list) {
  84.       writeit = !sargs->marked;
  85.       writeit |= sargs->marked && elem->nextmk;
  86.       if (writeit)
  87.          fputs( (char*)elem->data, sargs->fp );
  88.       elem = elem->next;
  89.       if (elem != sargs->list && writeit)
  90.          fputc( '\n', sargs->fp );
  91.    }
  92.    fclose( sargs->fp );
  93.    free( args );
  94.  
  95.    return;
  96. }
  97. /*---------------------------------------------------------------------------
  98.                                CorrectScroll
  99. ---------------------------------------------------------------------------*/
  100. void CorrectScroll( WNDATTR *wndattr, int delta )
  101. {
  102.  int maxmove;
  103.  
  104.    if (delta == 0)
  105.       return;
  106.  
  107.    maxmove = -wndattr->scrollpos;
  108.    if (delta < maxmove) {
  109.       delta = maxmove;
  110.    } else {
  111.       maxmove = LPListLines( wndattr->list ) - wndattr->scrollpos;
  112.       if (delta > maxmove)
  113.          delta = maxmove;
  114.    }
  115.  
  116.    WinScrollWindow( wndattr->Client,
  117.                      0,
  118.                      delta * wndattr->fontmax,
  119.                      NULL, NULL, NULLHANDLE, NULL,
  120.                      SW_INVALIDATERGN );
  121.  
  122.    wndattr->scrollpos += delta;
  123.    return;
  124. }
  125. /*---------------------------------------------------------------------------
  126.                             PasteFromClipboard
  127. ---------------------------------------------------------------------------*/
  128. void PasteFromClipboard( HAB hab, HWND wnd )
  129. {
  130.  WNDATTR *wndattr;
  131.  char *text;
  132.  
  133.     WinOpenClipbrd( hab );
  134.     text = ( char * )WinQueryClipbrdData( hab, CF_TEXT );
  135.  
  136.     if (text) {
  137.        wndattr = WinQueryWindowPtr( wnd, QWL_USER );
  138.        AppendLines( wndattr, text, FALSE, NULLHANDLE );
  139.     }
  140.  
  141.     WinCloseClipbrd( hab );
  142.  
  143.    return;
  144. }
  145. /*---------------------------------------------------------------------------
  146.                                PositionDialog
  147. ---------------------------------------------------------------------------*/
  148. void PositionDialog( HWND dlgwnd )
  149. {
  150.  HWND frame;
  151.  SWP  swp;
  152.  int  x, y;
  153.  long maxx, maxy;
  154.  
  155.    frame = WinQueryWindow( dlgwnd, QW_OWNER );
  156.  
  157.    WinQueryWindowPos( frame, &swp );
  158.    x = swp.x + swp.cx / 2;
  159.    y = swp.y + swp.cy / 2;
  160.  
  161.    WinQueryWindowPos( dlgwnd, &swp );
  162.    x -= swp.cx / 2;
  163.    y -= swp.cy / 2;
  164.  
  165.    maxx = WinQuerySysValue( HWND_DESKTOP, SV_CXSCREEN ) - swp.cx;
  166.    maxy = WinQuerySysValue( HWND_DESKTOP, SV_CYSCREEN ) - swp.cy;
  167.    x = min( x, maxx );
  168.    x = max( x, 0 );
  169.    y = min( y, maxy );
  170.    y = max( y, 0 );
  171.  
  172.    WinSetWindowPos( dlgwnd, NULLHANDLE, x, y, 0, 0,
  173.                     SWP_MOVE | SWP_ACTIVATE );
  174.    return;
  175. }
  176. /*-------------------------------------------------------------------------
  177.                                 AppendFile
  178. --------------------------------------------------------------------------*/
  179. BOOL AppendFile( WNDATTR *wndattr, char *filename, BOOL threaded, HEV hev )
  180. {
  181.  void   addfile( void * );
  182.  APPFILE_ARGS *Args;
  183.  
  184.    Args = ( APPFILE_ARGS * )malloc( sizeof( APPFILE_ARGS ) );
  185.    Args->fp = fopen( filename, "r" );
  186.  
  187.    Args->hev = hev;
  188.  
  189.    if (Args->fp == NULL) {
  190.       free( Args );
  191.       if (hev != NULLHANDLE)
  192.          DosPostEventSem( hev );
  193.       return FALSE;
  194.    }
  195.  
  196.    Args->wndattr = wndattr;
  197.  
  198.    if (threaded)
  199.       _beginthread( addfile, NULL, 0x2000, Args );
  200.    else
  201.       addfile( Args );
  202.  
  203.   return TRUE;
  204. }
  205. /*-------------------------------------------------------------------------
  206.                                 addfile
  207. --------------------------------------------------------------------------*/
  208. void addfile( void *arg )
  209. {
  210.  APPFILE_ARGS *Args;
  211.  char   *buffer;
  212.  USHORT  maxlen, len;
  213.  USHORT  lines_added;
  214.  
  215.    Args = arg;
  216.  
  217.    lines_added = 0;
  218.  
  219.    maxlen = LPListMaxLen( Args->wndattr->list );
  220.    buffer = (char*)malloc( ( size_t )maxlen + 1 );
  221.  
  222.    if (buffer != NULL) {
  223.       while (fgets( buffer, maxlen, Args->fp )) {
  224.          len = strcspn( buffer, "\n\r" );
  225.          if (AddLine( Args->wndattr->list, buffer, len ) == TRUE)
  226.             lines_added++;
  227.       }
  228.       free( buffer );
  229.    }
  230.    fclose( Args->fp );
  231.  
  232.    WinPostMsg( Args->wndattr->Client, FLM_CORRECTWINDOW,
  233.                MPFROMSHORT( lines_added ), 0);
  234.  
  235.    if (Args->hev != NULLHANDLE)
  236.       DosPostEventSem( Args->hev );
  237.  
  238.    free( Args );
  239.  
  240.    return;
  241. }
  242. /*--------------------------------------------------------------------------
  243.                                AppendLines
  244. --------------------------------------------------------------------------*/
  245. BOOL AppendLines( WNDATTR *wndattr, char *text, BOOL threaded, HEV hev )
  246. {
  247.  void addlines( void * );
  248.  APPLINES_ARGS *Args;
  249.  
  250.    Args = ( APPLINES_ARGS * )malloc( sizeof( APPLINES_ARGS ) );
  251.    Args->text = text;
  252.    Args->wnd = wndattr->Client;
  253.    Args->list = wndattr->list;
  254.    Args->hev = hev;
  255.  
  256.    if (threaded)
  257.       _beginthread( addlines, NULL, 0x2000, Args );
  258.    else
  259.       addlines( Args );
  260.  
  261.   return TRUE;
  262. }
  263. /*-------------------------------------------------------------------------
  264.                                 addlines
  265. --------------------------------------------------------------------------*/
  266. void addlines( void *arg )
  267. {
  268.  USHORT  len, maxlen, linelen, lines_added;
  269.  APPLINES_ARGS *Args;
  270.  BOOL ret;
  271.  
  272.    Args = arg;
  273.  
  274.    maxlen = LPListMaxLen( Args->list );
  275.    lines_added = 0;
  276.  
  277.    do {
  278.       len = strcspn( Args->text, "\r\n" );
  279.  
  280.       linelen = min( len, maxlen );
  281.  
  282.       if (AddLine( Args->list, Args->text, linelen ) == TRUE)
  283.          lines_added++;
  284.  
  285.       Args->text += len;
  286.  
  287.       Args->text += ( *Args->text == '\n' || *Args->text == '\r' );
  288.       Args->text += ( *Args->text == '\n' || *Args->text == '\r' );
  289.  
  290.    } while (*Args->text);
  291.  
  292.   if (Args->hev)
  293.      DosPostEventSem( Args->hev );
  294.  
  295.    ret = WinPostMsg( Args->wnd, FLM_CORRECTWINDOW,
  296.                      MPFROMSHORT( lines_added ), 0);
  297.  
  298.    free( Args );
  299.  
  300.    return;
  301. }
  302. /*-------------------------------------------------------------------------
  303.                                AppendLine
  304. --------------------------------------------------------------------------*/
  305. BOOL AppendLine( WNDATTR *wndattr, char *text )
  306. {
  307.  USHORT  len;
  308.  
  309.    len = strcspn( text, "\r\n" );
  310.    AddLine( wndattr->list, text, len );
  311.  
  312.    WinPostMsg( wndattr->Client, FLM_CORRECTWINDOW, MPFROMSHORT( 1 ), 0);
  313.  
  314.   return TRUE;
  315. }
  316. /*-------------------------------------------------------------------------
  317.                                 AddLine
  318. --------------------------------------------------------------------------*/
  319. BOOL AddLine( LPLIST *list, char *text, USHORT len )
  320. {
  321.  LPELEM *elem;
  322.  BOOL    ret;
  323.  
  324.    if (text == NULL)
  325.       return FALSE;
  326.  
  327.    elem = LPElemCreate();
  328.    if (elem == NULL) {
  329.       ret = FALSE;
  330.    } else {
  331.       DosEnterCritSec( );
  332.       if (LPElemSetData( list, elem, text, len ) == FALSE) {
  333.          LPElemDestroy( elem );
  334.          ret = FALSE;
  335.       } else {
  336.          LPElemAppend( list, elem );
  337.          ret = TRUE;
  338.       }
  339.       DosExitCritSec( );
  340.    }
  341.  
  342.   return ret;
  343. }
  344.  
  345. /*-------------------------------------------------------------------------
  346.                              GetTempDirName
  347. --------------------------------------------------------------------------*/
  348. void GetTempDirName( char *buffer )
  349. {
  350.  char *value;
  351.  
  352.   strcpy( buffer, _argv[0] );
  353.   *strrchr( buffer, '\\' ) = '\0';
  354.  
  355.   if ((DosScanEnv( "TEMP", &value ) == 0) ||
  356.       (DosScanEnv( "TMP", &value ) == 0 ))
  357.          strcpy( buffer, value );
  358.  
  359.   if (buffer[strlen( buffer ) - 1] != '\\')
  360.      strcat( buffer, "\\" );
  361.  
  362.   return;
  363. }
  364.