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