iomem.c

00001 /*
00002  * Copyright (c) 2005-2012 by KoanLogic s.r.l. <http://www.koanlogic.com>
00003  * All rights reserved.
00004  *
00005  * This file is part of KLone, and as such it is subject to the license stated
00006  * in the LICENSE file which you have received as part of this distribution.
00007  *
00008  * $Id: iomem.c,v 1.11 2007/07/20 10:33:15 tat Exp $
00009  */
00010 
00011 #include "klone_conf.h"
00012 #include <unistd.h>
00013 #include <u/libu.h>
00014 #include <klone/io.h>
00015 #include <klone/io.h>
00016 #include <klone/ioprv.h>
00017 
00018 struct io_mem_s
00019 {
00020     struct io_s io; /* must be the first item */
00021     char *buf;
00022     size_t size;
00023     size_t off;
00024     int flags;
00025 };
00026 
00027 typedef struct io_mem_s io_mem_t;
00028 
00029 static ssize_t io_mem_read(io_mem_t *io, char *buf, size_t size);
00030 static ssize_t io_mem_write(io_mem_t *io, const char *buf, size_t size);
00031 static ssize_t io_mem_seek(io_mem_t *io, size_t off);
00032 static ssize_t io_mem_tell(io_mem_t *im);
00033 static int io_mem_close(io_mem_t *io);
00034 static int io_mem_free(io_mem_t *io);
00035 
00036 static ssize_t io_mem_tell(io_mem_t *im)
00037 {
00038     dbg_return_if (im == NULL, -1);
00039 
00040     return im->off;
00041 }
00042 
00043 static ssize_t io_mem_seek(io_mem_t *im, size_t off)
00044 {
00045     dbg_return_if (im == NULL, -1);
00046     
00047     if(off >= im->size)
00048         return -1;
00049 
00050     im->off = off;
00051 
00052     return off;
00053 }
00054 
00055 static ssize_t io_mem_read(io_mem_t *im, char *buf, size_t size)
00056 {
00057     char *ptr;
00058     size_t sz;
00059 
00060     dbg_return_if (im == NULL, -1);
00061     dbg_return_if (buf == NULL, -1);
00062 
00063     sz = U_MIN(size, im->size - im->off);
00064     if(sz)
00065     {
00066         ptr = im->buf + im->off; 
00067         memcpy(buf, ptr, sz);
00068         im->off += sz;
00069     }
00070 
00071     return sz;
00072 }
00073 
00074 static ssize_t io_mem_write(io_mem_t *im, const char *buf, size_t size)
00075 {
00076     char *ptr;
00077     size_t sz;
00078 
00079     dbg_return_if (im == NULL, -1);
00080     dbg_return_if (buf == NULL, -1);
00081 
00082     sz = U_MIN(size, im->size - im->off);
00083     if(sz)
00084     {
00085         ptr = im->buf + im->off; 
00086         memcpy(ptr, buf, sz);
00087         im->off += sz;
00088     }
00089 
00090     return sz;
00091 }
00092 
00093 static int io_mem_close(io_mem_t *im)
00094 {
00095     return 0;
00096 }
00097 
00098 static int io_mem_free(io_mem_t *im)
00099 {
00100     dbg_return_if (im == NULL, ~0);
00101 
00102     if(im->flags & IO_MEM_FREE_BUF)
00103     {
00104         U_FREE(im->buf);
00105         im->buf = NULL;
00106         im->size = im->off = 0;
00107     }
00108 
00109     return 0;
00110 }
00111 
00112 size_t io_mem_get_bufsz(io_t *io)
00113 {
00114     io_mem_t *im = (io_mem_t*)io;
00115 
00116     dbg_err_if(io == NULL);
00117     dbg_err_if(im->io.type != IO_TYPE_MEM);
00118 
00119     return im->size;
00120 err:
00121     return 0;
00122 }
00123 
00124 char *io_mem_get_buf(io_t *io)
00125 {
00126     io_mem_t *im = (io_mem_t*)io;
00127 
00128     dbg_err_if(io == NULL);
00129     dbg_err_if(im->io.type != IO_TYPE_MEM);
00130 
00131     return im->buf;
00132 err:
00133     return NULL;
00134 }
00135 
00136 int io_mem_create(char *buf, size_t size, int flags, io_t **pio)
00137 {
00138     io_mem_t *im = NULL;
00139 
00140     dbg_err_if (buf == NULL);
00141     dbg_err_if (pio == NULL);
00142     
00143     dbg_err_if(io_create(io_mem_t, (io_t**)&im));
00144 
00145     im->io.type = IO_TYPE_MEM;
00146 
00147     im->buf = buf;
00148     im->size = size;
00149     im->flags = flags;
00150     im->off = 0;
00151     im->io.read = (io_read_op) io_mem_read;
00152     im->io.write = (io_write_op) io_mem_write;
00153     im->io.seek = (io_seek_op) io_mem_seek;
00154     im->io.tell = (io_tell_op) io_mem_tell;
00155     im->io.close = (io_close_op) io_mem_close; 
00156     im->io.free = (io_free_op) io_mem_free; 
00157 
00158     *pio = (io_t*)im;
00159 
00160     return 0;
00161 err:
00162     if(im)
00163         io_free((io_t *)im);
00164     return ~0;
00165 }

←Products
Copyright © 2005-2012 - KoanLogic S.r.l. - All rights reserved