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