summaryrefslogtreecommitdiffstats
path: root/file_use.c
diff options
context:
space:
mode:
authorFreeArtMan <dos21h@gmail.com>2014-12-09 10:31:37 +0900
committerFreeArtMan <dos21h@gmail.com>2014-12-09 10:31:37 +0900
commita57c6bed8f6ab7d0f4355190c0cff7cd913da6a0 (patch)
treec8b85b9de364cb63678d05625bdff6a2cf12ecda /file_use.c
parentdc4bbe5366d6c733f9f77b7c9fee0cbba3e0d92b (diff)
downloadmicrobbs-a57c6bed8f6ab7d0f4355190c0cff7cd913da6a0.tar.gz
microbbs-a57c6bed8f6ab7d0f4355190c0cff7cd913da6a0.zip
New planned functionality. Menuconfig support. Simple captcha.
Diffstat (limited to 'file_use.c')
-rw-r--r--file_use.c198
1 files changed, 198 insertions, 0 deletions
diff --git a/file_use.c b/file_use.c
new file mode 100644
index 0000000..cd816bc
--- /dev/null
+++ b/file_use.c
@@ -0,0 +1,198 @@
+#include "file_use.h"
+
+
+void f_file_null( f_file *f_f )
+{
+ if ( f_f )
+ {
+ f_f->fid = NULL;
+ f_f->flags = 0;
+ f_f->size = -1;
+ f_f->seek = -1;
+ }
+}
+
+int f_file_seek( f_file *f_f, long offset, int seek )
+{
+ int ret=-1;
+ PRINT("\n");
+ if ( f_f )
+ {
+ if ( offset < 0 )
+ {
+ ERROR("\n");
+ return -1;
+ }
+
+ if ( offset > f_f->size )
+ {
+ ERROR("\n");
+ return -1;
+ }
+
+
+ ret = fseek( f_f->fid, offset , seek );
+ PRINT("ret=%d\n",ret);
+ if ( ret == 0 )
+ {
+ f_f->seek = ret;
+ }
+ else
+ {
+ ERROR("cannot seek to %d\n", offset);
+ return -1;
+ }
+ PRINT("ret=%d\n",ret);
+ }
+ return ret;
+}
+
+
+size_t f_file_read( f_file *f_f, size_t size, void *ptr )
+{
+ size_t ret=-1;
+ PRINT("\n");
+ if ( f_f )
+ {
+ if ( (f_f->flags == F_FILE_READ) ||
+ (f_f->flags == F_FILE_RW))
+ {
+ if ( f_f->size >= f_f->seek + f_f->size )
+ {
+ ret = fread( ptr, 1, size, f_f->fid );
+ /*
+ if ( ret != size )
+ {
+ ERROR("%d != %d\n", ret, size );
+ return -1;
+ }
+ else
+ */
+ if ( ret < 0 )
+ {
+ ERROR("\n");
+ return ret;
+ }
+ } else
+ {
+ ERROR("\n");
+ }
+ } else
+ {
+ ERROR("file writable only");
+ }
+ }
+ return ret;
+}
+
+
+int f_file_size( f_file *f_f )
+{
+ int ret=-1;
+ long old_seek;
+
+ PRINT("\n");
+ if ( f_f )
+ {
+ //could make some logic break
+ if ( f_f->size < 0 )
+ {
+ old_seek = ftell( f_f->fid );
+ fseek( f_f->fid, 0, SEEK_END );
+ ret = ftell( f_f->fid );
+ fseek( f_f->fid, old_seek, SEEK_CUR );
+ }
+ }
+ return ret;
+}
+
+
+//f_file_read_bl();
+
+
+size_t f_file_write( f_file *f_f, size_t size, void *ptr )
+{
+ PRINT("%s\n");
+ if ( f_f )
+ {
+ if ((f_f->flags == F_FILE_WRITE) ||
+ (f_f->flags == F_FILE_RW) )
+ {
+ ERROR("Not yet ready\n");
+ }
+ }
+
+}
+
+
+//f_file_write_bl();
+
+
+f_file* f_file_open( const char *fname, int flags )
+{
+ f_file *ret = NULL;
+
+ const char *f_flags_write="r";
+ const char *f_flags_read="w";
+ const char *f_flags_rw="r+";
+ char *f_flags_tmp=NULL;
+
+ if ( fname != NULL )
+ {
+ ret = malloc( sizeof( f_file ) );
+ if ( ret == NULL )
+ {
+ ERROR("Cannot alloc mem\n");
+ return NULL;
+ }
+ memset( ret, 0, sizeof( f_file ));
+ f_file_null( ret );
+ switch ( flags )
+ {
+ case F_FILE_READ:
+ f_flags_tmp = f_flags_read;
+ ret->flags = F_FILE_READ;
+ break;
+
+ case F_FILE_WRITE:
+ f_flags_tmp = f_flags_write;
+ ret->flags = F_FILE_WRITE;
+ break;
+
+ case F_FILE_RW:
+ f_flags_tmp = f_flags_rw;
+ ret->flags = F_FILE_RW;
+ break;
+
+ default:
+ ERROR("Unknown flag for opening \n");
+ goto exit_close_f;
+ }
+ ret->fid = fopen( fname, "r" );
+ if ( ret->fid == NULL )
+ {
+ ERROR("Cannot open file\n");
+ goto exit_close_f;
+ }
+ ret->size = f_file_size( ret );
+ }
+ return ret;
+
+exit_close_f:
+ if ( ret != NULL )
+ free( ret );
+ return NULL;
+}
+
+
+int f_file_close( f_file *f_f )
+{
+ PRINT("\n");
+ if ( f_f )
+ {
+ fclose( f_f->fid );
+ free( f_f );
+ f_f = NULL;
+ }
+}
+