1 /*---------------------------------------------------------------------------*
2   Project:  NitroSDK - tools - makelcf
3   File:     misc.c
4 
5   Copyright 2003-2008 Nintendo.  All rights reserved.
6 
7   These coded instructions, statements, and computer programs contain
8   proprietary information of Nintendo of America Inc. and/or Nintendo
9   Company Ltd., and are protected by Federal copyright law.  They may
10   not be disclosed to third parties or copied or duplicated in any form,
11   in whole or in part, without the prior written consent of Nintendo.
12 
13   $Log: misc.c,v $
14   Revision 1.5  2006/01/18 02:11:19  kitase_hirotake
15   do-indent
16 
17   Revision 1.4  2005/02/28 05:26:03  yosizaki
18   do-indent.
19 
20   Revision 1.3  2004/06/30 09:27:21  yasu
21   fix calling method for Free()
22 
23   Revision 1.2  2004/06/29 04:08:33  yasu
24   add VBuffer
25 
26   Revision 1.1  2004/03/26 05:07:33  yasu
27   support variables like as -DNAME=VALUE
28 
29   $NoKeywords: $
30  *---------------------------------------------------------------------------*/
31 #include	<stdio.h>
32 #include	<malloc.h>             // calloc()
33 #include	<stdlib.h>             // free(), exit()
34 #include	<string.h>             // strlen(), strcpy()
35 #include	<stdarg.h>             // va_start(),va_end()
36 #include	"misc.h"
37 
38 BOOL    DebugMode = FALSE;
39 
40 /*---------------------------------------------------------------------------*
41  *   Memory Allocation Utilities
42  *
43  *	void*	Alloc( size_t size )
44  *---------------------------------------------------------------------------*/
45 
Alloc(size_t size)46 void   *Alloc(size_t size)
47 {
48     void   *t = calloc(1, size);
49 
50     if (t == NULL)
51     {
52         error("Can't allocate memory.");
53         exit(10);
54     }
55     return t;
56 }
57 
58 
Free(void * p)59 void Free(void *p)
60 {
61     void  **ptr = (void **)p;
62 
63     if (*ptr)
64     {
65         free(*ptr);
66         (*ptr) = NULL;
67     }
68 }
69 
70 
71 /*---------------------------------------------------------------------------*
72  *   VBuffer
73  *
74  *	void	PutVBuffer( VBuffer* vbuf, char c )
75  *---------------------------------------------------------------------------*/
76 
PutVBuffer(VBuffer * vbuf,char c)77 void PutVBuffer(VBuffer * vbuf, char c)
78 {
79     int     size;
80     char   *tmp_buffer;
81 
82     if (vbuf->buffer == 0)
83     {
84         vbuf->size = VBUFFER_INITIAL_SIZE;
85         vbuf->buffer = Alloc(vbuf->size);       // buffer is CALLOCed
86     }
87     size = strlen(vbuf->buffer);
88 
89     if (size >= vbuf->size - 1)
90     {
91         // Need buffer expansion
92         vbuf->size *= 2;
93         tmp_buffer = Alloc(vbuf->size); // buffer is CALLOCed
94         strcpy(tmp_buffer, vbuf->buffer);
95         Free(&vbuf->buffer);
96         vbuf->buffer = tmp_buffer;
97     }
98     vbuf->buffer[size] = c;
99     return;
100 }
101 
GetVBuffer(VBuffer * vbuf)102 char   *GetVBuffer(VBuffer * vbuf)
103 {
104     return vbuf->buffer;
105 }
106 
InitVBuffer(VBuffer * vbuf)107 void InitVBuffer(VBuffer * vbuf)
108 {
109     vbuf->buffer = 0;
110     vbuf->size = 0;
111 }
112 
FreeVBuffer(VBuffer * vbuf)113 void FreeVBuffer(VBuffer * vbuf)
114 {
115     Free(&vbuf->buffer);
116 }
117 
118 /*---------------------------------------------------------------------------*
119  *  Debug print
120  *	void   debug_printf( char* fmt, ... )
121  *---------------------------------------------------------------------------*/
122 
debug_printf(const char * fmt,...)123 void debug_printf(const char *fmt, ...)
124 {
125     va_list va;
126 
127     if (DebugMode)
128     {
129         va_start(va, fmt);
130         vfprintf(stderr, fmt, va);
131         va_end(va);
132     }
133 }
134