libretro: adjust psxclock description
[pcsx_rearmed.git] / deps / libretro-common / streams / trans_stream_pipe.c
1 /* Copyright  (C) 2010-2020 The RetroArch team
2  *
3  * ---------------------------------------------------------------------------------------
4  * The following license statement only applies to this file (trans_stream_pipe.c).
5  * ---------------------------------------------------------------------------------------
6  *
7  * Permission is hereby granted, free of charge,
8  * to any person obtaining a copy of this software and associated documentation files (the "Software"),
9  * to deal in the Software without restriction, including without limitation the rights to
10  * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software,
11  * and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
12  *
13  * The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
14  *
15  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
16  * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
18  * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
19  * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
21  */
22
23 #include <stdlib.h>
24 #include <string.h>
25
26 #include <streams/trans_stream.h>
27
28 struct pipe_trans_stream
29 {
30    const uint8_t *in;
31    uint8_t *out;
32    uint32_t in_size, out_size;
33 };
34
35 static void *pipe_stream_new(void)
36 {
37    struct pipe_trans_stream *stream = 
38       (struct pipe_trans_stream*)malloc(sizeof(*stream));
39    if (!stream)
40       return NULL;
41
42    stream->in                       = NULL;
43    stream->out                      = NULL;
44    stream->in_size                  = 0;
45    stream->out_size                 = 0;
46
47    return stream;
48 }
49
50 static void pipe_stream_free(void *data)
51 {
52    free(data);
53 }
54
55 static void pipe_set_in(void *data, const uint8_t *in, uint32_t in_size)
56 {
57    struct pipe_trans_stream *p = (struct pipe_trans_stream *) data;
58
59    if (!p)
60       return;
61          
62    p->in                       = in;
63    p->in_size                  = in_size;
64 }
65
66 static void pipe_set_out(void *data, uint8_t *out, uint32_t out_size)
67 {
68    struct pipe_trans_stream *p = (struct pipe_trans_stream *) data;
69    
70    if (!p)
71       return;
72
73    p->out                      = out;
74    p->out_size                 = out_size;
75 }
76
77 static bool pipe_trans(
78    void *data, bool flush,
79    uint32_t *rd, uint32_t *wn,
80    enum trans_stream_error *error)
81 {
82    struct pipe_trans_stream *p = (struct pipe_trans_stream *) data;
83
84    if (p->out_size < p->in_size)
85    {
86       memcpy(p->out, p->in, p->out_size);
87       *rd     = *wn = p->out_size;
88       p->in  += p->out_size;
89       p->out += p->out_size;
90       *error  = TRANS_STREAM_ERROR_BUFFER_FULL;
91       return false;
92    }
93
94    memcpy(p->out, p->in, p->in_size);
95    *rd     = *wn = p->in_size;
96    p->in  += p->in_size;
97    p->out += p->in_size;
98    *error  = TRANS_STREAM_ERROR_NONE;
99    return true;
100 }
101
102 const struct trans_stream_backend pipe_backend = {
103    "pipe",
104    &pipe_backend,
105    pipe_stream_new,
106    pipe_stream_free,
107    NULL,
108    pipe_set_in,
109    pipe_set_out,
110    pipe_trans
111 };