|
@@ -14465,13 +14465,15 @@ mg_check_feature(unsigned feature)
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
-/* Print system information.
|
|
|
|
- * TODO: define parameters. */
|
|
|
|
-int
|
|
|
|
-mg_print_system_info__experimental(int prm1, char *prm2)
|
|
|
|
|
|
+/* Get system information. It can be printed or stored by the caller.
|
|
|
|
+ * Return the size of available information. */
|
|
|
|
+static int
|
|
|
|
+mg_get_system_info_impl(char *buffer, int buflen)
|
|
{
|
|
{
|
|
- char buf[256];
|
|
|
|
|
|
+ char block[256];
|
|
|
|
+ int system_info_length = 0;
|
|
const char *version = mg_version();
|
|
const char *version = mg_version();
|
|
|
|
+
|
|
#if defined(_WIN32)
|
|
#if defined(_WIN32)
|
|
#if !defined(__SYMBIAN32__)
|
|
#if !defined(__SYMBIAN32__)
|
|
DWORD dwVersion = 0;
|
|
DWORD dwVersion = 0;
|
|
@@ -14496,31 +14498,34 @@ mg_print_system_info__experimental(int prm1, char *prm2)
|
|
|
|
|
|
mg_snprintf(NULL,
|
|
mg_snprintf(NULL,
|
|
NULL,
|
|
NULL,
|
|
- buf,
|
|
|
|
- sizeof(buf),
|
|
|
|
- "Windows %u.%u",
|
|
|
|
|
|
+ block,
|
|
|
|
+ sizeof(block),
|
|
|
|
+ "Windows %u.%u\n",
|
|
(unsigned)dwMajorVersion,
|
|
(unsigned)dwMajorVersion,
|
|
(unsigned)dwMinorVersion);
|
|
(unsigned)dwMinorVersion);
|
|
- if (prm1 == 0) {
|
|
|
|
- puts(buf);
|
|
|
|
|
|
+ system_info_length += (int)strlen(block);
|
|
|
|
+ if (system_info_length < buflen) {
|
|
|
|
+ strcat(buffer, block);
|
|
}
|
|
}
|
|
|
|
|
|
mg_snprintf(NULL,
|
|
mg_snprintf(NULL,
|
|
NULL,
|
|
NULL,
|
|
- buf,
|
|
|
|
- sizeof(buf),
|
|
|
|
- "CPU: type %u, cores %u, mask %x",
|
|
|
|
|
|
+ block,
|
|
|
|
+ sizeof(block),
|
|
|
|
+ "CPU: type %u, cores %u, mask %x\n",
|
|
(unsigned)si.wProcessorArchitecture,
|
|
(unsigned)si.wProcessorArchitecture,
|
|
(unsigned)si.dwNumberOfProcessors,
|
|
(unsigned)si.dwNumberOfProcessors,
|
|
(unsigned)si.dwActiveProcessorMask);
|
|
(unsigned)si.dwActiveProcessorMask);
|
|
- if (prm1 == 0) {
|
|
|
|
- puts(buf);
|
|
|
|
|
|
+ system_info_length += (int)strlen(block);
|
|
|
|
+ if (system_info_length < buflen) {
|
|
|
|
+ strcat(buffer, block);
|
|
}
|
|
}
|
|
|
|
|
|
#else
|
|
#else
|
|
- mg_snprintf(NULL, NULL, buf, sizeof(buf), "%s - Symbian");
|
|
|
|
- if (prm1 == 0) {
|
|
|
|
- puts(buf);
|
|
|
|
|
|
+ mg_snprintf(NULL, NULL, block, sizeof(block), "%s - Symbian\n");
|
|
|
|
+ system_info_length += (int)strlen(block);
|
|
|
|
+ if (system_info_length < buflen) {
|
|
|
|
+ strcat(buffer, block);
|
|
}
|
|
}
|
|
#endif
|
|
#endif
|
|
#else
|
|
#else
|
|
@@ -14530,23 +14535,24 @@ mg_print_system_info__experimental(int prm1, char *prm2)
|
|
|
|
|
|
mg_snprintf(NULL,
|
|
mg_snprintf(NULL,
|
|
NULL,
|
|
NULL,
|
|
- buf,
|
|
|
|
- sizeof(buf),
|
|
|
|
- "%s %s (%s) - %s",
|
|
|
|
|
|
+ block,
|
|
|
|
+ sizeof(block),
|
|
|
|
+ "%s %s (%s) - %s\n",
|
|
name.sysname,
|
|
name.sysname,
|
|
name.version,
|
|
name.version,
|
|
name.release,
|
|
name.release,
|
|
name.machine);
|
|
name.machine);
|
|
- if (prm1 == 0) {
|
|
|
|
- puts(buf);
|
|
|
|
|
|
+ system_info_length += (int)strlen(block);
|
|
|
|
+ if (system_info_length < buflen) {
|
|
|
|
+ strcat(buffer, block);
|
|
}
|
|
}
|
|
#endif
|
|
#endif
|
|
|
|
|
|
mg_snprintf(NULL,
|
|
mg_snprintf(NULL,
|
|
NULL,
|
|
NULL,
|
|
- buf,
|
|
|
|
- sizeof(buf),
|
|
|
|
- "Features: %X%s%s%s%s%s%s",
|
|
|
|
|
|
+ block,
|
|
|
|
+ sizeof(block),
|
|
|
|
+ "Features: %X%s%s%s%s%s%s\n",
|
|
mg_check_feature(0xFFFFFFFFu),
|
|
mg_check_feature(0xFFFFFFFFu),
|
|
mg_check_feature(1) ? " Files" : "",
|
|
mg_check_feature(1) ? " Files" : "",
|
|
mg_check_feature(2) ? " HTTPS" : "",
|
|
mg_check_feature(2) ? " HTTPS" : "",
|
|
@@ -14554,142 +14560,160 @@ mg_print_system_info__experimental(int prm1, char *prm2)
|
|
mg_check_feature(8) ? " IPv6" : "",
|
|
mg_check_feature(8) ? " IPv6" : "",
|
|
mg_check_feature(16) ? " WebSockets" : "",
|
|
mg_check_feature(16) ? " WebSockets" : "",
|
|
mg_check_feature(32) ? " Lua" : "");
|
|
mg_check_feature(32) ? " Lua" : "");
|
|
- if (prm1 == 0) {
|
|
|
|
- puts(buf);
|
|
|
|
|
|
+ system_info_length += (int)strlen(block);
|
|
|
|
+ if (system_info_length < buflen) {
|
|
|
|
+ strcat(buffer, block);
|
|
}
|
|
}
|
|
|
|
|
|
#ifdef USE_LUA
|
|
#ifdef USE_LUA
|
|
mg_snprintf(NULL,
|
|
mg_snprintf(NULL,
|
|
NULL,
|
|
NULL,
|
|
- buf,
|
|
|
|
- sizeof(buf),
|
|
|
|
- "Lua Version: %u (%s)",
|
|
|
|
|
|
+ block,
|
|
|
|
+ sizeof(block),
|
|
|
|
+ "Lua Version: %u (%s)\n",
|
|
(unsigned)LUA_VERSION_NUM,
|
|
(unsigned)LUA_VERSION_NUM,
|
|
LUA_RELEASE);
|
|
LUA_RELEASE);
|
|
- if (prm1 == 0) {
|
|
|
|
- puts(buf);
|
|
|
|
|
|
+ system_info_length += (int)strlen(block);
|
|
|
|
+ if (system_info_length < buflen) {
|
|
|
|
+ strcat(buffer, block);
|
|
}
|
|
}
|
|
#endif
|
|
#endif
|
|
|
|
|
|
- mg_snprintf(NULL, NULL, buf, sizeof(buf), "Version: %s", version);
|
|
|
|
- if (prm1 == 0) {
|
|
|
|
- puts(buf);
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- mg_snprintf(NULL, NULL, buf, sizeof(buf), "Build: %s", __DATE__);
|
|
|
|
- if (prm1 == 0) {
|
|
|
|
- puts(buf);
|
|
|
|
|
|
+ mg_snprintf(NULL,
|
|
|
|
+ NULL,
|
|
|
|
+ block,
|
|
|
|
+ sizeof(block),
|
|
|
|
+ "Version: %s, Build: %s\n",
|
|
|
|
+ version,
|
|
|
|
+ __DATE__);
|
|
|
|
+ system_info_length += (int)strlen(block);
|
|
|
|
+ if (system_info_length < buflen) {
|
|
|
|
+ strcat(buffer, block);
|
|
}
|
|
}
|
|
|
|
|
|
/* http://sourceforge.net/p/predef/wiki/Compilers/ */
|
|
/* http://sourceforge.net/p/predef/wiki/Compilers/ */
|
|
#if defined(_MSC_VER)
|
|
#if defined(_MSC_VER)
|
|
mg_snprintf(NULL,
|
|
mg_snprintf(NULL,
|
|
NULL,
|
|
NULL,
|
|
- buf,
|
|
|
|
- sizeof(buf),
|
|
|
|
- "MSC: %u (%u)",
|
|
|
|
|
|
+ block,
|
|
|
|
+ sizeof(block),
|
|
|
|
+ "MSC: %u (%u)\n",
|
|
(unsigned)_MSC_VER,
|
|
(unsigned)_MSC_VER,
|
|
(unsigned)_MSC_FULL_VER);
|
|
(unsigned)_MSC_FULL_VER);
|
|
- if (prm1 == 0) {
|
|
|
|
- puts(buf);
|
|
|
|
|
|
+ system_info_length += (int)strlen(block);
|
|
|
|
+ if (system_info_length < buflen) {
|
|
|
|
+ strcat(buffer, block);
|
|
}
|
|
}
|
|
#elif defined(__MINGW64__)
|
|
#elif defined(__MINGW64__)
|
|
mg_snprintf(NULL,
|
|
mg_snprintf(NULL,
|
|
NULL,
|
|
NULL,
|
|
- buf,
|
|
|
|
- sizeof(buf),
|
|
|
|
- "MinGW64: %u.%u",
|
|
|
|
|
|
+ block,
|
|
|
|
+ sizeof(block),
|
|
|
|
+ "MinGW64: %u.%u\n",
|
|
(unsigned)__MINGW64_VERSION_MAJOR,
|
|
(unsigned)__MINGW64_VERSION_MAJOR,
|
|
(unsigned)__MINGW64_VERSION_MINOR);
|
|
(unsigned)__MINGW64_VERSION_MINOR);
|
|
- if (prm1 == 0) {
|
|
|
|
- puts(buf);
|
|
|
|
|
|
+ system_info_length += (int)strlen(block);
|
|
|
|
+ if (system_info_length < buflen) {
|
|
|
|
+ strcat(buffer, block);
|
|
}
|
|
}
|
|
mg_snprintf(NULL,
|
|
mg_snprintf(NULL,
|
|
NULL,
|
|
NULL,
|
|
- buf,
|
|
|
|
- sizeof(buf),
|
|
|
|
- "MinGW32: %u.%u",
|
|
|
|
|
|
+ block,
|
|
|
|
+ sizeof(block),
|
|
|
|
+ "MinGW32: %u.%u\n",
|
|
(unsigned)__MINGW32_MAJOR_VERSION,
|
|
(unsigned)__MINGW32_MAJOR_VERSION,
|
|
(unsigned)__MINGW32_MINOR_VERSION);
|
|
(unsigned)__MINGW32_MINOR_VERSION);
|
|
- if (prm1 == 0) {
|
|
|
|
- puts(buf);
|
|
|
|
|
|
+ system_info_length += (int)strlen(block);
|
|
|
|
+ if (system_info_length < buflen) {
|
|
|
|
+ strcat(buffer, block);
|
|
}
|
|
}
|
|
#elif defined(__MINGW32__)
|
|
#elif defined(__MINGW32__)
|
|
mg_snprintf(NULL,
|
|
mg_snprintf(NULL,
|
|
NULL,
|
|
NULL,
|
|
- buf,
|
|
|
|
- sizeof(buf),
|
|
|
|
- "MinGW32: %u.%u",
|
|
|
|
|
|
+ block,
|
|
|
|
+ sizeof(block),
|
|
|
|
+ "MinGW32: %u.%u\n",
|
|
(unsigned)__MINGW32_MAJOR_VERSION,
|
|
(unsigned)__MINGW32_MAJOR_VERSION,
|
|
(unsigned)__MINGW32_MINOR_VERSION);
|
|
(unsigned)__MINGW32_MINOR_VERSION);
|
|
- if (prm1 == 0) {
|
|
|
|
- puts(buf);
|
|
|
|
|
|
+ system_info_length += (int)strlen(block);
|
|
|
|
+ if (system_info_length < buflen) {
|
|
|
|
+ strcat(buffer, block);
|
|
}
|
|
}
|
|
#elif defined(__clang__)
|
|
#elif defined(__clang__)
|
|
mg_snprintf(NULL,
|
|
mg_snprintf(NULL,
|
|
NULL,
|
|
NULL,
|
|
- buf,
|
|
|
|
- sizeof(buf),
|
|
|
|
- "clang: %u.%u.%u (%s)",
|
|
|
|
|
|
+ block,
|
|
|
|
+ sizeof(block),
|
|
|
|
+ "clang: %u.%u.%u (%s)\n",
|
|
__clang_major__,
|
|
__clang_major__,
|
|
__clang_minor__,
|
|
__clang_minor__,
|
|
__clang_patchlevel__,
|
|
__clang_patchlevel__,
|
|
__clang_version__);
|
|
__clang_version__);
|
|
- if (prm1 == 0) {
|
|
|
|
- puts(buf);
|
|
|
|
|
|
+ system_info_length += (int)strlen(block);
|
|
|
|
+ if (system_info_length < buflen) {
|
|
|
|
+ strcat(buffer, block);
|
|
}
|
|
}
|
|
#elif defined(__GNUC__)
|
|
#elif defined(__GNUC__)
|
|
mg_snprintf(NULL,
|
|
mg_snprintf(NULL,
|
|
NULL,
|
|
NULL,
|
|
- buf,
|
|
|
|
- sizeof(buf),
|
|
|
|
- "gcc: %u.%u.%u",
|
|
|
|
|
|
+ block,
|
|
|
|
+ sizeof(block),
|
|
|
|
+ "gcc: %u.%u.%u\n",
|
|
(unsigned)__GNUC__,
|
|
(unsigned)__GNUC__,
|
|
(unsigned)__GNUC_MINOR__,
|
|
(unsigned)__GNUC_MINOR__,
|
|
(unsigned)__GNUC_PATCHLEVEL__);
|
|
(unsigned)__GNUC_PATCHLEVEL__);
|
|
- if (prm1 == 0) {
|
|
|
|
- puts(buf);
|
|
|
|
|
|
+ system_info_length += (int)strlen(block);
|
|
|
|
+ if (system_info_length < buflen) {
|
|
|
|
+ strcat(buffer, block);
|
|
}
|
|
}
|
|
#elif defined(__INTEL_COMPILER)
|
|
#elif defined(__INTEL_COMPILER)
|
|
mg_snprintf(NULL,
|
|
mg_snprintf(NULL,
|
|
NULL,
|
|
NULL,
|
|
- buf,
|
|
|
|
- sizeof(buf),
|
|
|
|
- "Intel C/C++: %u",
|
|
|
|
|
|
+ block,
|
|
|
|
+ sizeof(block),
|
|
|
|
+ "Intel C/C++: %u\n",
|
|
(unsigned)__INTEL_COMPILER);
|
|
(unsigned)__INTEL_COMPILER);
|
|
- if (prm1 == 0) {
|
|
|
|
- puts(buf);
|
|
|
|
|
|
+ system_info_length += (int)strlen(block);
|
|
|
|
+ if (system_info_length < buflen) {
|
|
|
|
+ strcat(buffer, block);
|
|
}
|
|
}
|
|
#elif defined(__BORLANDC__)
|
|
#elif defined(__BORLANDC__)
|
|
mg_snprintf(NULL,
|
|
mg_snprintf(NULL,
|
|
NULL,
|
|
NULL,
|
|
- buf,
|
|
|
|
- sizeof(buf),
|
|
|
|
- "Borland C: 0x%x",
|
|
|
|
|
|
+ block,
|
|
|
|
+ sizeof(block),
|
|
|
|
+ "Borland C: 0x%x\n",
|
|
(unsigned)__BORLANDC__);
|
|
(unsigned)__BORLANDC__);
|
|
- if (prm1 == 0) {
|
|
|
|
- puts(buf);
|
|
|
|
|
|
+ system_info_length += (int)strlen(block);
|
|
|
|
+ if (system_info_length < buflen) {
|
|
|
|
+ strcat(buffer, block);
|
|
}
|
|
}
|
|
#elif defined(__SUNPRO_C)
|
|
#elif defined(__SUNPRO_C)
|
|
- mg_snprintf(
|
|
|
|
- NULL, NULL, buf, sizeof(buf), "Solaris: 0x%x", (unsigned)__SUNPRO_C);
|
|
|
|
- if (prm1 == 0) {
|
|
|
|
- puts(buf);
|
|
|
|
|
|
+ mg_snprintf(NULL,
|
|
|
|
+ NULL,
|
|
|
|
+ block,
|
|
|
|
+ sizeof(block),
|
|
|
|
+ "Solaris: 0x%x\n",
|
|
|
|
+ (unsigned)__SUNPRO_C);
|
|
|
|
+ system_info_length += (int)strlen(block);
|
|
|
|
+ if (system_info_length < buflen) {
|
|
|
|
+ strcat(buffer, block);
|
|
}
|
|
}
|
|
#else
|
|
#else
|
|
- mg_snprintf(NULL, NULL, buf, sizeof(buf), "Other");
|
|
|
|
- if (prm1 == 0) {
|
|
|
|
- puts(buf);
|
|
|
|
|
|
+ mg_snprintf(NULL, NULL, block, sizeof(block), "Other\n");
|
|
|
|
+ system_info_length += (int)strlen(block);
|
|
|
|
+ if (system_info_length < buflen) {
|
|
|
|
+ strcat(buffer, block);
|
|
}
|
|
}
|
|
#endif
|
|
#endif
|
|
/* Determine 32/64 bit data mode.
|
|
/* Determine 32/64 bit data mode.
|
|
* see https://en.wikipedia.org/wiki/64-bit_computing */
|
|
* see https://en.wikipedia.org/wiki/64-bit_computing */
|
|
mg_snprintf(NULL,
|
|
mg_snprintf(NULL,
|
|
NULL,
|
|
NULL,
|
|
- buf,
|
|
|
|
- sizeof(buf),
|
|
|
|
|
|
+ block,
|
|
|
|
+ sizeof(block),
|
|
"Data model: int:%u/%u/%u/%u, float:%u/%u/%u, char:%u/%u, "
|
|
"Data model: int:%u/%u/%u/%u, float:%u/%u/%u, char:%u/%u, "
|
|
- "ptr:%u, size:%u, time:%u",
|
|
|
|
|
|
+ "ptr:%u, size:%u, time:%u\n",
|
|
(unsigned)sizeof(short),
|
|
(unsigned)sizeof(short),
|
|
(unsigned)sizeof(int),
|
|
(unsigned)sizeof(int),
|
|
(unsigned)sizeof(long),
|
|
(unsigned)sizeof(long),
|
|
@@ -14702,14 +14726,27 @@ mg_print_system_info__experimental(int prm1, char *prm2)
|
|
(unsigned)sizeof(void *),
|
|
(unsigned)sizeof(void *),
|
|
(unsigned)sizeof(size_t),
|
|
(unsigned)sizeof(size_t),
|
|
(unsigned)sizeof(time_t));
|
|
(unsigned)sizeof(time_t));
|
|
- if (prm1 == 0) {
|
|
|
|
- puts(buf);
|
|
|
|
|
|
+ system_info_length += (int)strlen(block);
|
|
|
|
+ if (system_info_length < buflen) {
|
|
|
|
+ strcat(buffer, block);
|
|
}
|
|
}
|
|
|
|
|
|
- /* WARNING: these parameters are not being used */
|
|
|
|
- (void)prm2;
|
|
|
|
|
|
+ return system_info_length;
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
|
|
- return 0;
|
|
|
|
|
|
+/* Get system information. It can be printed or stored by the caller.
|
|
|
|
+ * Return the size of available information. */
|
|
|
|
+int
|
|
|
|
+mg_get_system_info(char *buffer, int buflen)
|
|
|
|
+{
|
|
|
|
+ if ((buffer == NULL) || (buflen < 1)) {
|
|
|
|
+ return mg_get_system_info_impl(NULL, 0);
|
|
|
|
+ } else {
|
|
|
|
+ /* Reset buffer, so we can always use strcat. */
|
|
|
|
+ buffer[0] = 0;
|
|
|
|
+ return mg_get_system_info_impl(buffer, buffer);
|
|
|
|
+ }
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|