Merge pull request #3 from VinceAle7082/Coding

Coding is now the "main branch"
This commit is contained in:
Vincenzo Aleksey Brocato 2024-07-31 21:07:34 +02:00 committed by GitHub
commit 60850153ab
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
8 changed files with 162 additions and 9 deletions

1
.gitignore vendored
View File

@ -1,2 +1,3 @@
build/ build/
.mailmap .mailmap
.vscode

View File

@ -1,3 +1,6 @@
<h2>This is the "Coding" branch, the code in this branch is full of bugs and errors or simply doesn't compile, please use the main branch!</h2>
<hr>
Hey all, Vincenzo Aleskey Brocato (VinceAle7082) here! <br> Hey all, Vincenzo Aleskey Brocato (VinceAle7082) here! <br>
This is a little project where I try to make an OS just for fun <br> This is a little project where I try to make an OS just for fun <br>
<br> <br>

View File

@ -1,3 +0,0 @@
stdio.h(4): Warning! W138: No newline at end of file
main.c(8): Warning! W138: No newline at end of file
main.c(4): Warning! W303: Parameter 'bootDrive' has been defined, but not referenced

View File

@ -8,5 +8,7 @@ typedef signed long int int32_t;
typedef unsigned long int uint32_t; typedef unsigned long int uint32_t;
typedef signed long int int64_t; typedef signed long int int64_t;
typedef unsigned long int uint64_t; typedef unsigned long int uint64_t;
typedef uint8_t bool;
#define true 1
#define false 0

View File

@ -13,3 +13,154 @@ void puts(const char *str)
str++; str++;
} }
} }
#define PRINTF_STATE_NORMAL 0
#define PRINTF_STATE_LENGHT 1
#define PRINTF_STATE_LENGHT_SHORT 2
#define PRINTF_STATE_LENGHT_LONG 1
#define PRINTF_STATE_SPEC 4
#define PRINTF_LENGTH_DEFAULT 0
#define PRINTF_LENGTH_SHORT_SHORT 1
#define PRINTF_LENGTH_SHORT 2
#define PRINTF_LENGTH_LONG 3
#define PRINTF_LENGTH_LONG_LONG 4
int* printf_number(int *argp, int length, bool sign, int radix)
const char g_HexChars[] = '0123456789abcdef'
void _cdecl printf(const char *fmt, ...)
{
int *argp = (int*)&fmt;
int state = PRINTF_STATE_NORMAL;
int length = PRINTF_LENGTH_DEFAULT;
int radix = 10;
bool sign = false;
argp++;
while (*fmt)
{
switch (state)
{
case PRINTF_STATE_NORMAL:
switch (*fmt)
{
case '%':
state = PRINTF_STATE_LENGHT;
break;
default:
putc(*fmt);
break;
}
case PRINTF_STATE_LENGHT:
switch (*fmt)
{
case 'h':
length = PRINTF_LENGTH_SHORT;
state = PRINTF_STATE_LENGHT_SHORT;
break;
case 'l':
length = PRINTF_LENGTH_LONG;
state = PRINTF_STATE_LENGHT_LONG;
break;
default:
goto PRINTF_STATE_SPEC;
}
break;
case PRINTF_LENGTH_SHORT:
if (*fmt == 'h')
{
length = PRINTF_LENGTH_SHORT_SHORT;
state = PRINTF_STATE_SPEC;
}
else
{
goto PRINTF_STATE_SPEC;
}
break;
case PRINTF_STATE_SPEC:
switch (*fmt)
{
case 'c':
putc((char)*argp);
argp++;
break;
case 's':
puts(*(char **)argp);
argp++;
break;
case '%':
putc('%');
break;
case 'd':
case 'i':
radix = 10;
sign = true;
argp = printf_number(argp, length, sign, radix);
break;
case 'u':
radix = 10;
sign = false;
argp = printf_number(argp, length, sign, radix);
break;
case 'x':
case 'X':
case 'p':
radix = 16;
sign = false;
argp = printf_number(argp, length, sign, radix);
break;
case 'o':
radix = 8;
sign = false;
argp = printf_number(argp, length, sign, radix);
break;
//Se è messo un carattere non valido questo codice fa in modo che li ignora.
default:
break;
}
//Porta le variabili allo stato di default / normale.
state = PRINTF_STATE_NORMAL;
length = PRINTF_LENGTH_DEFAULT;
radix = 10;
sign = false;
break;
}
fmt++;
}
}
int* printf_number(int* argp, int length, bool sign, int radix)
{
char buffer[32];
unsigned long long number;
int number_sign = 1;
int pos = 0;
switch (length)
{
case PRINTF_LENGTH_SHORT_SHORT:
case PRINTF_LENGTH_SHORT:
case PRINTF_LENGTH_LONG:
case PRINTF_LENGTH_LONG_LONG:
case PRINTF_LENGTH_DEFAULT:
if (sign)
{
int n = *argp;
if (n < 0)
{
n = -n;
number_sign = -1;
}
number = n;
}
else
{
number = (*unsigned int*)argp;
}
argp++;
break;
}
}

View File

@ -1,2 +0,0 @@
stdio.h(4): Warning! W138: No newline at end of file
x86.h(4): Warning! W138: No newline at end of file

View File

@ -1,4 +1,5 @@
#pragma once #pragma once
void putc(char c); void putc(char c);
void puts(const char *str); void puts(const char* str);
void _cdecl printf(const char *fmt, ...);