ReactOS 0.4.17-dev-684-ga6524ef
stdlib.h File Reference
Include dependency graph for stdlib.h:
This graph shows which files directly or indirectly include this file:

Go to the source code of this file.

Macros

#define uacpi_memcpy   memcpy
 
#define uacpi_memmove   memmove
 
#define uacpi_memset   memset
 
#define uacpi_memcmp   memcmp
 
#define uacpi_free(mem, _)   uacpi_kernel_free(mem)
 
#define uacpi_memzero(ptr, size)   uacpi_memset(ptr, 0, size)
 
#define UACPI_COMPARE(x, y, op)   ((x) op (y) ? (x) : (y))
 
#define UACPI_MIN(x, y)   UACPI_COMPARE(x, y, <)
 
#define UACPI_MAX(x, y)   UACPI_COMPARE(x, y, >)
 
#define UACPI_ALIGN_UP_MASK(x, mask)   (((x) + (mask)) & ~(mask))
 
#define UACPI_ALIGN_UP(x, val, type)   UACPI_ALIGN_UP_MASK(x, (type)(val) - 1)
 
#define UACPI_ALIGN_DOWN_MASK(x, mask)   ((x) & ~(mask))
 
#define UACPI_ALIGN_DOWN(x, val, type)   UACPI_ALIGN_DOWN_MASK(x, (type)(val) - 1)
 
#define UACPI_IS_ALIGNED_MASK(x, mask)   (((x) & (mask)) == 0)
 
#define UACPI_IS_ALIGNED(x, val, type)   UACPI_IS_ALIGNED_MASK(x, (type)(val) - 1)
 
#define UACPI_IS_POWER_OF_TWO(x, type)   UACPI_IS_ALIGNED(x, x, type)
 
#define uacpi_kernel_alloc_zeroed   uacpi_builtin_alloc_zeroed
 

Functions

voidmemcpy (void *dest, const void *src, uacpi_size count)
 
voidmemmove (void *dest, const void *src, uacpi_size count)
 
voidmemset (void *dest, int ch, uacpi_size count)
 
int memcmp (const void *lhs, const void *rhs, uacpi_size count)
 
uacpi_size uacpi_strlen (const uacpi_char *str)
 
uacpi_size uacpi_strnlen (const uacpi_char *str, uacpi_size max)
 
uacpi_i32 uacpi_strcmp (const uacpi_char *lhs, const uacpi_char *rhs)
 
uacpi_i32 uacpi_snprintf (uacpi_char *buffer, uacpi_size capacity, const uacpi_char *fmt,...)
 
uacpi_i32 uacpi_vsnprintf (uacpi_char *buffer, uacpi_size capacity, const uacpi_char *fmt, uacpi_va_list vlist)
 
void uacpi_memcpy_zerout (void *dst, const void *src, uacpi_size dst_size, uacpi_size src_size)
 
uacpi_u8 uacpi_bit_scan_forward (uacpi_u64)
 
uacpi_u8 uacpi_bit_scan_backward (uacpi_u64)
 
voiduacpi_builtin_alloc_zeroed (uacpi_size size)
 

Macro Definition Documentation

◆ UACPI_ALIGN_DOWN

#define UACPI_ALIGN_DOWN (   x,
  val,
  type 
)    UACPI_ALIGN_DOWN_MASK(x, (type)(val) - 1)

Definition at line 109 of file stdlib.h.

◆ UACPI_ALIGN_DOWN_MASK

#define UACPI_ALIGN_DOWN_MASK (   x,
  mask 
)    ((x) & ~(mask))

Definition at line 108 of file stdlib.h.

◆ UACPI_ALIGN_UP

#define UACPI_ALIGN_UP (   x,
  val,
  type 
)    UACPI_ALIGN_UP_MASK(x, (type)(val) - 1)

Definition at line 106 of file stdlib.h.

◆ UACPI_ALIGN_UP_MASK

#define UACPI_ALIGN_UP_MASK (   x,
  mask 
)    (((x) + (mask)) & ~(mask))

Definition at line 105 of file stdlib.h.

◆ UACPI_COMPARE

#define UACPI_COMPARE (   x,
  y,
  op 
)    ((x) op (y) ? (x) : (y))

Definition at line 101 of file stdlib.h.

◆ uacpi_free

#define uacpi_free (   mem,
  _ 
)    uacpi_kernel_free(mem)

Definition at line 96 of file stdlib.h.

◆ UACPI_IS_ALIGNED

#define UACPI_IS_ALIGNED (   x,
  val,
  type 
)    UACPI_IS_ALIGNED_MASK(x, (type)(val) - 1)

Definition at line 112 of file stdlib.h.

◆ UACPI_IS_ALIGNED_MASK

#define UACPI_IS_ALIGNED_MASK (   x,
  mask 
)    (((x) & (mask)) == 0)

Definition at line 111 of file stdlib.h.

◆ UACPI_IS_POWER_OF_TWO

#define UACPI_IS_POWER_OF_TWO (   x,
  type 
)    UACPI_IS_ALIGNED(x, x, type)

Definition at line 114 of file stdlib.h.

◆ uacpi_kernel_alloc_zeroed

#define uacpi_kernel_alloc_zeroed   uacpi_builtin_alloc_zeroed

Definition at line 127 of file stdlib.h.

◆ UACPI_MAX

#define UACPI_MAX (   x,
  y 
)    UACPI_COMPARE(x, y, >)

Definition at line 103 of file stdlib.h.

◆ uacpi_memcmp

#define uacpi_memcmp   memcmp

Definition at line 61 of file stdlib.h.

◆ uacpi_memcpy

#define uacpi_memcpy   memcpy

Definition at line 34 of file stdlib.h.

◆ uacpi_memmove

#define uacpi_memmove   memmove

Definition at line 43 of file stdlib.h.

◆ uacpi_memset

#define uacpi_memset   memset

Definition at line 52 of file stdlib.h.

◆ uacpi_memzero

#define uacpi_memzero (   ptr,
  size 
)    uacpi_memset(ptr, 0, size)

Definition at line 99 of file stdlib.h.

◆ UACPI_MIN

#define UACPI_MIN (   x,
  y 
)    UACPI_COMPARE(x, y, <)

Definition at line 102 of file stdlib.h.

Function Documentation

◆ memcmp()

int memcmp ( const void lhs,
const void rhs,
uacpi_size  count 
)

Definition at line 2807 of file string.c.

2808{
2809 const unsigned char *p1 = ptr1, *p2 = ptr2;
2810 size_t align;
2811 int result;
2812
2813 if (n < sizeof(uint64_t))
2814 return memcmp_bytes(p1, p2, n);
2815
2816 align = -(size_t)p1 & (sizeof(uint64_t) - 1);
2817
2818 if ((result = memcmp_bytes(p1, p2, align)))
2819 return result;
2820
2821 p1 += align;
2822 p2 += align;
2823 n -= align;
2824
2825 return memcmp_blocks(p1, p2, n);
2826}
UINT64 uint64_t
Definition: types.h:77
unsigned int size_t
Definition: corecrt.h:203
static int memcmp_bytes(const void *ptr1, const void *ptr2, size_t n)
Definition: string.c:2770
static int memcmp_blocks(const void *ptr1, const void *ptr2, size_t size)
Definition: string.c:2782
int align(int length, int align)
Definition: dsound8.c:36
GLdouble n
Definition: glext.h:7729
GLuint64EXT * result
Definition: glext.h:11304

◆ memcpy()

void * memcpy ( void dest,
const void src,
uacpi_size  count 
)

Definition at line 3202 of file string.c.

3203{
3204 return memmove(dst, src, n);
3205}
GLenum src
Definition: glext.h:6340
GLenum GLenum dst
Definition: glext.h:6340
#define memmove(s1, s2, n)
Definition: mkisofs.h:881

◆ memmove()

void * memmove ( void dest,
const void src,
uacpi_size  count 
)

Definition at line 3093 of file string.c.

3094{
3095#if defined(__x86_64__) && !defined(__arm64ec__)
3096 return sse2_memmove(dst, src, n);
3097#else
3098 unsigned char *d = dst;
3099 const unsigned char *s = src;
3100 int sh1;
3101
3102#ifdef __i386__
3103 if (sse2_supported)
3104 return sse2_memmove(dst, src, n);
3105#endif
3106
3107 if (!n) return dst;
3108
3109 if ((size_t)dst - (size_t)src >= n)
3110 {
3111 for (; (size_t)d % sizeof(size_t) && n; n--) *d++ = *s++;
3112
3113 sh1 = 8 * ((size_t)s % sizeof(size_t));
3114 if (!sh1)
3115 {
3116 while (n >= sizeof(size_t))
3117 {
3118 *(size_t*)d = *(size_t*)s;
3119 s += sizeof(size_t);
3120 d += sizeof(size_t);
3121 n -= sizeof(size_t);
3122 }
3123 }
3124 else if (n >= 2 * sizeof(size_t))
3125 {
3126 int sh2 = 8 * sizeof(size_t) - sh1;
3127 size_t x, y;
3128
3129 s -= sh1 / 8;
3130 x = *(size_t*)s;
3131 do
3132 {
3133 s += sizeof(size_t);
3134 y = *(size_t*)s;
3135 *(size_t*)d = MERGE(x, sh1, y, sh2);
3136 d += sizeof(size_t);
3137
3138 s += sizeof(size_t);
3139 x = *(size_t*)s;
3140 *(size_t*)d = MERGE(y, sh1, x, sh2);
3141 d += sizeof(size_t);
3142
3143 n -= 2 * sizeof(size_t);
3144 } while (n >= 2 * sizeof(size_t));
3145 s += sh1 / 8;
3146 }
3147 while (n--) *d++ = *s++;
3148 return dst;
3149 }
3150 else
3151 {
3152 d += n;
3153 s += n;
3154
3155 for (; (size_t)d % sizeof(size_t) && n; n--) *--d = *--s;
3156
3157 sh1 = 8 * ((size_t)s % sizeof(size_t));
3158 if (!sh1)
3159 {
3160 while (n >= sizeof(size_t))
3161 {
3162 s -= sizeof(size_t);
3163 d -= sizeof(size_t);
3164 *(size_t*)d = *(size_t*)s;
3165 n -= sizeof(size_t);
3166 }
3167 }
3168 else if (n >= 2 * sizeof(size_t))
3169 {
3170 int sh2 = 8 * sizeof(size_t) - sh1;
3171 size_t x, y;
3172
3173 s -= sh1 / 8;
3174 x = *(size_t*)s;
3175 do
3176 {
3177 s -= sizeof(size_t);
3178 y = *(size_t*)s;
3179 d -= sizeof(size_t);
3180 *(size_t*)d = MERGE(y, sh1, x, sh2);
3181
3182 s -= sizeof(size_t);
3183 x = *(size_t*)s;
3184 d -= sizeof(size_t);
3185 *(size_t*)d = MERGE(x, sh1, y, sh2);
3186
3187 n -= 2 * sizeof(size_t);
3188 } while (n >= 2 * sizeof(size_t));
3189 s += sh1 / 8;
3190 }
3191 while (n--) *--d = *--s;
3192 }
3193 return dst;
3194#endif
3195}
BOOL sse2_supported
Definition: math.c:71
#define MERGE(w1, sh1, w2, sh2)
Definition: string.c:3091
GLint GLint GLint GLint GLint x
Definition: gl.h:1548
GLdouble s
Definition: gl.h:2039
GLint GLint GLint GLint GLint GLint y
Definition: gl.h:1548
#define d
Definition: ke_i.h:81

◆ memset()

void * memset ( void dest,
int  ch,
uacpi_size  count 
)

Definition at line 3235 of file string.c.

3236{
3237 typedef uint64_t DECLSPEC_ALIGN(1) unaligned_ui64;
3238 typedef uint32_t DECLSPEC_ALIGN(1) unaligned_ui32;
3239 typedef uint16_t DECLSPEC_ALIGN(1) unaligned_ui16;
3240
3241 uint64_t v = 0x101010101010101ull * (unsigned char)c;
3242 unsigned char *d = (unsigned char *)dst;
3243 size_t a = 0x20 - ((uintptr_t)d & 0x1f);
3244
3245 if (n >= 16)
3246 {
3247 *(unaligned_ui64 *)(d + 0) = v;
3248 *(unaligned_ui64 *)(d + 8) = v;
3249 *(unaligned_ui64 *)(d + n - 16) = v;
3250 *(unaligned_ui64 *)(d + n - 8) = v;
3251 if (n <= 32) return dst;
3252 *(unaligned_ui64 *)(d + 16) = v;
3253 *(unaligned_ui64 *)(d + 24) = v;
3254 *(unaligned_ui64 *)(d + n - 32) = v;
3255 *(unaligned_ui64 *)(d + n - 24) = v;
3256 if (n <= 64) return dst;
3257
3258 n = (n - a) & ~0x1f;
3259 memset_aligned_32(d + a, v, n);
3260 return dst;
3261 }
3262 if (n >= 8)
3263 {
3264 *(unaligned_ui64 *)d = v;
3265 *(unaligned_ui64 *)(d + n - 8) = v;
3266 return dst;
3267 }
3268 if (n >= 4)
3269 {
3270 *(unaligned_ui32 *)d = v;
3271 *(unaligned_ui32 *)(d + n - 4) = v;
3272 return dst;
3273 }
3274 if (n >= 2)
3275 {
3276 *(unaligned_ui16 *)d = v;
3277 *(unaligned_ui16 *)(d + n - 2) = v;
3278 return dst;
3279 }
3280 if (n >= 1)
3281 {
3282 *(uint8_t *)d = v;
3283 return dst;
3284 }
3285 return dst;
3286}
UINT32 uint32_t
Definition: types.h:75
#define DECLSPEC_ALIGN(x)
Definition: corecrt.h:141
unsigned int uintptr_t
Definition: corecrt.h:185
unsigned short uint16_t
Definition: stdint.h:35
unsigned char uint8_t
Definition: stdint.h:33
static void memset_aligned_32(unsigned char *d, uint64_t v, size_t n)
Definition: string.c:3219
const GLdouble * v
Definition: gl.h:2040
const GLubyte * c
Definition: glext.h:8905
GLboolean GLboolean GLboolean GLboolean a
Definition: glext.h:6204
#define a
Definition: ke_i.h:78
if(dx< 0)
Definition: linetemp.h:194

◆ uacpi_bit_scan_backward()

uacpi_u8 uacpi_bit_scan_backward ( uacpi_u64  value)

Definition at line 166 of file stdlib.c.

167{
168#if defined(_MSC_VER) && !defined(__clang__)
169 unsigned char ret;
170 unsigned long index;
171
172#ifdef _WIN64
174 if (ret == 0)
175 return 0;
176
177 return (uacpi_u8)index + 1;
178#else
179 ret = _BitScanReverse(&index, value >> 32);
180 if (ret == 0) {
182 if (ret == 0)
183 return 0;
184
185 return (uacpi_u8)index + 1;
186 }
187
188 return (uacpi_u8)index + 33;
189#endif
190
191#elif defined(__WATCOMC__)
192 // TODO: Use compiler intrinsics or inline ASM here
194 uacpi_u64 mask = (1ull << 63);
195
196 for (index = 64; index > 0; index--, mask >>= 1) {
197 if (value & mask) {
198 return index;
199 }
200 }
201
202 return 0;
203#else
204 if (value == 0)
205 return 0;
206
207 return 64 - __builtin_clzll(value);
208#endif
209}
#define index(s, c)
Definition: various.h:29
uint64_t uacpi_u64
Definition: types.h:22
uint8_t uacpi_u8
Definition: types.h:19
return ret
Definition: mutex.c:147
GLuint index
Definition: glext.h:6031
GLenum GLint GLuint mask
Definition: glext.h:6028
__INTRIN_INLINE unsigned char _BitScanReverse64(unsigned long *Index, unsigned long long Mask)
Definition: intrin_arm64.h:124
unsigned char _BitScanReverse(unsigned long *_Index, unsigned long _Mask)
Definition: intrin_arm.h:180
Definition: pdh_main.c:96

Referenced by gas_get_access_bit_width(), and handle_unary_math().

◆ uacpi_bit_scan_forward()

uacpi_u8 uacpi_bit_scan_forward ( uacpi_u64  value)

Definition at line 124 of file stdlib.c.

125{
126#if defined(_MSC_VER) && !defined(__clang__)
127 unsigned char ret;
128 unsigned long index;
129
130#ifdef _WIN64
132 if (ret == 0)
133 return 0;
134
135 return (uacpi_u8)index + 1;
136#else
138 if (ret == 0) {
139 ret = _BitScanForward(&index, value >> 32);
140 if (ret == 0)
141 return 0;
142
143 return (uacpi_u8)index + 33;
144 }
145
146 return (uacpi_u8)index + 1;
147#endif
148
149#elif defined(__WATCOMC__)
150 // TODO: Use compiler intrinsics or inline ASM here
152 uacpi_u64 mask = 1;
153
154 for (index = 1; index <= 64; index++, mask <<= 1) {
155 if (value & mask) {
156 return index;
157 }
158 }
159
160 return 0;
161#else
162 return __builtin_ffsll(value);
163#endif
164}
__INTRIN_INLINE unsigned char _BitScanForward64(unsigned long *Index, unsigned long long Mask)
Definition: intrin_arm64.h:113
unsigned char _BitScanForward(unsigned long *_Index, unsigned long _Mask)
Definition: intrin_arm.h:57

Referenced by handle_unary_math().

◆ uacpi_builtin_alloc_zeroed()

void * uacpi_builtin_alloc_zeroed ( uacpi_size  size)

Definition at line 212 of file stdlib.c.

213{
214 void *ptr;
215
218 return ptr;
219
221 return ptr;
222}
#define uacpi_memzero(ptr, size)
Definition: stdlib.h:99
#define uacpi_unlikely(expr)
Definition: compiler.h:88
#define UACPI_NULL
Definition: types.h:33
GLsizeiptr size
Definition: glext.h:5919
void * uacpi_kernel_alloc(uacpi_size size)
Definition: uacpiosl.c:111
static PVOID ptr
Definition: dispmode.c:27

◆ uacpi_memcpy_zerout()

void uacpi_memcpy_zerout ( void dst,
const void src,
uacpi_size  dst_size,
uacpi_size  src_size 
)

Definition at line 112 of file stdlib.c.

114{
115 uacpi_size bytes_to_copy = UACPI_MIN(src_size, dst_size);
116
117 if (bytes_to_copy)
118 uacpi_memcpy(dst, src, bytes_to_copy);
119
120 if (dst_size > bytes_to_copy)
121 uacpi_memzero((uacpi_u8 *)dst + bytes_to_copy, dst_size - bytes_to_copy);
122}
#define uacpi_memcpy
Definition: stdlib.h:34
#define UACPI_MIN(x, y)
Definition: stdlib.h:102
size_t uacpi_size
Definition: types.h:37

Referenced by buffer_alloc_and_store(), build_table_id(), do_aml_resource_to_native(), do_native_resource_to_aml(), exec_op(), handle_buffer(), handle_deref_of(), handle_special_field(), object_assign_with_implicit_cast(), object_to_integer(), uacpi_dispatch_opregion_io(), uacpi_read_field_unit(), uacpi_write_buffer_field(), and write_buffer_index().

◆ uacpi_snprintf()

uacpi_i32 uacpi_snprintf ( uacpi_char buffer,
uacpi_size  capacity,
const uacpi_char fmt,
  ... 
)

Definition at line 684 of file stdlib.c.

687{
688 uacpi_va_list vlist;
690
691 uacpi_va_start(vlist, fmt);
692 ret = uacpi_vsnprintf(buffer, capacity, fmt, vlist);
693 uacpi_va_end(vlist);
694
695 return ret;
696}
#define uacpi_va_end
Definition: types.h:41
va_list uacpi_va_list
Definition: types.h:39
int32_t uacpi_i32
Definition: types.h:26
#define uacpi_va_start
Definition: types.h:40
GLuint buffer
Definition: glext.h:5915
uacpi_i32 uacpi_vsnprintf(uacpi_char *buffer, uacpi_size capacity, const uacpi_char *fmt, uacpi_va_list vlist)
Definition: stdlib.c:499
Definition: dsound.c:943

Referenced by buffer_to_string(), handle_concatenate(), integer_to_string(), uacpi_eval_cls(), and uacpi_eval_uid().

◆ uacpi_strcmp()

uacpi_i32 uacpi_strcmp ( const uacpi_char lhs,
const uacpi_char rhs 
)

Definition at line 96 of file stdlib.c.

97{
98 uacpi_size i = 0;
99 typedef const uacpi_u8 *cucp;
100
101 while (lhs[i] && rhs[i]) {
102 if (lhs[i] != rhs[i])
103 return *(cucp)&lhs[i] - *(cucp)&rhs[i];
104
105 i++;
106 }
107
108 return *(cucp)&lhs[i] - *(cucp)&rhs[i];
109}
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
Definition: glfuncs.h:248

Referenced by find_interface_unlocked(), matches_any(), and uacpi_uninstall_interface().

◆ uacpi_strlen()

uacpi_size uacpi_strlen ( const uacpi_char str)

Definition at line 72 of file stdlib.c.

73{
74 const uacpi_char *str1;
75
76 for (str1 = str; *str1; str1++);
77
78 return str1 - str;
79}
char uacpi_char
Definition: types.h:44
const WCHAR * str
XML_HIDDEN void xmlParserErrors const char const xmlChar * str1
Definition: parser.h:35

Referenced by consume(), uacpi_free_dynamic_string(), uacpi_install_interface(), uacpi_namespace_node_resolve(), and uacpi_object_create_cstring().

◆ uacpi_strnlen()

uacpi_size uacpi_strnlen ( const uacpi_char str,
uacpi_size  max 
)

Definition at line 85 of file stdlib.c.

86{
87 const uacpi_char *str1;
88
89 for (str1 = str; max-- && *str1; str1++);
90
91 return str1 - str;
92}
#define max(a, b)
Definition: svc.c:63

Referenced by handle_string(), and handle_to_string().

◆ uacpi_vsnprintf()

uacpi_i32 uacpi_vsnprintf ( uacpi_char buffer,
uacpi_size  capacity,
const uacpi_char fmt,
uacpi_va_list  vlist 
)

Definition at line 499 of file stdlib.c.

503{
504 struct fmt_buf_state fb_state = { 0 };
506 const uacpi_char *next_conversion;
507 uacpi_size next_offset;
509
510 fb_state.buffer = buffer;
511 fb_state.capacity = capacity;
512 fb_state.bytes_written = 0;
513
514 while (*fmt) {
515 struct fmt_spec fm = {
516 .pad_char = ' ',
517 .base = 10,
518 };
519 next_conversion = find_next_conversion(fmt, &next_offset);
520
521 if (next_offset)
522 write_many(&fb_state, fmt, next_offset);
523
524 if (!next_conversion)
525 break;
526
527 fmt = next_conversion;
528 if (consume(&fmt, "%%")) {
529 write_one(&fb_state, '%');
530 continue;
531 }
532
533 // consume %
534 fmt++;
535
536 while (consume_one_of(&fmt, "+- 0#", &flag)) {
537 switch (flag) {
538 case '+':
539 case ' ':
540 fm.prepend = UACPI_TRUE;
541 fm.prepend_char = flag;
542 continue;
543 case '-':
545 continue;
546 case '0':
547 fm.pad_char = '0';
548 continue;
549 case '#':
551 continue;
552 default:
553 return -1;
554 }
555 }
556
557 if (consume(&fmt, "*")) {
558 fm.min_width = uacpi_va_arg(vlist, int);
560 return -1;
561 }
562
563 if (consume(&fmt, ".")) {
565
566 if (consume(&fmt, "*")) {
567 fm.precision = uacpi_va_arg(vlist, int);
568 } else {
570 return -1;
571 }
572 }
573
574 flag = 0;
575
576 if (consume(&fmt, "c")) {
577 uacpi_char c = uacpi_va_arg(vlist, int);
578 write_one(&fb_state, c);
579 continue;
580 }
581
582 if (consume(&fmt, "s")) {
583 const uacpi_char *string = uacpi_va_arg(vlist, uacpi_char*);
585
586 if (uacpi_unlikely(string == UACPI_NULL))
587 string = "<null>";
588
589 for (i = 0; (!fm.has_precision || i < fm.precision) && string[i]; ++i)
590 write_one(&fb_state, string[i]);
591 while (i++ < fm.min_width)
592 write_one(&fb_state, ' ');
593 continue;
594 }
595
596 if (consume(&fmt, "p")) {
597 value = (uacpi_uintptr)uacpi_va_arg(vlist, void*);
598 fm.base = 16;
599 fm.min_width = UACPI_POINTER_SIZE * 2;
600 fm.pad_char = '0';
601 goto write_int;
602 }
603
604 if (consume(&fmt, "hh")) {
605 if (consume(&fmt, "d") || consume(&fmt, "i")) {
606 value = (uacpi_u64)uacpi_va_arg(vlist, int);
608 } else if (consume_one_of(&fmt, "oxXu", &flag)) {
609 value = (unsigned char)uacpi_va_arg(vlist, int);
610 } else {
611 return -1;
612 }
613 goto write_int;
614 }
615
616 if (consume(&fmt, "h")) {
617 if (consume(&fmt, "d") || consume(&fmt, "i")) {
618 value = (signed short)uacpi_va_arg(vlist, int);
620 } else if (consume_one_of(&fmt, "oxXu", &flag)) {
621 value = (unsigned short)uacpi_va_arg(vlist, int);
622 } else {
623 return -1;
624 }
625 goto write_int;
626 }
627
628 if (consume(&fmt, "ll") ||
629 (sizeof(uacpi_size) == sizeof(long long) && consume(&fmt, "z"))) {
630 if (consume(&fmt, "d") || consume(&fmt, "i")) {
631 value = uacpi_va_arg(vlist, long long);
633 } else if (consume_one_of(&fmt, "oxXu", &flag)) {
634 value = uacpi_va_arg(vlist, unsigned long long);
635 } else {
636 return -1;
637 }
638 goto write_int;
639 }
640
641 if (consume(&fmt, "l") ||
642 (sizeof(uacpi_size) == sizeof(long) && consume(&fmt, "z"))) {
643 if (consume(&fmt, "d") || consume(&fmt, "i")) {
644 value = uacpi_va_arg(vlist, long);
646 } else if (consume_one_of(&fmt, "oxXu", &flag)) {
647 value = uacpi_va_arg(vlist, unsigned long);
648 } else {
649 return -1;
650 }
651 goto write_int;
652 }
653
654 if (consume(&fmt, "d") || consume(&fmt, "i")) {
655 value = uacpi_va_arg(vlist, uacpi_i32);
657 } else if (consume_one_of(&fmt, "oxXu", &flag)) {
658 value = uacpi_va_arg(vlist, uacpi_u32);
659 } else {
660 return -1;
661 }
662
663 write_int:
664 if (flag != 0) {
667 }
668
669 write_integer(&fb_state, &fm, value);
670 }
671
672 if (fb_state.capacity) {
673 uacpi_size last_char;
674
675 last_char = UACPI_MIN(fb_state.bytes_written, fb_state.capacity - 1);
676 fb_state.buffer[last_char] = '\0';
677 }
678
679 return fb_state.bytes_written;
680}
unsigned char
Definition: typeof.h:29
unsigned short(__cdecl typeof(TIFFCurrentDirectory))(struct tiff *)
Definition: typeof.h:94
uint32_t uacpi_u32
Definition: types.h:21
#define uacpi_va_arg
Definition: types.h:42
#define UACPI_TRUE
Definition: types.h:29
uintptr_t uacpi_uintptr
Definition: types.h:35
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean flag
Definition: glfuncs.h:52
static uacpi_bool consume(const uacpi_char **string, const uacpi_char *token)
Definition: stdlib.c:419
static void write_many(struct fmt_buf_state *fb_state, const uacpi_char *string, uacpi_size count)
Definition: stdlib.c:256
static const uacpi_char * find_next_conversion(const uacpi_char *fmt, uacpi_size *offset)
Definition: stdlib.c:482
static uacpi_u32 base_from_specifier(uacpi_char specifier)
Definition: stdlib.c:463
@ PARSE_NUMBER_MODE_MAYBE
Definition: stdlib.c:400
@ PARSE_NUMBER_MODE_MUST
Definition: stdlib.c:401
static uacpi_bool consume_one_of(const uacpi_char **string, const uacpi_char *list, uacpi_char *consumed_char)
Definition: stdlib.c:446
static void write_one(struct fmt_buf_state *fb_state, uacpi_char c)
Definition: stdlib.c:248
static uacpi_bool parse_number(const uacpi_char **fmt, enum parse_number_mode mode, uacpi_u64 *out_value)
Definition: stdlib.c:404
static uacpi_bool is_uppercase_specifier(uacpi_char specifier)
Definition: stdlib.c:477
static void write_integer(struct fmt_buf_state *fb_state, struct fmt_spec *fm, uacpi_u64 value)
Definition: stdlib.c:299
uacpi_size capacity
Definition: stdlib.c:230
uacpi_size bytes_written
Definition: stdlib.c:231
uacpi_char * buffer
Definition: stdlib.c:229
uacpi_u8 left_justify
Definition: stdlib.c:238
uacpi_u8 uppercase
Definition: stdlib.c:237
uacpi_u8 prepend
Definition: stdlib.c:236
uacpi_char prepend_char
Definition: stdlib.c:242
uacpi_u64 precision
Definition: stdlib.c:244
uacpi_u8 alternate_form
Definition: stdlib.c:239
uacpi_char pad_char
Definition: stdlib.c:241
uacpi_u8 is_signed
Definition: stdlib.c:235
uacpi_u64 min_width
Definition: stdlib.c:243
uacpi_u8 has_precision
Definition: stdlib.c:240
uacpi_u32 base
Definition: stdlib.c:245

Referenced by uacpi_log(), and uacpi_snprintf().