2 * Copyright 2008, Google Inc.
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions are
9 * * Redistributions of source code must retain the above copyright
10 * notice, this list of conditions and the following disclaimer.
11 * * Redistributions in binary form must reproduce the above
12 * copyright notice, this list of conditions and the following disclaimer
13 * in the documentation and/or other materials provided with the
15 * * Neither the name of Google Inc. nor the names of its
16 * contributors may be used to endorse or promote products derived from
17 * this software without specific prior written permission.
19 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
20 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
21 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
22 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
23 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
24 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
25 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
26 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
27 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
28 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
29 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
33 * NaCl Generic I/O interface implementation: memory buffer-based I/O.
35 #include "native_client/include/portability.h"
40 #include "native_client/service_runtime/gio.h"
43 * Memory file is just read/write from/to an in-memory buffer. Once
44 * the buffer is consumed, there is no refilling/flushing.
47 struct GioVtbl
const kGioMemoryFileVtbl
= {
56 int GioMemoryFileCtor(struct GioMemoryFile
*self
,
60 self
->buffer
= buffer
;
64 self
->base
.vtbl
= &kGioMemoryFileVtbl
;
68 int GioMemoryFileRead(struct Gio
*vself
,
72 struct GioMemoryFile
*self
= (struct GioMemoryFile
*) vself
;
76 /* is size_t signed? */
82 /* 0 <= self->curpos && self->curpos <= self->len */
83 remain
= self
->len
- self
->curpos
;
84 /* 0 <= remain <= self->len */
88 /* 0 <= count && count <= remain */
92 newpos
= self
->curpos
+ count
;
93 /* self->curpos <= newpos && newpos <= self->len */
95 memcpy(buf
, self
->buffer
+ self
->curpos
, count
);
96 self
->curpos
= newpos
;
100 int GioMemoryFileWrite(struct Gio
*vself
,
104 struct GioMemoryFile
*self
= (struct GioMemoryFile
*) vself
;
108 /* is size_t signed? */
114 /* 0 <= self->curpos && self->curpos <= self->len */
115 remain
= self
->len
- self
->curpos
;
116 /* 0 <= remain <= self->len */
117 if (count
> remain
) {
120 /* 0 <= count && count <= remain */
124 newpos
= self
->curpos
+ count
;
125 /* self->curpos <= newpos && newpos <= self->len */
127 memcpy(self
->buffer
+ self
->curpos
, buf
, count
);
128 self
->curpos
= newpos
;
129 /* we never extend a memory file */
133 off_t
GioMemoryFileSeek(struct Gio
*vself
,
137 struct GioMemoryFile
*self
= (struct GioMemoryFile
*) vself
;
145 new_pos
= self
->curpos
+ offset
;
148 new_pos
= self
->len
+ offset
;
154 if (new_pos
< 0 || new_pos
> self
->len
) {
158 self
->curpos
= new_pos
;
162 int GioMemoryFileClose(struct Gio
*vself
)
167 int GioMemoryFileFlush(struct Gio
*vself
)
172 void GioMemoryFileDtor(struct Gio
*vself
)