1*61046927SAndroid Build Coastguard Worker /*
2*61046927SAndroid Build Coastguard Worker * Copyright 2020 Lag Free Games, LLC
3*61046927SAndroid Build Coastguard Worker * All Rights Reserved.
4*61046927SAndroid Build Coastguard Worker *
5*61046927SAndroid Build Coastguard Worker * Permission is hereby granted, free of charge, to any person obtaining a
6*61046927SAndroid Build Coastguard Worker * copy of this software and associated documentation files (the
7*61046927SAndroid Build Coastguard Worker * "Software"), to deal in the Software without restriction, including
8*61046927SAndroid Build Coastguard Worker * without limitation the rights to use, copy, modify, merge, publish,
9*61046927SAndroid Build Coastguard Worker * distribute, sub license, and/or sell copies of the Software, and to
10*61046927SAndroid Build Coastguard Worker * permit persons to whom the Software is furnished to do so, subject to
11*61046927SAndroid Build Coastguard Worker * the following conditions:
12*61046927SAndroid Build Coastguard Worker *
13*61046927SAndroid Build Coastguard Worker * The above copyright notice and this permission notice (including the
14*61046927SAndroid Build Coastguard Worker * next paragraph) shall be included in all copies or substantial portions
15*61046927SAndroid Build Coastguard Worker * of the Software.
16*61046927SAndroid Build Coastguard Worker *
17*61046927SAndroid Build Coastguard Worker * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
18*61046927SAndroid Build Coastguard Worker * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
19*61046927SAndroid Build Coastguard Worker * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
20*61046927SAndroid Build Coastguard Worker * IN NO EVENT SHALL VMWARE AND/OR ITS SUPPLIERS BE LIABLE FOR
21*61046927SAndroid Build Coastguard Worker * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
22*61046927SAndroid Build Coastguard Worker * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
23*61046927SAndroid Build Coastguard Worker * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
24*61046927SAndroid Build Coastguard Worker */
25*61046927SAndroid Build Coastguard Worker
26*61046927SAndroid Build Coastguard Worker #include "memstream.h"
27*61046927SAndroid Build Coastguard Worker
28*61046927SAndroid Build Coastguard Worker #include <stdlib.h>
29*61046927SAndroid Build Coastguard Worker
30*61046927SAndroid Build Coastguard Worker #ifdef _WIN32
31*61046927SAndroid Build Coastguard Worker #include <windows.h>
32*61046927SAndroid Build Coastguard Worker #endif
33*61046927SAndroid Build Coastguard Worker
34*61046927SAndroid Build Coastguard Worker bool
u_memstream_open(struct u_memstream * mem,char ** bufp,size_t * sizep)35*61046927SAndroid Build Coastguard Worker u_memstream_open(struct u_memstream *mem, char **bufp, size_t *sizep)
36*61046927SAndroid Build Coastguard Worker {
37*61046927SAndroid Build Coastguard Worker #ifdef _GAMING_XBOX
38*61046927SAndroid Build Coastguard Worker int err = tmpfile_s(&mem->f);
39*61046927SAndroid Build Coastguard Worker mem->bufp = bufp;
40*61046927SAndroid Build Coastguard Worker mem->sizep = sizep;
41*61046927SAndroid Build Coastguard Worker
42*61046927SAndroid Build Coastguard Worker return err == 0;
43*61046927SAndroid Build Coastguard Worker #elif defined(_WIN32)
44*61046927SAndroid Build Coastguard Worker bool success = false;
45*61046927SAndroid Build Coastguard Worker
46*61046927SAndroid Build Coastguard Worker char path[MAX_PATH];
47*61046927SAndroid Build Coastguard Worker DWORD dwResult = GetTempPath(MAX_PATH, path);
48*61046927SAndroid Build Coastguard Worker if ((dwResult > 0) && (dwResult < MAX_PATH)) {
49*61046927SAndroid Build Coastguard Worker char *temp = mem->temp;
50*61046927SAndroid Build Coastguard Worker UINT uResult = GetTempFileName(path, "MEMSTREAM", 0, temp);
51*61046927SAndroid Build Coastguard Worker if (uResult != 0) {
52*61046927SAndroid Build Coastguard Worker FILE *f = fopen(temp, "w+b");
53*61046927SAndroid Build Coastguard Worker success = f != NULL;
54*61046927SAndroid Build Coastguard Worker if (success)
55*61046927SAndroid Build Coastguard Worker {
56*61046927SAndroid Build Coastguard Worker mem->f = f;
57*61046927SAndroid Build Coastguard Worker mem->bufp = bufp;
58*61046927SAndroid Build Coastguard Worker mem->sizep = sizep;
59*61046927SAndroid Build Coastguard Worker }
60*61046927SAndroid Build Coastguard Worker }
61*61046927SAndroid Build Coastguard Worker }
62*61046927SAndroid Build Coastguard Worker
63*61046927SAndroid Build Coastguard Worker return success;
64*61046927SAndroid Build Coastguard Worker #else
65*61046927SAndroid Build Coastguard Worker FILE *const f = open_memstream(bufp, sizep);
66*61046927SAndroid Build Coastguard Worker mem->f = f;
67*61046927SAndroid Build Coastguard Worker return f != NULL;
68*61046927SAndroid Build Coastguard Worker #endif
69*61046927SAndroid Build Coastguard Worker }
70*61046927SAndroid Build Coastguard Worker
71*61046927SAndroid Build Coastguard Worker void
u_memstream_close(struct u_memstream * mem)72*61046927SAndroid Build Coastguard Worker u_memstream_close(struct u_memstream *mem)
73*61046927SAndroid Build Coastguard Worker {
74*61046927SAndroid Build Coastguard Worker FILE *const f = mem->f;
75*61046927SAndroid Build Coastguard Worker
76*61046927SAndroid Build Coastguard Worker #ifdef _WIN32
77*61046927SAndroid Build Coastguard Worker long size = ftell(f);
78*61046927SAndroid Build Coastguard Worker if (size > 0) {
79*61046927SAndroid Build Coastguard Worker /* reserve space for the null terminator */
80*61046927SAndroid Build Coastguard Worker char *buf = malloc(size + 1);
81*61046927SAndroid Build Coastguard Worker fseek(f, 0, SEEK_SET);
82*61046927SAndroid Build Coastguard Worker fread(buf, 1, size, f);
83*61046927SAndroid Build Coastguard Worker /* insert null terminator */
84*61046927SAndroid Build Coastguard Worker buf[size] = '\0';
85*61046927SAndroid Build Coastguard Worker
86*61046927SAndroid Build Coastguard Worker *mem->bufp = buf;
87*61046927SAndroid Build Coastguard Worker *mem->sizep = size;
88*61046927SAndroid Build Coastguard Worker }
89*61046927SAndroid Build Coastguard Worker
90*61046927SAndroid Build Coastguard Worker remove(mem->temp);
91*61046927SAndroid Build Coastguard Worker #endif
92*61046927SAndroid Build Coastguard Worker
93*61046927SAndroid Build Coastguard Worker fclose(f);
94*61046927SAndroid Build Coastguard Worker }
95