utclib.c revision 9980:13d7f3eec672
1/******************************************************************************
2 *
3 * Module Name: cmclib - Local implementation of C library functions
4 *
5 *****************************************************************************/
6
7/******************************************************************************
8 *
9 * 1. Copyright Notice
10 *
11 * Some or all of this work - Copyright (c) 1999 - 2009, Intel Corp.
12 * All rights reserved.
13 *
14 * 2. License
15 *
16 * 2.1. This is your license from Intel Corp. under its intellectual property
17 * rights.  You may have additional license terms from the party that provided
18 * you this software, covering your right to use that party's intellectual
19 * property rights.
20 *
21 * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a
22 * copy of the source code appearing in this file ("Covered Code") an
23 * irrevocable, perpetual, worldwide license under Intel's copyrights in the
24 * base code distributed originally by Intel ("Original Intel Code") to copy,
25 * make derivatives, distribute, use and display any portion of the Covered
26 * Code in any form, with the right to sublicense such rights; and
27 *
28 * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent
29 * license (with the right to sublicense), under only those claims of Intel
30 * patents that are infringed by the Original Intel Code, to make, use, sell,
31 * offer to sell, and import the Covered Code and derivative works thereof
32 * solely to the minimum extent necessary to exercise the above copyright
33 * license, and in no event shall the patent license extend to any additions
34 * to or modifications of the Original Intel Code.  No other license or right
35 * is granted directly or by implication, estoppel or otherwise;
36 *
37 * The above copyright and patent license is granted only if the following
38 * conditions are met:
39 *
40 * 3. Conditions
41 *
42 * 3.1. Redistribution of Source with Rights to Further Distribute Source.
43 * Redistribution of source code of any substantial portion of the Covered
44 * Code or modification with rights to further distribute source must include
45 * the above Copyright Notice, the above License, this list of Conditions,
46 * and the following Disclaimer and Export Compliance provision.  In addition,
47 * Licensee must cause all Covered Code to which Licensee contributes to
48 * contain a file documenting the changes Licensee made to create that Covered
49 * Code and the date of any change.  Licensee must include in that file the
50 * documentation of any changes made by any predecessor Licensee.  Licensee
51 * must include a prominent statement that the modification is derived,
52 * directly or indirectly, from Original Intel Code.
53 *
54 * 3.2. Redistribution of Source with no Rights to Further Distribute Source.
55 * Redistribution of source code of any substantial portion of the Covered
56 * Code or modification without rights to further distribute source must
57 * include the following Disclaimer and Export Compliance provision in the
58 * documentation and/or other materials provided with distribution.  In
59 * addition, Licensee may not authorize further sublicense of source of any
60 * portion of the Covered Code, and must include terms to the effect that the
61 * license from Licensee to its licensee is limited to the intellectual
62 * property embodied in the software Licensee provides to its licensee, and
63 * not to intellectual property embodied in modifications its licensee may
64 * make.
65 *
66 * 3.3. Redistribution of Executable. Redistribution in executable form of any
67 * substantial portion of the Covered Code or modification must reproduce the
68 * above Copyright Notice, and the following Disclaimer and Export Compliance
69 * provision in the documentation and/or other materials provided with the
70 * distribution.
71 *
72 * 3.4. Intel retains all right, title, and interest in and to the Original
73 * Intel Code.
74 *
75 * 3.5. Neither the name Intel nor any other trademark owned or controlled by
76 * Intel shall be used in advertising or otherwise to promote the sale, use or
77 * other dealings in products derived from or relating to the Covered Code
78 * without prior written authorization from Intel.
79 *
80 * 4. Disclaimer and Export Compliance
81 *
82 * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED
83 * HERE.  ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE
84 * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT,  ASSISTANCE,
85 * INSTALLATION, TRAINING OR OTHER SERVICES.  INTEL WILL NOT PROVIDE ANY
86 * UPDATES, ENHANCEMENTS OR EXTENSIONS.  INTEL SPECIFICALLY DISCLAIMS ANY
87 * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A
88 * PARTICULAR PURPOSE.
89 *
90 * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES
91 * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR
92 * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT,
93 * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY
94 * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL
95 * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES.  THESE LIMITATIONS
96 * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY
97 * LIMITED REMEDY.
98 *
99 * 4.3. Licensee shall not export, either directly or indirectly, any of this
100 * software or system incorporating such software without first obtaining any
101 * required license or other approval from the U. S. Department of Commerce or
102 * any other agency or department of the United States Government.  In the
103 * event Licensee exports any such software from the United States or
104 * re-exports any such software from a foreign destination, Licensee shall
105 * ensure that the distribution and export/re-export of the software is in
106 * compliance with all laws, regulations, orders, or other restrictions of the
107 * U.S. Export Administration Regulations. Licensee agrees that neither it nor
108 * any of its subsidiaries will export/re-export any technical data, process,
109 * software, or service, directly or indirectly, to any country for which the
110 * United States government or any agency thereof requires an export license,
111 * other governmental approval, or letter of assurance, without first obtaining
112 * such license, approval or letter.
113 *
114 *****************************************************************************/
115
116
117#define __CMCLIB_C__
118
119#include "acpi.h"
120#include "accommon.h"
121
122/*
123 * These implementations of standard C Library routines can optionally be
124 * used if a C library is not available.  In general, they are less efficient
125 * than an inline or assembly implementation
126 */
127
128#define _COMPONENT          ACPI_UTILITIES
129        ACPI_MODULE_NAME    ("cmclib")
130
131
132#ifndef ACPI_USE_SYSTEM_CLIBRARY
133
134#define NEGATIVE    1
135#define POSITIVE    0
136
137
138/*******************************************************************************
139 *
140 * FUNCTION:    AcpiUtMemcmp (memcmp)
141 *
142 * PARAMETERS:  Buffer1         - First Buffer
143 *              Buffer2         - Second Buffer
144 *              Count           - Maximum # of bytes to compare
145 *
146 * RETURN:      Index where Buffers mismatched, or 0 if Buffers matched
147 *
148 * DESCRIPTION: Compare two Buffers, with a maximum length
149 *
150 ******************************************************************************/
151
152int
153AcpiUtMemcmp (
154    const char              *Buffer1,
155    const char              *Buffer2,
156    ACPI_SIZE               Count)
157{
158
159    for ( ; Count-- && (*Buffer1 == *Buffer2); Buffer1++, Buffer2++)
160    {
161    }
162
163    return ((Count == ACPI_SIZE_MAX) ? 0 : ((unsigned char) *Buffer1 -
164        (unsigned char) *Buffer2));
165}
166
167
168/*******************************************************************************
169 *
170 * FUNCTION:    AcpiUtMemcpy (memcpy)
171 *
172 * PARAMETERS:  Dest        - Target of the copy
173 *              Src         - Source buffer to copy
174 *              Count       - Number of bytes to copy
175 *
176 * RETURN:      Dest
177 *
178 * DESCRIPTION: Copy arbitrary bytes of memory
179 *
180 ******************************************************************************/
181
182void *
183AcpiUtMemcpy (
184    void                    *Dest,
185    const void              *Src,
186    ACPI_SIZE               Count)
187{
188    char                    *New = (char *) Dest;
189    char                    *Old = (char *) Src;
190
191
192    while (Count)
193    {
194        *New = *Old;
195        New++;
196        Old++;
197        Count--;
198    }
199
200    return (Dest);
201}
202
203
204/*******************************************************************************
205 *
206 * FUNCTION:    AcpiUtMemset (memset)
207 *
208 * PARAMETERS:  Dest        - Buffer to set
209 *              Value       - Value to set each byte of memory
210 *              Count       - Number of bytes to set
211 *
212 * RETURN:      Dest
213 *
214 * DESCRIPTION: Initialize a buffer to a known value.
215 *
216 ******************************************************************************/
217
218void *
219AcpiUtMemset (
220    void                    *Dest,
221    UINT8                   Value,
222    ACPI_SIZE               Count)
223{
224    char                    *New = (char *) Dest;
225
226
227    while (Count)
228    {
229        *New = (char) Value;
230        New++;
231        Count--;
232    }
233
234    return (Dest);
235}
236
237
238/*******************************************************************************
239 *
240 * FUNCTION:    AcpiUtStrlen (strlen)
241 *
242 * PARAMETERS:  String              - Null terminated string
243 *
244 * RETURN:      Length
245 *
246 * DESCRIPTION: Returns the length of the input string
247 *
248 ******************************************************************************/
249
250
251ACPI_SIZE
252AcpiUtStrlen (
253    const char              *String)
254{
255    UINT32                  Length = 0;
256
257
258    /* Count the string until a null is encountered */
259
260    while (*String)
261    {
262        Length++;
263        String++;
264    }
265
266    return (Length);
267}
268
269
270/*******************************************************************************
271 *
272 * FUNCTION:    AcpiUtStrcpy (strcpy)
273 *
274 * PARAMETERS:  DstString       - Target of the copy
275 *              SrcString       - The source string to copy
276 *
277 * RETURN:      DstString
278 *
279 * DESCRIPTION: Copy a null terminated string
280 *
281 ******************************************************************************/
282
283char *
284AcpiUtStrcpy (
285    char                    *DstString,
286    const char              *SrcString)
287{
288    char                    *String = DstString;
289
290
291    /* Move bytes brute force */
292
293    while (*SrcString)
294    {
295        *String = *SrcString;
296
297        String++;
298        SrcString++;
299    }
300
301    /* Null terminate */
302
303    *String = 0;
304    return (DstString);
305}
306
307
308/*******************************************************************************
309 *
310 * FUNCTION:    AcpiUtStrncpy (strncpy)
311 *
312 * PARAMETERS:  DstString       - Target of the copy
313 *              SrcString       - The source string to copy
314 *              Count           - Maximum # of bytes to copy
315 *
316 * RETURN:      DstString
317 *
318 * DESCRIPTION: Copy a null terminated string, with a maximum length
319 *
320 ******************************************************************************/
321
322char *
323AcpiUtStrncpy (
324    char                    *DstString,
325    const char              *SrcString,
326    ACPI_SIZE               Count)
327{
328    char                    *String = DstString;
329
330
331    /* Copy the string */
332
333    for (String = DstString;
334        Count && (Count--, (*String++ = *SrcString++)); )
335    {;}
336
337    /* Pad with nulls if necessary */
338
339    while (Count--)
340    {
341        *String = 0;
342        String++;
343    }
344
345    /* Return original pointer */
346
347    return (DstString);
348}
349
350
351/*******************************************************************************
352 *
353 * FUNCTION:    AcpiUtStrcmp (strcmp)
354 *
355 * PARAMETERS:  String1         - First string
356 *              String2         - Second string
357 *
358 * RETURN:      Index where strings mismatched, or 0 if strings matched
359 *
360 * DESCRIPTION: Compare two null terminated strings
361 *
362 ******************************************************************************/
363
364int
365AcpiUtStrcmp (
366    const char              *String1,
367    const char              *String2)
368{
369
370
371    for ( ; (*String1 == *String2); String2++)
372    {
373        if (!*String1++)
374        {
375            return (0);
376        }
377    }
378
379    return ((unsigned char) *String1 - (unsigned char) *String2);
380}
381
382
383#ifdef ACPI_FUTURE_IMPLEMENTATION
384/* Not used at this time */
385/*******************************************************************************
386 *
387 * FUNCTION:    AcpiUtStrchr (strchr)
388 *
389 * PARAMETERS:  String          - Search string
390 *              ch              - character to search for
391 *
392 * RETURN:      Ptr to char or NULL if not found
393 *
394 * DESCRIPTION: Search a string for a character
395 *
396 ******************************************************************************/
397
398char *
399AcpiUtStrchr (
400    const char              *String,
401    int                     ch)
402{
403
404
405    for ( ; (*String); String++)
406    {
407        if ((*String) == (char) ch)
408        {
409            return ((char *) String);
410        }
411    }
412
413    return (NULL);
414}
415#endif
416
417/*******************************************************************************
418 *
419 * FUNCTION:    AcpiUtStrncmp (strncmp)
420 *
421 * PARAMETERS:  String1         - First string
422 *              String2         - Second string
423 *              Count           - Maximum # of bytes to compare
424 *
425 * RETURN:      Index where strings mismatched, or 0 if strings matched
426 *
427 * DESCRIPTION: Compare two null terminated strings, with a maximum length
428 *
429 ******************************************************************************/
430
431int
432AcpiUtStrncmp (
433    const char              *String1,
434    const char              *String2,
435    ACPI_SIZE               Count)
436{
437
438
439    for ( ; Count-- && (*String1 == *String2); String2++)
440    {
441        if (!*String1++)
442        {
443            return (0);
444        }
445    }
446
447    return ((Count == ACPI_SIZE_MAX) ? 0 : ((unsigned char) *String1 -
448        (unsigned char) *String2));
449}
450
451
452/*******************************************************************************
453 *
454 * FUNCTION:    AcpiUtStrcat (Strcat)
455 *
456 * PARAMETERS:  DstString       - Target of the copy
457 *              SrcString       - The source string to copy
458 *
459 * RETURN:      DstString
460 *
461 * DESCRIPTION: Append a null terminated string to a null terminated string
462 *
463 ******************************************************************************/
464
465char *
466AcpiUtStrcat (
467    char                    *DstString,
468    const char              *SrcString)
469{
470    char                    *String;
471
472
473    /* Find end of the destination string */
474
475    for (String = DstString; *String++; )
476    { ; }
477
478    /* Concatenate the string */
479
480    for (--String; (*String++ = *SrcString++); )
481    { ; }
482
483    return (DstString);
484}
485
486
487/*******************************************************************************
488 *
489 * FUNCTION:    AcpiUtStrncat (strncat)
490 *
491 * PARAMETERS:  DstString       - Target of the copy
492 *              SrcString       - The source string to copy
493 *              Count           - Maximum # of bytes to copy
494 *
495 * RETURN:      DstString
496 *
497 * DESCRIPTION: Append a null terminated string to a null terminated string,
498 *              with a maximum count.
499 *
500 ******************************************************************************/
501
502char *
503AcpiUtStrncat (
504    char                    *DstString,
505    const char              *SrcString,
506    ACPI_SIZE               Count)
507{
508    char                    *String;
509
510
511    if (Count)
512    {
513        /* Find end of the destination string */
514
515        for (String = DstString; *String++; )
516        { ; }
517
518        /* Concatenate the string */
519
520        for (--String; (*String++ = *SrcString++) && --Count; )
521        { ; }
522
523        /* Null terminate if necessary */
524
525        if (!Count)
526        {
527            *String = 0;
528        }
529    }
530
531    return (DstString);
532}
533
534
535/*******************************************************************************
536 *
537 * FUNCTION:    AcpiUtStrstr (strstr)
538 *
539 * PARAMETERS:  String1         - Target string
540 *              String2         - Substring to search for
541 *
542 * RETURN:      Where substring match starts, Null if no match found
543 *
544 * DESCRIPTION: Checks if String2 occurs in String1. This is not really a
545 *              full implementation of strstr, only sufficient for command
546 *              matching
547 *
548 ******************************************************************************/
549
550char *
551AcpiUtStrstr (
552    char                    *String1,
553    char                    *String2)
554{
555    char                    *String;
556
557
558    if (AcpiUtStrlen (String2) > AcpiUtStrlen (String1))
559    {
560        return (NULL);
561    }
562
563    /* Walk entire string, comparing the letters */
564
565    for (String = String1; *String2; )
566    {
567        if (*String2 != *String)
568        {
569            return (NULL);
570        }
571
572        String2++;
573        String++;
574    }
575
576    return (String1);
577}
578
579
580/*******************************************************************************
581 *
582 * FUNCTION:    AcpiUtStrtoul (strtoul)
583 *
584 * PARAMETERS:  String          - Null terminated string
585 *              Terminater      - Where a pointer to the terminating byte is
586 *                                returned
587 *              Base            - Radix of the string
588 *
589 * RETURN:      Converted value
590 *
591 * DESCRIPTION: Convert a string into a 32-bit unsigned value.
592 *              Note: use AcpiUtStrtoul64 for 64-bit integers.
593 *
594 ******************************************************************************/
595
596UINT32
597AcpiUtStrtoul (
598    const char              *String,
599    char                    **Terminator,
600    UINT32                  Base)
601{
602    UINT32                  converted = 0;
603    UINT32                  index;
604    UINT32                  sign;
605    const char              *StringStart;
606    UINT32                  ReturnValue = 0;
607    ACPI_STATUS             Status = AE_OK;
608
609
610    /*
611     * Save the value of the pointer to the buffer's first
612     * character, save the current errno value, and then
613     * skip over any white space in the buffer:
614     */
615    StringStart = String;
616    while (ACPI_IS_SPACE (*String) || *String == '\t')
617    {
618        ++String;
619    }
620
621    /*
622     * The buffer may contain an optional plus or minus sign.
623     * If it does, then skip over it but remember what is was:
624     */
625    if (*String == '-')
626    {
627        sign = NEGATIVE;
628        ++String;
629    }
630    else if (*String == '+')
631    {
632        ++String;
633        sign = POSITIVE;
634    }
635    else
636    {
637        sign = POSITIVE;
638    }
639
640    /*
641     * If the input parameter Base is zero, then we need to
642     * determine if it is octal, decimal, or hexadecimal:
643     */
644    if (Base == 0)
645    {
646        if (*String == '0')
647        {
648            if (AcpiUtToLower (*(++String)) == 'x')
649            {
650                Base = 16;
651                ++String;
652            }
653            else
654            {
655                Base = 8;
656            }
657        }
658        else
659        {
660            Base = 10;
661        }
662    }
663    else if (Base < 2 || Base > 36)
664    {
665        /*
666         * The specified Base parameter is not in the domain of
667         * this function:
668         */
669        goto done;
670    }
671
672    /*
673     * For octal and hexadecimal bases, skip over the leading
674     * 0 or 0x, if they are present.
675     */
676    if (Base == 8 && *String == '0')
677    {
678        String++;
679    }
680
681    if (Base == 16 &&
682        *String == '0' &&
683        AcpiUtToLower (*(++String)) == 'x')
684    {
685        String++;
686    }
687
688    /*
689     * Main loop: convert the string to an unsigned long:
690     */
691    while (*String)
692    {
693        if (ACPI_IS_DIGIT (*String))
694        {
695            index = (UINT32) ((UINT8) *String - '0');
696        }
697        else
698        {
699            index = (UINT32) AcpiUtToUpper (*String);
700            if (ACPI_IS_UPPER (index))
701            {
702                index = index - 'A' + 10;
703            }
704            else
705            {
706                goto done;
707            }
708        }
709
710        if (index >= Base)
711        {
712            goto done;
713        }
714
715        /*
716         * Check to see if value is out of range:
717         */
718
719        if (ReturnValue > ((ACPI_UINT32_MAX - (UINT32) index) /
720                            (UINT32) Base))
721        {
722            Status = AE_ERROR;
723            ReturnValue = 0;           /* reset */
724        }
725        else
726        {
727            ReturnValue *= Base;
728            ReturnValue += index;
729            converted = 1;
730        }
731
732        ++String;
733    }
734
735done:
736    /*
737     * If appropriate, update the caller's pointer to the next
738     * unconverted character in the buffer.
739     */
740    if (Terminator)
741    {
742        if (converted == 0 && ReturnValue == 0 && String != NULL)
743        {
744            *Terminator = (char *) StringStart;
745        }
746        else
747        {
748            *Terminator = (char *) String;
749        }
750    }
751
752    if (Status == AE_ERROR)
753    {
754        ReturnValue = ACPI_UINT32_MAX;
755    }
756
757    /*
758     * If a minus sign was present, then "the conversion is negated":
759     */
760    if (sign == NEGATIVE)
761    {
762        ReturnValue = (ACPI_UINT32_MAX - ReturnValue) + 1;
763    }
764
765    return (ReturnValue);
766}
767
768
769/*******************************************************************************
770 *
771 * FUNCTION:    AcpiUtToUpper (TOUPPER)
772 *
773 * PARAMETERS:  c           - Character to convert
774 *
775 * RETURN:      Converted character as an int
776 *
777 * DESCRIPTION: Convert character to uppercase
778 *
779 ******************************************************************************/
780
781int
782AcpiUtToUpper (
783    int                     c)
784{
785
786    return (ACPI_IS_LOWER(c) ? ((c)-0x20) : (c));
787}
788
789
790/*******************************************************************************
791 *
792 * FUNCTION:    AcpiUtToLower (TOLOWER)
793 *
794 * PARAMETERS:  c           - Character to convert
795 *
796 * RETURN:      Converted character as an int
797 *
798 * DESCRIPTION: Convert character to lowercase
799 *
800 ******************************************************************************/
801
802int
803AcpiUtToLower (
804    int                     c)
805{
806
807    return (ACPI_IS_UPPER(c) ? ((c)+0x20) : (c));
808}
809
810
811/*******************************************************************************
812 *
813 * FUNCTION:    is* functions
814 *
815 * DESCRIPTION: is* functions use the ctype table below
816 *
817 ******************************************************************************/
818
819const UINT8 _acpi_ctype[257] = {
820    _ACPI_CN,            /* 0x0      0.     */
821    _ACPI_CN,            /* 0x1      1.     */
822    _ACPI_CN,            /* 0x2      2.     */
823    _ACPI_CN,            /* 0x3      3.     */
824    _ACPI_CN,            /* 0x4      4.     */
825    _ACPI_CN,            /* 0x5      5.     */
826    _ACPI_CN,            /* 0x6      6.     */
827    _ACPI_CN,            /* 0x7      7.     */
828    _ACPI_CN,            /* 0x8      8.     */
829    _ACPI_CN|_ACPI_SP,   /* 0x9      9.     */
830    _ACPI_CN|_ACPI_SP,   /* 0xA     10.     */
831    _ACPI_CN|_ACPI_SP,   /* 0xB     11.     */
832    _ACPI_CN|_ACPI_SP,   /* 0xC     12.     */
833    _ACPI_CN|_ACPI_SP,   /* 0xD     13.     */
834    _ACPI_CN,            /* 0xE     14.     */
835    _ACPI_CN,            /* 0xF     15.     */
836    _ACPI_CN,            /* 0x10    16.     */
837    _ACPI_CN,            /* 0x11    17.     */
838    _ACPI_CN,            /* 0x12    18.     */
839    _ACPI_CN,            /* 0x13    19.     */
840    _ACPI_CN,            /* 0x14    20.     */
841    _ACPI_CN,            /* 0x15    21.     */
842    _ACPI_CN,            /* 0x16    22.     */
843    _ACPI_CN,            /* 0x17    23.     */
844    _ACPI_CN,            /* 0x18    24.     */
845    _ACPI_CN,            /* 0x19    25.     */
846    _ACPI_CN,            /* 0x1A    26.     */
847    _ACPI_CN,            /* 0x1B    27.     */
848    _ACPI_CN,            /* 0x1C    28.     */
849    _ACPI_CN,            /* 0x1D    29.     */
850    _ACPI_CN,            /* 0x1E    30.     */
851    _ACPI_CN,            /* 0x1F    31.     */
852    _ACPI_XS|_ACPI_SP,   /* 0x20    32. ' ' */
853    _ACPI_PU,            /* 0x21    33. '!' */
854    _ACPI_PU,            /* 0x22    34. '"' */
855    _ACPI_PU,            /* 0x23    35. '#' */
856    _ACPI_PU,            /* 0x24    36. '$' */
857    _ACPI_PU,            /* 0x25    37. '%' */
858    _ACPI_PU,            /* 0x26    38. '&' */
859    _ACPI_PU,            /* 0x27    39. ''' */
860    _ACPI_PU,            /* 0x28    40. '(' */
861    _ACPI_PU,            /* 0x29    41. ')' */
862    _ACPI_PU,            /* 0x2A    42. '*' */
863    _ACPI_PU,            /* 0x2B    43. '+' */
864    _ACPI_PU,            /* 0x2C    44. ',' */
865    _ACPI_PU,            /* 0x2D    45. '-' */
866    _ACPI_PU,            /* 0x2E    46. '.' */
867    _ACPI_PU,            /* 0x2F    47. '/' */
868    _ACPI_XD|_ACPI_DI,   /* 0x30    48. '0' */
869    _ACPI_XD|_ACPI_DI,   /* 0x31    49. '1' */
870    _ACPI_XD|_ACPI_DI,   /* 0x32    50. '2' */
871    _ACPI_XD|_ACPI_DI,   /* 0x33    51. '3' */
872    _ACPI_XD|_ACPI_DI,   /* 0x34    52. '4' */
873    _ACPI_XD|_ACPI_DI,   /* 0x35    53. '5' */
874    _ACPI_XD|_ACPI_DI,   /* 0x36    54. '6' */
875    _ACPI_XD|_ACPI_DI,   /* 0x37    55. '7' */
876    _ACPI_XD|_ACPI_DI,   /* 0x38    56. '8' */
877    _ACPI_XD|_ACPI_DI,   /* 0x39    57. '9' */
878    _ACPI_PU,            /* 0x3A    58. ':' */
879    _ACPI_PU,            /* 0x3B    59. ';' */
880    _ACPI_PU,            /* 0x3C    60. '<' */
881    _ACPI_PU,            /* 0x3D    61. '=' */
882    _ACPI_PU,            /* 0x3E    62. '>' */
883    _ACPI_PU,            /* 0x3F    63. '?' */
884    _ACPI_PU,            /* 0x40    64. '@' */
885    _ACPI_XD|_ACPI_UP,   /* 0x41    65. 'A' */
886    _ACPI_XD|_ACPI_UP,   /* 0x42    66. 'B' */
887    _ACPI_XD|_ACPI_UP,   /* 0x43    67. 'C' */
888    _ACPI_XD|_ACPI_UP,   /* 0x44    68. 'D' */
889    _ACPI_XD|_ACPI_UP,   /* 0x45    69. 'E' */
890    _ACPI_XD|_ACPI_UP,   /* 0x46    70. 'F' */
891    _ACPI_UP,            /* 0x47    71. 'G' */
892    _ACPI_UP,            /* 0x48    72. 'H' */
893    _ACPI_UP,            /* 0x49    73. 'I' */
894    _ACPI_UP,            /* 0x4A    74. 'J' */
895    _ACPI_UP,            /* 0x4B    75. 'K' */
896    _ACPI_UP,            /* 0x4C    76. 'L' */
897    _ACPI_UP,            /* 0x4D    77. 'M' */
898    _ACPI_UP,            /* 0x4E    78. 'N' */
899    _ACPI_UP,            /* 0x4F    79. 'O' */
900    _ACPI_UP,            /* 0x50    80. 'P' */
901    _ACPI_UP,            /* 0x51    81. 'Q' */
902    _ACPI_UP,            /* 0x52    82. 'R' */
903    _ACPI_UP,            /* 0x53    83. 'S' */
904    _ACPI_UP,            /* 0x54    84. 'T' */
905    _ACPI_UP,            /* 0x55    85. 'U' */
906    _ACPI_UP,            /* 0x56    86. 'V' */
907    _ACPI_UP,            /* 0x57    87. 'W' */
908    _ACPI_UP,            /* 0x58    88. 'X' */
909    _ACPI_UP,            /* 0x59    89. 'Y' */
910    _ACPI_UP,            /* 0x5A    90. 'Z' */
911    _ACPI_PU,            /* 0x5B    91. '[' */
912    _ACPI_PU,            /* 0x5C    92. '\' */
913    _ACPI_PU,            /* 0x5D    93. ']' */
914    _ACPI_PU,            /* 0x5E    94. '^' */
915    _ACPI_PU,            /* 0x5F    95. '_' */
916    _ACPI_PU,            /* 0x60    96. '`' */
917    _ACPI_XD|_ACPI_LO,   /* 0x61    97. 'a' */
918    _ACPI_XD|_ACPI_LO,   /* 0x62    98. 'b' */
919    _ACPI_XD|_ACPI_LO,   /* 0x63    99. 'c' */
920    _ACPI_XD|_ACPI_LO,   /* 0x64   100. 'd' */
921    _ACPI_XD|_ACPI_LO,   /* 0x65   101. 'e' */
922    _ACPI_XD|_ACPI_LO,   /* 0x66   102. 'f' */
923    _ACPI_LO,            /* 0x67   103. 'g' */
924    _ACPI_LO,            /* 0x68   104. 'h' */
925    _ACPI_LO,            /* 0x69   105. 'i' */
926    _ACPI_LO,            /* 0x6A   106. 'j' */
927    _ACPI_LO,            /* 0x6B   107. 'k' */
928    _ACPI_LO,            /* 0x6C   108. 'l' */
929    _ACPI_LO,            /* 0x6D   109. 'm' */
930    _ACPI_LO,            /* 0x6E   110. 'n' */
931    _ACPI_LO,            /* 0x6F   111. 'o' */
932    _ACPI_LO,            /* 0x70   112. 'p' */
933    _ACPI_LO,            /* 0x71   113. 'q' */
934    _ACPI_LO,            /* 0x72   114. 'r' */
935    _ACPI_LO,            /* 0x73   115. 's' */
936    _ACPI_LO,            /* 0x74   116. 't' */
937    _ACPI_LO,            /* 0x75   117. 'u' */
938    _ACPI_LO,            /* 0x76   118. 'v' */
939    _ACPI_LO,            /* 0x77   119. 'w' */
940    _ACPI_LO,            /* 0x78   120. 'x' */
941    _ACPI_LO,            /* 0x79   121. 'y' */
942    _ACPI_LO,            /* 0x7A   122. 'z' */
943    _ACPI_PU,            /* 0x7B   123. '{' */
944    _ACPI_PU,            /* 0x7C   124. '|' */
945    _ACPI_PU,            /* 0x7D   125. '}' */
946    _ACPI_PU,            /* 0x7E   126. '~' */
947    _ACPI_CN,            /* 0x7F   127.     */
948
949    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,  /* 0x80 to 0x8F    */
950    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,  /* 0x90 to 0x9F    */
951    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,  /* 0xA0 to 0xAF    */
952    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,  /* 0xB0 to 0xBF    */
953    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,  /* 0xC0 to 0xCF    */
954    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,  /* 0xD0 to 0xDF    */
955    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,  /* 0xE0 to 0xEF    */
956    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 /* 0xF0 to 0x100   */
957};
958
959
960#endif /* ACPI_USE_SYSTEM_CLIBRARY */
961
962