1 /*$
2 Copyright (C) 2016-2020 Azel.
3
4 This file is part of AzPainterB.
5
6 AzPainterB is free software: you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation, either version 3 of the License, or
9 (at your option) any later version.
10
11 AzPainterB is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
15
16 You should have received a copy of the GNU General Public License
17 along with this program. If not, see <http://www.gnu.org/licenses/>.
18 $*/
19
20 /*****************************************
21 * 標準定義関数
22 *****************************************/
23
24 #include <stdlib.h>
25 #include <stdio.h>
26 #include <string.h>
27 #include <stdarg.h>
28
29 #include "mDef.h"
30
31 #ifdef MLIB_MEMDEBUG
32 #include "mMemDebug.h"
33 #endif
34
35
36 /********************//**
37
38 @defgroup default mDef
39 @brief 標準定義
40
41 @ingroup group_main
42 @{
43
44 @file mDef.h
45 @file mDefGui.h
46
47 *************************/
48
49
50 /** stderr にメッセージ表示 */
51
mDebug(const char * format,...)52 void mDebug(const char *format,...)
53 {
54 va_list arg;
55
56 va_start(arg, format);
57 vfprintf(stderr, format, arg);
58 va_end(arg);
59
60 fflush(stderr);
61 }
62
63
64 //===========================
65 // メモリ関連 - 通常
66 //===========================
67
68
69 /** メモリ解放
70 *
71 * @param ptr NULL で何もしない */
72
mFree(void * ptr)73 void mFree(void *ptr)
74 {
75 if(ptr) free(ptr);
76 }
77
78 /** メモリ確保 (非デバッグ)
79 *
80 * @param clear TRUE でゼロクリア */
81
__mMalloc(uint32_t size,mBool clear)82 void *__mMalloc(uint32_t size,mBool clear)
83 {
84 void *ptr;
85
86 ptr = malloc(size);
87 if(!ptr) return NULL;
88
89 if(clear) memset(ptr, 0, size);
90
91 return ptr;
92 }
93
94 /** メモリサイズ変更 (非デバッグ) */
95
__mRealloc(void * ptr,uint32_t size)96 void *__mRealloc(void *ptr,uint32_t size)
97 {
98 if(ptr)
99 return realloc(ptr, size);
100 else
101 return NULL;
102 }
103
104 /** メモリバッファ複製 */
105
mMemdup(const void * src,uint32_t size)106 void *mMemdup(const void *src,uint32_t size)
107 {
108 void *buf;
109
110 if(!src) return NULL;
111
112 buf = mMalloc(size, FALSE);
113 if(!buf)
114 return NULL;
115 else
116 {
117 memcpy(buf, src, size);
118 return buf;
119 }
120 }
121
122 /** バッファをゼロクリア */
123
mMemzero(void * buf,int size)124 void mMemzero(void *buf,int size)
125 {
126 if(buf)
127 memset(buf, 0, size);
128 }
129
130
131 //===========================
132 // メモリデバッグ用
133 //===========================
134
135
136 #ifdef MLIB_MEMDEBUG
137
__mMalloc_debug(uint32_t size,mBool clear,const char * filename,int line)138 void *__mMalloc_debug(uint32_t size,mBool clear,const char *filename,int line)
139 {
140 void *ptr;
141
142 ptr = mMemDebug_malloc(size, filename, line);
143 if(!ptr) return NULL;
144
145 if(clear) memset(ptr, 0, size);
146
147 return ptr;
148 }
149
__mRealloc_debug(void * ptr,uint32_t size,const char * filename,int line)150 void *__mRealloc_debug(void *ptr,uint32_t size,const char *filename,int line)
151 {
152 return mMemDebug_realloc(ptr, size, filename, line);
153 }
154
__mStrdup_debug(const char * str,const char * filename,int line)155 char *__mStrdup_debug(const char *str,const char *filename,int line)
156 {
157 return mMemDebug_strdup(str, filename, line);
158 }
159
__mStrndup_debug(const char * str,int len,const char * filename,int line)160 char *__mStrndup_debug(const char *str,int len,const char *filename,int line)
161 {
162 return mMemDebug_strndup(str, len, filename, line);
163 }
164
165 #endif
166
167
168 //===========================
169 // 文字列関連
170 //===========================
171
172
173 /** 文字列複製 (非デバッグ)
174 *
175 * @return str が NULL の場合は NULL を返す */
176
__mStrdup(const char * str)177 char *__mStrdup(const char *str)
178 {
179 if(str)
180 return strdup(str);
181 else
182 return NULL;
183 }
184
185 /** 文字列複製
186 *
187 * ptr に複製した文字列を格納し、文字の長さを返す。
188 *
189 * @param str NULL の場合、*ptr には NULL、戻り値には 0 を返す
190 * @return 文字の長さ */
191
mStrdup2(const char * str,char ** ptr)192 int mStrdup2(const char *str,char **ptr)
193 {
194 if(str)
195 {
196 *ptr = mStrdup(str);
197 return strlen(str);
198 }
199 else
200 {
201 *ptr = NULL;
202 return 0;
203 }
204 }
205
206 /** 文字列複製
207 *
208 * *dst が NULL 以外なら、解放してから複製。\n
209 * *dst に文字列ポインタが入る。
210 *
211 * @return *dst の値が返る */
212
mStrdup_ptr(char ** dst,const char * src)213 char *mStrdup_ptr(char **dst,const char *src)
214 {
215 mFree(*dst);
216
217 return (*dst = mStrdup(src));
218 }
219
220 /** 文字列を指定長さ分複製 (非デバッグ) */
221
__mStrndup(const char * str,int len)222 char *__mStrndup(const char *str,int len)
223 {
224 if(str)
225 return strndup(str, len);
226 else
227 return NULL;
228 }
229
230 /** 文字列を指定サイズに収めてコピー
231 *
232 * dst は必ず NULL で終わる。
233 *
234 * @return コピーした文字数 */
235
mStrcpy(char * dst,const char * src,int dstsize)236 int mStrcpy(char *dst,const char *src,int dstsize)
237 {
238 int len = strlen(src);
239
240 if(dstsize <= 0)
241 return 0;
242 else if(len < dstsize)
243 memcpy(dst, src, len + 1);
244 else
245 {
246 len = dstsize - 1;
247
248 memcpy(dst, src, len);
249 dst[len] = 0;
250 }
251
252 return len;
253 }
254
255 /** 文字列の長さ取得
256 *
257 * @param str NULL 可 */
258
mStrlen(const char * str)259 int mStrlen(const char *str)
260 {
261 if(str)
262 return strlen(str);
263 else
264 return 0;
265 }
266
267 /* @} */
268
269