xref: /titanic_50/usr/src/cmd/acpi/common/utprint.c (revision 385cc6b4ad1792caef3f84eb61eed3f27085801f)
1*385cc6b4SJerry Jelinek /******************************************************************************
2*385cc6b4SJerry Jelinek  *
3*385cc6b4SJerry Jelinek  * Module Name: utprint - Formatted printing routines
4*385cc6b4SJerry Jelinek  *
5*385cc6b4SJerry Jelinek  *****************************************************************************/
6*385cc6b4SJerry Jelinek 
7*385cc6b4SJerry Jelinek /*
8*385cc6b4SJerry Jelinek  * Copyright (C) 2000 - 2016, Intel Corp.
9*385cc6b4SJerry Jelinek  * All rights reserved.
10*385cc6b4SJerry Jelinek  *
11*385cc6b4SJerry Jelinek  * Redistribution and use in source and binary forms, with or without
12*385cc6b4SJerry Jelinek  * modification, are permitted provided that the following conditions
13*385cc6b4SJerry Jelinek  * are met:
14*385cc6b4SJerry Jelinek  * 1. Redistributions of source code must retain the above copyright
15*385cc6b4SJerry Jelinek  *    notice, this list of conditions, and the following disclaimer,
16*385cc6b4SJerry Jelinek  *    without modification.
17*385cc6b4SJerry Jelinek  * 2. Redistributions in binary form must reproduce at minimum a disclaimer
18*385cc6b4SJerry Jelinek  *    substantially similar to the "NO WARRANTY" disclaimer below
19*385cc6b4SJerry Jelinek  *    ("Disclaimer") and any redistribution must be conditioned upon
20*385cc6b4SJerry Jelinek  *    including a substantially similar Disclaimer requirement for further
21*385cc6b4SJerry Jelinek  *    binary redistribution.
22*385cc6b4SJerry Jelinek  * 3. Neither the names of the above-listed copyright holders nor the names
23*385cc6b4SJerry Jelinek  *    of any contributors may be used to endorse or promote products derived
24*385cc6b4SJerry Jelinek  *    from this software without specific prior written permission.
25*385cc6b4SJerry Jelinek  *
26*385cc6b4SJerry Jelinek  * Alternatively, this software may be distributed under the terms of the
27*385cc6b4SJerry Jelinek  * GNU General Public License ("GPL") version 2 as published by the Free
28*385cc6b4SJerry Jelinek  * Software Foundation.
29*385cc6b4SJerry Jelinek  *
30*385cc6b4SJerry Jelinek  * NO WARRANTY
31*385cc6b4SJerry Jelinek  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
32*385cc6b4SJerry Jelinek  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
33*385cc6b4SJerry Jelinek  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR
34*385cc6b4SJerry Jelinek  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
35*385cc6b4SJerry Jelinek  * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
36*385cc6b4SJerry Jelinek  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
37*385cc6b4SJerry Jelinek  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
38*385cc6b4SJerry Jelinek  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
39*385cc6b4SJerry Jelinek  * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
40*385cc6b4SJerry Jelinek  * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
41*385cc6b4SJerry Jelinek  * POSSIBILITY OF SUCH DAMAGES.
42*385cc6b4SJerry Jelinek  */
43*385cc6b4SJerry Jelinek 
44*385cc6b4SJerry Jelinek #include "acpi.h"
45*385cc6b4SJerry Jelinek #include "accommon.h"
46*385cc6b4SJerry Jelinek 
47*385cc6b4SJerry Jelinek #define _COMPONENT          ACPI_UTILITIES
48*385cc6b4SJerry Jelinek         ACPI_MODULE_NAME    ("utprint")
49*385cc6b4SJerry Jelinek 
50*385cc6b4SJerry Jelinek 
51*385cc6b4SJerry Jelinek #define ACPI_FORMAT_SIGN            0x01
52*385cc6b4SJerry Jelinek #define ACPI_FORMAT_SIGN_PLUS       0x02
53*385cc6b4SJerry Jelinek #define ACPI_FORMAT_SIGN_PLUS_SPACE 0x04
54*385cc6b4SJerry Jelinek #define ACPI_FORMAT_ZERO            0x08
55*385cc6b4SJerry Jelinek #define ACPI_FORMAT_LEFT            0x10
56*385cc6b4SJerry Jelinek #define ACPI_FORMAT_UPPER           0x20
57*385cc6b4SJerry Jelinek #define ACPI_FORMAT_PREFIX          0x40
58*385cc6b4SJerry Jelinek 
59*385cc6b4SJerry Jelinek 
60*385cc6b4SJerry Jelinek /* Local prototypes */
61*385cc6b4SJerry Jelinek 
62*385cc6b4SJerry Jelinek static ACPI_SIZE
63*385cc6b4SJerry Jelinek AcpiUtBoundStringLength (
64*385cc6b4SJerry Jelinek     const char              *String,
65*385cc6b4SJerry Jelinek     ACPI_SIZE               Count);
66*385cc6b4SJerry Jelinek 
67*385cc6b4SJerry Jelinek static char *
68*385cc6b4SJerry Jelinek AcpiUtBoundStringOutput (
69*385cc6b4SJerry Jelinek     char                    *String,
70*385cc6b4SJerry Jelinek     const char              *End,
71*385cc6b4SJerry Jelinek     char                    c);
72*385cc6b4SJerry Jelinek 
73*385cc6b4SJerry Jelinek static char *
74*385cc6b4SJerry Jelinek AcpiUtFormatNumber (
75*385cc6b4SJerry Jelinek     char                    *String,
76*385cc6b4SJerry Jelinek     char                    *End,
77*385cc6b4SJerry Jelinek     UINT64                  Number,
78*385cc6b4SJerry Jelinek     UINT8                   Base,
79*385cc6b4SJerry Jelinek     INT32                   Width,
80*385cc6b4SJerry Jelinek     INT32                   Precision,
81*385cc6b4SJerry Jelinek     UINT8                   Type);
82*385cc6b4SJerry Jelinek 
83*385cc6b4SJerry Jelinek static char *
84*385cc6b4SJerry Jelinek AcpiUtPutNumber (
85*385cc6b4SJerry Jelinek     char                    *String,
86*385cc6b4SJerry Jelinek     UINT64                  Number,
87*385cc6b4SJerry Jelinek     UINT8                   Base,
88*385cc6b4SJerry Jelinek     BOOLEAN                 Upper);
89*385cc6b4SJerry Jelinek 
90*385cc6b4SJerry Jelinek 
91*385cc6b4SJerry Jelinek /*******************************************************************************
92*385cc6b4SJerry Jelinek  *
93*385cc6b4SJerry Jelinek  * FUNCTION:    AcpiUtBoundStringLength
94*385cc6b4SJerry Jelinek  *
95*385cc6b4SJerry Jelinek  * PARAMETERS:  String              - String with boundary
96*385cc6b4SJerry Jelinek  *              Count               - Boundary of the string
97*385cc6b4SJerry Jelinek  *
98*385cc6b4SJerry Jelinek  * RETURN:      Length of the string. Less than or equal to Count.
99*385cc6b4SJerry Jelinek  *
100*385cc6b4SJerry Jelinek  * DESCRIPTION: Calculate the length of a string with boundary.
101*385cc6b4SJerry Jelinek  *
102*385cc6b4SJerry Jelinek  ******************************************************************************/
103*385cc6b4SJerry Jelinek 
104*385cc6b4SJerry Jelinek static ACPI_SIZE
AcpiUtBoundStringLength(const char * String,ACPI_SIZE Count)105*385cc6b4SJerry Jelinek AcpiUtBoundStringLength (
106*385cc6b4SJerry Jelinek     const char              *String,
107*385cc6b4SJerry Jelinek     ACPI_SIZE               Count)
108*385cc6b4SJerry Jelinek {
109*385cc6b4SJerry Jelinek     UINT32                  Length = 0;
110*385cc6b4SJerry Jelinek 
111*385cc6b4SJerry Jelinek 
112*385cc6b4SJerry Jelinek     while (*String && Count)
113*385cc6b4SJerry Jelinek     {
114*385cc6b4SJerry Jelinek         Length++;
115*385cc6b4SJerry Jelinek         String++;
116*385cc6b4SJerry Jelinek         Count--;
117*385cc6b4SJerry Jelinek     }
118*385cc6b4SJerry Jelinek 
119*385cc6b4SJerry Jelinek     return (Length);
120*385cc6b4SJerry Jelinek }
121*385cc6b4SJerry Jelinek 
122*385cc6b4SJerry Jelinek 
123*385cc6b4SJerry Jelinek /*******************************************************************************
124*385cc6b4SJerry Jelinek  *
125*385cc6b4SJerry Jelinek  * FUNCTION:    AcpiUtBoundStringOutput
126*385cc6b4SJerry Jelinek  *
127*385cc6b4SJerry Jelinek  * PARAMETERS:  String              - String with boundary
128*385cc6b4SJerry Jelinek  *              End                 - Boundary of the string
129*385cc6b4SJerry Jelinek  *              c                   - Character to be output to the string
130*385cc6b4SJerry Jelinek  *
131*385cc6b4SJerry Jelinek  * RETURN:      Updated position for next valid character
132*385cc6b4SJerry Jelinek  *
133*385cc6b4SJerry Jelinek  * DESCRIPTION: Output a character into a string with boundary check.
134*385cc6b4SJerry Jelinek  *
135*385cc6b4SJerry Jelinek  ******************************************************************************/
136*385cc6b4SJerry Jelinek 
137*385cc6b4SJerry Jelinek static char *
AcpiUtBoundStringOutput(char * String,const char * End,char c)138*385cc6b4SJerry Jelinek AcpiUtBoundStringOutput (
139*385cc6b4SJerry Jelinek     char                    *String,
140*385cc6b4SJerry Jelinek     const char              *End,
141*385cc6b4SJerry Jelinek     char                    c)
142*385cc6b4SJerry Jelinek {
143*385cc6b4SJerry Jelinek 
144*385cc6b4SJerry Jelinek     if (String < End)
145*385cc6b4SJerry Jelinek     {
146*385cc6b4SJerry Jelinek         *String = c;
147*385cc6b4SJerry Jelinek     }
148*385cc6b4SJerry Jelinek 
149*385cc6b4SJerry Jelinek     ++String;
150*385cc6b4SJerry Jelinek     return (String);
151*385cc6b4SJerry Jelinek }
152*385cc6b4SJerry Jelinek 
153*385cc6b4SJerry Jelinek 
154*385cc6b4SJerry Jelinek /*******************************************************************************
155*385cc6b4SJerry Jelinek  *
156*385cc6b4SJerry Jelinek  * FUNCTION:    AcpiUtPutNumber
157*385cc6b4SJerry Jelinek  *
158*385cc6b4SJerry Jelinek  * PARAMETERS:  String              - Buffer to hold reverse-ordered string
159*385cc6b4SJerry Jelinek  *              Number              - Integer to be converted
160*385cc6b4SJerry Jelinek  *              Base                - Base of the integer
161*385cc6b4SJerry Jelinek  *              Upper               - Whether or not using upper cased digits
162*385cc6b4SJerry Jelinek  *
163*385cc6b4SJerry Jelinek  * RETURN:      Updated position for next valid character
164*385cc6b4SJerry Jelinek  *
165*385cc6b4SJerry Jelinek  * DESCRIPTION: Convert an integer into a string, note that, the string holds a
166*385cc6b4SJerry Jelinek  *              reversed ordered number without the trailing zero.
167*385cc6b4SJerry Jelinek  *
168*385cc6b4SJerry Jelinek  ******************************************************************************/
169*385cc6b4SJerry Jelinek 
170*385cc6b4SJerry Jelinek static char *
AcpiUtPutNumber(char * String,UINT64 Number,UINT8 Base,BOOLEAN Upper)171*385cc6b4SJerry Jelinek AcpiUtPutNumber (
172*385cc6b4SJerry Jelinek     char                    *String,
173*385cc6b4SJerry Jelinek     UINT64                  Number,
174*385cc6b4SJerry Jelinek     UINT8                   Base,
175*385cc6b4SJerry Jelinek     BOOLEAN                 Upper)
176*385cc6b4SJerry Jelinek {
177*385cc6b4SJerry Jelinek     const char              *Digits;
178*385cc6b4SJerry Jelinek     UINT64                  DigitIndex;
179*385cc6b4SJerry Jelinek     char                    *Pos;
180*385cc6b4SJerry Jelinek 
181*385cc6b4SJerry Jelinek 
182*385cc6b4SJerry Jelinek     Pos = String;
183*385cc6b4SJerry Jelinek     Digits = Upper ? AcpiGbl_UpperHexDigits : AcpiGbl_LowerHexDigits;
184*385cc6b4SJerry Jelinek 
185*385cc6b4SJerry Jelinek     if (Number == 0)
186*385cc6b4SJerry Jelinek     {
187*385cc6b4SJerry Jelinek         *(Pos++) = '0';
188*385cc6b4SJerry Jelinek     }
189*385cc6b4SJerry Jelinek     else
190*385cc6b4SJerry Jelinek     {
191*385cc6b4SJerry Jelinek         while (Number)
192*385cc6b4SJerry Jelinek         {
193*385cc6b4SJerry Jelinek             (void) AcpiUtDivide (Number, Base, &Number, &DigitIndex);
194*385cc6b4SJerry Jelinek             *(Pos++) = Digits[DigitIndex];
195*385cc6b4SJerry Jelinek         }
196*385cc6b4SJerry Jelinek     }
197*385cc6b4SJerry Jelinek 
198*385cc6b4SJerry Jelinek     /* *(Pos++) = '0'; */
199*385cc6b4SJerry Jelinek     return (Pos);
200*385cc6b4SJerry Jelinek }
201*385cc6b4SJerry Jelinek 
202*385cc6b4SJerry Jelinek 
203*385cc6b4SJerry Jelinek /*******************************************************************************
204*385cc6b4SJerry Jelinek  *
205*385cc6b4SJerry Jelinek  * FUNCTION:    AcpiUtScanNumber
206*385cc6b4SJerry Jelinek  *
207*385cc6b4SJerry Jelinek  * PARAMETERS:  String              - String buffer
208*385cc6b4SJerry Jelinek  *              NumberPtr           - Where the number is returned
209*385cc6b4SJerry Jelinek  *
210*385cc6b4SJerry Jelinek  * RETURN:      Updated position for next valid character
211*385cc6b4SJerry Jelinek  *
212*385cc6b4SJerry Jelinek  * DESCRIPTION: Scan a string for a decimal integer.
213*385cc6b4SJerry Jelinek  *
214*385cc6b4SJerry Jelinek  ******************************************************************************/
215*385cc6b4SJerry Jelinek 
216*385cc6b4SJerry Jelinek const char *
AcpiUtScanNumber(const char * String,UINT64 * NumberPtr)217*385cc6b4SJerry Jelinek AcpiUtScanNumber (
218*385cc6b4SJerry Jelinek     const char              *String,
219*385cc6b4SJerry Jelinek     UINT64                  *NumberPtr)
220*385cc6b4SJerry Jelinek {
221*385cc6b4SJerry Jelinek     UINT64                  Number = 0;
222*385cc6b4SJerry Jelinek 
223*385cc6b4SJerry Jelinek 
224*385cc6b4SJerry Jelinek     while (isdigit ((int) *String))
225*385cc6b4SJerry Jelinek     {
226*385cc6b4SJerry Jelinek         Number *= 10;
227*385cc6b4SJerry Jelinek         Number += *(String++) - '0';
228*385cc6b4SJerry Jelinek     }
229*385cc6b4SJerry Jelinek 
230*385cc6b4SJerry Jelinek     *NumberPtr = Number;
231*385cc6b4SJerry Jelinek     return (String);
232*385cc6b4SJerry Jelinek }
233*385cc6b4SJerry Jelinek 
234*385cc6b4SJerry Jelinek 
235*385cc6b4SJerry Jelinek /*******************************************************************************
236*385cc6b4SJerry Jelinek  *
237*385cc6b4SJerry Jelinek  * FUNCTION:    AcpiUtPrintNumber
238*385cc6b4SJerry Jelinek  *
239*385cc6b4SJerry Jelinek  * PARAMETERS:  String              - String buffer
240*385cc6b4SJerry Jelinek  *              Number              - The number to be converted
241*385cc6b4SJerry Jelinek  *
242*385cc6b4SJerry Jelinek  * RETURN:      Updated position for next valid character
243*385cc6b4SJerry Jelinek  *
244*385cc6b4SJerry Jelinek  * DESCRIPTION: Print a decimal integer into a string.
245*385cc6b4SJerry Jelinek  *
246*385cc6b4SJerry Jelinek  ******************************************************************************/
247*385cc6b4SJerry Jelinek 
248*385cc6b4SJerry Jelinek const char *
AcpiUtPrintNumber(char * String,UINT64 Number)249*385cc6b4SJerry Jelinek AcpiUtPrintNumber (
250*385cc6b4SJerry Jelinek     char                    *String,
251*385cc6b4SJerry Jelinek     UINT64                  Number)
252*385cc6b4SJerry Jelinek {
253*385cc6b4SJerry Jelinek     char                    AsciiString[20];
254*385cc6b4SJerry Jelinek     const char              *Pos1;
255*385cc6b4SJerry Jelinek     char                    *Pos2;
256*385cc6b4SJerry Jelinek 
257*385cc6b4SJerry Jelinek 
258*385cc6b4SJerry Jelinek     Pos1 = AcpiUtPutNumber (AsciiString, Number, 10, FALSE);
259*385cc6b4SJerry Jelinek     Pos2 = String;
260*385cc6b4SJerry Jelinek 
261*385cc6b4SJerry Jelinek     while (Pos1 != AsciiString)
262*385cc6b4SJerry Jelinek     {
263*385cc6b4SJerry Jelinek         *(Pos2++) = *(--Pos1);
264*385cc6b4SJerry Jelinek     }
265*385cc6b4SJerry Jelinek 
266*385cc6b4SJerry Jelinek     *Pos2 = 0;
267*385cc6b4SJerry Jelinek     return (String);
268*385cc6b4SJerry Jelinek }
269*385cc6b4SJerry Jelinek 
270*385cc6b4SJerry Jelinek 
271*385cc6b4SJerry Jelinek /*******************************************************************************
272*385cc6b4SJerry Jelinek  *
273*385cc6b4SJerry Jelinek  * FUNCTION:    AcpiUtFormatNumber
274*385cc6b4SJerry Jelinek  *
275*385cc6b4SJerry Jelinek  * PARAMETERS:  String              - String buffer with boundary
276*385cc6b4SJerry Jelinek  *              End                 - Boundary of the string
277*385cc6b4SJerry Jelinek  *              Number              - The number to be converted
278*385cc6b4SJerry Jelinek  *              Base                - Base of the integer
279*385cc6b4SJerry Jelinek  *              Width               - Field width
280*385cc6b4SJerry Jelinek  *              Precision           - Precision of the integer
281*385cc6b4SJerry Jelinek  *              Type                - Special printing flags
282*385cc6b4SJerry Jelinek  *
283*385cc6b4SJerry Jelinek  * RETURN:      Updated position for next valid character
284*385cc6b4SJerry Jelinek  *
285*385cc6b4SJerry Jelinek  * DESCRIPTION: Print an integer into a string with any base and any precision.
286*385cc6b4SJerry Jelinek  *
287*385cc6b4SJerry Jelinek  ******************************************************************************/
288*385cc6b4SJerry Jelinek 
289*385cc6b4SJerry Jelinek static char *
AcpiUtFormatNumber(char * String,char * End,UINT64 Number,UINT8 Base,INT32 Width,INT32 Precision,UINT8 Type)290*385cc6b4SJerry Jelinek AcpiUtFormatNumber (
291*385cc6b4SJerry Jelinek     char                    *String,
292*385cc6b4SJerry Jelinek     char                    *End,
293*385cc6b4SJerry Jelinek     UINT64                  Number,
294*385cc6b4SJerry Jelinek     UINT8                   Base,
295*385cc6b4SJerry Jelinek     INT32                   Width,
296*385cc6b4SJerry Jelinek     INT32                   Precision,
297*385cc6b4SJerry Jelinek     UINT8                   Type)
298*385cc6b4SJerry Jelinek {
299*385cc6b4SJerry Jelinek     char                    *Pos;
300*385cc6b4SJerry Jelinek     char                    Sign;
301*385cc6b4SJerry Jelinek     char                    Zero;
302*385cc6b4SJerry Jelinek     BOOLEAN                 NeedPrefix;
303*385cc6b4SJerry Jelinek     BOOLEAN                 Upper;
304*385cc6b4SJerry Jelinek     INT32                   i;
305*385cc6b4SJerry Jelinek     char                    ReversedString[66];
306*385cc6b4SJerry Jelinek 
307*385cc6b4SJerry Jelinek 
308*385cc6b4SJerry Jelinek     /* Parameter validation */
309*385cc6b4SJerry Jelinek 
310*385cc6b4SJerry Jelinek     if (Base < 2 || Base > 16)
311*385cc6b4SJerry Jelinek     {
312*385cc6b4SJerry Jelinek         return (NULL);
313*385cc6b4SJerry Jelinek     }
314*385cc6b4SJerry Jelinek 
315*385cc6b4SJerry Jelinek     if (Type & ACPI_FORMAT_LEFT)
316*385cc6b4SJerry Jelinek     {
317*385cc6b4SJerry Jelinek         Type &= ~ACPI_FORMAT_ZERO;
318*385cc6b4SJerry Jelinek     }
319*385cc6b4SJerry Jelinek 
320*385cc6b4SJerry Jelinek     NeedPrefix = ((Type & ACPI_FORMAT_PREFIX) && Base != 10) ? TRUE : FALSE;
321*385cc6b4SJerry Jelinek     Upper = (Type & ACPI_FORMAT_UPPER) ? TRUE : FALSE;
322*385cc6b4SJerry Jelinek     Zero = (Type & ACPI_FORMAT_ZERO) ? '0' : ' ';
323*385cc6b4SJerry Jelinek 
324*385cc6b4SJerry Jelinek     /* Calculate size according to sign and prefix */
325*385cc6b4SJerry Jelinek 
326*385cc6b4SJerry Jelinek     Sign = '\0';
327*385cc6b4SJerry Jelinek     if (Type & ACPI_FORMAT_SIGN)
328*385cc6b4SJerry Jelinek     {
329*385cc6b4SJerry Jelinek         if ((INT64) Number < 0)
330*385cc6b4SJerry Jelinek         {
331*385cc6b4SJerry Jelinek             Sign = '-';
332*385cc6b4SJerry Jelinek             Number = - (INT64) Number;
333*385cc6b4SJerry Jelinek             Width--;
334*385cc6b4SJerry Jelinek         }
335*385cc6b4SJerry Jelinek         else if (Type & ACPI_FORMAT_SIGN_PLUS)
336*385cc6b4SJerry Jelinek         {
337*385cc6b4SJerry Jelinek             Sign = '+';
338*385cc6b4SJerry Jelinek             Width--;
339*385cc6b4SJerry Jelinek         }
340*385cc6b4SJerry Jelinek         else if (Type & ACPI_FORMAT_SIGN_PLUS_SPACE)
341*385cc6b4SJerry Jelinek         {
342*385cc6b4SJerry Jelinek             Sign = ' ';
343*385cc6b4SJerry Jelinek             Width--;
344*385cc6b4SJerry Jelinek         }
345*385cc6b4SJerry Jelinek     }
346*385cc6b4SJerry Jelinek     if (NeedPrefix)
347*385cc6b4SJerry Jelinek     {
348*385cc6b4SJerry Jelinek         Width--;
349*385cc6b4SJerry Jelinek         if (Base == 16)
350*385cc6b4SJerry Jelinek         {
351*385cc6b4SJerry Jelinek             Width--;
352*385cc6b4SJerry Jelinek         }
353*385cc6b4SJerry Jelinek     }
354*385cc6b4SJerry Jelinek 
355*385cc6b4SJerry Jelinek     /* Generate full string in reverse order */
356*385cc6b4SJerry Jelinek 
357*385cc6b4SJerry Jelinek     Pos = AcpiUtPutNumber (ReversedString, Number, Base, Upper);
358*385cc6b4SJerry Jelinek     i = ACPI_PTR_DIFF (Pos, ReversedString);
359*385cc6b4SJerry Jelinek 
360*385cc6b4SJerry Jelinek     /* Printing 100 using %2d gives "100", not "00" */
361*385cc6b4SJerry Jelinek 
362*385cc6b4SJerry Jelinek     if (i > Precision)
363*385cc6b4SJerry Jelinek     {
364*385cc6b4SJerry Jelinek         Precision = i;
365*385cc6b4SJerry Jelinek     }
366*385cc6b4SJerry Jelinek 
367*385cc6b4SJerry Jelinek     Width -= Precision;
368*385cc6b4SJerry Jelinek 
369*385cc6b4SJerry Jelinek     /* Output the string */
370*385cc6b4SJerry Jelinek 
371*385cc6b4SJerry Jelinek     if (!(Type & (ACPI_FORMAT_ZERO | ACPI_FORMAT_LEFT)))
372*385cc6b4SJerry Jelinek     {
373*385cc6b4SJerry Jelinek         while (--Width >= 0)
374*385cc6b4SJerry Jelinek         {
375*385cc6b4SJerry Jelinek             String = AcpiUtBoundStringOutput (String, End, ' ');
376*385cc6b4SJerry Jelinek         }
377*385cc6b4SJerry Jelinek     }
378*385cc6b4SJerry Jelinek     if (Sign)
379*385cc6b4SJerry Jelinek     {
380*385cc6b4SJerry Jelinek         String = AcpiUtBoundStringOutput (String, End, Sign);
381*385cc6b4SJerry Jelinek     }
382*385cc6b4SJerry Jelinek     if (NeedPrefix)
383*385cc6b4SJerry Jelinek     {
384*385cc6b4SJerry Jelinek         String = AcpiUtBoundStringOutput (String, End, '0');
385*385cc6b4SJerry Jelinek         if (Base == 16)
386*385cc6b4SJerry Jelinek         {
387*385cc6b4SJerry Jelinek             String = AcpiUtBoundStringOutput (
388*385cc6b4SJerry Jelinek                 String, End, Upper ? 'X' : 'x');
389*385cc6b4SJerry Jelinek         }
390*385cc6b4SJerry Jelinek     }
391*385cc6b4SJerry Jelinek     if (!(Type & ACPI_FORMAT_LEFT))
392*385cc6b4SJerry Jelinek     {
393*385cc6b4SJerry Jelinek         while (--Width >= 0)
394*385cc6b4SJerry Jelinek         {
395*385cc6b4SJerry Jelinek             String = AcpiUtBoundStringOutput (String, End, Zero);
396*385cc6b4SJerry Jelinek         }
397*385cc6b4SJerry Jelinek     }
398*385cc6b4SJerry Jelinek 
399*385cc6b4SJerry Jelinek     while (i <= --Precision)
400*385cc6b4SJerry Jelinek     {
401*385cc6b4SJerry Jelinek         String = AcpiUtBoundStringOutput (String, End, '0');
402*385cc6b4SJerry Jelinek     }
403*385cc6b4SJerry Jelinek     while (--i >= 0)
404*385cc6b4SJerry Jelinek     {
405*385cc6b4SJerry Jelinek         String = AcpiUtBoundStringOutput (String, End,
406*385cc6b4SJerry Jelinek                     ReversedString[i]);
407*385cc6b4SJerry Jelinek     }
408*385cc6b4SJerry Jelinek     while (--Width >= 0)
409*385cc6b4SJerry Jelinek     {
410*385cc6b4SJerry Jelinek         String = AcpiUtBoundStringOutput (String, End, ' ');
411*385cc6b4SJerry Jelinek     }
412*385cc6b4SJerry Jelinek 
413*385cc6b4SJerry Jelinek     return (String);
414*385cc6b4SJerry Jelinek }
415*385cc6b4SJerry Jelinek 
416*385cc6b4SJerry Jelinek 
417*385cc6b4SJerry Jelinek /*******************************************************************************
418*385cc6b4SJerry Jelinek  *
419*385cc6b4SJerry Jelinek  * FUNCTION:    AcpiUtVsnprintf
420*385cc6b4SJerry Jelinek  *
421*385cc6b4SJerry Jelinek  * PARAMETERS:  String              - String with boundary
422*385cc6b4SJerry Jelinek  *              Size                - Boundary of the string
423*385cc6b4SJerry Jelinek  *              Format              - Standard printf format
424*385cc6b4SJerry Jelinek  *              Args                - Argument list
425*385cc6b4SJerry Jelinek  *
426*385cc6b4SJerry Jelinek  * RETURN:      Number of bytes actually written.
427*385cc6b4SJerry Jelinek  *
428*385cc6b4SJerry Jelinek  * DESCRIPTION: Formatted output to a string using argument list pointer.
429*385cc6b4SJerry Jelinek  *
430*385cc6b4SJerry Jelinek  ******************************************************************************/
431*385cc6b4SJerry Jelinek 
432*385cc6b4SJerry Jelinek int
AcpiUtVsnprintf(char * String,ACPI_SIZE Size,const char * Format,va_list Args)433*385cc6b4SJerry Jelinek AcpiUtVsnprintf (
434*385cc6b4SJerry Jelinek     char                    *String,
435*385cc6b4SJerry Jelinek     ACPI_SIZE               Size,
436*385cc6b4SJerry Jelinek     const char              *Format,
437*385cc6b4SJerry Jelinek     va_list                 Args)
438*385cc6b4SJerry Jelinek {
439*385cc6b4SJerry Jelinek     UINT8                   Base;
440*385cc6b4SJerry Jelinek     UINT8                   Type;
441*385cc6b4SJerry Jelinek     INT32                   Width;
442*385cc6b4SJerry Jelinek     INT32                   Precision;
443*385cc6b4SJerry Jelinek     char                    Qualifier;
444*385cc6b4SJerry Jelinek     UINT64                  Number;
445*385cc6b4SJerry Jelinek     char                    *Pos;
446*385cc6b4SJerry Jelinek     char                    *End;
447*385cc6b4SJerry Jelinek     char                    c;
448*385cc6b4SJerry Jelinek     const char              *s;
449*385cc6b4SJerry Jelinek     const void              *p;
450*385cc6b4SJerry Jelinek     INT32                   Length;
451*385cc6b4SJerry Jelinek     int                     i;
452*385cc6b4SJerry Jelinek 
453*385cc6b4SJerry Jelinek 
454*385cc6b4SJerry Jelinek     Pos = String;
455*385cc6b4SJerry Jelinek     End = String + Size;
456*385cc6b4SJerry Jelinek 
457*385cc6b4SJerry Jelinek     for (; *Format; ++Format)
458*385cc6b4SJerry Jelinek     {
459*385cc6b4SJerry Jelinek         if (*Format != '%')
460*385cc6b4SJerry Jelinek         {
461*385cc6b4SJerry Jelinek             Pos = AcpiUtBoundStringOutput (Pos, End, *Format);
462*385cc6b4SJerry Jelinek             continue;
463*385cc6b4SJerry Jelinek         }
464*385cc6b4SJerry Jelinek 
465*385cc6b4SJerry Jelinek         Type = 0;
466*385cc6b4SJerry Jelinek         Base = 10;
467*385cc6b4SJerry Jelinek 
468*385cc6b4SJerry Jelinek         /* Process sign */
469*385cc6b4SJerry Jelinek 
470*385cc6b4SJerry Jelinek         do
471*385cc6b4SJerry Jelinek         {
472*385cc6b4SJerry Jelinek             ++Format;
473*385cc6b4SJerry Jelinek             if (*Format == '#')
474*385cc6b4SJerry Jelinek             {
475*385cc6b4SJerry Jelinek                 Type |= ACPI_FORMAT_PREFIX;
476*385cc6b4SJerry Jelinek             }
477*385cc6b4SJerry Jelinek             else if (*Format == '0')
478*385cc6b4SJerry Jelinek             {
479*385cc6b4SJerry Jelinek                 Type |= ACPI_FORMAT_ZERO;
480*385cc6b4SJerry Jelinek             }
481*385cc6b4SJerry Jelinek             else if (*Format == '+')
482*385cc6b4SJerry Jelinek             {
483*385cc6b4SJerry Jelinek                 Type |= ACPI_FORMAT_SIGN_PLUS;
484*385cc6b4SJerry Jelinek             }
485*385cc6b4SJerry Jelinek             else if (*Format == ' ')
486*385cc6b4SJerry Jelinek             {
487*385cc6b4SJerry Jelinek                 Type |= ACPI_FORMAT_SIGN_PLUS_SPACE;
488*385cc6b4SJerry Jelinek             }
489*385cc6b4SJerry Jelinek             else if (*Format == '-')
490*385cc6b4SJerry Jelinek             {
491*385cc6b4SJerry Jelinek                 Type |= ACPI_FORMAT_LEFT;
492*385cc6b4SJerry Jelinek             }
493*385cc6b4SJerry Jelinek             else
494*385cc6b4SJerry Jelinek             {
495*385cc6b4SJerry Jelinek                 break;
496*385cc6b4SJerry Jelinek             }
497*385cc6b4SJerry Jelinek 
498*385cc6b4SJerry Jelinek         } while (1);
499*385cc6b4SJerry Jelinek 
500*385cc6b4SJerry Jelinek         /* Process width */
501*385cc6b4SJerry Jelinek 
502*385cc6b4SJerry Jelinek         Width = -1;
503*385cc6b4SJerry Jelinek         if (isdigit ((int) *Format))
504*385cc6b4SJerry Jelinek         {
505*385cc6b4SJerry Jelinek             Format = AcpiUtScanNumber (Format, &Number);
506*385cc6b4SJerry Jelinek             Width = (INT32) Number;
507*385cc6b4SJerry Jelinek         }
508*385cc6b4SJerry Jelinek         else if (*Format == '*')
509*385cc6b4SJerry Jelinek         {
510*385cc6b4SJerry Jelinek             ++Format;
511*385cc6b4SJerry Jelinek             Width = va_arg (Args, int);
512*385cc6b4SJerry Jelinek             if (Width < 0)
513*385cc6b4SJerry Jelinek             {
514*385cc6b4SJerry Jelinek                 Width = -Width;
515*385cc6b4SJerry Jelinek                 Type |= ACPI_FORMAT_LEFT;
516*385cc6b4SJerry Jelinek             }
517*385cc6b4SJerry Jelinek         }
518*385cc6b4SJerry Jelinek 
519*385cc6b4SJerry Jelinek         /* Process precision */
520*385cc6b4SJerry Jelinek 
521*385cc6b4SJerry Jelinek         Precision = -1;
522*385cc6b4SJerry Jelinek         if (*Format == '.')
523*385cc6b4SJerry Jelinek         {
524*385cc6b4SJerry Jelinek             ++Format;
525*385cc6b4SJerry Jelinek             if (isdigit ((int) *Format))
526*385cc6b4SJerry Jelinek             {
527*385cc6b4SJerry Jelinek                 Format = AcpiUtScanNumber (Format, &Number);
528*385cc6b4SJerry Jelinek                 Precision = (INT32) Number;
529*385cc6b4SJerry Jelinek             }
530*385cc6b4SJerry Jelinek             else if (*Format == '*')
531*385cc6b4SJerry Jelinek             {
532*385cc6b4SJerry Jelinek                 ++Format;
533*385cc6b4SJerry Jelinek                 Precision = va_arg (Args, int);
534*385cc6b4SJerry Jelinek             }
535*385cc6b4SJerry Jelinek 
536*385cc6b4SJerry Jelinek             if (Precision < 0)
537*385cc6b4SJerry Jelinek             {
538*385cc6b4SJerry Jelinek                 Precision = 0;
539*385cc6b4SJerry Jelinek             }
540*385cc6b4SJerry Jelinek         }
541*385cc6b4SJerry Jelinek 
542*385cc6b4SJerry Jelinek         /* Process qualifier */
543*385cc6b4SJerry Jelinek 
544*385cc6b4SJerry Jelinek         Qualifier = -1;
545*385cc6b4SJerry Jelinek         if (*Format == 'h' || *Format == 'l' || *Format == 'L')
546*385cc6b4SJerry Jelinek         {
547*385cc6b4SJerry Jelinek             Qualifier = *Format;
548*385cc6b4SJerry Jelinek             ++Format;
549*385cc6b4SJerry Jelinek 
550*385cc6b4SJerry Jelinek             if (Qualifier == 'l' && *Format == 'l')
551*385cc6b4SJerry Jelinek             {
552*385cc6b4SJerry Jelinek                 Qualifier = 'L';
553*385cc6b4SJerry Jelinek                 ++Format;
554*385cc6b4SJerry Jelinek             }
555*385cc6b4SJerry Jelinek         }
556*385cc6b4SJerry Jelinek 
557*385cc6b4SJerry Jelinek         switch (*Format)
558*385cc6b4SJerry Jelinek         {
559*385cc6b4SJerry Jelinek         case '%':
560*385cc6b4SJerry Jelinek 
561*385cc6b4SJerry Jelinek             Pos = AcpiUtBoundStringOutput (Pos, End, '%');
562*385cc6b4SJerry Jelinek             continue;
563*385cc6b4SJerry Jelinek 
564*385cc6b4SJerry Jelinek         case 'c':
565*385cc6b4SJerry Jelinek 
566*385cc6b4SJerry Jelinek             if (!(Type & ACPI_FORMAT_LEFT))
567*385cc6b4SJerry Jelinek             {
568*385cc6b4SJerry Jelinek                 while (--Width > 0)
569*385cc6b4SJerry Jelinek                 {
570*385cc6b4SJerry Jelinek                     Pos = AcpiUtBoundStringOutput (Pos, End, ' ');
571*385cc6b4SJerry Jelinek                 }
572*385cc6b4SJerry Jelinek             }
573*385cc6b4SJerry Jelinek 
574*385cc6b4SJerry Jelinek             c = (char) va_arg (Args, int);
575*385cc6b4SJerry Jelinek             Pos = AcpiUtBoundStringOutput (Pos, End, c);
576*385cc6b4SJerry Jelinek 
577*385cc6b4SJerry Jelinek             while (--Width > 0)
578*385cc6b4SJerry Jelinek             {
579*385cc6b4SJerry Jelinek                 Pos = AcpiUtBoundStringOutput (Pos, End, ' ');
580*385cc6b4SJerry Jelinek             }
581*385cc6b4SJerry Jelinek             continue;
582*385cc6b4SJerry Jelinek 
583*385cc6b4SJerry Jelinek         case 's':
584*385cc6b4SJerry Jelinek 
585*385cc6b4SJerry Jelinek             s = va_arg (Args, char *);
586*385cc6b4SJerry Jelinek             if (!s)
587*385cc6b4SJerry Jelinek             {
588*385cc6b4SJerry Jelinek                 s = "<NULL>";
589*385cc6b4SJerry Jelinek             }
590*385cc6b4SJerry Jelinek             Length = AcpiUtBoundStringLength (s, Precision);
591*385cc6b4SJerry Jelinek             if (!(Type & ACPI_FORMAT_LEFT))
592*385cc6b4SJerry Jelinek             {
593*385cc6b4SJerry Jelinek                 while (Length < Width--)
594*385cc6b4SJerry Jelinek                 {
595*385cc6b4SJerry Jelinek                     Pos = AcpiUtBoundStringOutput (Pos, End, ' ');
596*385cc6b4SJerry Jelinek                 }
597*385cc6b4SJerry Jelinek             }
598*385cc6b4SJerry Jelinek 
599*385cc6b4SJerry Jelinek             for (i = 0; i < Length; ++i)
600*385cc6b4SJerry Jelinek             {
601*385cc6b4SJerry Jelinek                 Pos = AcpiUtBoundStringOutput (Pos, End, *s);
602*385cc6b4SJerry Jelinek                 ++s;
603*385cc6b4SJerry Jelinek             }
604*385cc6b4SJerry Jelinek 
605*385cc6b4SJerry Jelinek             while (Length < Width--)
606*385cc6b4SJerry Jelinek             {
607*385cc6b4SJerry Jelinek                 Pos = AcpiUtBoundStringOutput (Pos, End, ' ');
608*385cc6b4SJerry Jelinek             }
609*385cc6b4SJerry Jelinek             continue;
610*385cc6b4SJerry Jelinek 
611*385cc6b4SJerry Jelinek         case 'o':
612*385cc6b4SJerry Jelinek 
613*385cc6b4SJerry Jelinek             Base = 8;
614*385cc6b4SJerry Jelinek             break;
615*385cc6b4SJerry Jelinek 
616*385cc6b4SJerry Jelinek         case 'X':
617*385cc6b4SJerry Jelinek 
618*385cc6b4SJerry Jelinek             Type |= ACPI_FORMAT_UPPER;
619*385cc6b4SJerry Jelinek 
620*385cc6b4SJerry Jelinek         case 'x':
621*385cc6b4SJerry Jelinek 
622*385cc6b4SJerry Jelinek             Base = 16;
623*385cc6b4SJerry Jelinek             break;
624*385cc6b4SJerry Jelinek 
625*385cc6b4SJerry Jelinek         case 'd':
626*385cc6b4SJerry Jelinek         case 'i':
627*385cc6b4SJerry Jelinek 
628*385cc6b4SJerry Jelinek             Type |= ACPI_FORMAT_SIGN;
629*385cc6b4SJerry Jelinek 
630*385cc6b4SJerry Jelinek         case 'u':
631*385cc6b4SJerry Jelinek 
632*385cc6b4SJerry Jelinek             break;
633*385cc6b4SJerry Jelinek 
634*385cc6b4SJerry Jelinek         case 'p':
635*385cc6b4SJerry Jelinek 
636*385cc6b4SJerry Jelinek             if (Width == -1)
637*385cc6b4SJerry Jelinek             {
638*385cc6b4SJerry Jelinek                 Width = 2 * sizeof (void *);
639*385cc6b4SJerry Jelinek                 Type |= ACPI_FORMAT_ZERO;
640*385cc6b4SJerry Jelinek             }
641*385cc6b4SJerry Jelinek 
642*385cc6b4SJerry Jelinek             p = va_arg (Args, void *);
643*385cc6b4SJerry Jelinek             Pos = AcpiUtFormatNumber (
644*385cc6b4SJerry Jelinek                 Pos, End, ACPI_TO_INTEGER (p), 16, Width, Precision, Type);
645*385cc6b4SJerry Jelinek             continue;
646*385cc6b4SJerry Jelinek 
647*385cc6b4SJerry Jelinek         default:
648*385cc6b4SJerry Jelinek 
649*385cc6b4SJerry Jelinek             Pos = AcpiUtBoundStringOutput (Pos, End, '%');
650*385cc6b4SJerry Jelinek             if (*Format)
651*385cc6b4SJerry Jelinek             {
652*385cc6b4SJerry Jelinek                 Pos = AcpiUtBoundStringOutput (Pos, End, *Format);
653*385cc6b4SJerry Jelinek             }
654*385cc6b4SJerry Jelinek             else
655*385cc6b4SJerry Jelinek             {
656*385cc6b4SJerry Jelinek                 --Format;
657*385cc6b4SJerry Jelinek             }
658*385cc6b4SJerry Jelinek             continue;
659*385cc6b4SJerry Jelinek         }
660*385cc6b4SJerry Jelinek 
661*385cc6b4SJerry Jelinek         if (Qualifier == 'L')
662*385cc6b4SJerry Jelinek         {
663*385cc6b4SJerry Jelinek             Number = va_arg (Args, UINT64);
664*385cc6b4SJerry Jelinek             if (Type & ACPI_FORMAT_SIGN)
665*385cc6b4SJerry Jelinek             {
666*385cc6b4SJerry Jelinek                 Number = (INT64) Number;
667*385cc6b4SJerry Jelinek             }
668*385cc6b4SJerry Jelinek         }
669*385cc6b4SJerry Jelinek         else if (Qualifier == 'l')
670*385cc6b4SJerry Jelinek         {
671*385cc6b4SJerry Jelinek             Number = va_arg (Args, unsigned long);
672*385cc6b4SJerry Jelinek             if (Type & ACPI_FORMAT_SIGN)
673*385cc6b4SJerry Jelinek             {
674*385cc6b4SJerry Jelinek                 Number = (INT32) Number;
675*385cc6b4SJerry Jelinek             }
676*385cc6b4SJerry Jelinek         }
677*385cc6b4SJerry Jelinek         else if (Qualifier == 'h')
678*385cc6b4SJerry Jelinek         {
679*385cc6b4SJerry Jelinek             Number = (UINT16) va_arg (Args, int);
680*385cc6b4SJerry Jelinek             if (Type & ACPI_FORMAT_SIGN)
681*385cc6b4SJerry Jelinek             {
682*385cc6b4SJerry Jelinek                 Number = (INT16) Number;
683*385cc6b4SJerry Jelinek             }
684*385cc6b4SJerry Jelinek         }
685*385cc6b4SJerry Jelinek         else
686*385cc6b4SJerry Jelinek         {
687*385cc6b4SJerry Jelinek             Number = va_arg (Args, unsigned int);
688*385cc6b4SJerry Jelinek             if (Type & ACPI_FORMAT_SIGN)
689*385cc6b4SJerry Jelinek             {
690*385cc6b4SJerry Jelinek                 Number = (signed int) Number;
691*385cc6b4SJerry Jelinek             }
692*385cc6b4SJerry Jelinek         }
693*385cc6b4SJerry Jelinek 
694*385cc6b4SJerry Jelinek         Pos = AcpiUtFormatNumber (Pos, End, Number, Base,
695*385cc6b4SJerry Jelinek             Width, Precision, Type);
696*385cc6b4SJerry Jelinek     }
697*385cc6b4SJerry Jelinek 
698*385cc6b4SJerry Jelinek     if (Size > 0)
699*385cc6b4SJerry Jelinek     {
700*385cc6b4SJerry Jelinek         if (Pos < End)
701*385cc6b4SJerry Jelinek         {
702*385cc6b4SJerry Jelinek             *Pos = '\0';
703*385cc6b4SJerry Jelinek         }
704*385cc6b4SJerry Jelinek         else
705*385cc6b4SJerry Jelinek         {
706*385cc6b4SJerry Jelinek             End[-1] = '\0';
707*385cc6b4SJerry Jelinek         }
708*385cc6b4SJerry Jelinek     }
709*385cc6b4SJerry Jelinek 
710*385cc6b4SJerry Jelinek     return (ACPI_PTR_DIFF (Pos, String));
711*385cc6b4SJerry Jelinek }
712*385cc6b4SJerry Jelinek 
713*385cc6b4SJerry Jelinek 
714*385cc6b4SJerry Jelinek /*******************************************************************************
715*385cc6b4SJerry Jelinek  *
716*385cc6b4SJerry Jelinek  * FUNCTION:    AcpiUtSnprintf
717*385cc6b4SJerry Jelinek  *
718*385cc6b4SJerry Jelinek  * PARAMETERS:  String              - String with boundary
719*385cc6b4SJerry Jelinek  *              Size                - Boundary of the string
720*385cc6b4SJerry Jelinek  *              Format, ...         - Standard printf format
721*385cc6b4SJerry Jelinek  *
722*385cc6b4SJerry Jelinek  * RETURN:      Number of bytes actually written.
723*385cc6b4SJerry Jelinek  *
724*385cc6b4SJerry Jelinek  * DESCRIPTION: Formatted output to a string.
725*385cc6b4SJerry Jelinek  *
726*385cc6b4SJerry Jelinek  ******************************************************************************/
727*385cc6b4SJerry Jelinek 
728*385cc6b4SJerry Jelinek int
AcpiUtSnprintf(char * String,ACPI_SIZE Size,const char * Format,...)729*385cc6b4SJerry Jelinek AcpiUtSnprintf (
730*385cc6b4SJerry Jelinek     char                    *String,
731*385cc6b4SJerry Jelinek     ACPI_SIZE               Size,
732*385cc6b4SJerry Jelinek     const char              *Format,
733*385cc6b4SJerry Jelinek     ...)
734*385cc6b4SJerry Jelinek {
735*385cc6b4SJerry Jelinek     va_list                 Args;
736*385cc6b4SJerry Jelinek     int                     Length;
737*385cc6b4SJerry Jelinek 
738*385cc6b4SJerry Jelinek 
739*385cc6b4SJerry Jelinek     va_start (Args, Format);
740*385cc6b4SJerry Jelinek     Length = AcpiUtVsnprintf (String, Size, Format, Args);
741*385cc6b4SJerry Jelinek     va_end (Args);
742*385cc6b4SJerry Jelinek 
743*385cc6b4SJerry Jelinek     return (Length);
744*385cc6b4SJerry Jelinek }
745*385cc6b4SJerry Jelinek 
746*385cc6b4SJerry Jelinek 
747*385cc6b4SJerry Jelinek #ifdef ACPI_APPLICATION
748*385cc6b4SJerry Jelinek /*******************************************************************************
749*385cc6b4SJerry Jelinek  *
750*385cc6b4SJerry Jelinek  * FUNCTION:    AcpiUtFileVprintf
751*385cc6b4SJerry Jelinek  *
752*385cc6b4SJerry Jelinek  * PARAMETERS:  File                - File descriptor
753*385cc6b4SJerry Jelinek  *              Format              - Standard printf format
754*385cc6b4SJerry Jelinek  *              Args                - Argument list
755*385cc6b4SJerry Jelinek  *
756*385cc6b4SJerry Jelinek  * RETURN:      Number of bytes actually written.
757*385cc6b4SJerry Jelinek  *
758*385cc6b4SJerry Jelinek  * DESCRIPTION: Formatted output to a file using argument list pointer.
759*385cc6b4SJerry Jelinek  *
760*385cc6b4SJerry Jelinek  ******************************************************************************/
761*385cc6b4SJerry Jelinek 
762*385cc6b4SJerry Jelinek int
AcpiUtFileVprintf(ACPI_FILE File,const char * Format,va_list Args)763*385cc6b4SJerry Jelinek AcpiUtFileVprintf (
764*385cc6b4SJerry Jelinek     ACPI_FILE               File,
765*385cc6b4SJerry Jelinek     const char              *Format,
766*385cc6b4SJerry Jelinek     va_list                 Args)
767*385cc6b4SJerry Jelinek {
768*385cc6b4SJerry Jelinek     ACPI_CPU_FLAGS          Flags;
769*385cc6b4SJerry Jelinek     int                     Length;
770*385cc6b4SJerry Jelinek 
771*385cc6b4SJerry Jelinek 
772*385cc6b4SJerry Jelinek     Flags = AcpiOsAcquireLock (AcpiGbl_PrintLock);
773*385cc6b4SJerry Jelinek     Length = AcpiUtVsnprintf (AcpiGbl_PrintBuffer,
774*385cc6b4SJerry Jelinek         sizeof (AcpiGbl_PrintBuffer), Format, Args);
775*385cc6b4SJerry Jelinek 
776*385cc6b4SJerry Jelinek     (void) AcpiOsWriteFile (File, AcpiGbl_PrintBuffer, Length, 1);
777*385cc6b4SJerry Jelinek     AcpiOsReleaseLock (AcpiGbl_PrintLock, Flags);
778*385cc6b4SJerry Jelinek 
779*385cc6b4SJerry Jelinek     return (Length);
780*385cc6b4SJerry Jelinek }
781*385cc6b4SJerry Jelinek 
782*385cc6b4SJerry Jelinek 
783*385cc6b4SJerry Jelinek /*******************************************************************************
784*385cc6b4SJerry Jelinek  *
785*385cc6b4SJerry Jelinek  * FUNCTION:    AcpiUtFilePrintf
786*385cc6b4SJerry Jelinek  *
787*385cc6b4SJerry Jelinek  * PARAMETERS:  File                - File descriptor
788*385cc6b4SJerry Jelinek  *              Format, ...         - Standard printf format
789*385cc6b4SJerry Jelinek  *
790*385cc6b4SJerry Jelinek  * RETURN:      Number of bytes actually written.
791*385cc6b4SJerry Jelinek  *
792*385cc6b4SJerry Jelinek  * DESCRIPTION: Formatted output to a file.
793*385cc6b4SJerry Jelinek  *
794*385cc6b4SJerry Jelinek  ******************************************************************************/
795*385cc6b4SJerry Jelinek 
796*385cc6b4SJerry Jelinek int
AcpiUtFilePrintf(ACPI_FILE File,const char * Format,...)797*385cc6b4SJerry Jelinek AcpiUtFilePrintf (
798*385cc6b4SJerry Jelinek     ACPI_FILE               File,
799*385cc6b4SJerry Jelinek     const char              *Format,
800*385cc6b4SJerry Jelinek     ...)
801*385cc6b4SJerry Jelinek {
802*385cc6b4SJerry Jelinek     va_list                 Args;
803*385cc6b4SJerry Jelinek     int                     Length;
804*385cc6b4SJerry Jelinek 
805*385cc6b4SJerry Jelinek 
806*385cc6b4SJerry Jelinek     va_start (Args, Format);
807*385cc6b4SJerry Jelinek     Length = AcpiUtFileVprintf (File, Format, Args);
808*385cc6b4SJerry Jelinek     va_end (Args);
809*385cc6b4SJerry Jelinek 
810*385cc6b4SJerry Jelinek     return (Length);
811*385cc6b4SJerry Jelinek }
812*385cc6b4SJerry Jelinek #endif
813