47 buffer +=
seprintf(buffer, last,
" Compiler: "
50 #elif defined(__ICC) && defined(__GNUC__)
51 "ICC %d (GCC %d.%d.%d mode)", __ICC, __GNUC__, __GNUC_MINOR__, __GNUC_PATCHLEVEL__
54 #elif defined(__GNUC__)
55 "GCC %d.%d.%d", __GNUC__, __GNUC_MINOR__, __GNUC_PATCHLEVEL__
56 #elif defined(__WATCOMC__)
57 "WatcomC %d", __WATCOMC__
62 #if defined(__VERSION__)
63 return buffer +
seprintf(buffer, last,
" \"" __VERSION__
"\"\n\n");
65 return buffer +
seprintf(buffer, last,
"\n\n");
89 return buffer +
seprintf(buffer, last,
96 " Build date: %s\n\n",
98 _openttd_revision_modified,
99 _openttd_newgrf_version,
131 " Graphics set: %s (%u)\n"
133 " Music driver: %s\n"
134 " Music set: %s (%u)\n"
136 " Sound driver: %s\n"
137 " Sound set: %s (%u)\n"
138 " Video driver: %s\n\n",
167 FOR_ALL_COMPANIES(c) {
168 if (c->ai_info == NULL) {
169 buffer +=
seprintf(buffer, last,
" %2i: Human\n", (
int)c->
index);
178 buffer +=
seprintf(buffer, last,
"\n");
185 # include <allegro.h>
187 #ifdef WITH_FONTCONFIG
188 # include <fontconfig/fontconfig.h>
196 # include <ft2build.h>
197 # include FT_FREETYPE_H
200 # include <unicode/uversion.h>
206 #include <lzo/lzo1x.h>
224 buffer +=
seprintf(buffer, last,
"Libraries:\n");
227 buffer +=
seprintf(buffer, last,
" Allegro: %s\n", allegro_id);
230 #ifdef WITH_FONTCONFIG
231 int version = FcGetVersion();
232 buffer +=
seprintf(buffer, last,
" FontConfig: %d.%d.%d\n", version / 10000, (version / 100) % 100, version % 100);
237 int major, minor, patch;
238 FT_Init_FreeType(&library);
239 FT_Library_Version(library, &major, &minor, &patch);
240 FT_Done_FreeType(library);
241 buffer +=
seprintf(buffer, last,
" FreeType: %d.%d.%d\n", major, minor, patch);
246 char buf[4 * 3 + 3 + 1];
249 u_versionToString(ver, buf);
250 buffer +=
seprintf(buffer, last,
" ICU: %s\n", buf);
254 buffer +=
seprintf(buffer, last,
" LZMA: %s\n", lzma_version_string());
258 buffer +=
seprintf(buffer, last,
" LZO: %s\n", lzo_version_string());
262 buffer +=
seprintf(buffer, last,
" PNG: %s\n", png_get_libpng_ver(NULL));
266 #ifdef DYNAMICALLY_LOADED_SDL
267 if (SDL_CALL SDL_Linked_Version != NULL) {
271 const SDL_version *v = SDL_CALL SDL_Linked_Version();
272 buffer +=
seprintf(buffer, last,
" SDL: %d.%d.%d\n", v->major, v->minor, v->patch);
277 buffer +=
seprintf(buffer, last,
" Zlib: %s\n", zlibVersion());
280 buffer +=
seprintf(buffer, last,
"\n");
315 time_t cur_time = time(NULL);
316 buffer +=
seprintf(buffer, last,
"*** OpenTTD Crash Report ***\n\n");
317 buffer +=
seprintf(buffer, last,
"Crash at: %s", asctime(gmtime(&cur_time)));
334 buffer +=
seprintf(buffer, last,
"*** End of OpenTTD Crash Report ***\n");
352 if (file == NULL)
return false;
354 size_t len = strlen(buffer);
355 size_t written = fwrite(buffer, 1, len, file);
358 return len == written;
379 if (
_m == NULL)
return false;
404 if (_screen.width < 1 || _screen.height < 1 || _screen.dst_ptr == NULL)
return false;
420 static bool crashlogged =
false;
421 if (crashlogged)
return false;
424 char filename[MAX_PATH];
428 printf(
"Crash encountered, generating crash log...\n");
430 printf(
"%s\n", buffer);
431 printf(
"Crash log generated.\n\n");
433 printf(
"Writing crash log to disk...\n");
436 printf(
"Crash log written to %s. Please add this file to any bug reports.\n\n", filename);
438 printf(
"Writing crash log failed. Please attach the output above to any bug reports.\n\n");
445 printf(
"Writing crash dump failed.\n\n");
447 }
else if (dret > 0) {
448 printf(
"Crash dump written to %s. Please add this file to any bug reports.\n\n", filename);
451 printf(
"Writing crash savegame...\n");
454 printf(
"Crash savegame written to %s. Please add this file and the last (auto)save to any bug reports.\n\n", filename);
457 printf(
"Writing crash savegame failed. Please attach the last (auto)save to any bug reports.\n\n");
460 printf(
"Writing crash screenshot...\n");
463 printf(
"Crash screenshot written to %s. Please add this file to any bug reports.\n\n", filename);
466 printf(
"Writing crash screenshot failed.\n\n");