41#define concat_2str(str1,str2) \
43 char* s1 = (str1) == NULL ? (char*)"" : (char*)(str1); \
44 char* s2 = (str2) == NULL ? (char*)"" : (char*)(str2); \
45 char* __res__ = (char*)alloca(strlen(s1)+strlen(s2)+1); \
46 strcpy(__res__, s1); \
47 strcat(__res__, s2); \
63#define concat_3str(str1,str2,str3) \
65 char* s1 = (str1) == NULL ? (char*)"" : (char*)(str1); \
66 char* s2 = (str2) == NULL ? (char*)"" : (char*)(str2); \
67 char* s3 = (str3) == NULL ? (char*)"" : (char*)(str3); \
68 char* __res__ = (char*)alloca(strlen(s1)+strlen(s2)+strlen(s3)+1); \
69 strcpy(__res__, s1); \
70 strcat(__res__, s2); \
71 strcat(__res__, s3); \
88#define concat_4str(str1,str2,str3,str4) \
90 char* s1 = (str1) == NULL ? (char*)"" : (char*)(str1); \
91 char* s2 = (str2) == NULL ? (char*)"" : (char*)(str2); \
92 char* s3 = (str3) == NULL ? (char*)"" : (char*)(str3); \
93 char* s4 = (str4) == NULL ? (char*)"" : (char*)(str4); \
94 char* __res__ = (char*)alloca(strlen(s1)+strlen(s2)+strlen(s3)+strlen(s4)+1); \
95 strcpy(__res__, s1); \
96 strcat(__res__, s2); \
97 strcat(__res__, s3); \
98 strcat(__res__, s4); \
116#define concat_5str(str1,str2,str3,str4,str5) \
118 char* s1 = (str1) == NULL ? (char*)"" : (char*)(str1); \
119 char* s2 = (str2) == NULL ? (char*)"" : (char*)(str2); \
120 char* s3 = (str3) == NULL ? (char*)"" : (char*)(str3); \
121 char* s4 = (str4) == NULL ? (char*)"" : (char*)(str4); \
122 char* s5 = (str5) == NULL ? (char*)"" : (char*)(str5); \
123 char* __res__ = (char*)alloca(strlen(s1)+strlen(s2)+strlen(s3)+strlen(s4)+strlen(s5)+1); \
124 strcpy(__res__, s1); \
125 strcat(__res__, s2); \
126 strcat(__res__, s3); \
127 strcat(__res__, s4); \
128 strcat(__res__, s5); \
147#define concat_6str(str1,str2,str3,str4,str5,str6) \
149 char* s1 = (str1) == NULL ? (char*)"" : (char*)(str1); \
150 char* s2 = (str2) == NULL ? (char*)"" : (char*)(str2); \
151 char* s3 = (str3) == NULL ? (char*)"" : (char*)(str3); \
152 char* s4 = (str4) == NULL ? (char*)"" : (char*)(str4); \
153 char* s5 = (str5) == NULL ? (char*)"" : (char*)(str5); \
154 char* s6 = (str6) == NULL ? (char*)"" : (char*)(str6); \
155 char* __res__ = (char*)alloca(strlen(s1)+strlen(s2)+strlen(s3)+strlen(s4)+strlen(s5)+strlen(s6)+1); \
156 strcpy(__res__, s1); \
157 strcat(__res__, s2); \
158 strcat(__res__, s3); \
159 strcat(__res__, s4); \
160 strcat(__res__, s5); \
161 strcat(__res__, s6); \
181#define concat_7str(str1,str2,str3,str4,str5,str6,str7) \
183 char* s1 = (str1) == NULL ? (char*)"" : (char*)(str1); \
184 char* s2 = (str2) == NULL ? (char*)"" : (char*)(str2); \
185 char* s3 = (str3) == NULL ? (char*)"" : (char*)(str3); \
186 char* s4 = (str4) == NULL ? (char*)"" : (char*)(str4); \
187 char* s5 = (str5) == NULL ? (char*)"" : (char*)(str5); \
188 char* s6 = (str6) == NULL ? (char*)"" : (char*)(str6); \
189 char* s7 = (str7) == NULL ? (char*)"" : (char*)(str7); \
190 char* __res__ = (char*)alloca(strlen(s1)+strlen(s2)+strlen(s3)+strlen(s4)+strlen(s5)+strlen(s6)+strlen(s7)+1); \
191 strcpy(__res__, s1); \
192 strcat(__res__, s2); \
193 strcat(__res__, s3); \
194 strcat(__res__, s4); \
195 strcat(__res__, s5); \
196 strcat(__res__, s6); \
197 strcat(__res__, s7); \
222#define concat_12str(str1,str2,str3,str4,str5,str6,str7,str8,str9,str10,str11,str12) \
224 char* s1 = (str1) == NULL ? (char*)"" : (char*)(str1); \
225 char* s2 = (str2) == NULL ? (char*)"" : (char*)(str2); \
226 char* s3 = (str3) == NULL ? (char*)"" : (char*)(str3); \
227 char* s4 = (str4) == NULL ? (char*)"" : (char*)(str4); \
228 char* s5 = (str5) == NULL ? (char*)"" : (char*)(str5); \
229 char* s6 = (str6) == NULL ? (char*)"" : (char*)(str6); \
230 char* s7 = (str7) == NULL ? (char*)"" : (char*)(str7); \
231 char* s8 = (str8) == NULL ? (char*)"" : (char*)(str8); \
232 char* s9 = (str9) == NULL ? (char*)"" : (char*)(str9); \
233 char* s10 = (str10) == NULL ? (char*)"" : (char*)(str10); \
234 char* s11 = (str11) == NULL ? (char*)"" : (char*)(str11); \
235 char* s12 = (str12) == NULL ? (char*)"" : (char*)(str12); \
236 char* __res__ = (char*)alloca(strlen(s1)+strlen(s2)+strlen(s3)+strlen(s4)+strlen(s5)+strlen(s6)+strlen(s7)+strlen(s8)+strlen(s9)+strlen(s10)+strlen(s11)+strlen(s12)+1); \
237 strcpy(__res__, s1); \
238 strcat(__res__, s2); \
239 strcat(__res__, s3); \
240 strcat(__res__, s4); \
241 strcat(__res__, s5); \
242 strcat(__res__, s6); \
243 strcat(__res__, s7); \
244 strcat(__res__, s8); \
245 strcat(__res__, s9); \
246 strcat(__res__, s10); \
247 strcat(__res__, s11); \
248 strcat(__res__, s12); \
261#define numDigits(num) \
264 int n = abs(num)/10; \
281#define int2str(num) \
283 char* __res__ = (char*)alloca(numDigits((int)(num))+((int)(num) < 0 ? 1 : 0)+1); \
284 sprintf(__res__, "%d", (int)(num)); \
303#define int2nstr(num, len) \
305 require ((len) > 0, concat_3str("invalid length value (", int2str(len), ")")); \
306 int d = numDigits((int)(num))+((int)(num) < 0 ? 1 : 0); \
309 char* __res__ = (char*)alloca(d+1); \
310 sprintf(__res__, "%0*d", d, (int)(num)); \
322#define long2str(num) \
324 char* __res__ = (char*)alloca(numDigits((long)(num))+((long)(num) < 0 ? 1 : 0)+1); \
325 sprintf(__res__, "%ld", (long)(num)); \
344#define long2nstr(num, len) \
346 require ((len) > 0, concat_3str("invalid length value (", int2str(len), ")")); \
347 int d = numDigits((int)(num))+((long)(num) < 0 ? 1 : 0); \
350 char* __res__ = (char*)alloca(d+1); \
351 sprintf(__res__, "%0*ld", d, (long)(num)); \
367#define perc2str(percentage) \
369 require ((percentage) >= 0 && (percentage) <= 100, concat_3str("invalid percentage value (", int2str(percentage), ")")); \
370 char* __res__ = (char*)alloca(4+1); \
371 sprintf(__res__, "%3d%%", (int)(percentage)); \
391#define random_boolean(trueProb) \
393 require ((trueProb) >= 0 && (trueProb) <= 100, concat_3str("invalid percentage (", int2str(trueProb), ")")); \
394 int res = (double)rand()/(double)RAND_MAX < (double)(trueProb)/100.0; \
414#define random_int(min, max) \
416 require ((max) >= (min), concat_5str("invalid interval [", int2str(min), ",", int2str(max), "]")); \
417 int res = (min) + (int)(((double)rand()/(double)RAND_MAX)*((max)-(min))+0.5); \
428#define clear_console() \
430 printf("\u001B[2J"); \
445#define move_cursor(line, column) \
447 require ((line) >= 0 && (column) >= 0, concat_4str("invalid cursor position, line:", int2str(line), ", column:", int2str(column))); \
448 printf("\u001B[%d;%df", 1+(line), 1+(column)); \
459#define hide_cursor() \
472#define show_cursor() \
Design-by-Contract module.
Handle Defensive Programming module.