Home | History | Annotate | Line # | Download | only in runtime
      1      1.1  jakllsch /*	$NetBSD: rtstr.c,v 1.1.1.3 2021/09/30 18:50:09 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.1.3  jmcneill #pragma RUNTIME_CODE(RtStrCmp)
     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.3  jmcneill         RtSetMem(Dest + Size, (Len - Size) * sizeof(CHAR16), '\0');
     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.3  jmcneill #pragma RUNTIME_CODE(RtStpCpy)
     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.3  jmcneill #pragma RUNTIME_CODE(RtStpnCpy)
    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.3  jmcneill         RtSetMem(Dest + Size, (Len - Size) * sizeof(CHAR16), '\0');
    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.1.3  jmcneill     RtStrCpy(Dest+RtStrLen(Dest), Src);
    128      1.1  jakllsch }
    129      1.1  jakllsch 
    130      1.1  jakllsch #ifndef __GNUC__
    131  1.1.1.3  jmcneill #pragma RUNTIME_CODE(RtStrnCat)
    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.3  jmcneill     UINTN DestSize, Size;
    142  1.1.1.3  jmcneill 
    143  1.1.1.3  jmcneill     DestSize = RtStrLen(Dest);
    144  1.1.1.3  jmcneill     Size = RtStrnLen(Src, Len);
    145  1.1.1.3  jmcneill     RtCopyMem(Dest + DestSize, Src, Size * sizeof(CHAR16));
    146  1.1.1.3  jmcneill     Dest[DestSize + Size] = '\0';
    147  1.1.1.2  jmcneill }
    148  1.1.1.2  jmcneill 
    149  1.1.1.2  jmcneill #ifndef __GNUC__
    150      1.1  jakllsch #pragma RUNTIME_CODE(RtStrLen)
    151      1.1  jakllsch #endif
    152      1.1  jakllsch UINTN
    153      1.1  jakllsch RUNTIMEFUNCTION
    154      1.1  jakllsch RtStrLen (
    155  1.1.1.2  jmcneill     IN CONST CHAR16   *s1
    156      1.1  jakllsch     )
    157      1.1  jakllsch // string length
    158      1.1  jakllsch {
    159      1.1  jakllsch     UINTN        len;
    160  1.1.1.2  jmcneill 
    161      1.1  jakllsch     for (len=0; *s1; s1+=1, len+=1) ;
    162      1.1  jakllsch     return len;
    163      1.1  jakllsch }
    164      1.1  jakllsch 
    165      1.1  jakllsch #ifndef __GNUC__
    166  1.1.1.2  jmcneill #pragma RUNTIME_CODE(RtStrnLen)
    167  1.1.1.2  jmcneill #endif
    168  1.1.1.2  jmcneill UINTN
    169  1.1.1.2  jmcneill RUNTIMEFUNCTION
    170  1.1.1.2  jmcneill RtStrnLen (
    171  1.1.1.2  jmcneill     IN CONST CHAR16   *s1,
    172  1.1.1.2  jmcneill     IN UINTN           Len
    173  1.1.1.2  jmcneill     )
    174  1.1.1.3  jmcneill // string length
    175  1.1.1.2  jmcneill {
    176  1.1.1.2  jmcneill     UINTN i;
    177  1.1.1.2  jmcneill     for (i = 0; *s1 && i < Len; i++)
    178  1.1.1.3  jmcneill         s1++;
    179  1.1.1.2  jmcneill     return i;
    180  1.1.1.2  jmcneill }
    181  1.1.1.2  jmcneill 
    182  1.1.1.2  jmcneill #ifndef __GNUC__
    183      1.1  jakllsch #pragma RUNTIME_CODE(RtStrSize)
    184      1.1  jakllsch #endif
    185      1.1  jakllsch UINTN
    186      1.1  jakllsch RUNTIMEFUNCTION
    187      1.1  jakllsch RtStrSize (
    188  1.1.1.2  jmcneill     IN CONST CHAR16   *s1
    189      1.1  jakllsch     )
    190      1.1  jakllsch // string size
    191      1.1  jakllsch {
    192      1.1  jakllsch     UINTN        len;
    193  1.1.1.2  jmcneill 
    194      1.1  jakllsch     for (len=0; *s1; s1+=1, len+=1) ;
    195      1.1  jakllsch     return (len + 1) * sizeof(CHAR16);
    196      1.1  jakllsch }
    197      1.1  jakllsch 
    198      1.1  jakllsch #ifndef __GNUC__
    199      1.1  jakllsch #pragma RUNTIME_CODE(RtBCDtoDecimal)
    200      1.1  jakllsch #endif
    201      1.1  jakllsch UINT8
    202      1.1  jakllsch RUNTIMEFUNCTION
    203      1.1  jakllsch RtBCDtoDecimal(
    204      1.1  jakllsch     IN  UINT8 BcdValue
    205      1.1  jakllsch     )
    206      1.1  jakllsch {
    207      1.1  jakllsch     UINTN   High, Low;
    208      1.1  jakllsch 
    209      1.1  jakllsch     High    = BcdValue >> 4;
    210      1.1  jakllsch     Low     = BcdValue - (High << 4);
    211      1.1  jakllsch 
    212      1.1  jakllsch     return ((UINT8)(Low + (High * 10)));
    213      1.1  jakllsch }
    214      1.1  jakllsch 
    215      1.1  jakllsch 
    216      1.1  jakllsch #ifndef __GNUC__
    217      1.1  jakllsch #pragma RUNTIME_CODE(RtDecimaltoBCD)
    218      1.1  jakllsch #endif
    219      1.1  jakllsch UINT8
    220      1.1  jakllsch RUNTIMEFUNCTION
    221      1.1  jakllsch RtDecimaltoBCD (
    222      1.1  jakllsch     IN  UINT8 DecValue
    223      1.1  jakllsch     )
    224      1.1  jakllsch {
    225      1.1  jakllsch     UINTN   High, Low;
    226      1.1  jakllsch 
    227      1.1  jakllsch     High    = DecValue / 10;
    228      1.1  jakllsch     Low     = DecValue - (High * 10);
    229      1.1  jakllsch 
    230      1.1  jakllsch     return ((UINT8)(Low + (High << 4)));
    231      1.1  jakllsch }
    232      1.1  jakllsch 
    233      1.1  jakllsch 
    234