lr/err.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);
}