xref: /reactos/sdk/lib/fslib/vfatlib/check/common.c (revision 02e84521)
1 /* common.c - Common functions
2 
3    Copyright (C) 1993 Werner Almesberger <werner.almesberger@lrc.di.epfl.ch>
4    Copyright (C) 1998 Roman Hodek <Roman.Hodek@informatik.uni-erlangen.de>
5    Copyright (C) 2008-2014 Daniel Baumann <mail@daniel-baumann.ch>
6 
7    This program is free software: you can redistribute it and/or modify
8    it under the terms of the GNU General Public License as published by
9    the Free Software Foundation, either version 3 of the License, or
10    (at your option) any later version.
11 
12    This program is distributed in the hope that it will be useful,
13    but WITHOUT ANY WARRANTY; without even the implied warranty of
14    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15    GNU General Public License for more details.
16 
17    You should have received a copy of the GNU General Public License
18    along with this program. If not, see <http://www.gnu.org/licenses/>.
19 
20    The complete text of the GNU General Public License
21    can be found in /usr/share/common-licenses/GPL-3 file.
22 */
23 
24 /* FAT32, VFAT, Atari format support, and various fixes additions May 1998
25  * by Roman Hodek <Roman.Hodek@informatik.uni-erlangen.de> */
26 
27 #include "vfatlib.h"
28 
29 #define NDEBUG
30 #include <debug.h>
31 
32 typedef struct _link {
33     void *data;
34     struct _link *next;
35 } LINK;
36 
37 #ifdef __REACTOS__
38 DECLSPEC_NORETURN // __attribute((noreturn))
39 void exit(int exitcode)
40 {
41     // DbgBreakPoint();
42     NtTerminateProcess(NtCurrentProcess(), exitcode);
43 
44     /* Should never get here */
45     while(1);
46 }
47 
48 DECLSPEC_NORETURN // __attribute((noreturn))
49 void die_func(const char *msg, ...) // die
50 #else
51 void die(const char *msg, ...)
52 #endif
53 {
54     va_list args;
55 
56     va_start(args, msg);
57 #ifndef __REACTOS__
58     vfprintf(stderr, msg, args);
59 #else
60     DPRINT1("Unrecoverable problem!\n");
61     VfatPrintV((char*)msg, args);
62 #endif
63     va_end(args);
64 #ifndef __REACTOS__
65     fprintf(stderr, "\n");
66 #endif
67     exit(1);
68 }
69 
70 #ifdef __REACTOS__
71 DECLSPEC_NORETURN // __attribute((noreturn))
72 void pdie_func(const char *msg, ...) // pdie
73 #else
74 void pdie(const char *msg, ...)
75 #endif
76 {
77     va_list args;
78 
79     va_start(args, msg);
80 #ifndef __REACTOS__
81     vfprintf(stderr, msg, args);
82 #else
83     DPRINT1("Unrecoverable problem!\n");
84     VfatPrintV((char*)msg, args);
85 #endif
86     va_end(args);
87 #ifndef __REACTOS__
88     fprintf(stderr, ":%s\n", strerror(errno));
89 #endif
90     exit(1);
91 }
92 
93 #ifndef __REACTOS__
94 void *alloc(int size)
95 {
96     void *this;
97 
98     if ((this = malloc(size)))
99 	return this;
100     pdie("malloc");
101     return NULL;		/* for GCC */
102 }
103 #else
104 void *vfalloc(int size)
105 {
106     void *ptr;
107 
108     ptr = RtlAllocateHeap(RtlGetProcessHeap(), 0, size);
109     if (ptr == NULL)
110     {
111         DPRINT1("Allocation failed!\n");
112         pdie("malloc");
113         return NULL;
114     }
115 
116     return ptr;
117 }
118 
119 void *vfcalloc(int size, int count)
120 {
121     void *ptr;
122 
123     ptr = RtlAllocateHeap(RtlGetProcessHeap(), HEAP_ZERO_MEMORY, size * count);
124     if (ptr == NULL)
125     {
126         DPRINT1("Allocation failed!\n");
127         return NULL;
128     }
129 
130     return ptr;
131 }
132 
133 void vffree(void *ptr)
134 {
135     RtlFreeHeap(RtlGetProcessHeap(), 0, ptr);
136 }
137 #endif
138 
139 void *qalloc(void **root, int size)
140 {
141     LINK *link;
142 
143 #ifndef __REACTOS__
144     link = alloc(sizeof(LINK));
145 #else
146     link = vfalloc(sizeof(LINK));
147 #endif
148     link->next = *root;
149     *root = link;
150 #ifndef __REACTOS__
151     return link->data = alloc(size);
152 #else
153     return link->data = vfalloc(size);
154 #endif
155 }
156 
157 void qfree(void **root)
158 {
159     LINK *this;
160 
161     while (*root) {
162 	this = (LINK *) * root;
163 	*root = this->next;
164 #ifndef __REACTOS__
165 	free(this->data);
166 	free(this);
167 #else
168 	vffree(this->data);
169 	vffree(this);
170 #endif
171     }
172 }
173 
174 #ifdef __REACTOS__
175 #ifdef min
176 #undef min
177 #endif
178 #endif
179 int min(int a, int b)
180 {
181     return a < b ? a : b;
182 }
183 
184 char get_key(const char *valid, const char *prompt)
185 {
186 #ifndef __REACTOS__
187     int ch, okay;
188 
189     while (1) {
190 	if (prompt)
191 	    printf("%s ", prompt);
192 	fflush(stdout);
193 	while (ch = getchar(), ch == ' ' || ch == '\t') ;
194 	if (ch == EOF)
195 	    exit(1);
196 	if (!strchr(valid, okay = ch))
197 	    okay = 0;
198 	while (ch = getchar(), ch != '\n' && ch != EOF) ;
199 	if (ch == EOF)
200 	    exit(1);
201 	if (okay)
202 	    return okay;
203 	printf("Invalid input.\n");
204     }
205 #else
206     return 0;
207 #endif
208 }
209