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