ReactOS 0.4.16-dev-289-g096a551
utprint.c File Reference
#include "acpi.h"
#include "accommon.h"
Include dependency graph for utprint.c:

Go to the source code of this file.

Macros

#define _COMPONENT   ACPI_UTILITIES
 
#define ACPI_FORMAT_SIGN   0x01
 
#define ACPI_FORMAT_SIGN_PLUS   0x02
 
#define ACPI_FORMAT_SIGN_PLUS_SPACE   0x04
 
#define ACPI_FORMAT_ZERO   0x08
 
#define ACPI_FORMAT_LEFT   0x10
 
#define ACPI_FORMAT_UPPER   0x20
 
#define ACPI_FORMAT_PREFIX   0x40
 

Functions

static ACPI_SIZE AcpiUtBoundStringLength (const char *String, ACPI_SIZE Count)
 
static charAcpiUtBoundStringOutput (char *String, const char *End, char c)
 
static charAcpiUtFormatNumber (char *String, char *End, UINT64 Number, UINT8 Base, INT32 Width, INT32 Precision, UINT8 Type)
 
static charAcpiUtPutNumber (char *String, UINT64 Number, UINT8 Base, BOOLEAN Upper)
 
const charAcpiUtScanNumber (const char *String, UINT64 *NumberPtr)
 
const charAcpiUtPrintNumber (char *String, UINT64 Number)
 
int vsnprintf (char *String, ACPI_SIZE Size, const char *Format, va_list Args)
 
int snprintf (char *String, ACPI_SIZE Size, const char *Format,...)
 
int sprintf (char *String, const char *Format,...)
 

Macro Definition Documentation

◆ _COMPONENT

#define _COMPONENT   ACPI_UTILITIES

Definition at line 47 of file utprint.c.

◆ ACPI_FORMAT_LEFT

#define ACPI_FORMAT_LEFT   0x10

Definition at line 55 of file utprint.c.

◆ ACPI_FORMAT_PREFIX

#define ACPI_FORMAT_PREFIX   0x40

Definition at line 57 of file utprint.c.

◆ ACPI_FORMAT_SIGN

#define ACPI_FORMAT_SIGN   0x01

Definition at line 51 of file utprint.c.

◆ ACPI_FORMAT_SIGN_PLUS

#define ACPI_FORMAT_SIGN_PLUS   0x02

Definition at line 52 of file utprint.c.

◆ ACPI_FORMAT_SIGN_PLUS_SPACE

#define ACPI_FORMAT_SIGN_PLUS_SPACE   0x04

Definition at line 53 of file utprint.c.

◆ ACPI_FORMAT_UPPER

#define ACPI_FORMAT_UPPER   0x20

Definition at line 56 of file utprint.c.

◆ ACPI_FORMAT_ZERO

#define ACPI_FORMAT_ZERO   0x08

Definition at line 54 of file utprint.c.

Function Documentation

◆ AcpiUtBoundStringLength()

static ACPI_SIZE AcpiUtBoundStringLength ( const char String,
ACPI_SIZE  Count 
)
static

Definition at line 105 of file utprint.c.

108{
109 UINT32 Length = 0;
110
111
112 while (*String && Count)
113 {
114 Length++;
115 String++;
116 Count--;
117 }
118
119 return (Length);
120}
unsigned int UINT32
int Count
Definition: noreturn.cpp:7
_In_ ULONG _In_ ULONG _In_ ULONG Length
Definition: ntddpcm.h:102
_Must_inspect_result_ _In_ WDFDEVICE _In_ WDFSTRING String
Definition: wdfdevice.h:2433

Referenced by vsnprintf().

◆ AcpiUtBoundStringOutput()

static char * AcpiUtBoundStringOutput ( char String,
const char End,
char  c 
)
static

Definition at line 138 of file utprint.c.

142{
143
144 if (String < End)
145 {
146 *String = c;
147 }
148
149 ++String;
150 return (String);
151}
#define c
Definition: ke_i.h:80

Referenced by AcpiUtFormatNumber(), and vsnprintf().

◆ AcpiUtFormatNumber()

static char * AcpiUtFormatNumber ( char String,
char End,
UINT64  Number,
UINT8  Base,
INT32  Width,
INT32  Precision,
UINT8  Type 
)
static

Definition at line 290 of file utprint.c.

298{
299 char *Pos;
300 char Sign;
301 char Zero;
302 BOOLEAN NeedPrefix;
303 BOOLEAN Upper;
304 INT32 i;
305 char ReversedString[66];
306
307
308 /* Parameter validation */
309
310 if (Base < 2 || Base > 16)
311 {
312 return (NULL);
313 }
314
316 {
317 Type &= ~ACPI_FORMAT_ZERO;
318 }
319
320 NeedPrefix = ((Type & ACPI_FORMAT_PREFIX) && Base != 10) ? TRUE : FALSE;
321 Upper = (Type & ACPI_FORMAT_UPPER) ? TRUE : FALSE;
322 Zero = (Type & ACPI_FORMAT_ZERO) ? '0' : ' ';
323
324 /* Calculate size according to sign and prefix */
325
326 Sign = '\0';
328 {
329 if ((INT64) Number < 0)
330 {
331 Sign = '-';
332 Number = - (INT64) Number;
333 Width--;
334 }
335 else if (Type & ACPI_FORMAT_SIGN_PLUS)
336 {
337 Sign = '+';
338 Width--;
339 }
341 {
342 Sign = ' ';
343 Width--;
344 }
345 }
346 if (NeedPrefix)
347 {
348 Width--;
349 if (Base == 16)
350 {
351 Width--;
352 }
353 }
354
355 /* Generate full string in reverse order */
356
357 Pos = AcpiUtPutNumber (ReversedString, Number, Base, Upper);
358 i = (INT32) ACPI_PTR_DIFF (Pos, ReversedString);
359
360 /* Printing 100 using %2d gives "100", not "00" */
361
362 if (i > Precision)
363 {
364 Precision = i;
365 }
366
367 Width -= Precision;
368
369 /* Output the string */
370
372 {
373 while (--Width >= 0)
374 {
376 }
377 }
378 if (Sign)
379 {
381 }
382 if (NeedPrefix)
383 {
385 if (Base == 16)
386 {
388 String, End, Upper ? 'X' : 'x');
389 }
390 }
391 if (!(Type & ACPI_FORMAT_LEFT))
392 {
393 while (--Width >= 0)
394 {
396 }
397 }
398
399 while (i <= --Precision)
400 {
402 }
403 while (--i >= 0)
404 {
406 ReversedString[i]);
407 }
408 while (--Width >= 0)
409 {
411 }
412
413 return (String);
414}
signed int INT32
unsigned char BOOLEAN
signed long long INT64
Type
Definition: Type.h:7
#define ACPI_PTR_DIFF(a, b)
Definition: actypes.h:548
ush Pos
Definition: deflate.h:92
#define NULL
Definition: types.h:112
#define TRUE
Definition: types.h:120
#define FALSE
Definition: types.h:117
@ Sign
Definition: msg.c:1064
IN PVCB IN VBO IN ULONG OUT PBCB OUT PVOID IN BOOLEAN IN BOOLEAN Zero
Definition: fatprocs.h:419
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
_In_opt_ ULONG Base
Definition: rtlfuncs.h:2451
_In_opt_ PENTER_STATE_SYSTEM_HANDLER _In_opt_ PVOID _In_ LONG _In_opt_ LONG volatile * Number
Definition: ntpoapi.h:207
_In_ HFONT _Out_ PUINT _Out_ PUINT Width
Definition: font.h:89
#define ACPI_FORMAT_ZERO
Definition: utprint.c:54
#define ACPI_FORMAT_PREFIX
Definition: utprint.c:57
#define ACPI_FORMAT_UPPER
Definition: utprint.c:56
static char * AcpiUtBoundStringOutput(char *String, const char *End, char c)
Definition: utprint.c:138
#define ACPI_FORMAT_SIGN
Definition: utprint.c:51
#define ACPI_FORMAT_LEFT
Definition: utprint.c:55
static char * AcpiUtPutNumber(char *String, UINT64 Number, UINT8 Base, BOOLEAN Upper)
Definition: utprint.c:171
#define ACPI_FORMAT_SIGN_PLUS
Definition: utprint.c:52
#define ACPI_FORMAT_SIGN_PLUS_SPACE
Definition: utprint.c:53

Referenced by vsnprintf().

◆ AcpiUtPrintNumber()

const char * AcpiUtPrintNumber ( char String,
UINT64  Number 
)

Definition at line 249 of file utprint.c.

252{
253 char AsciiString[20];
254 const char *Pos1;
255 char *Pos2;
256
257
258 Pos1 = AcpiUtPutNumber (AsciiString, Number, 10, FALSE);
259 Pos2 = String;
260
261 while (Pos1 != AsciiString)
262 {
263 *(Pos2++) = *(--Pos1);
264 }
265
266 *Pos2 = 0;
267 return (String);
268}

◆ AcpiUtPutNumber()

static char * AcpiUtPutNumber ( char String,
UINT64  Number,
UINT8  Base,
BOOLEAN  Upper 
)
static

Definition at line 171 of file utprint.c.

176{
177 const char *Digits;
178 UINT64 DigitIndex;
179 char *Pos;
180
181
182 Pos = String;
184
185 if (Number == 0)
186 {
187 *(Pos++) = '0';
188 }
189 else
190 {
191 while (Number)
192 {
193 (void) AcpiUtDivide (Number, Base, &Number, &DigitIndex);
194 *(Pos++) = Digits[DigitIndex];
195 }
196 }
197
198 /* *(Pos++) = '0'; */
199 return (Pos);
200}
unsigned long long UINT64
const char AcpiGbl_LowerHexDigits[]
Definition: utglobal.c:92
const char AcpiGbl_UpperHexDigits[]
Definition: utglobal.c:93
ACPI_STATUS AcpiUtDivide(UINT64 InDividend, UINT64 InDivisor, UINT64 *OutQuotient, UINT64 *OutRemainder)
Definition: utmath.c:402

Referenced by AcpiUtFormatNumber(), and AcpiUtPrintNumber().

◆ AcpiUtScanNumber()

const char * AcpiUtScanNumber ( const char String,
UINT64 NumberPtr 
)

Definition at line 217 of file utprint.c.

220{
221 UINT64 Number = 0;
222
223
224 while (isdigit ((int) *String))
225 {
227 Number += *(String++) - '0';
228 }
229
230 *NumberPtr = Number;
231 return (String);
232}
#define isdigit(c)
Definition: acclib.h:68
ACPI_STATUS AcpiUtShortMultiply(UINT64 InMultiplicand, UINT32 Multiplier, UINT64 *Outproduct)
Definition: utmath.c:88

Referenced by vsnprintf().

◆ snprintf()

int snprintf ( char String,
ACPI_SIZE  Size,
const char Format,
  ... 
)

Definition at line 736 of file utprint.c.

741{
743 int Length;
744
745
748 va_end (Args);
749
750 return (Length);
751}
char ** Args
Definition: acdebug.h:353
char * va_list
Definition: acmsvcex.h:78
#define va_end(ap)
Definition: acmsvcex.h:90
#define va_start(ap, A)
Definition: acmsvcex.h:91
#define vsnprintf
Definition: tif_win32.c:406
_Must_inspect_result_ _In_ WDFDEVICE _In_ PWDF_DEVICE_PROPERTY_DATA _In_ DEVPROPTYPE _In_ ULONG Size
Definition: wdfdevice.h:4533

◆ sprintf()

int sprintf ( char String,
const char Format,
  ... 
)

Definition at line 768 of file utprint.c.

772{
774 int Length;
775
776
779 va_end (Args);
780
781 return (Length);
782}
#define ACPI_UINT32_MAX
Definition: actypes.h:66

◆ vsnprintf()

int vsnprintf ( char String,
ACPI_SIZE  Size,
const char Format,
va_list  Args 
)

Definition at line 433 of file utprint.c.

438{
439 UINT8 Base;
440 UINT8 Type;
441 INT32 Width;
442 INT32 Precision;
443 char Qualifier;
445 char *Pos;
446 char *End;
447 char c;
448 const char *s;
449 const void *p;
451 int i;
452
453
454 Pos = String;
455
456
457 if (Size != ACPI_UINT32_MAX) {
458 End = String + Size;
459 } else {
460 End = ACPI_CAST_PTR(char, ACPI_UINT32_MAX);
461 }
462
463 for (; *Format; ++Format)
464 {
465 if (*Format != '%')
466 {
468 continue;
469 }
470
471 Type = 0;
472 Base = 10;
473
474 /* Process sign */
475
476 do
477 {
478 ++Format;
479 if (*Format == '#')
480 {
482 }
483 else if (*Format == '0')
484 {
486 }
487 else if (*Format == '+')
488 {
490 }
491 else if (*Format == ' ')
492 {
494 }
495 else if (*Format == '-')
496 {
498 }
499 else
500 {
501 break;
502 }
503
504 } while (1);
505
506 /* Process width */
507
508 Width = -1;
509 if (isdigit ((int) *Format))
510 {
512 Width = (INT32) Number;
513 }
514 else if (*Format == '*')
515 {
516 ++Format;
517 Width = va_arg (Args, int);
518 if (Width < 0)
519 {
520 Width = -Width;
522 }
523 }
524
525 /* Process precision */
526
527 Precision = -1;
528 if (*Format == '.')
529 {
530 ++Format;
531 if (isdigit ((int) *Format))
532 {
534 Precision = (INT32) Number;
535 }
536 else if (*Format == '*')
537 {
538 ++Format;
539 Precision = va_arg (Args, int);
540 }
541
542 if (Precision < 0)
543 {
544 Precision = 0;
545 }
546 }
547
548 /* Process qualifier */
549
550 Qualifier = -1;
551 if (*Format == 'h' || *Format == 'l' || *Format == 'L')
552 {
553 Qualifier = *Format;
554 ++Format;
555
556 if (Qualifier == 'l' && *Format == 'l')
557 {
558 Qualifier = 'L';
559 ++Format;
560 }
561 }
562
563 switch (*Format)
564 {
565 case '%':
566
567 Pos = AcpiUtBoundStringOutput (Pos, End, '%');
568 continue;
569
570 case 'c':
571
572 if (!(Type & ACPI_FORMAT_LEFT))
573 {
574 while (--Width > 0)
575 {
576 Pos = AcpiUtBoundStringOutput (Pos, End, ' ');
577 }
578 }
579
580 c = (char) va_arg (Args, int);
582
583 while (--Width > 0)
584 {
585 Pos = AcpiUtBoundStringOutput (Pos, End, ' ');
586 }
587 continue;
588
589 case 's':
590
591 s = va_arg (Args, char *);
592 if (!s)
593 {
594 s = "<NULL>";
595 }
596 Length = (INT32) AcpiUtBoundStringLength (s, Precision);
597 if (!(Type & ACPI_FORMAT_LEFT))
598 {
599 while (Length < Width--)
600 {
601 Pos = AcpiUtBoundStringOutput (Pos, End, ' ');
602 }
603 }
604
605 for (i = 0; i < Length; ++i)
606 {
607 Pos = AcpiUtBoundStringOutput (Pos, End, *s);
608 ++s;
609 }
610
611 while (Length < Width--)
612 {
613 Pos = AcpiUtBoundStringOutput (Pos, End, ' ');
614 }
615 continue;
616
617 case 'o':
618
619 Base = 8;
620 break;
621
622 case 'X':
623
626
627 case 'x':
628
629 Base = 16;
630 break;
631
632 case 'd':
633 case 'i':
634
636
637 case 'u':
638
639 break;
640
641 case 'p':
642
643 if (Width == -1)
644 {
645 Width = 2 * sizeof (void *);
647 }
648
649 p = va_arg (Args, void *);
651 Pos, End, ACPI_TO_INTEGER (p), 16, Width, Precision, Type);
652 continue;
653
654 default:
655
656 Pos = AcpiUtBoundStringOutput (Pos, End, '%');
657 if (*Format)
658 {
660 }
661 else
662 {
663 --Format;
664 }
665 continue;
666 }
667
668 if (Qualifier == 'L')
669 {
672 {
673 Number = (INT64) Number;
674 }
675 }
676 else if (Qualifier == 'l')
677 {
678 Number = va_arg (Args, unsigned long);
680 {
681 Number = (INT32) Number;
682 }
683 }
684 else if (Qualifier == 'h')
685 {
686 Number = (UINT16) va_arg (Args, int);
688 {
689 Number = (INT16) Number;
690 }
691 }
692 else
693 {
694 Number = va_arg (Args, unsigned int);
696 {
697 Number = (signed int) Number;
698 }
699 }
700
702 Width, Precision, Type);
703 }
704
705 if (Size > 0)
706 {
707 if (Pos < End)
708 {
709 *Pos = '\0';
710 }
711 else
712 {
713 End[-1] = '\0';
714 }
715 }
716
717 return ((int) ACPI_PTR_DIFF (Pos, String));
718}
unsigned short UINT16
signed short INT16
unsigned char UINT8
#define va_arg(ap, T)
Definition: acmsvcex.h:89
#define ACPI_TO_INTEGER(p)
Definition: actypes.h:554
#define ACPI_CAST_PTR(t, p)
Definition: actypes.h:544
#define ACPI_FALLTHROUGH
Definition: actypes.h:1466
unsigned int(__cdecl typeof(jpeg_read_scanlines))(struct jpeg_decompress_struct *
Definition: typeof.h:31
unsigned char
Definition: typeof.h:29
GLdouble s
Definition: gl.h:2039
const GLubyte * c
Definition: glext.h:8905
GLfloat GLfloat p
Definition: glext.h:8902
static ACPI_SIZE AcpiUtBoundStringLength(const char *String, ACPI_SIZE Count)
Definition: utprint.c:105
static char * AcpiUtFormatNumber(char *String, char *End, UINT64 Number, UINT8 Base, INT32 Width, INT32 Precision, UINT8 Type)
Definition: utprint.c:290
const char * AcpiUtScanNumber(const char *String, UINT64 *NumberPtr)
Definition: utprint.c:217