xref: /aosp_15_r20/external/mesa3d/src/util/memstream.c (revision 6104692788411f58d303aa86923a9ff6ecaded22)
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