Blender V4.3
logmemfile.cc
Go to the documentation of this file.
1/* SPDX-FileCopyrightText: 2006 Joseph Eagar <joeedh@gmail.com>.
2 *
3 * SPDX-License-Identifier: GPL-2.0-or-later */
4
11#include <cstdio>
12#include <cstdlib>
13#include <cstring>
14
15#include "logImageCore.h"
16#include "logmemfile.h"
17
18int logimage_fseek(LogImageFile *logFile, intptr_t offset, int origin)
19{
20 if (logFile->file) {
21 fseek(logFile->file, offset, origin);
22 }
23 else { /* we're seeking in memory */
24 if (origin == SEEK_SET) {
25 if (offset > logFile->memBufferSize) {
26 return 1;
27 }
28 logFile->memCursor = logFile->memBuffer + offset;
29 }
30 else if (origin == SEEK_END) {
31 if (offset > logFile->memBufferSize) {
32 return 1;
33 }
34 logFile->memCursor = (logFile->memBuffer + logFile->memBufferSize) - offset;
35 }
36 else if (origin == SEEK_CUR) {
37 uintptr_t pos = uintptr_t(logFile->memCursor) - uintptr_t(logFile->memBuffer);
38 if (pos + offset > logFile->memBufferSize) {
39 return 1;
40 }
41
42 logFile->memCursor += offset;
43 }
44 }
45 return 0;
46}
47
48int logimage_fwrite(const void *buffer, size_t size, uint count, LogImageFile *logFile)
49{
50 if (logFile->file) {
51 return fwrite(buffer, size, count, logFile->file);
52 }
53 /* we're writing to memory */
54 /* do nothing as this isn't supported yet */
55 return count;
56}
57
58int logimage_fread(void *buffer, size_t size, uint count, LogImageFile *logFile)
59{
60 if (logFile->file) {
61 return fread(buffer, size, count, logFile->file);
62 }
63 /* we're reading from memory */
64 uchar *buf = (uchar *)buffer;
65 uintptr_t pos = uintptr_t(logFile->memCursor) - uintptr_t(logFile->memBuffer);
66 size_t total_size = size * count;
67 if (pos + total_size > logFile->memBufferSize) {
68 /* how many elements can we read without overflow ? */
69 count = (logFile->memBufferSize - pos) / size;
70 /* recompute the size */
71 total_size = size * count;
72 }
73
74 if (total_size != 0) {
75 memcpy(buf, logFile->memCursor, total_size);
76 }
77
78 return count;
79}
80
82{
83 uintptr_t pos = uintptr_t(logFile->memCursor) - uintptr_t(logFile->memBuffer);
84 if (pos + sizeof(uchar) > logFile->memBufferSize) {
85 return 1;
86 }
87
88 *x = *(uchar *)logFile->memCursor;
89 logFile->memCursor += sizeof(uchar);
90 return 0;
91}
92
94{
95 uintptr_t pos = uintptr_t(logFile->memCursor) - uintptr_t(logFile->memBuffer);
96 if (pos + sizeof(ushort) > logFile->memBufferSize) {
97 return 1;
98 }
99
100 *x = *(ushort *)logFile->memCursor;
101 logFile->memCursor += sizeof(ushort);
102 return 0;
103}
104
106{
107 uintptr_t pos = uintptr_t(logFile->memCursor) - uintptr_t(logFile->memBuffer);
108 if (pos + sizeof(uint) > logFile->memBufferSize) {
109 return 1;
110 }
111
112 *x = *(uint *)logFile->memCursor;
113 logFile->memCursor += sizeof(uint);
114 return 0;
115}
unsigned char uchar
unsigned short ushort
unsigned int uint
int count
int logimage_read_uint(uint *x, LogImageFile *logFile)
int logimage_fread(void *buffer, size_t size, uint count, LogImageFile *logFile)
Definition logmemfile.cc:58
int logimage_read_ushort(ushort *x, LogImageFile *logFile)
Definition logmemfile.cc:93
int logimage_read_uchar(uchar *x, LogImageFile *logFile)
Definition logmemfile.cc:81
int logimage_fseek(LogImageFile *logFile, intptr_t offset, int origin)
Definition logmemfile.cc:18
int logimage_fwrite(const void *buffer, size_t size, uint count, LogImageFile *logFile)
Definition logmemfile.cc:48
_W64 unsigned int uintptr_t
Definition stdint.h:119
_W64 int intptr_t
Definition stdint.h:118
uintptr_t memBufferSize
unsigned char * memBuffer
unsigned char * memCursor