1*cc4ad7daSAndroid Build Coastguard Worker /*
2*cc4ad7daSAndroid Build Coastguard Worker * kmod - interface to kernel module operations
3*cc4ad7daSAndroid Build Coastguard Worker *
4*cc4ad7daSAndroid Build Coastguard Worker * Copyright (C) 2016 Intel Corporation. All rights reserved.
5*cc4ad7daSAndroid Build Coastguard Worker *
6*cc4ad7daSAndroid Build Coastguard Worker * This library is free software; you can redistribute it and/or
7*cc4ad7daSAndroid Build Coastguard Worker * modify it under the terms of the GNU Lesser General Public
8*cc4ad7daSAndroid Build Coastguard Worker * License as published by the Free Software Foundation; either
9*cc4ad7daSAndroid Build Coastguard Worker * version 2.1 of the License, or (at your option) any later version.
10*cc4ad7daSAndroid Build Coastguard Worker *
11*cc4ad7daSAndroid Build Coastguard Worker * This library is distributed in the hope that it will be useful,
12*cc4ad7daSAndroid Build Coastguard Worker * but WITHOUT ANY WARRANTY; without even the implied warranty of
13*cc4ad7daSAndroid Build Coastguard Worker * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14*cc4ad7daSAndroid Build Coastguard Worker * Lesser General Public License for more details.
15*cc4ad7daSAndroid Build Coastguard Worker *
16*cc4ad7daSAndroid Build Coastguard Worker * You should have received a copy of the GNU Lesser General Public
17*cc4ad7daSAndroid Build Coastguard Worker * License along with this library; if not, see <http://www.gnu.org/licenses/>.
18*cc4ad7daSAndroid Build Coastguard Worker */
19*cc4ad7daSAndroid Build Coastguard Worker #include "scratchbuf.h"
20*cc4ad7daSAndroid Build Coastguard Worker
21*cc4ad7daSAndroid Build Coastguard Worker #include <errno.h>
22*cc4ad7daSAndroid Build Coastguard Worker #include <string.h>
23*cc4ad7daSAndroid Build Coastguard Worker
scratchbuf_init(struct scratchbuf * buf,char * stackbuf,size_t size)24*cc4ad7daSAndroid Build Coastguard Worker void scratchbuf_init(struct scratchbuf *buf, char *stackbuf, size_t size)
25*cc4ad7daSAndroid Build Coastguard Worker {
26*cc4ad7daSAndroid Build Coastguard Worker buf->bytes = stackbuf;
27*cc4ad7daSAndroid Build Coastguard Worker buf->size = size;
28*cc4ad7daSAndroid Build Coastguard Worker buf->need_free = false;
29*cc4ad7daSAndroid Build Coastguard Worker }
30*cc4ad7daSAndroid Build Coastguard Worker
scratchbuf_alloc(struct scratchbuf * buf,size_t size)31*cc4ad7daSAndroid Build Coastguard Worker int scratchbuf_alloc(struct scratchbuf *buf, size_t size)
32*cc4ad7daSAndroid Build Coastguard Worker {
33*cc4ad7daSAndroid Build Coastguard Worker char *tmp;
34*cc4ad7daSAndroid Build Coastguard Worker
35*cc4ad7daSAndroid Build Coastguard Worker if (size <= buf->size)
36*cc4ad7daSAndroid Build Coastguard Worker return 0;
37*cc4ad7daSAndroid Build Coastguard Worker
38*cc4ad7daSAndroid Build Coastguard Worker if (buf->need_free) {
39*cc4ad7daSAndroid Build Coastguard Worker tmp = realloc(buf->bytes, size);
40*cc4ad7daSAndroid Build Coastguard Worker if (tmp == NULL)
41*cc4ad7daSAndroid Build Coastguard Worker return -ENOMEM;
42*cc4ad7daSAndroid Build Coastguard Worker } else {
43*cc4ad7daSAndroid Build Coastguard Worker tmp = malloc(size);
44*cc4ad7daSAndroid Build Coastguard Worker if (tmp == NULL)
45*cc4ad7daSAndroid Build Coastguard Worker return -ENOMEM;
46*cc4ad7daSAndroid Build Coastguard Worker memcpy(tmp, buf->bytes, buf->size);
47*cc4ad7daSAndroid Build Coastguard Worker }
48*cc4ad7daSAndroid Build Coastguard Worker
49*cc4ad7daSAndroid Build Coastguard Worker buf->size = size;
50*cc4ad7daSAndroid Build Coastguard Worker buf->bytes = tmp;
51*cc4ad7daSAndroid Build Coastguard Worker buf->need_free = true;
52*cc4ad7daSAndroid Build Coastguard Worker
53*cc4ad7daSAndroid Build Coastguard Worker return 0;
54*cc4ad7daSAndroid Build Coastguard Worker }
55*cc4ad7daSAndroid Build Coastguard Worker
scratchbuf_release(struct scratchbuf * buf)56*cc4ad7daSAndroid Build Coastguard Worker void scratchbuf_release(struct scratchbuf *buf)
57*cc4ad7daSAndroid Build Coastguard Worker {
58*cc4ad7daSAndroid Build Coastguard Worker if (buf->need_free)
59*cc4ad7daSAndroid Build Coastguard Worker free(buf->bytes);
60*cc4ad7daSAndroid Build Coastguard Worker }
61