added more int to string conversions

This commit is contained in:
Lauchmelder 2022-01-20 16:38:03 +01:00
parent 9fcfe4cb05
commit 5ec9cc709f
4 changed files with 55 additions and 25 deletions

View file

@ -3,4 +3,8 @@
#include "stdint.h" #include "stdint.h"
int stoi(const char* string); int stoi(const char* string);
char* itoa(int number, char* string);
char* ultoa(unsigned long number, char* string, int base);
char* ltoa(long number, char* string, int base);
char* utoa(unsigned int number, char* string, int base);
char* itoa(int number, char* string, int base);

View file

@ -24,6 +24,8 @@ _start:
cbnz w2, 3b cbnz w2, 3b
4: # Jump to main() in C 4: # Jump to main() in C
ldr x4, =_start ldr x0, =_start
ldr x1, =0x50000
str x0, [x1]
bl main bl main
b 1b b 1b

View file

@ -21,8 +21,14 @@ int stoi(const char* string)
return output; return output;
} }
char* itoa(int number, char* string) char* ultoa(unsigned long number, char* string, int base)
{ {
if(base < 2 || base > 16)
{
string[0] = '\0';
return string;
}
volatile char* temp = (volatile char*)0x40000000; volatile char* temp = (volatile char*)0x40000000;
int i = 0; int i = 0;
if(number == 0) if(number == 0)
@ -31,17 +37,12 @@ char* itoa(int number, char* string)
} }
else else
{ {
for(int n = (number < 0 ? -number : number); n > 0; n /= 10) for(; number > 0; number /= base)
{ {
temp[i++] = '0' + (n % 10); temp[i++] = '0' + (number % base);
} }
} }
if(number < 0)
{
temp[i++] = '-';
}
temp[i] = '\0'; temp[i] = '\0';
string[i] = '\0'; string[i] = '\0';
@ -51,4 +52,27 @@ char* itoa(int number, char* string)
} }
return string; return string;
}
char* ltoa(long number, char* string, int base)
{
char* old_string = string;
if(number < 0)
{
number *= -1;
*string++ = '-';
}
itoa(number, string, base);
return old_string;
}
char* utoa(unsigned int number, char* string, int base)
{
return ultoa(number, string, base);
}
char* itoa(int number, char* string, int base)
{
return ltoa(number, string, base);
} }

View file

@ -3,29 +3,24 @@
#include "string.h" #include "string.h"
void print_clippy(); void print_clippy();
char* get_user_input(char* buffer);
void main() void main()
{ {
const char* hex_chars = "0123456789ABCDEF"; const char* hex_chars = "0123456789ABCDEF";
register int* start_address asm ("x4"); long int start = *(volatile long int*)0x50000;
long int start = (long int)start_address; char buffer[1024];
uart_init(); uart_init();
print_clippy(); print_clippy();
uart_puts("Boot successful! \n"); uart_puts("Boot successful! \n");
uart_puts("Started execution at 0x"); uart_puts("Started execution at 0x");
for(int i = 0; i < 8; i++) uart_puts(ultoa(start, buffer, 16));
{
uart_putchar(hex_chars[start & 0xF]);
start >>= 4;
}
char buffer[1024];
for(;;) for(;;)
{ {
uart_puts("\n\nPlease enter first operand\n"); uart_puts("\n\nPlease enter first operand\n");
uart_puts("📎 "); get_user_input(buffer);
uart_gets(buffer);
if(!strcmp(buffer, "clippy")) if(!strcmp(buffer, "clippy"))
{ {
@ -36,18 +31,23 @@ void main()
int a = stoi(buffer); int a = stoi(buffer);
uart_puts("\nPlease enter second operand\n"); uart_puts("\nPlease enter second operand\n");
uart_puts("📎 "); int b = stoi(get_user_input(buffer));
int b = stoi(uart_gets(buffer));
uart_puts("\n"); uart_puts("\n");
uart_puts(itoa(a, buffer)); uart_puts(itoa(a, buffer, 10));
uart_puts(" * "); uart_puts(" * ");
uart_puts(itoa(b, buffer)); uart_puts(itoa(b, buffer, 10));
uart_puts(" = "); uart_puts(" = ");
uart_puts(itoa(a * b, buffer)); uart_puts(itoa(a * b, buffer, 10));
} }
} }
char* get_user_input(char* buffer)
{
uart_puts("📎 ");
return uart_gets(buffer);
}
void print_clippy() void print_clippy()
{ {
uart_puts(" \n"); uart_puts(" \n");