ascii-chat 0.6.0
Real-time terminal-based video chat with ASCII art conversion
Loading...
Searching...
No Matches
musl_c23_compat.c
Go to the documentation of this file.
1
14#include <stdlib.h>
15#include <stdio.h>
16#include <stdarg.h>
17#include <wchar.h>
18
19// strtol family - string to integer conversion
20// NOTE: Direct implementation to avoid infinite recursion with musl static builds
21// where strtol might redirect back to __isoc23_strtol
22long __isoc23_strtol(const char *str, char **endptr, int base) {
23 // Simplified implementation for common cases (base 10 only for now)
24 // This avoids calling strtol() which might cause infinite recursion
25 if (!str) {
26 if (endptr)
27 *endptr = (char *)str;
28 return 0;
29 }
30
31 // For non-base-10, fall back to strtoll and cast
32 // (strtoll seems to work in musl static builds)
33 if (base != 10) {
34 long long result = strtoll(str, endptr, base);
35 // Clamp to long range
36 if (result > __LONG_MAX__)
37 return __LONG_MAX__;
38 if (result < -__LONG_MAX__ - 1)
39 return -__LONG_MAX__ - 1;
40 return (long)result;
41 }
42
43 // Manual base-10 parsing to avoid strtol() infinite loop
44 const char *p = str;
45 long sign = 1;
46 long result = 0;
47
48 // Skip whitespace
49 while (*p == ' ' || *p == '\t' || *p == '\n' || *p == '\r')
50 p++;
51
52 // Handle sign
53 if (*p == '-') {
54 sign = -1;
55 p++;
56 } else if (*p == '+') {
57 p++;
58 }
59
60 // Convert digits
61 int has_digits = 0;
62 while (*p >= '0' && *p <= '9') {
63 has_digits = 1;
64 int digit = *p - '0';
65 // Check for overflow
66 if (result > (__LONG_MAX__ - digit) / 10) {
67 if (endptr)
68 *endptr = (char *)p;
69 return sign > 0 ? __LONG_MAX__ : -__LONG_MAX__ - 1;
70 }
71 result = result * 10 + digit;
72 p++;
73 }
74
75 if (endptr) {
76 *endptr = (char *)(has_digits ? p : str);
77 }
78
79 return sign * result;
80}
81
82long long __isoc23_strtoll(const char *str, char **endptr, int base) {
83 return strtoll(str, endptr, base);
84}
85
86unsigned long __isoc23_strtoul(const char *str, char **endptr, int base) {
87 return strtoul(str, endptr, base);
88}
89
90unsigned long long __isoc23_strtoull(const char *str, char **endptr, int base) {
91 return strtoull(str, endptr, base);
92}
93
94// wcstol family - wide string to integer conversion
95long __isoc23_wcstol(const wchar_t *str, wchar_t **endptr, int base) {
96 return wcstol(str, endptr, base);
97}
98
99long long __isoc23_wcstoll(const wchar_t *str, wchar_t **endptr, int base) {
100 return wcstoll(str, endptr, base);
101}
102
103unsigned long __isoc23_wcstoul(const wchar_t *str, wchar_t **endptr, int base) {
104 return wcstoul(str, endptr, base);
105}
106
107unsigned long long __isoc23_wcstoull(const wchar_t *str, wchar_t **endptr, int base) {
108 return wcstoull(str, endptr, base);
109}
110
111// scanf family - formatted input
112int __isoc23_scanf(const char *format, ...) {
113 va_list args;
114 va_start(args, format);
115 int result = vscanf(format, args);
116 va_end(args);
117 return result;
118}
119
120int __isoc23_fscanf(FILE *stream, const char *format, ...) {
121 va_list args;
122 va_start(args, format);
123 int result = vfscanf(stream, format, args);
124 va_end(args);
125 return result;
126}
127
128int __isoc23_sscanf(const char *str, const char *format, ...) {
129 va_list args;
130 va_start(args, format);
131 int result = vsscanf(str, format, args);
132 va_end(args);
133 return result;
134}
135
136int __isoc23_vscanf(const char *format, va_list args) {
137 return vscanf(format, args);
138}
139
140int __isoc23_vfscanf(FILE *stream, const char *format, va_list args) {
141 return vfscanf(stream, format, args);
142}
143
144int __isoc23_vsscanf(const char *str, const char *format, va_list args) {
145 return vsscanf(str, format, args);
146}
147
148// wscanf family - wide formatted input
149int __isoc23_wscanf(const wchar_t *format, ...) {
150 va_list args;
151 va_start(args, format);
152 int result = vwscanf(format, args);
153 va_end(args);
154 return result;
155}
156
157int __isoc23_fwscanf(FILE *stream, const wchar_t *format, ...) {
158 va_list args;
159 va_start(args, format);
160 int result = vfwscanf(stream, format, args);
161 va_end(args);
162 return result;
163}
164
165int __isoc23_swscanf(const wchar_t *str, const wchar_t *format, ...) {
166 va_list args;
167 va_start(args, format);
168 int result = vswscanf(str, format, args);
169 va_end(args);
170 return result;
171}
172
173int __isoc23_vwscanf(const wchar_t *format, va_list args) {
174 return vwscanf(format, args);
175}
176
177int __isoc23_vfwscanf(FILE *stream, const wchar_t *format, va_list args) {
178 return vfwscanf(stream, format, args);
179}
180
181int __isoc23_vswscanf(const wchar_t *str, const wchar_t *format, va_list args) {
182 return vswscanf(str, format, args);
183}
unsigned long long __isoc23_strtoull(const char *str, char **endptr, int base)
int __isoc23_wscanf(const wchar_t *format,...)
int __isoc23_sscanf(const char *str, const char *format,...)
unsigned long __isoc23_strtoul(const char *str, char **endptr, int base)
int __isoc23_swscanf(const wchar_t *str, const wchar_t *format,...)
int __isoc23_vswscanf(const wchar_t *str, const wchar_t *format, va_list args)
int __isoc23_vscanf(const char *format, va_list args)
long long __isoc23_strtoll(const char *str, char **endptr, int base)
int __isoc23_fscanf(FILE *stream, const char *format,...)
int __isoc23_fwscanf(FILE *stream, const wchar_t *format,...)
long long __isoc23_wcstoll(const wchar_t *str, wchar_t **endptr, int base)
int __isoc23_vwscanf(const wchar_t *format, va_list args)
int __isoc23_scanf(const char *format,...)
int __isoc23_vsscanf(const char *str, const char *format, va_list args)
long __isoc23_strtol(const char *str, char **endptr, int base)
int __isoc23_vfscanf(FILE *stream, const char *format, va_list args)
int __isoc23_vfwscanf(FILE *stream, const wchar_t *format, va_list args)
unsigned long long __isoc23_wcstoull(const wchar_t *str, wchar_t **endptr, int base)
unsigned long __isoc23_wcstoul(const wchar_t *str, wchar_t **endptr, int base)
long __isoc23_wcstol(const wchar_t *str, wchar_t **endptr, int base)