ReactOS 0.4.16-dev-1561-gba36b90
stdlib.c File Reference
Include dependency graph for stdlib.c:

Go to the source code of this file.

Classes

struct  fmt_buf_state
 
struct  fmt_spec
 

Macros

#define REPR_BUFFER_SIZE   32
 

Enumerations

enum  parse_number_mode { PARSE_NUMBER_MODE_MAYBE , PARSE_NUMBER_MODE_MUST }
 

Functions

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)
 
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 value)
 
uacpi_u8 uacpi_bit_scan_backward (uacpi_u64 value)
 
voiduacpi_builtin_alloc_zeroed (uacpi_size size)
 
static void write_one (struct fmt_buf_state *fb_state, uacpi_char c)
 
static void write_many (struct fmt_buf_state *fb_state, const uacpi_char *string, uacpi_size count)
 
static uacpi_char hex_char (uacpi_bool upper, uacpi_u64 value)
 
static void write_padding (struct fmt_buf_state *fb_state, struct fmt_spec *fm, uacpi_size repr_size)
 
static void write_integer (struct fmt_buf_state *fb_state, struct fmt_spec *fm, uacpi_u64 value)
 
static uacpi_bool string_has_at_least (const uacpi_char *string, uacpi_size characters)
 
static uacpi_bool consume_digits (const uacpi_char **string, uacpi_size *out_size)
 
static uacpi_bool parse_number (const uacpi_char **fmt, enum parse_number_mode mode, uacpi_u64 *out_value)
 
static uacpi_bool consume (const uacpi_char **string, const uacpi_char *token)
 
static uacpi_bool is_one_of (uacpi_char c, const uacpi_char *list)
 
static uacpi_bool consume_one_of (const uacpi_char **string, const uacpi_char *list, uacpi_char *consumed_char)
 
static uacpi_u32 base_from_specifier (uacpi_char specifier)
 
static uacpi_bool is_uppercase_specifier (uacpi_char specifier)
 
static const uacpi_charfind_next_conversion (const uacpi_char *fmt, uacpi_size *offset)
 
uacpi_i32 uacpi_vsnprintf (uacpi_char *buffer, uacpi_size capacity, const uacpi_char *fmt, uacpi_va_list vlist)
 
uacpi_i32 uacpi_snprintf (uacpi_char *buffer, uacpi_size capacity, const uacpi_char *fmt,...)
 
void uacpi_log (uacpi_log_level lvl, const uacpi_char *str,...)
 

Macro Definition Documentation

◆ REPR_BUFFER_SIZE

#define REPR_BUFFER_SIZE   32

Definition at line 273 of file stdlib.c.

Enumeration Type Documentation

◆ parse_number_mode

Enumerator
PARSE_NUMBER_MODE_MAYBE 
PARSE_NUMBER_MODE_MUST 

Definition at line 375 of file stdlib.c.

375 {
378};
@ PARSE_NUMBER_MODE_MAYBE
Definition: stdlib.c:376
@ PARSE_NUMBER_MODE_MUST
Definition: stdlib.c:377

Function Documentation

◆ base_from_specifier()

static uacpi_u32 base_from_specifier ( uacpi_char  specifier)
static

Definition at line 439 of file stdlib.c.

440{
441 switch (specifier)
442 {
443 case 'x':
444 case 'X':
445 return 16;
446 case 'o':
447 return 8;
448 default:
449 return 10;
450 }
451}
wchar_t specifier
Definition: wcsftime.cpp:381

Referenced by uacpi_vsnprintf().

◆ consume()

static uacpi_bool consume ( const uacpi_char **  string,
const uacpi_char token 
)
static

Definition at line 395 of file stdlib.c.

396{
397 uacpi_size token_size;
398
399 token_size = uacpi_strlen(token);
400
401 if (!string_has_at_least(*string, token_size))
402 return UACPI_FALSE;
403
404 if (!uacpi_memcmp(*string, token, token_size)) {
405 *string += token_size;
406 return UACPI_TRUE;
407 }
408
409 return UACPI_FALSE;
410}
#define uacpi_memcmp
Definition: stdlib.h:61
size_t uacpi_size
Definition: types.h:37
#define UACPI_FALSE
Definition: types.h:30
#define UACPI_TRUE
Definition: types.h:29
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 token
Definition: glfuncs.h:210
static uacpi_bool string_has_at_least(const uacpi_char *string, uacpi_size characters)
Definition: stdlib.c:339
uacpi_size uacpi_strlen(const uacpi_char *str)
Definition: stdlib.c:72

Referenced by uacpi_vsnprintf().

◆ consume_digits()

static uacpi_bool consume_digits ( const uacpi_char **  string,
uacpi_size out_size 
)
static

Definition at line 353 of file stdlib.c.

356{
357 uacpi_size size = 0;
358
359 for (;;) {
360 char c = **string;
361 if (c < '0' || c > '9')
362 break;
363
364 size++;
365 *string += 1;
366 }
367
368 if (size == 0)
369 return UACPI_FALSE;
370
371 *out_size = size;
372 return UACPI_TRUE;
373}
GLsizeiptr size
Definition: glext.h:5919
const GLubyte * c
Definition: glext.h:8905
char string[160]
Definition: util.h:11
static HANDLE PIO_APC_ROUTINE PVOID PIO_STATUS_BLOCK ULONG PVOID ULONG PVOID ULONG out_size
Definition: file.c:100

Referenced by parse_number().

◆ consume_one_of()

static uacpi_bool consume_one_of ( const uacpi_char **  string,
const uacpi_char list,
uacpi_char consumed_char 
)
static

Definition at line 422 of file stdlib.c.

425{
426 uacpi_char c = **string;
427 if (!c)
428 return UACPI_FALSE;
429
430 if (is_one_of(c, list)) {
431 *consumed_char = c;
432 *string += 1;
433 return UACPI_TRUE;
434 }
435
436 return UACPI_FALSE;
437}
Definition: list.h:37
char uacpi_char
Definition: types.h:44
#define c
Definition: ke_i.h:80
static uacpi_bool is_one_of(uacpi_char c, const uacpi_char *list)
Definition: stdlib.c:412

Referenced by uacpi_vsnprintf().

◆ find_next_conversion()

static const uacpi_char * find_next_conversion ( const uacpi_char fmt,
uacpi_size offset 
)
static

Definition at line 458 of file stdlib.c.

461{
462 *offset = 0;
463
464 while (*fmt) {
465 if (*fmt == '%')
466 return fmt;
467
468 fmt++;
469 *offset += 1;
470 }
471
472 return UACPI_NULL;
473}
#define UACPI_NULL
Definition: types.h:33
GLintptr offset
Definition: glext.h:5920
Definition: dsound.c:943

Referenced by uacpi_vsnprintf().

◆ hex_char()

static uacpi_char hex_char ( uacpi_bool  upper,
uacpi_u64  value 
)
static

Definition at line 250 of file stdlib.c.

251{
252 static const uacpi_char upper_hex[] = "0123456789ABCDEF";
253 static const uacpi_char lower_hex[] = "0123456789abcdef";
254
255 return (upper ? upper_hex : lower_hex)[value];
256}
Definition: pdh_main.c:96

Referenced by write_integer().

◆ is_one_of()

static uacpi_bool is_one_of ( uacpi_char  c,
const uacpi_char list 
)
static

Definition at line 412 of file stdlib.c.

413{
414 for (; *list; list++) {
415 if (c == *list)
416 return UACPI_TRUE;
417 }
418
419 return UACPI_FALSE;
420}
#define list
Definition: rosglue.h:35

Referenced by consume_one_of(), and uacpi_namespace_node_next_typed().

◆ is_uppercase_specifier()

static uacpi_bool is_uppercase_specifier ( uacpi_char  specifier)
static

Definition at line 453 of file stdlib.c.

454{
455 return specifier == 'X';
456}

Referenced by uacpi_vsnprintf().

◆ parse_number()

static uacpi_bool parse_number ( const uacpi_char **  fmt,
enum parse_number_mode  mode,
uacpi_u64 out_value 
)
static

Definition at line 380 of file stdlib.c.

383{
385 uacpi_size num_digits;
386 const uacpi_char *digits = *fmt;
387
388 if (!consume_digits(fmt, &num_digits))
390
391 ret = uacpi_string_to_integer(digits, num_digits, UACPI_BASE_DEC, out_value);
392 return ret == UACPI_STATUS_OK;
393}
uacpi_status
Definition: status.h:10
@ UACPI_STATUS_OK
Definition: status.h:11
return ret
Definition: mutex.c:146
GLenum mode
Definition: glext.h:6217
uacpi_status uacpi_string_to_integer(const uacpi_char *str, uacpi_size max_chars, enum uacpi_base base, uacpi_u64 *out_value)
Definition: utilities.c:233
@ UACPI_BASE_DEC
Definition: utilities.h:33
static const int digits[]
Definition: decode.c:71
static uacpi_bool consume_digits(const uacpi_char **string, uacpi_size *out_size)
Definition: stdlib.c:353

Referenced by uacpi_vsnprintf().

◆ string_has_at_least()

static uacpi_bool string_has_at_least ( const uacpi_char string,
uacpi_size  characters 
)
static

Definition at line 339 of file stdlib.c.

342{
343 while (*string) {
344 if (--characters == 0)
345 return UACPI_TRUE;
346
347 string++;
348 }
349
350 return UACPI_FALSE;
351}

Referenced by consume().

◆ uacpi_bit_scan_backward()

uacpi_u8 uacpi_bit_scan_backward ( uacpi_u64  value)

Definition at line 154 of file stdlib.c.

155{
156#if defined(_MSC_VER) && !defined(__clang__)
157 unsigned char ret;
158 unsigned long index;
159
160#ifdef _WIN64
161 ret = _BitScanReverse64(&index, value);
162 if (ret == 0)
163 return 0;
164
165 return (uacpi_u8)index + 1;
166#else
167 ret = _BitScanReverse(&index, value >> 32);
168 if (ret == 0) {
170 if (ret == 0)
171 return 0;
172
173 return (uacpi_u8)index + 1;
174 }
175
176 return (uacpi_u8)index + 33;
177#endif
178
179#else
180 if (value == 0)
181 return 0;
182
183 return 64 - __builtin_clzll(value);
184#endif
185}
#define index(s, c)
Definition: various.h:29
uint8_t uacpi_u8
Definition: types.h:19
GLuint index
Definition: glext.h:6031
unsigned char _BitScanReverse(unsigned long *_Index, unsigned long _Mask)
Definition: intrin_arm.h:180

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
131 ret = _BitScanForward64(&index, value);
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#else
150 return __builtin_ffsll(value);
151#endif
152}
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 188 of file stdlib.c.

189{
190 void *ptr;
191
194 return ptr;
195
197 return ptr;
198}
#define uacpi_memzero(ptr, size)
Definition: stdlib.h:99
#define uacpi_unlikely(expr)
Definition: compiler.h:58
void * uacpi_kernel_alloc(uacpi_size size)
Definition: uacpiosl.c:111
static PVOID ptr
Definition: dispmode.c:27

◆ uacpi_log()

void uacpi_log ( uacpi_log_level  lvl,
const uacpi_char str,
  ... 
)

Definition at line 677 of file stdlib.c.

678{
680 int ret;
681
682 uacpi_va_list vlist;
683 uacpi_va_start(vlist, str);
684
685 ret = uacpi_vsnprintf(buf, sizeof(buf), str, vlist);
686 if (uacpi_unlikely(ret < 0))
687 return;
688
689 /*
690 * If this log message is too large for the configured buffer size, cut off
691 * the end and transform into "...\n" to indicate that it didn't fit and
692 * prevent the newline from being truncated.
693 */
699 }
700
701 uacpi_kernel_log(lvl, buf);
702
703 uacpi_va_end(vlist);
704}
#define UACPI_PLAIN_LOG_BUFFER_SIZE
Definition: config.h:140
#define uacpi_va_end
Definition: types.h:41
va_list uacpi_va_list
Definition: types.h:39
#define uacpi_va_start
Definition: types.h:40
GLenum GLuint GLenum GLsizei const GLchar * buf
Definition: glext.h:7751
void uacpi_kernel_log(uacpi_log_level, const uacpi_char *)
Definition: uacpiosl.c:18
const WCHAR * str
uacpi_i32 uacpi_vsnprintf(uacpi_char *buffer, uacpi_size capacity, const uacpi_char *fmt, uacpi_va_list vlist)
Definition: stdlib.c:475

◆ 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
GLenum src
Definition: glext.h:6340
GLenum GLenum dst
Definition: glext.h:6340

Referenced by buffer_alloc_and_store(), build_table_id(), do_aml_resource_to_native(), do_native_resource_to_aml(), exec_op(), handle_buffer(), handle_ref_or_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 661 of file stdlib.c.

664{
665 uacpi_va_list vlist;
667
668 uacpi_va_start(vlist, fmt);
669 ret = uacpi_vsnprintf(buffer, capacity, fmt, vlist);
670 uacpi_va_end(vlist);
671
672 return ret;
673}
int32_t uacpi_i32
Definition: types.h:26
GLuint buffer
Definition: glext.h:5915

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}

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 475 of file stdlib.c.

479{
480 struct fmt_buf_state fb_state = {
481 .buffer = buffer,
482 .capacity = capacity,
483 .bytes_written = 0
484 };
485
487 const uacpi_char *next_conversion;
488 uacpi_size next_offset;
490
491 while (*fmt) {
492 struct fmt_spec fm = {
493 .pad_char = ' ',
494 .base = 10,
495 };
496 next_conversion = find_next_conversion(fmt, &next_offset);
497
498 if (next_offset)
499 write_many(&fb_state, fmt, next_offset);
500
501 if (!next_conversion)
502 break;
503
504 fmt = next_conversion;
505 if (consume(&fmt, "%%")) {
506 write_one(&fb_state, '%');
507 continue;
508 }
509
510 // consume %
511 fmt++;
512
513 while (consume_one_of(&fmt, "+- 0#", &flag)) {
514 switch (flag) {
515 case '+':
516 case ' ':
517 fm.prepend = UACPI_TRUE;
518 fm.prepend_char = flag;
519 continue;
520 case '-':
522 continue;
523 case '0':
524 fm.pad_char = '0';
525 continue;
526 case '#':
528 continue;
529 default:
530 return -1;
531 }
532 }
533
534 if (consume(&fmt, "*")) {
535 fm.min_width = uacpi_va_arg(vlist, int);
537 return -1;
538 }
539
540 if (consume(&fmt, ".")) {
542
543 if (consume(&fmt, "*")) {
544 fm.precision = uacpi_va_arg(vlist, int);
545 } else {
547 return -1;
548 }
549 }
550
551 flag = 0;
552
553 if (consume(&fmt, "c")) {
554 uacpi_char c = uacpi_va_arg(vlist, int);
555 write_one(&fb_state, c);
556 continue;
557 }
558
559 if (consume(&fmt, "s")) {
560 const uacpi_char *string = uacpi_va_arg(vlist, uacpi_char*);
562
563 if (uacpi_unlikely(string == UACPI_NULL))
564 string = "<null>";
565
566 for (i = 0; (!fm.has_precision || i < fm.precision) && string[i]; ++i)
567 write_one(&fb_state, string[i]);
568 while (i++ < fm.min_width)
569 write_one(&fb_state, ' ');
570 continue;
571 }
572
573 if (consume(&fmt, "p")) {
574 value = (uacpi_uintptr)uacpi_va_arg(vlist, void*);
575 fm.base = 16;
576 fm.min_width = UACPI_POINTER_SIZE * 2;
577 fm.pad_char = '0';
578 goto write_int;
579 }
580
581 if (consume(&fmt, "hh")) {
582 if (consume(&fmt, "d") || consume(&fmt, "i")) {
583 value = (signed char)uacpi_va_arg(vlist, int);
585 } else if (consume_one_of(&fmt, "oxXu", &flag)) {
586 value = (unsigned char)uacpi_va_arg(vlist, int);
587 } else {
588 return -1;
589 }
590 goto write_int;
591 }
592
593 if (consume(&fmt, "h")) {
594 if (consume(&fmt, "d") || consume(&fmt, "i")) {
595 value = (signed short)uacpi_va_arg(vlist, int);
597 } else if (consume_one_of(&fmt, "oxXu", &flag)) {
598 value = (unsigned short)uacpi_va_arg(vlist, int);
599 } else {
600 return -1;
601 }
602 goto write_int;
603 }
604
605 if (consume(&fmt, "ll") ||
606 (sizeof(uacpi_size) == sizeof(long long) && consume(&fmt, "z"))) {
607 if (consume(&fmt, "d") || consume(&fmt, "i")) {
608 value = uacpi_va_arg(vlist, long long);
610 } else if (consume_one_of(&fmt, "oxXu", &flag)) {
611 value = uacpi_va_arg(vlist, unsigned long long);
612 } else {
613 return -1;
614 }
615 goto write_int;
616 }
617
618 if (consume(&fmt, "l") ||
619 (sizeof(uacpi_size) == sizeof(long) && consume(&fmt, "z"))) {
620 if (consume(&fmt, "d") || consume(&fmt, "i")) {
621 value = uacpi_va_arg(vlist, long);
623 } else if (consume_one_of(&fmt, "oxXu", &flag)) {
624 value = uacpi_va_arg(vlist, unsigned long);
625 } else {
626 return -1;
627 }
628 goto write_int;
629 }
630
631 if (consume(&fmt, "d") || consume(&fmt, "i")) {
632 value = uacpi_va_arg(vlist, uacpi_i32);
634 } else if (consume_one_of(&fmt, "oxXu", &flag)) {
635 value = uacpi_va_arg(vlist, uacpi_u32);
636 } else {
637 return -1;
638 }
639
640 write_int:
641 if (flag != 0) {
644 }
645
646 write_integer(&fb_state, &fm, value);
647 }
648
649 if (fb_state.capacity) {
651
652 last_char = UACPI_MIN(fb_state.bytes_written, fb_state.capacity - 1);
653 fb_state.buffer[last_char] = '\0';
654 }
655
656 return fb_state.bytes_written;
657}
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
uint64_t uacpi_u64
Definition: types.h:22
#define uacpi_va_arg
Definition: types.h:42
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
LONG last_char
Definition: input.c:71
static uacpi_bool consume(const uacpi_char **string, const uacpi_char *token)
Definition: stdlib.c:395
static void write_many(struct fmt_buf_state *fb_state, const uacpi_char *string, uacpi_size count)
Definition: stdlib.c:232
static const uacpi_char * find_next_conversion(const uacpi_char *fmt, uacpi_size *offset)
Definition: stdlib.c:458
static uacpi_u32 base_from_specifier(uacpi_char specifier)
Definition: stdlib.c:439
static uacpi_bool consume_one_of(const uacpi_char **string, const uacpi_char *list, uacpi_char *consumed_char)
Definition: stdlib.c:422
static void write_one(struct fmt_buf_state *fb_state, uacpi_char c)
Definition: stdlib.c:224
static uacpi_bool parse_number(const uacpi_char **fmt, enum parse_number_mode mode, uacpi_u64 *out_value)
Definition: stdlib.c:380
static uacpi_bool is_uppercase_specifier(uacpi_char specifier)
Definition: stdlib.c:453
static void write_integer(struct fmt_buf_state *fb_state, struct fmt_spec *fm, uacpi_u64 value)
Definition: stdlib.c:275
uacpi_size capacity
Definition: stdlib.c:206
uacpi_size bytes_written
Definition: stdlib.c:207
uacpi_char * buffer
Definition: stdlib.c:205
uacpi_u8 left_justify
Definition: stdlib.c:214
uacpi_u8 uppercase
Definition: stdlib.c:213
uacpi_u8 prepend
Definition: stdlib.c:212
uacpi_char prepend_char
Definition: stdlib.c:218
uacpi_u64 precision
Definition: stdlib.c:220
uacpi_u8 alternate_form
Definition: stdlib.c:215
uacpi_char pad_char
Definition: stdlib.c:217
uacpi_u8 is_signed
Definition: stdlib.c:211
uacpi_u64 min_width
Definition: stdlib.c:219
uacpi_u8 has_precision
Definition: stdlib.c:216
uacpi_u32 base
Definition: stdlib.c:221

Referenced by uacpi_log(), and uacpi_snprintf().

◆ write_integer()

static void write_integer ( struct fmt_buf_state fb_state,
struct fmt_spec fm,
uacpi_u64  value 
)
static

Definition at line 275 of file stdlib.c.

278{
279 uacpi_char repr_buffer[REPR_BUFFER_SIZE];
282 uacpi_char repr;
283 uacpi_bool negative = UACPI_FALSE;
284 uacpi_size repr_size;
285
286 if (fm->is_signed) {
287 uacpi_i64 as_ll = value;
288
289 if (as_ll < 0) {
290 value = -as_ll;
291 negative = UACPI_TRUE;
292 }
293 }
294
295 if (fm->prepend || negative)
296 write_one(fb_state, negative ? '-' : fm->prepend_char);
297
298 while (value) {
299 remainder = value % fm->base;
300 value /= fm->base;
301
302 if (fm->base == 16) {
303 repr = hex_char(fm->uppercase, remainder);
304 } else if (fm->base == 8 || fm->base == 10) {
305 repr = remainder + '0';
306 } else {
307 repr = '?';
308 }
309
310 repr_buffer[--index] = repr;
311 }
312 repr_size = REPR_BUFFER_SIZE - index;
313
314 if (repr_size == 0) {
315 repr_buffer[--index] = '0';
316 repr_size = 1;
317 }
318
319 if (fm->alternate_form) {
320 if (fm->base == 16) {
321 repr_buffer[--index] = fm->uppercase ? 'X' : 'x';
322 repr_buffer[--index] = '0';
323 repr_size += 2;
324 } else if (fm->base == 8) {
325 repr_buffer[--index] = '0';
326 repr_size += 1;
327 }
328 }
329
330 if (fm->left_justify) {
331 write_many(fb_state, &repr_buffer[index], repr_size);
332 write_padding(fb_state, fm, repr_size);
333 } else {
334 write_padding(fb_state, fm, repr_size);
335 write_many(fb_state, &repr_buffer[index], repr_size);
336 }
337}
bool uacpi_bool
Definition: types.h:31
int64_t uacpi_i64
Definition: types.h:27
double __cdecl remainder(double, double)
Definition: remainder.c:75
static void write_padding(struct fmt_buf_state *fb_state, struct fmt_spec *fm, uacpi_size repr_size)
Definition: stdlib.c:258
static uacpi_char hex_char(uacpi_bool upper, uacpi_u64 value)
Definition: stdlib.c:250
#define REPR_BUFFER_SIZE
Definition: stdlib.c:273

Referenced by uacpi_vsnprintf().

◆ write_many()

static void write_many ( struct fmt_buf_state fb_state,
const uacpi_char string,
uacpi_size  count 
)
static

Definition at line 232 of file stdlib.c.

235{
236 if (fb_state->bytes_written < fb_state->capacity) {
237 uacpi_size count_to_write;
238
239 count_to_write = UACPI_MIN(
240 count, fb_state->capacity - fb_state->bytes_written
241 );
243 &fb_state->buffer[fb_state->bytes_written], string, count_to_write
244 );
245 }
246
247 fb_state->bytes_written += count;
248}
GLuint GLuint GLsizei count
Definition: gl.h:1545

Referenced by uacpi_vsnprintf(), and write_integer().

◆ write_one()

static void write_one ( struct fmt_buf_state fb_state,
uacpi_char  c 
)
static

Definition at line 224 of file stdlib.c.

225{
226 if (fb_state->bytes_written < fb_state->capacity)
227 fb_state->buffer[fb_state->bytes_written] = c;
228
229 fb_state->bytes_written++;
230}

Referenced by uacpi_vsnprintf(), write_integer(), and write_padding().

◆ write_padding()

static void write_padding ( struct fmt_buf_state fb_state,
struct fmt_spec fm,
uacpi_size  repr_size 
)
static

Definition at line 258 of file stdlib.c.

261{
262 uacpi_u64 mw = fm->min_width;
263
264 if (mw <= repr_size)
265 return;
266
267 mw -= repr_size;
268
269 while (mw--)
270 write_one(fb_state, fm->left_justify ? ' ' : fm->pad_char);
271}

Referenced by write_integer().