#include <string.h>
#include <unistd.h>
#include <sys/time.h>
#include "general.h"
#include "timing.h"
#include "bmp_hosted.h"
#if defined(_WIN32) && !defined(__MINGW32__)
int vasprintf(char **strp, const char *const fmt, va_list ap)
{
const int actual_size = vsnprintf(NULL, 0, fmt, ap);
if (actual_size < 0)
return -1;
*strp = malloc(actual_size + 1);
if (!*strp)
return -1;
return vsnprintf(*strp, actual_size + 1, fmt, ap);
}
#endif
void platform_delay(uint32_t ms)
{
#if defined(_WIN32) && !defined(__MINGW32__)
Sleep(ms);
#else
#if !defined(usleep)
int usleep(unsigned int);
#endif
usleep(ms * 1000U);
#endif
}
uint32_t platform_time_ms(void)
{
timeval_s tv;
gettimeofday(&tv, NULL);
return (tv.tv_sec * 1000U) + (tv.tv_usec / 1000U);
}
bool begins_with(const char *const str, const size_t str_length, const char *const value)
{
const size_t value_length = strlen(value);
if (str_length < value_length)
return false;
return memcmp(str, value, value_length) == 0;
}
bool ends_with(const char *const str, const size_t str_length, const char *const value)
{
const size_t value_length = strlen(value);
if (str_length < value_length)
return false;
const size_t offset = str_length - value_length;
return memcmp(str + offset, value, value_length) == 0;
}
bool contains_substring(const char *const str, const size_t str_len, const char *const search)
{
const size_t search_len = strlen(search);
if (str_len < search_len)
return false;
for (size_t offset = 0; offset <= str_len - search_len; ++offset) {
if (memcmp(str + offset, search, search_len) == 0)
return true;
}
return false;
}