20#include "nuitka/safe_string_ops.h"
25void copyStringSafe(
char *buffer,
char const *source,
size_t buffer_size) {
26 if (strlen(source) >= buffer_size) {
30 if (buffer != source) {
31 strcpy(buffer, source);
35void copyStringSafeN(
char *buffer,
char const *source,
size_t n,
size_t buffer_size) {
36 if (n >= buffer_size - 1) {
39 strncpy(buffer, source, n);
43void copyStringSafeW(
wchar_t *buffer,
wchar_t const *source,
size_t buffer_size) {
44 while (*source != 0) {
45 if (buffer_size < 1) {
49 *buffer++ = *source++;
56void appendStringSafe(
char *target,
char const *source,
size_t buffer_size) {
57 if (strlen(source) + strlen(target) >= buffer_size) {
60 strcat(target, source);
63void appendCharSafe(
char *target,
char c,
size_t buffer_size) {
64 char source[2] = {c, 0};
66 appendStringSafe(target, source, buffer_size);
69void appendWStringSafeW(
wchar_t *target,
wchar_t const *source,
size_t buffer_size) {
70 if (unlikely(source == NULL)) {
74 while (*target != 0) {
79 while (*source != 0) {
80 if (unlikely(buffer_size < 1)) {
84 *target++ = *source++;
91void appendWCharSafeW(
wchar_t *target,
wchar_t c,
size_t buffer_size) {
92 while (*target != 0) {
97 if (buffer_size < 1) {
105void appendCharSafeW(
wchar_t *target,
char c,
size_t buffer_size) {
106 char buffer_c[2] = {c, 0};
107 wchar_t wide_buffer_c[2];
109 size_t res = mbstowcs(wide_buffer_c, buffer_c, 2);
114 appendWCharSafeW(target, wide_buffer_c[0], buffer_size);
117void appendStringSafeW(
wchar_t *target,
char const *source,
size_t buffer_size) {
118 while (*target != 0) {
123 while (*source != 0) {
124 appendCharSafeW(target, *source, buffer_size);
131void checkWStringNumber(
wchar_t const *value) {
132 if (unlikely(value == NULL || *value == 0)) {
137 if (!iswdigit(*value)) {
145void checkStringNumber(
char const *value) {
146 if (unlikely(value == NULL || *value == 0)) {
151 if (!isdigit(*value)) {
159void printOSErrorMessage(
char const *message, error_code_t error_code) {
163 FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, NULL,
164 error_code, MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US), (LPTSTR)&err_buffer, 0, NULL);
166 fprintf(stderr,
"%s ([Error " ERROR_CODE_FORMAT_STR
"] %s)\n", message, error_code, err_buffer);
168 fprintf(stderr,
"%s: %s\n", message, strerror(error_code));