home *** CD-ROM | disk | FTP | other *** search
/ Monster Media 1993 #2 / Image.iso / clipper / fcopy.zip / FCOPY.C < prev    next >
C/C++ Source or Header  |  1993-08-03  |  3KB  |  111 lines

  1.  
  2. /* 
  3.  * FCOPY.C - copy one file to another within clipper.
  4.  * This is a sample of evaluating a code block from C only.
  5.  * 
  6.  * Test With Clipper 5.2 only
  7.  * Copyright (c) Peter Kulek Aug 1993
  8.  *
  9.  * Compuserve ID  : 100140,1220
  10.  * 
  11.  * Specialising in Data Driven Object Oriented Applications for EIS & MIS
  12.  *
  13.  */
  14.  
  15.  
  16. #include "extend.h"
  17. #include "clipdefs.h"
  18. #include "filesys.api"
  19. #include "fm.api"
  20. #include "item.api"
  21.  
  22. //#define BUFFER_SIZE 1024
  23. #define BUFFER_SIZE 512
  24. #define IF(x)       if (x) {
  25. #define ELSE        } else {
  26. #define ELSEIF(x)   } else if(x) {
  27. #define ENDIF       }
  28. #define EXIT        break;
  29. #define DOWHILE     while(1) {
  30. #define ENDDO       }
  31.  
  32. #define MALLOC(x)    _xalloc(x)
  33. #define FREE(x)      _xfree(x)
  34.  
  35.  
  36. long _fsCopy(BYTEP ,BYTEP ,ITEM ) ;
  37. void blockeval( EVALINFO,ITEM, ULONG) ;
  38.  
  39. CLIPPER F_COPY() {
  40.     ITEM block = _itemParam( 3 ) ;
  41.     _retni(-1);
  42.     IF ( ISCHAR(1) && ISCHAR(2) )
  43.         _retnl(_fsCopy((BYTEP)_parc(1),(BYTEP)_parc(2),block));
  44.     ENDIF
  45.     return;
  46.  
  47. long _fsCopy(BYTEP source,BYTEP dest ,ITEM block) {
  48.         EVALINFO info;  // Create eval Info
  49.         FHANDLE dHANDLE,sHANDLE;
  50.         char    *buffer;
  51.         USHORT  usCount;
  52.         ULONG   ulCount = 0L;
  53.         sHANDLE = _fsOpen(source, FO_READ);
  54.         _evalNew( &info, block ); // Create an object of eval
  55.         IF( ! _fsError() ) 
  56.             dHANDLE = _fsCreate(dest,FC_NORMAL);
  57.             IF( _fsError() ) 
  58.                 _fsClose(sHANDLE);
  59.                 return( -2L) ;
  60.             ENDIF
  61.             buffer = MALLOC(BUFFER_SIZE);
  62.             IF(buffer == NULL)
  63.                 _fsClose(sHANDLE);
  64.                 _fsClose(dHANDLE);
  65.                 return(-3L) ;
  66.             ENDIF
  67.             usCount = _fsRead(sHANDLE,buffer,BUFFER_SIZE);
  68.             DOWHILE
  69.                 ulCount += (ULONG)usCount;
  70.                 blockeval(info,block,ulCount);
  71.                 _fsWrite(dHANDLE,buffer, usCount);
  72.                 usCount = _fsRead(sHANDLE,buffer, BUFFER_SIZE);
  73.                 IF (usCount != BUFFER_SIZE )
  74.                     EXIT
  75.                 ENDIF
  76.             ENDDO 
  77.             ulCount += (ULONG)usCount;
  78.             blockeval(info,block,ulCount);
  79.             _fsWrite(dHANDLE,buffer,usCount);
  80.             FREE(buffer);
  81.             _fsClose(sHANDLE);
  82.             _fsClose(dHANDLE);
  83.         ENDIF
  84.         _evalRelease( &info );  // Release object
  85.         return( ulCount );
  86. }
  87.  
  88.  
  89. // Test Eval of block from C
  90. static void blockeval(EVALINFO info, ITEM block, ULONG count) {
  91.     ITEM     retP;
  92.     IF( _itemType(block) == BLOCK )
  93.         _evalPutParam(&info,_itemPutNL(NULL,count)); // Put parameter on stack
  94.         retP = _evalLaunch( &info );   // Eval code block
  95.         _itemRelease( retP );  // release parameters from stack       
  96.     ENDIF
  97.     return;
  98. }
  99.  
  100.  
  101.  
  102.  
  103.  
  104.  
  105.  
  106.  
  107.  
  108.  
  109.  
  110.