hos/kernel/lang/conv.c

110 lines
1.7 KiB
C

// conv.h
// Author: Josh Holtrop
// Date: 08/02/04
// Modified: 12/30/04
#include "conv.h"
#include "hos_defines.h"
// BCD to string
// returns number of characters generated before null terminator
int bcdtoa(u32_t bcd, char *buf)
{
*buf++ = ((bcd & 0xF0) >> 4) + '0';
*buf++ = (bcd & 0xF) + '0';
*buf = 0;
return 2;
}
// convert integer to hexadecimal string
int itox(u32_t num, char *buf)
{
int s, i = 0;
for (s = 28; s >= 0; s -= 4)
{
u32_t val = (num >> s) & 0xF;
if (i || val || (!s))
{
val = (val > 9) ? (val + 'A' - 10) : (val + '0');
buf[i++] = val;
}
}
buf[i] = 0;
return i - 1;
}
// convert integer to an octal string
int itoo(u32_t num, char *buf)
{
int s, i = 0;
for (s = 30; s >= 0; s -= 3)
{
u32_t val = (num >> s) & 0x7;
if (i || val || (!s))
buf[i++] = val + '0';
}
buf[i] = 0;
return i - 1;
}
// convert signed integer to decimal string
int itoa(int num, char *buf)
{
// 4,294,967,296
int hitNum = 0, i = 0, mod, val;
if (num < 0)
{
buf[i++] = '-';
num = -num;
}
for (mod = 1000000000; mod >= 1; mod /= 10)
{
val = num / mod;
num %= mod;
if (val || (mod == 1))
hitNum = 1;
if (hitNum)
{
buf[i++] = val + '0';
}
}
buf[i] = 0;
return i - 1;
}
// convert an unsigned integer to decimal string
int utoa(u32_t num, char *buf)
{
// 4,294,967,296
int hitNum = 0, i = 0, mod, val;
for (mod = 1000000000; mod >= 1; mod /= 10)
{
val = num / mod;
num %= mod;
if (val || (mod == 1))
hitNum = 1;
if (hitNum)
{
buf[i++] = val + '0';
}
}
buf[i] = 0;
return i - 1;
}
char asciiSwitchCase(char chr)
{
if (chr >= 'A' && chr <= 'Z')
return chr + ('a' - 'A');
if (chr >= 'a' && chr <= 'z')
return chr - ('a' - 'A');
return chr;
}