1 /*---------------------------------------------------------------------------*
2   Project:  TwlSDK - 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   $Date:: 2008-09-18#$
14   $Rev: 8573 $
15   $Author: okubata_ryoma $
16  *---------------------------------------------------------------------------*/
17 #include	<stdio.h>
18 #include	<malloc.h>             // calloc()
19 #include	<stdlib.h>             // free(), exit()
20 #include	<string.h>             // strlen(), strcpy()
21 #include	<stdarg.h>             // va_start(),va_end()
22 #include	"misc.h"
23 
24 BOOL    DebugMode = FALSE;
25 
26 /*---------------------------------------------------------------------------*
27  *   Memory Allocation Utilities
28  *
29  *	void*	Alloc( size_t size )
30  *---------------------------------------------------------------------------*/
31 
Alloc(size_t size)32 void   *Alloc(size_t size)
33 {
34     void   *t = calloc(1, size);
35 
36     if (t == NULL)
37     {
38         error("Can't allocate memory.");
39         exit(10);
40     }
41     return t;
42 }
43 
44 
Free(void * p)45 void Free(void *p)
46 {
47     void  **ptr = (void **)p;
48 
49     if (*ptr)
50     {
51         free(*ptr);
52         (*ptr) = NULL;
53     }
54 }
55 
56 
57 /*---------------------------------------------------------------------------*
58  *   VBuffer
59  *
60  *	void	PutVBuffer( VBuffer* vbuf, char c )
61  *---------------------------------------------------------------------------*/
62 
PutVBuffer(VBuffer * vbuf,char c)63 void PutVBuffer(VBuffer * vbuf, char c)
64 {
65     int     size;
66     char   *tmp_buffer;
67 
68     if (vbuf->buffer == 0)
69     {
70         vbuf->size = VBUFFER_INITIAL_SIZE;
71         vbuf->buffer = Alloc(vbuf->size);       // buffer is CALLOCed
72     }
73     size = strlen(vbuf->buffer);
74 
75     if (size >= vbuf->size - 1)
76     {
77         // Need buffer expansion
78         vbuf->size *= 2;
79         tmp_buffer = Alloc(vbuf->size); // buffer is CALLOCed
80         strcpy(tmp_buffer, vbuf->buffer);
81         Free(&vbuf->buffer);
82         vbuf->buffer = tmp_buffer;
83     }
84     vbuf->buffer[size] = c;
85     return;
86 }
87 
GetVBuffer(VBuffer * vbuf)88 char   *GetVBuffer(VBuffer * vbuf)
89 {
90     return vbuf->buffer;
91 }
92 
InitVBuffer(VBuffer * vbuf)93 void InitVBuffer(VBuffer * vbuf)
94 {
95     vbuf->buffer = 0;
96     vbuf->size = 0;
97 }
98 
FreeVBuffer(VBuffer * vbuf)99 void FreeVBuffer(VBuffer * vbuf)
100 {
101     Free(&vbuf->buffer);
102 }
103 
104 /*---------------------------------------------------------------------------*
105  *  Debug print
106  *	void   debug_printf( char* fmt, ... )
107  *---------------------------------------------------------------------------*/
108 
debug_printf(const char * fmt,...)109 void debug_printf(const char *fmt, ...)
110 {
111     va_list va;
112 
113     if (DebugMode)
114     {
115         va_start(va, fmt);
116         vfprintf(stderr, fmt, va);
117         va_end(va);
118     }
119 }
120