Initial checkin of toy OS project.
[os.git] / kernel / rtl / string.c
1 //+----------------------------------------------------------------------------
2 //
3 // File:     string.c
4 //
5 // Module:   
6 //
7 // Synopsis: 
8 //
9 // Copyright (C) 2003 Scott Gasch
10 //
11 // Created:  sgasch  5 Jul 2003
12 //
13 //+----------------------------------------------------------------------------
14
15 #include "kernel.h"
16
17 CHAR *
18 strncpy(CHAR *pDest, CHAR *pSrc, SIZE_T u)
19 {
20     char *p = pDest;
21     ULONG v = 0;
22
23     while ((v < u) && (*pSrc))
24     {
25         *pDest = *pSrc;
26         pDest++; pSrc++; v++;
27     }
28
29     //
30     // If we ran out of space, null terminate the dest buffer
31     //
32     if ((*pSrc) && (u > 0))
33     {
34         *(pDest - 1) = 0;
35     }
36     
37     return(p);
38 }
39
40 SIZE_T
41 strlen(CHAR *p)
42 {
43     ULONG i = 0;
44     while(*p)
45     {
46         i++;
47         p++;
48     }
49     return(i);
50 }
51
52 CHAR *
53 RtlIntToAscii(INT i,
54               CHAR *buf,
55               ULONG uBufLen,
56               ULONG uBase)
57 {
58     CHAR *p = (buf + uBufLen);
59     ULONG uSpaceLeft = uBufLen;
60     ULONG uMagnitude;
61     BOOL fNeg = FALSE;
62
63     //
64     // null terminate the workspace buffer
65     //
66     if (uSpaceLeft == 0) 
67     {
68         return(NULL);
69     }
70     *p = '\0';
71     p--;
72     uSpaceLeft--;
73
74     //
75     // Get the int's sign
76     //
77     if (i < 0)
78     {
79         fNeg = TRUE;
80         uMagnitude = -i;
81     }
82     else
83     {
84         uMagnitude = i;
85     }
86     
87     //
88     // Based on base, do the conversion.  Build the string backwards from
89     // less significant digits.  Stop if we finish or if we run out of
90     // uSpaceLeft.
91     //
92     switch(uBase)
93     {
94         case 10:
95             do
96             {
97                 *p = (uMagnitude % 10) + '0';
98                 p--;
99                 uSpaceLeft--;
100                 uMagnitude /= 10;
101             } 
102             while((uSpaceLeft > 0) && (uMagnitude != 0));
103             break;
104         case 16:
105             do
106             {
107                 *p = "0123456789ABCDEF"[uMagnitude & 15];
108                 p--;
109                 uSpaceLeft--;
110                 uMagnitude >>= 4;
111             } 
112             while((uSpaceLeft > 0) && (uMagnitude != 0));
113             break;
114         case 8:
115             do 
116             {
117                 *p = (uMagnitude & 7) + '0';
118                 p--;
119                 uSpaceLeft--;
120                 uMagnitude >>= 3;
121             } 
122             while((uSpaceLeft > 0) && (uMagnitude != 0));
123             break;
124     }
125
126     if (TRUE == fNeg)
127     {
128         if (uSpaceLeft > 0)
129         {
130             *p = '-';
131         }
132     }
133     else
134     {
135         p++;
136     }
137     return(p);
138 }