git-svn-id: svn://10.65.10.50/branches/R_10_00@23030 c028cbd2-c16b-5b4b-a496-9718f37d4682
		
			
				
	
	
		
			248 lines
		
	
	
		
			6.6 KiB
		
	
	
	
		
			C
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			248 lines
		
	
	
		
			6.6 KiB
		
	
	
	
		
			C
		
	
	
		
			Executable File
		
	
	
	
	
/* m4create.c   (c)Copyright Sequiter Software Inc., 1988-1996.  All rights reserved.  */
 | 
						|
 | 
						|
#include "d4all.h"
 | 
						|
#ifdef __TURBOC__
 | 
						|
   #pragma hdrstop
 | 
						|
#endif
 | 
						|
 | 
						|
#ifndef S4CLIENT
 | 
						|
#ifndef S4MEMO_OFF
 | 
						|
#ifndef S4OFF_WRITE
 | 
						|
 | 
						|
/* if name is null, a temporary memo file is created, if d4 is null name must exist for cretae to work */
 | 
						|
int memo4fileCreate( MEMO4FILE *m4file, CODE4 *c4, DATA4FILE *d4, const char *name )
 | 
						|
{
 | 
						|
   MEMO4HEADER *headerPtr ;
 | 
						|
   char buf[258] ;
 | 
						|
   int i, rc, saveFlag, safety ;
 | 
						|
   time_t t ;
 | 
						|
   #ifndef S4MFOX
 | 
						|
      #ifndef S4MNDX
 | 
						|
         char memoName[9] ;
 | 
						|
      #endif
 | 
						|
   #endif
 | 
						|
 | 
						|
   #ifdef E4PARM_LOW
 | 
						|
      if ( c4 == 0 )
 | 
						|
         return error4( c4, e4parm_null, E95207 ) ;
 | 
						|
      if ( d4 == 0 && name == 0 )
 | 
						|
         return error4( c4, e4parm_null, E95207 ) ;
 | 
						|
   #endif
 | 
						|
 | 
						|
   m4file->data = d4 ;
 | 
						|
 | 
						|
   #ifndef S4MNDX
 | 
						|
      #ifdef S4MFOX
 | 
						|
         if ( c4->memSizeMemo < 33 )
 | 
						|
            c4->memSizeMemo = 33 ;
 | 
						|
      #else
 | 
						|
         if ( c4->memSizeMemo % 512 != 0 || c4->memSizeMemo == 0 )
 | 
						|
            c4->memSizeMemo = ((c4->memSizeMemo / 512) + 1) * 512 ;
 | 
						|
      #endif
 | 
						|
 | 
						|
      #ifdef E4MISC
 | 
						|
         if ( sizeof( MEMO4HEADER ) > c4->memSizeMemo )
 | 
						|
            return error4( c4, e4memoCreate, E95207 ) ;
 | 
						|
 | 
						|
         #ifdef S4MFOX
 | 
						|
            if ( c4->memSizeMemo > 512 * 32 )
 | 
						|
         #else
 | 
						|
            if ( c4->memSizeMemo > 512 * 63 )
 | 
						|
         #endif
 | 
						|
               return error4( 0, e4memoCreate, E85201 ) ;
 | 
						|
      #endif
 | 
						|
   #endif
 | 
						|
 | 
						|
   headerPtr = (MEMO4HEADER *)u4allocEr( c4, (long)sizeof( MEMO4HEADER ) ) ;
 | 
						|
   if ( headerPtr == 0 )
 | 
						|
      return -1 ;
 | 
						|
 | 
						|
   #ifdef S4MFOX
 | 
						|
      m4file->blockSize = (short)c4->memSizeMemo ;
 | 
						|
      if ( m4file->blockSize > 512 )
 | 
						|
         headerPtr->nextBlock = 0x01000000 ;
 | 
						|
      else
 | 
						|
      {
 | 
						|
         headerPtr->nextBlock = B4BLOCK_SIZE/m4file->blockSize ;
 | 
						|
         headerPtr->nextBlock = x4reverseLong( (void *)&headerPtr->nextBlock) ;
 | 
						|
      }
 | 
						|
      headerPtr->blockSize = x4reverseShort( (void *)&m4file->blockSize ) ;
 | 
						|
   #else
 | 
						|
      #ifdef S4MNDX
 | 
						|
         m4file->blockSize = MEMO4SIZE ;
 | 
						|
         headerPtr->nextBlock = 1 ;
 | 
						|
      #else
 | 
						|
         headerPtr->nextBlock = 1 ;
 | 
						|
         headerPtr->x102 = 0x102 ;
 | 
						|
         m4file->blockSize = headerPtr->blockSize = (short)c4->memSizeMemo ;
 | 
						|
      #endif
 | 
						|
   #endif
 | 
						|
 | 
						|
   if ( name == 0 )
 | 
						|
   {
 | 
						|
      saveFlag = c4->errCreate ;
 | 
						|
      safety = c4->safety ;
 | 
						|
      c4->errCreate = c4->safety = 0 ;
 | 
						|
 | 
						|
      strcpy( buf, "TEMP" ) ;
 | 
						|
      for ( i = 0 ;; )
 | 
						|
      {
 | 
						|
         if ( i >= 100 )
 | 
						|
         {
 | 
						|
            rc = error4( c4, e4create, E80605 ) ;
 | 
						|
            break ;
 | 
						|
         }
 | 
						|
         i++ ;
 | 
						|
 | 
						|
         u4delayHundredth( 50 ) ;
 | 
						|
         time( &t ) ;
 | 
						|
         t %= 10000L ;
 | 
						|
 | 
						|
         c4ltoa45( (long)t, buf + 4, -4 ) ;
 | 
						|
         strcpy( buf + 8, ".TMP" ) ;
 | 
						|
         rc = file4create( &m4file->file, c4, buf, 1 ) ;
 | 
						|
         if ( rc <= 0 )
 | 
						|
            break ;
 | 
						|
      }
 | 
						|
 | 
						|
      c4->errCreate = saveFlag ;
 | 
						|
      c4->safety = safety ;
 | 
						|
 | 
						|
      if ( rc < 0 )
 | 
						|
      {
 | 
						|
         u4free( headerPtr ) ;
 | 
						|
         return error4( 0, rc, E95207 ) ;
 | 
						|
      }
 | 
						|
   }
 | 
						|
   else
 | 
						|
   {
 | 
						|
      u4ncpy( buf, name, sizeof( buf ) ) ;
 | 
						|
      #ifndef S4MFOX
 | 
						|
         #ifndef S4MNDX
 | 
						|
            memset( memoName, 0, sizeof( memoName ) ) ;
 | 
						|
            u4namePiece( memoName, sizeof(memoName), name, 0, 0 ) ;
 | 
						|
            memcpy( headerPtr->fileName, memoName, 8 ) ;
 | 
						|
         #endif
 | 
						|
      #endif
 | 
						|
      #ifdef S4MFOX
 | 
						|
         #ifdef S4CASE_SEN
 | 
						|
            u4nameExt( buf, sizeof(buf), "fpt", 1 ) ;
 | 
						|
         #else
 | 
						|
            u4nameExt( buf, sizeof(buf), "FPT", 1 ) ;
 | 
						|
         #endif
 | 
						|
      #else
 | 
						|
         #ifdef S4CASE_SEN
 | 
						|
            u4nameExt( buf, sizeof(buf), "dbt", 1 ) ;
 | 
						|
         #else
 | 
						|
            u4nameExt( buf, sizeof(buf), "DBT", 1 ) ;
 | 
						|
         #endif
 | 
						|
      #endif
 | 
						|
 | 
						|
      rc = file4create( &m4file->file, c4, buf, 1 ) ;
 | 
						|
      if ( rc != 0 )
 | 
						|
      {
 | 
						|
         u4free( headerPtr ) ;
 | 
						|
         return error4( c4, (short)rc, E85201 ) ;
 | 
						|
      }
 | 
						|
   }
 | 
						|
   #ifdef S4BYTE_SWAP
 | 
						|
      headerPtr->nextBlock = x4reverseLong( (void *)&headerPtr->nextBlock ) ;
 | 
						|
      #ifndef S4MFOX
 | 
						|
         headerPtr->x102 = 0x201 ;
 | 
						|
      #endif
 | 
						|
      headerPtr->blockSize = x4reverseShort( (void *)&headerPtr->blockSize ) ;
 | 
						|
   #endif
 | 
						|
 | 
						|
   rc = file4write( &m4file->file, 0L, headerPtr, sizeof(  MEMO4HEADER ) ) ;
 | 
						|
   #ifdef S4MFOX
 | 
						|
      file4lenSet( &m4file->file, 512L ) ;
 | 
						|
   #endif
 | 
						|
   u4free( headerPtr ) ;
 | 
						|
   return rc ;
 | 
						|
}
 | 
						|
 | 
						|
#ifdef P4ARGS_USED
 | 
						|
   #pragma argsused
 | 
						|
#endif
 | 
						|
#ifdef S4MFOX
 | 
						|
   int memo4fileDump( MEMO4FILE *f4memo, const long memoId, const char *ptr, const unsigned len, const long memoLen, const long type )
 | 
						|
#else
 | 
						|
   int memo4fileDump( MEMO4FILE *f4memo, const long memoId, const char *ptr, const unsigned len, const long memoLen )
 | 
						|
#endif
 | 
						|
{
 | 
						|
   long pos, finalLen, tp ;
 | 
						|
   int rc, doLenSet ;
 | 
						|
 | 
						|
   #ifdef S4MNDX
 | 
						|
      char oneA = 0x1A ;
 | 
						|
   #else
 | 
						|
      MEMO4BLOCK  memoBlock ;
 | 
						|
 | 
						|
      #ifdef S4MFOX
 | 
						|
         #ifdef S4BYTE_SWAP
 | 
						|
            memoBlock.type = type ;
 | 
						|
            memoBlock.numChars = memoLen ;
 | 
						|
         #else
 | 
						|
            memoBlock.type = x4reverseLong( (void *)&type ) ;
 | 
						|
            memoBlock.numChars = x4reverseLong( (void *)&memoLen ) ;
 | 
						|
         #endif
 | 
						|
      #else
 | 
						|
         memoBlock.minusOne = -1 ;
 | 
						|
         memoBlock.startPos = sizeof(S4LONG) + 2 * sizeof( short ) ;
 | 
						|
         memoBlock.numChars = memoBlock.startPos + memoLen ;
 | 
						|
         #ifdef S4BYTE_SWAP
 | 
						|
            memoBlock.startPos = x4reverseShort( (void *)&memoBlock.startPos ) ;
 | 
						|
            memoBlock.numChars = x4reverseLong( (void *)&memoBlock.numChars ) ;
 | 
						|
         #endif
 | 
						|
      #endif
 | 
						|
   #endif
 | 
						|
 | 
						|
   pos = memoId * f4memo->blockSize ;
 | 
						|
 | 
						|
   doLenSet = ( file4len( &f4memo->file ) < pos + (long)len ) ;
 | 
						|
 | 
						|
   #ifndef S4MNDX
 | 
						|
      rc = file4write( &f4memo->file, pos, &memoBlock, sizeof( MEMO4BLOCK ) ) ;
 | 
						|
      if ( rc != 0 )
 | 
						|
         return rc ;
 | 
						|
      #ifdef S4MFOX
 | 
						|
         pos += sizeof( MEMO4BLOCK) ;
 | 
						|
      #else
 | 
						|
         pos += sizeof(S4LONG) + 2*sizeof(short) ;
 | 
						|
      #endif
 | 
						|
   #endif
 | 
						|
 | 
						|
   #ifdef S4MNDX
 | 
						|
      rc = file4write( &f4memo->file, pos, ptr, len ) ;
 | 
						|
      if ( rc != 0 )
 | 
						|
         return rc ;
 | 
						|
      rc = file4write( &f4memo->file, pos+len, &oneA, 1 ) ;
 | 
						|
   #else
 | 
						|
      rc = file4write( &f4memo->file, pos, ptr, len ) ;
 | 
						|
   #endif
 | 
						|
 | 
						|
   if ( rc < 0 )
 | 
						|
      return rc ;
 | 
						|
 | 
						|
   if ( doLenSet )
 | 
						|
   {
 | 
						|
      finalLen = file4len( &f4memo->file ) ;
 | 
						|
      tp = finalLen / f4memo->blockSize ;
 | 
						|
      if ( ( tp * f4memo->blockSize ) != finalLen )
 | 
						|
      {
 | 
						|
         #ifdef E4ANALYZE
 | 
						|
            if ( (tp+1)*f4memo->blockSize <= file4len( &f4memo->file ) ||
 | 
						|
                 (tp+1)*f4memo->blockSize <= pos + (long)len )
 | 
						|
              return error4( f4memo->data->c4, e4info, E95207 ) ;
 | 
						|
         #endif
 | 
						|
         file4lenSet( &f4memo->file, (tp+1) * f4memo->blockSize ) ;
 | 
						|
      }
 | 
						|
   }
 | 
						|
 | 
						|
   return 0 ;
 | 
						|
}
 | 
						|
 | 
						|
#endif  /* S4OFF_WRITE */
 | 
						|
#endif  /* S4MEMO_OFF */
 | 
						|
#endif  /* S4CLIENT */
 |