/*
* CHU - driver for CH375 in disk mode
* Copyright (C) 2024 Javier S. Pedro
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see .
*/
/* Simple printf function for console, a bit wasteful for what it is used.
* But it is part of the init code, so it will be thrown away.
* dlog.h is more powerful but only in debug builds. */
#include
#include
#include
#include
#include "inc/dosapi.h"
#include "cio.h"
static inline void c_llputc(char c)
{
dos_print_char(c);
}
void c_utoa(unsigned num, unsigned base)
{
char buf[6];
int i = 0;
do {
unsigned digit = num % base;
if (digit < 10) {
buf[i] = '0' + digit;
} else {
buf[i] = 'a' + (digit - 10);
}
i++;
num /= base;
} while (num > 0 && i < sizeof(buf));
while (i--) {
c_llputc(buf[i]);
}
}
void c_itoa(int num, unsigned base)
{
unsigned unum;
if (num < 0) {
c_llputc('-');
unum = -num;
} else {
unum = num;
}
c_utoa(unum, base);
}
unsigned c_strtou(const char * *str)
{
unsigned i = 0;
const char *s = *str;
char c = *s;
while (c >= '0' && c <= '9') {
i = (i * 10) + (c - '0');
c = *(++s);
}
*str = s;
return i;
}
static void c_printstr(const char *s)
{
while (*s) { c_llputc(*s++); }
}
void c_printf(const char *fmt, ...)
{
va_list va;
char c;
va_start(va, fmt);
while ((c = *(fmt++))) {
if (c == '%') {
switch ((c = *(fmt++))) {
case 'd':
c_itoa(va_arg(va, int), 10);
break;
case 'u':
c_utoa(va_arg(va, unsigned), 10);
break;
case 'x':
case 'p':
c_utoa(va_arg(va, unsigned), 16);
break;
case 's':
c_printstr(va_arg(va, const char *));
break;
case 'c':
c_putc(va_arg(va, char));
break;
case '%':
c_llputc('%');
break;
}
} else {
c_putc(c);
}
}
va_end(va);
}
void c_putc(char c)
{
if (c == '\n') {
c_llputc('\r');
}
c_llputc(c);
}
void c_puts(const char *s)
{
char c;
while ((c = *(s++))) {
c_putc(c);
}
c_putc('\n');
}