Skip to content

Commit

Permalink
fwrite fix.
Browse files Browse the repository at this point in the history
  • Loading branch information
mumurik committed Apr 29, 2010
1 parent 91ef21e commit e6cd86e
Show file tree
Hide file tree
Showing 7 changed files with 67 additions and 19 deletions.
13 changes: 11 additions & 2 deletions mona/core/monalibc/stdio/fflush.c
Expand Up @@ -41,9 +41,18 @@ int fflush(FILE *stream)
}
else if( stream->_flags & __SFBF )
{
stream->_seek(stream, stream->_extra->offset, SEEK_SET);
if( stream->_flags & __SWR )
stream->_write(stream, stream->_bf._base, stream->_bf._size);
{
if(stream->_bf._range > 0)
{
stream->_seek(stream, stream->_bf._offset, SEEK_SET);
stream->_write(stream, stream->_bf._base, stream->_bf._range);
}
stream->_bf._offset = stream->_extra->offset;
stream->_bf._range = 0;
}
stream->_seek(stream, stream->_extra->offset, SEEK_SET);
return 0;
}
else if( stream->_flags & __SLBF )
{
Expand Down
17 changes: 11 additions & 6 deletions mona/core/monalibc/stdio/fopen.c
Expand Up @@ -109,12 +109,17 @@ FILE *fopen(const char *path, const char *mode)
fp->_extra->filesize = (fpos_t)monapi_file_get_file_size(fp->_file);
fp->_ungetcbuf = EOF;

fp->_bf._size = BUFSIZ;
fp->_flags |= __SALD|__SFBF|__SOAL;
/*
fp->_bf._size = 0;
fp->_flags |= __SNBF;
*/
// if read+write, nobuffer.
if(((fp->_flags & __SWR) || (fp->_flags & __SAP)) && (fp->_flags & __SRD))
{
fp->_bf._size = 0;
fp->_flags |= __SNBF;
}
else
{
fp->_bf._size = BUFSIZ;
fp->_flags |= __SALD|__SFBF|__SOAL;
}

return fp;
}
Expand Down
1 change: 1 addition & 0 deletions mona/core/monalibc/stdio/fseek.c
Expand Up @@ -38,6 +38,7 @@ int fseek(FILE *stream, long offset, int whence)
{
register int result;
// stream->_extra->filesize = monapi_file_get_file_size(stream->_file);
fflush(stream);
switch(whence)
{
case SEEK_SET:
Expand Down
29 changes: 19 additions & 10 deletions mona/core/monalibc/stdio/fwrite.c
Expand Up @@ -53,26 +53,35 @@ size_t __nida_nonebuf_fwrite(const void *ptr, size_t size, FILE *stream)
return writesize;
}

static int target_inside_buffer(int bufoff, int bufsize, int targetoff, int targetsize)
{
return ( bufoff <= targetoff &&
bufoff+bufsize >= targetoff+targetsize);
}

size_t __nida_fullybuf_fwrite(const void *ptr, size_t size, FILE *stream)
{
size_t writesize;
int offdiff;

if( stream->_bf._offset <= stream->_extra->offset &&
stream->_bf._offset+stream->_bf._range >= stream->_extra->offset+size);
struct __sbuf *bf = &stream->_bf;
struct __sFILEX *extra = stream->_extra;
if(!target_inside_buffer(bf->_offset, bf->_size, extra->offset, size))
{
offdiff = stream->_extra->offset-stream->_bf._offset;
writesize = size;
if( stream->_bf._size < size )
fflush(stream);
if(!target_inside_buffer(bf->_offset, bf->_size, extra->offset, size))
{
writesize = stream->_bf._size;
return stream->_write(stream, (void*)ptr, size);
}
memcpy(stream->_bf._base+offdiff, ptr, writesize);
/* fall through */
}
offdiff = extra->offset-bf->_offset;
memcpy(bf->_base+offdiff, ptr, size);
extra->offset += size;
if(bf->_range < offdiff+size)
bf->_range = offdiff+size;
return size;

stream->_write(stream, (void*)ptr, size);

return writesize;
}

size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream)
Expand Down
1 change: 1 addition & 0 deletions mona/core/scheme/lib/conf.scm.in
Expand Up @@ -334,6 +334,7 @@
(call-process "/APPS/TSTDIO.APP/TSTDIO.EX5")
(call-process "/APPS/TMSG.EX5")
(call-process "/APPS/TSOCK.EX5")
(call-process "/APPS/TRAMDISK.EX5")
;(call-process "/APPS/HELLO.EX5")
;(start-process "/APPS/NET.EX5")

Expand Down
23 changes: 23 additions & 0 deletions mona/test/monalibc/stdio/test.cpp
Expand Up @@ -10,6 +10,7 @@ int test2();
int test3();
int test4();
int test5();
void testFWriteSmall();

int main(int argc, char* argv[])
{
Expand All @@ -22,6 +23,7 @@ int main(int argc, char* argv[])
test3();
test4();
test5();
testFWriteSmall();
TEST_RESULTS(stdio);
return 0;
}
Expand Down Expand Up @@ -84,3 +86,24 @@ int test5()
EXPECT_EQ(fileno(stdout), fileno(stdout));
EXPECT_EQ(fileno(stderr), fileno(stderr));
}

static int fileSize(const char* path)
{
uint32_t id = monapi_file_open(path, false);
int actual = monapi_file_get_file_size(id);
monapi_file_close(id);
return actual;
}

void testFWriteSmall()
{
const char* path;
FILE* fp = fopen("/MEM/TEST.DAT", "w");
EXPECT_TRUE(fp != NULL);
const char buf[] = "test";
fwrite(buf, sizeof(char), sizeof(buf), fp);
fclose(fp);

EXPECT_EQ(sizeof(buf), fileSize("/MEM/TEST.DAT"));
monapi_file_delete("/MEM/TEST.DAT");
}
2 changes: 1 addition & 1 deletion mona/test/monapi/ram_disk/Makefile
Expand Up @@ -2,7 +2,7 @@ ifndef $(MONADIR)
export MONADIR=$(shell cd $(PWD)/../../../; pwd)
endif

TARGET = RAMDISK
TARGET = TRAMDISK
SOURCES = ram_disk.cpp
INSTDIR = $(BINDIR)/APPS

Expand Down

0 comments on commit e6cd86e

Please sign in to comment.