Exemplo n.º 1
0
int     FSkipLogical( b_file *io )
//================================
{
    unsigned_32 tag;
    unsigned_32 save_tag;
    size_t      rc;

    for(;;) {
        rc = SysRead( io, (char *)(&tag), sizeof( unsigned_32 ) );
        if( rc == READ_ERROR ) {
            if( io->stat != IO_EOF )
                return( -1 );
            // if an EOF occurs we've skipped the record
            IOOk( io );
            return( 0 );
        }
        if( (tag & 0x80000000) == 0 )
            break;
        save_tag = tag;
        tag &= 0x7fffffff;
        if( SysSeek( io, tag, SEEK_CUR ) < 0 )
            return( -1 );
        rc = SysRead( io, (char *)(&tag), sizeof( unsigned_32 ) );
        if( rc == READ_ERROR )
            return( -1 );
        if( tag != save_tag ) {
            FSetErr( IO_BAD_RECORD, io );
            return( -1 );
        }
    }
    if( SysSeek( io, -(long)sizeof( unsigned_32 ), SEEK_CUR ) < 0 )
        return( -1 );
    return( 0 );
}
Exemplo n.º 2
0
int SampWrite( void FAR_PTR *buff, unsigned len )
{
    unsigned    written;
    int         handle;
    int         rc;

    _fstrcpy( SampName, SharedMemory->SampName );
    if( SharedMemory->SampleHandle == 0 ) {
        handle = SysCreate( SampName );
        SharedMemory->SampleHandle = 1;
    } else {
        handle = SysOpen( SampName );
        if( handle >= 0 ) SysSeek( handle, SharedMemory->SampOffset );
    }
    if( handle == -1 ) {
        SharedMemory->FarWriteProblem = 1;
        return( -1 );
    }

    written = SysWrite( handle, buff, len );
    if( written == len ) {
        SharedMemory->SampOffset += len;
        rc = 0;
    } else {
        SysSeek( handle, SharedMemory->SampOffset );
        SysWrite( handle, "", 0 );
        SharedMemory->FarWriteProblem = 1;
        rc = -1;
    }
    SysClose( handle );
    return( rc );

} /* SampWrite */
Exemplo n.º 3
0
static size_t GetVariableRec( b_file *io, char *b, size_t len )
//=============================================================
// Get a record from a file with "variable" records.
{
    size_t      tag_len;
    unsigned_32 tag;
    unsigned_32 save_tag;

    if( SysRead( io, (char *)(&tag), sizeof( unsigned_32 ) ) == READ_ERROR ) {
        return( 0 );
    }
    save_tag = tag;
    tag_len = tag & 0x7fffffff;
    if( tag_len > len ) {
        FSetTrunc( io );
        if( SysRead( io, b, len ) == READ_ERROR )
            return( 0 );
        if( SysSeek( io, (long)tag_len - (long)len, SEEK_CUR ) < 0 ) {
            FSetSysErr( io );
            return( 0 );
        }
    } else {
        if( SysRead( io, b, tag_len ) == READ_ERROR )
            return( 0 );
        len = tag_len;
    }
    if( SysRead( io, (char *)(&tag), sizeof( unsigned_32 ) ) == READ_ERROR )
        return( 0 );
    if( tag != save_tag ) {
        FSetErr( IO_BAD_RECORD, io );
        return( 0 );
    }
    return( len );
}
Exemplo n.º 4
0
signed_32       FGetVarRecLen( b_file *io )
//=========================================
{
    unsigned_32 tag;
    unsigned_32 save_tag;
    int         rc;
    long        pos;
    unsigned_32 size = 0;

    pos = FGetFilePos( io );
    for( ;; ) {
        rc = SysRead( io, (char *)(&tag), sizeof( unsigned_32 ) );
        if( rc == READ_ERROR ) {
            if( io->stat != IO_EOF )
                return( -1 );
            // if an EOF occurs we've skipped the record
            IOOk( io );
            break;
        }
        save_tag = tag;
        if( !size ) {
            if( tag & 0x80000000 ) {
                FSetErr( IO_BAD_RECORD, io );
                return( -1 );
            }
        } else {
            if( tag & 0x80000000 ) {
                tag &= 0x7fffffff;
            } else {
                break;
            }
        }
        size += tag;
        if( SysSeek( io, tag, SEEK_CUR ) < 0 )
            return( -1 );
        rc = SysRead( io, (char *)(&tag), sizeof( unsigned_32 ) );
        if( rc == READ_ERROR )
            return( -1 );
        if( tag != save_tag ) {
            FSetErr( IO_BAD_RECORD, io );
            return( -1 );
        }
    }
    if( SysSeek( io, pos, SEEK_SET ) < 0 )
        return( -1 );
    return( size );
}
Exemplo n.º 5
0
int SampSeek( unsigned long loc )
{
    if( !SampIsDOS ) {
        if( SysSeek( SampleHandle, loc ) != loc ) return( -1 );
    }
    SampOffset = loc;
    return( 0 );
}
Exemplo n.º 6
0
void    FBackspace( b_file *io, int rec_size ) {
//==============================================

// Backspace a file.

    uint        ch;
    unsigned_32 offset;
    bool        start_of_logical_record;

    IOOk( io );
    if( io->attrs & REC_VARIABLE ) {
        for(;;) {
            offset = sizeof( unsigned_32 );
            if( SysSeek( io, -offset, SEEK_CUR ) < 0 ) return;
            if( SysRead( io, (char *)(&offset), sizeof( unsigned_32 ) ) ==
                READ_ERROR ) return;
            if( offset & 0x80000000 ) {
                offset &= 0x7fffffff;
                start_of_logical_record = FALSE;
            } else {
                start_of_logical_record = TRUE;
            }
            SysSeek( io, -( offset + 2 * sizeof( unsigned_32 ) ), SEEK_CUR );
            if( start_of_logical_record ) break;
        }
    } else if( io->attrs & REC_TEXT ) {
        // skip first record separator
        if( GetPrevChar( io ) == NO_CHAR ) return;
        for(;;) {
            ch = GetPrevChar( io );
            if( ch == NO_CHAR ) return;
            if( ch == LF ) break;
        }
        // give back record separator
        SysSeek( io, +1, SEEK_CUR );
    } else {
        SysSeek( io, -rec_size, SEEK_CUR );
    }
}
Exemplo n.º 7
0
Arquivo: file.c Projeto: d33tah/whitix
off_t lseek(int fd,off_t offset,int whence)
{
	int ret;
	
	ret = SysSeek(fd, offset, whence);
	
	if (ret < 0)
	{
		errno = -ret;
		ret = -1;
	}
	
	return (off_t)ret;
}
Exemplo n.º 8
0
static  uint    GetPrevChar( b_file *io ) {
//=========================================

// Get previous character in file.

    if( CurrFileOffset( io ) == 0 ) return( NO_CHAR );
    if( SysSeek( io, -1L, SEEK_CUR ) < 0 ) {
        return( NO_CHAR );
    }
    if( ( io->attrs & READ_AHEAD ) && io->b_curs < io->read_len ) {
        return( io->buffer[ io->b_curs ] );
    } else if( io->b_curs < io->high_water ) {
        return( io->buffer[ io->b_curs ] );
    }
    return( NO_CHAR );
}
Exemplo n.º 9
0
void    FSeekRec( b_file *io, unsigned_32 rec, uint recsize )
// Seek to specified record in file.
{
    IOOk( io );
    if( io->attrs & SEEK ) {
        if( io->attrs & REC_TEXT ) {
#if defined( __UNIX__ )
            recsize += sizeof( char );     // compensate for LF
#else
            recsize += 2 * sizeof( char ); // compensate for CR/LF
#endif
        } else if( io->attrs & REC_VARIABLE ) {
            recsize += 2 * sizeof( unsigned_32 ); // compensate for length tags
        }
        SysSeek( io, rec * recsize, SEEK_SET );
    } else {
        FSetErr( IO_BAD_OPERATION, io );
    }
}
Exemplo n.º 10
0
int     FCheckLogical( b_file *io )
//=================================
{
    unsigned_32 tag;
    size_t      rc;

    rc = SysRead( io, (char *)(&tag), sizeof( unsigned_32 ) );
    if( rc == READ_ERROR ) {
        if( io->stat != IO_EOF )
            return( -1 );
        // if an EOF occurs we've skipped the record
        IOOk( io );
        return( 0 );
    }
    rc = 0;
    if( tag & 0x80000000 ) {
        rc = 1;
    }
    if( SysSeek( io, -(long)sizeof( unsigned_32 ), SEEK_CUR ) < 0 )
        return( -1 );
    return( rc );
}
Exemplo n.º 11
0
int SampWrite( void FAR_PTR *buff, unsigned len )
{
    LONG written;

    if( SampIsDOS ) {
        DOSWrite( SampleHandle, SampOffset, buff, len, &written );
    } else {
        written = SysWrite( SampleHandle, buff, len );
    }
    if( written == len ) {
        SampOffset += len;
        return( 0 );
    } else {
        if( SampIsDOS ) {
            DOSWrite( SampleHandle, SampOffset, buff, 0, &written );
        } else {
            SysSeek( SampleHandle, SampOffset );
            SysWrite( SampleHandle, "", 0 );   /* truncate the file */
        }
        FarWriteProblem = 1;
        return( -1 );
    }
}
Exemplo n.º 12
0
void    FSeekAbs( b_file *io, unsigned_32 offset )
{
    SysSeek( io, offset, SEEK_SET );
}