Home | History | Annotate | Line # | Download | only in runtime
rtstr.c revision 1.1.1.1.36.1
      1  1.1.1.1.36.1  christos /*	$NetBSD: rtstr.c,v 1.1.1.1.36.1 2019/06/10 22:08:37 christos 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.1.36.1  christos     IN CONST CHAR16   *s1,
     29  1.1.1.1.36.1  christos     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.1.36.1  christos     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.1.36.1  christos #pragma RUNTIME_CODE(RtStrnCpy)
     64  1.1.1.1.36.1  christos #endif
     65  1.1.1.1.36.1  christos VOID
     66  1.1.1.1.36.1  christos RUNTIMEFUNCTION
     67  1.1.1.1.36.1  christos RtStrnCpy (
     68  1.1.1.1.36.1  christos     IN CHAR16   *Dest,
     69  1.1.1.1.36.1  christos     IN CONST CHAR16   *Src,
     70  1.1.1.1.36.1  christos     IN UINTN     Len
     71  1.1.1.1.36.1  christos     )
     72  1.1.1.1.36.1  christos // copy strings
     73  1.1.1.1.36.1  christos {
     74  1.1.1.1.36.1  christos     UINTN Size = RtStrnLen(Src, Len);
     75  1.1.1.1.36.1  christos     if (Size != Len)
     76  1.1.1.1.36.1  christos 	RtSetMem(Dest + Len, '\0', (Len - Size) * sizeof(CHAR16));
     77  1.1.1.1.36.1  christos     RtCopyMem(Dest, Src, Size * sizeof(CHAR16));
     78  1.1.1.1.36.1  christos }
     79  1.1.1.1.36.1  christos 
     80  1.1.1.1.36.1  christos #ifndef __GNUC__
     81  1.1.1.1.36.1  christos #pragma RUNTIME_CODE(RtStrCpy)
     82  1.1.1.1.36.1  christos #endif
     83  1.1.1.1.36.1  christos CHAR16 *
     84  1.1.1.1.36.1  christos RUNTIMEFUNCTION
     85  1.1.1.1.36.1  christos RtStpCpy (
     86  1.1.1.1.36.1  christos     IN CHAR16   *Dest,
     87  1.1.1.1.36.1  christos     IN CONST CHAR16   *Src
     88  1.1.1.1.36.1  christos     )
     89  1.1.1.1.36.1  christos // copy strings
     90  1.1.1.1.36.1  christos {
     91  1.1.1.1.36.1  christos     while (*Src) {
     92  1.1.1.1.36.1  christos         *(Dest++) = *(Src++);
     93  1.1.1.1.36.1  christos     }
     94  1.1.1.1.36.1  christos     *Dest = 0;
     95  1.1.1.1.36.1  christos     return Dest;
     96  1.1.1.1.36.1  christos }
     97  1.1.1.1.36.1  christos 
     98  1.1.1.1.36.1  christos #ifndef __GNUC__
     99  1.1.1.1.36.1  christos #pragma RUNTIME_CODE(RtStrnCpy)
    100  1.1.1.1.36.1  christos #endif
    101  1.1.1.1.36.1  christos CHAR16 *
    102  1.1.1.1.36.1  christos RUNTIMEFUNCTION
    103  1.1.1.1.36.1  christos RtStpnCpy (
    104  1.1.1.1.36.1  christos     IN CHAR16   *Dest,
    105  1.1.1.1.36.1  christos     IN CONST CHAR16   *Src,
    106  1.1.1.1.36.1  christos     IN UINTN     Len
    107  1.1.1.1.36.1  christos     )
    108  1.1.1.1.36.1  christos // copy strings
    109  1.1.1.1.36.1  christos {
    110  1.1.1.1.36.1  christos     UINTN Size = RtStrnLen(Src, Len);
    111  1.1.1.1.36.1  christos     if (Size != Len)
    112  1.1.1.1.36.1  christos 	RtSetMem(Dest + Len, '\0', (Len - Size) * sizeof(CHAR16));
    113  1.1.1.1.36.1  christos     RtCopyMem(Dest, Src, Size * sizeof(CHAR16));
    114  1.1.1.1.36.1  christos     return Dest + Size;
    115  1.1.1.1.36.1  christos }
    116  1.1.1.1.36.1  christos 
    117  1.1.1.1.36.1  christos #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.1.36.1  christos     IN CONST CHAR16   *Src
    125           1.1  jakllsch     )
    126  1.1.1.1.36.1  christos {
    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.1.36.1  christos #pragma RUNTIME_CODE(RtStrCat)
    132  1.1.1.1.36.1  christos #endif
    133  1.1.1.1.36.1  christos VOID
    134  1.1.1.1.36.1  christos RUNTIMEFUNCTION
    135  1.1.1.1.36.1  christos RtStrnCat (
    136  1.1.1.1.36.1  christos     IN CHAR16   *Dest,
    137  1.1.1.1.36.1  christos     IN CONST CHAR16   *Src,
    138  1.1.1.1.36.1  christos     IN UINTN    Len
    139  1.1.1.1.36.1  christos     )
    140  1.1.1.1.36.1  christos {
    141  1.1.1.1.36.1  christos     RtStrnCpy(Dest+StrLen(Dest), Src, Len);
    142  1.1.1.1.36.1  christos }
    143  1.1.1.1.36.1  christos 
    144  1.1.1.1.36.1  christos #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.1.36.1  christos     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.1.36.1  christos 
    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.1.36.1  christos #pragma RUNTIME_CODE(RtStrnLen)
    162  1.1.1.1.36.1  christos #endif
    163  1.1.1.1.36.1  christos UINTN
    164  1.1.1.1.36.1  christos RUNTIMEFUNCTION
    165  1.1.1.1.36.1  christos RtStrnLen (
    166  1.1.1.1.36.1  christos     IN CONST CHAR16   *s1,
    167  1.1.1.1.36.1  christos     IN UINTN           Len
    168  1.1.1.1.36.1  christos     )
    169  1.1.1.1.36.1  christos // copy strings
    170  1.1.1.1.36.1  christos {
    171  1.1.1.1.36.1  christos     UINTN i;
    172  1.1.1.1.36.1  christos     for (i = 0; *s1 && i < Len; i++)
    173  1.1.1.1.36.1  christos 	    s1++;
    174  1.1.1.1.36.1  christos     return i;
    175  1.1.1.1.36.1  christos }
    176  1.1.1.1.36.1  christos 
    177  1.1.1.1.36.1  christos #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.1.36.1  christos     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.1.36.1  christos 
    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