campo-sirio/cb/source/m4create.c
alex af15e0698b Codebase
git-svn-id: svn://10.65.10.50/trunk@4679 c028cbd2-c16b-5b4b-a496-9718f37d4682
1997-06-16 13:01:08 +00:00

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( 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 */