Home | History | Annotate | Line # | Download | only in runtime
rtstr.c revision 1.1.1.2
      1      1.1  jakllsch /*	$NetBSD: rtstr.c,v 1.1.1.2 2018/08/16 18:17:47 jmcneill Exp $	*/
      2      1.1  jakllsch 
      3      1.1  jakllsch /*++
      4      1.1  jakllsch 
      5      1.1  jakllsch Copyright (c) 1998  Intel Corporation
      6      1.1  jakllsch 
      7      1.1  jakllsch Module Name:
      8      1.1  jakllsch 
      9      1.1  jakllsch     str.c
     10      1.1  jakllsch 
     11      1.1  jakllsch Abstract:
     12      1.1  jakllsch 
     13      1.1  jakllsch     String runtime functions
     14      1.1  jakllsch 
     15      1.1  jakllsch 
     16      1.1  jakllsch Revision History
     17      1.1  jakllsch 
     18      1.1  jakllsch --*/
     19      1.1  jakllsch 
     20      1.1  jakllsch #include "lib.h"
     21      1.1  jakllsch 
     22      1.1  jakllsch #ifndef __GNUC__
     23      1.1  jakllsch #pragma RUNTIME_CODE(RtAcquireLock)
     24      1.1  jakllsch #endif
     25      1.1  jakllsch INTN
     26      1.1  jakllsch RUNTIMEFUNCTION
     27      1.1  jakllsch RtStrCmp (
     28  1.1.1.2  jmcneill     IN CONST CHAR16   *s1,
     29  1.1.1.2  jmcneill     IN CONST CHAR16   *s2
     30      1.1  jakllsch     )
     31      1.1  jakllsch // compare strings
     32      1.1  jakllsch {
     33      1.1  jakllsch     while (*s1) {
     34      1.1  jakllsch         if (*s1 != *s2) {
     35      1.1  jakllsch             break;
     36      1.1  jakllsch         }
     37      1.1  jakllsch 
     38      1.1  jakllsch         s1 += 1;
     39      1.1  jakllsch         s2 += 1;
     40      1.1  jakllsch     }
     41      1.1  jakllsch 
     42      1.1  jakllsch     return *s1 - *s2;
     43      1.1  jakllsch }
     44      1.1  jakllsch 
     45      1.1  jakllsch #ifndef __GNUC__
     46      1.1  jakllsch #pragma RUNTIME_CODE(RtStrCpy)
     47      1.1  jakllsch #endif
     48      1.1  jakllsch VOID
     49      1.1  jakllsch RUNTIMEFUNCTION
     50      1.1  jakllsch RtStrCpy (
     51      1.1  jakllsch     IN CHAR16   *Dest,
     52  1.1.1.2  jmcneill     IN CONST CHAR16   *Src
     53      1.1  jakllsch     )
     54      1.1  jakllsch // copy strings
     55      1.1  jakllsch {
     56      1.1  jakllsch     while (*Src) {
     57      1.1  jakllsch         *(Dest++) = *(Src++);
     58      1.1  jakllsch     }
     59      1.1  jakllsch     *Dest = 0;
     60      1.1  jakllsch }
     61      1.1  jakllsch 
     62      1.1  jakllsch #ifndef __GNUC__
     63  1.1.1.2  jmcneill #pragma RUNTIME_CODE(RtStrnCpy)
     64  1.1.1.2  jmcneill #endif
     65  1.1.1.2  jmcneill VOID
     66  1.1.1.2  jmcneill RUNTIMEFUNCTION
     67  1.1.1.2  jmcneill RtStrnCpy (
     68  1.1.1.2  jmcneill     IN CHAR16   *Dest,
     69  1.1.1.2  jmcneill     IN CONST CHAR16   *Src,
     70  1.1.1.2  jmcneill     IN UINTN     Len
     71  1.1.1.2  jmcneill     )
     72  1.1.1.2  jmcneill // copy strings
     73  1.1.1.2  jmcneill {
     74  1.1.1.2  jmcneill     UINTN Size = RtStrnLen(Src, Len);
     75  1.1.1.2  jmcneill     if (Size != Len)
     76  1.1.1.2  jmcneill 	RtSetMem(Dest + Len, '\0', (Len - Size) * sizeof(CHAR16));
     77  1.1.1.2  jmcneill     RtCopyMem(Dest, Src, Size * sizeof(CHAR16));
     78  1.1.1.2  jmcneill }
     79  1.1.1.2  jmcneill 
     80  1.1.1.2  jmcneill #ifndef __GNUC__
     81  1.1.1.2  jmcneill #pragma RUNTIME_CODE(RtStrCpy)
     82  1.1.1.2  jmcneill #endif
     83  1.1.1.2  jmcneill CHAR16 *
     84  1.1.1.2  jmcneill RUNTIMEFUNCTION
     85  1.1.1.2  jmcneill RtStpCpy (
     86  1.1.1.2  jmcneill     IN CHAR16   *Dest,
     87  1.1.1.2  jmcneill     IN CONST CHAR16   *Src
     88  1.1.1.2  jmcneill     )
     89  1.1.1.2  jmcneill // copy strings
     90  1.1.1.2  jmcneill {
     91  1.1.1.2  jmcneill     while (*Src) {
     92  1.1.1.2  jmcneill         *(Dest++) = *(Src++);
     93  1.1.1.2  jmcneill     }
     94  1.1.1.2  jmcneill     *Dest = 0;
     95  1.1.1.2  jmcneill     return Dest;
     96  1.1.1.2  jmcneill }
     97  1.1.1.2  jmcneill 
     98  1.1.1.2  jmcneill #ifndef __GNUC__
     99  1.1.1.2  jmcneill #pragma RUNTIME_CODE(RtStrnCpy)
    100  1.1.1.2  jmcneill #endif
    101  1.1.1.2  jmcneill CHAR16 *
    102  1.1.1.2  jmcneill RUNTIMEFUNCTION
    103  1.1.1.2  jmcneill RtStpnCpy (
    104  1.1.1.2  jmcneill     IN CHAR16   *Dest,
    105  1.1.1.2  jmcneill     IN CONST CHAR16   *Src,
    106  1.1.1.2  jmcneill     IN UINTN     Len
    107  1.1.1.2  jmcneill     )
    108  1.1.1.2  jmcneill // copy strings
    109  1.1.1.2  jmcneill {
    110  1.1.1.2  jmcneill     UINTN Size = RtStrnLen(Src, Len);
    111  1.1.1.2  jmcneill     if (Size != Len)
    112  1.1.1.2  jmcneill 	RtSetMem(Dest + Len, '\0', (Len - Size) * sizeof(CHAR16));
    113  1.1.1.2  jmcneill     RtCopyMem(Dest, Src, Size * sizeof(CHAR16));
    114  1.1.1.2  jmcneill     return Dest + Size;
    115  1.1.1.2  jmcneill }
    116  1.1.1.2  jmcneill 
    117  1.1.1.2  jmcneill #ifndef __GNUC__
    118      1.1  jakllsch #pragma RUNTIME_CODE(RtStrCat)
    119      1.1  jakllsch #endif
    120      1.1  jakllsch VOID
    121      1.1  jakllsch RUNTIMEFUNCTION
    122      1.1  jakllsch RtStrCat (
    123      1.1  jakllsch     IN CHAR16   *Dest,
    124  1.1.1.2  jmcneill     IN CONST CHAR16   *Src
    125      1.1  jakllsch     )
    126  1.1.1.2  jmcneill {
    127      1.1  jakllsch     RtStrCpy(Dest+StrLen(Dest), Src);
    128      1.1  jakllsch }
    129      1.1  jakllsch 
    130      1.1  jakllsch #ifndef __GNUC__
    131  1.1.1.2  jmcneill #pragma RUNTIME_CODE(RtStrCat)
    132  1.1.1.2  jmcneill #endif
    133  1.1.1.2  jmcneill VOID
    134  1.1.1.2  jmcneill RUNTIMEFUNCTION
    135  1.1.1.2  jmcneill RtStrnCat (
    136  1.1.1.2  jmcneill     IN CHAR16   *Dest,
    137  1.1.1.2  jmcneill     IN CONST CHAR16   *Src,
    138  1.1.1.2  jmcneill     IN UINTN    Len
    139  1.1.1.2  jmcneill     )
    140  1.1.1.2  jmcneill {
    141  1.1.1.2  jmcneill     RtStrnCpy(Dest+StrLen(Dest), Src, Len);
    142  1.1.1.2  jmcneill }
    143  1.1.1.2  jmcneill 
    144  1.1.1.2  jmcneill #ifndef __GNUC__
    145      1.1  jakllsch #pragma RUNTIME_CODE(RtStrLen)
    146      1.1  jakllsch #endif
    147      1.1  jakllsch UINTN
    148      1.1  jakllsch RUNTIMEFUNCTION
    149      1.1  jakllsch RtStrLen (
    150  1.1.1.2  jmcneill     IN CONST CHAR16   *s1
    151      1.1  jakllsch     )
    152      1.1  jakllsch // string length
    153      1.1  jakllsch {
    154      1.1  jakllsch     UINTN        len;
    155  1.1.1.2  jmcneill 
    156      1.1  jakllsch     for (len=0; *s1; s1+=1, len+=1) ;
    157      1.1  jakllsch     return len;
    158      1.1  jakllsch }
    159      1.1  jakllsch 
    160      1.1  jakllsch #ifndef __GNUC__
    161  1.1.1.2  jmcneill #pragma RUNTIME_CODE(RtStrnLen)
    162  1.1.1.2  jmcneill #endif
    163  1.1.1.2  jmcneill UINTN
    164  1.1.1.2  jmcneill RUNTIMEFUNCTION
    165  1.1.1.2  jmcneill RtStrnLen (
    166  1.1.1.2  jmcneill     IN CONST CHAR16   *s1,
    167  1.1.1.2  jmcneill     IN UINTN           Len
    168  1.1.1.2  jmcneill     )
    169  1.1.1.2  jmcneill // copy strings
    170  1.1.1.2  jmcneill {
    171  1.1.1.2  jmcneill     UINTN i;
    172  1.1.1.2  jmcneill     for (i = 0; *s1 && i < Len; i++)
    173  1.1.1.2  jmcneill 	    s1++;
    174  1.1.1.2  jmcneill     return i;
    175  1.1.1.2  jmcneill }
    176  1.1.1.2  jmcneill 
    177  1.1.1.2  jmcneill #ifndef __GNUC__
    178      1.1  jakllsch #pragma RUNTIME_CODE(RtStrSize)
    179      1.1  jakllsch #endif
    180      1.1  jakllsch UINTN
    181      1.1  jakllsch RUNTIMEFUNCTION
    182      1.1  jakllsch RtStrSize (
    183  1.1.1.2  jmcneill     IN CONST CHAR16   *s1
    184      1.1  jakllsch     )
    185      1.1  jakllsch // string size
    186      1.1  jakllsch {
    187      1.1  jakllsch     UINTN        len;
    188  1.1.1.2  jmcneill 
    189      1.1  jakllsch     for (len=0; *s1; s1+=1, len+=1) ;
    190      1.1  jakllsch     return (len + 1) * sizeof(CHAR16);
    191      1.1  jakllsch }
    192      1.1  jakllsch 
    193      1.1  jakllsch #ifndef __GNUC__
    194      1.1  jakllsch #pragma RUNTIME_CODE(RtBCDtoDecimal)
    195      1.1  jakllsch #endif
    196      1.1  jakllsch UINT8
    197      1.1  jakllsch RUNTIMEFUNCTION
    198      1.1  jakllsch RtBCDtoDecimal(
    199      1.1  jakllsch     IN  UINT8 BcdValue
    200      1.1  jakllsch     )
    201      1.1  jakllsch {
    202      1.1  jakllsch     UINTN   High, Low;
    203      1.1  jakllsch 
    204      1.1  jakllsch     High    = BcdValue >> 4;
    205      1.1  jakllsch     Low     = BcdValue - (High << 4);
    206      1.1  jakllsch 
    207      1.1  jakllsch     return ((UINT8)(Low + (High * 10)));
    208      1.1  jakllsch }
    209      1.1  jakllsch 
    210      1.1  jakllsch 
    211      1.1  jakllsch #ifndef __GNUC__
    212      1.1  jakllsch #pragma RUNTIME_CODE(RtDecimaltoBCD)
    213      1.1  jakllsch #endif
    214      1.1  jakllsch UINT8
    215      1.1  jakllsch RUNTIMEFUNCTION
    216      1.1  jakllsch RtDecimaltoBCD (
    217      1.1  jakllsch     IN  UINT8 DecValue
    218      1.1  jakllsch     )
    219      1.1  jakllsch {
    220      1.1  jakllsch     UINTN   High, Low;
    221      1.1  jakllsch 
    222      1.1  jakllsch     High    = DecValue / 10;
    223      1.1  jakllsch     Low     = DecValue - (High * 10);
    224      1.1  jakllsch 
    225      1.1  jakllsch     return ((UINT8)(Low + (High << 4)));
    226      1.1  jakllsch }
    227      1.1  jakllsch 
    228      1.1  jakllsch 
    229