82 lines
1.1 KiB
C
82 lines
1.1 KiB
C
#include<stdio.h>
|
|
#include<stdarg.h>
|
|
#include<unistd.h>
|
|
#include"err.h"
|
|
#include"vec.h"
|
|
#include"str.h"
|
|
#include"sprint.h"
|
|
|
|
void err_log(char*fmt,...)
|
|
{
|
|
Str str=str_new();
|
|
va_list va;
|
|
|
|
char*strptr;
|
|
static char sbuffer[1024];
|
|
uint32_t ibuffer;
|
|
|
|
if(!fmt)return;
|
|
va_start(va,fmt);
|
|
|
|
for(size_t i=0;fmt[i];++i)
|
|
{
|
|
if(fmt[i]=='%')
|
|
{
|
|
++i;
|
|
if(!fmt[i])break;
|
|
switch(fmt[i])
|
|
{
|
|
|
|
case 'i':
|
|
case 'd':
|
|
case 'u':
|
|
ibuffer=va_arg(va,uint32_t);
|
|
sprint(sbuffer,"%u",ibuffer);
|
|
str_append(&str,sbuffer);
|
|
break;
|
|
|
|
case 'x':
|
|
ibuffer=va_arg(va,uint32_t);
|
|
sprint(sbuffer,"%x",ibuffer);
|
|
str_append(&str,sbuffer);
|
|
break;
|
|
|
|
case 'c':
|
|
sbuffer[0]=va_arg(va,int);
|
|
sbuffer[1]=0;
|
|
str_append(&str,sbuffer);
|
|
break;
|
|
|
|
case 's':
|
|
strptr=va_arg(va,char*);
|
|
str_append(&str,strptr);
|
|
break;
|
|
|
|
default:
|
|
break;
|
|
}
|
|
}
|
|
|
|
else
|
|
{
|
|
sbuffer[0]=fmt[i];
|
|
sbuffer[1]=0;
|
|
str_append(&str,sbuffer);
|
|
}
|
|
}
|
|
|
|
va_end(va);
|
|
|
|
{
|
|
char b[1024];
|
|
int n=sprint(b,"%serror%s: %s\n",
|
|
"\033[31m",
|
|
"\033[0m",
|
|
str.buffer
|
|
);
|
|
write(2,b,n);
|
|
}
|
|
|
|
str_free(&str);
|
|
}
|