Skip to content

Commit

Permalink
Implemented sprintf function.
Browse files Browse the repository at this point in the history
  • Loading branch information
shoily committed Jul 7, 2021
1 parent a2ff1fc commit d23fa45
Show file tree
Hide file tree
Showing 3 changed files with 98 additions and 15 deletions.
13 changes: 0 additions & 13 deletions debug.c
Original file line number Diff line number Diff line change
Expand Up @@ -28,19 +28,6 @@ void debug_init() {
INIT_SPIN_LOCK(&lock_debug_mem);
}

typedef enum _va_type {

VA_BYTE = 0,
VA_PERCENT = 1,
VA_CHAR = 2,
VA_UCHAR = 3,
VA_INT = 4,
VA_UINT = 5,
VA_HEX = 6,
VA_SHORT = 7,
VA_USHORT = 8
} va_type;

#define DEBUG_BUFFER_SIZE 4096

#define WRITE_TO_BUF(addr, ch) { \
Expand Down
82 changes: 82 additions & 0 deletions util.c
Original file line number Diff line number Diff line change
Expand Up @@ -200,3 +200,85 @@ int strncmp(const char *s1, const char *s2, size_t len) {

return 0;
}

void sprintf(char *buf, char *fmt, ...) {

va_list list;
va_start(fmt, list);
char *p = fmt;
char *ptr;

union {
char c;
int i;
unsigned int u;
long long ll;
char *s;
void *p;
} val;
char str[20];

while(*p) {

if (*p == '%') {
p++;
if (*p == 37 || *p == '\0') {

*buf++ = 37;
} else {

if (*p == 'c') {

val.c = va_arg(list, char);
*buf++ = val.c;
} else if (*p == 'i' || *p == 'd' || *p == 'x') {

val.i = va_arg(list, int);
itoa(val.i, str, (*p == 'x') ? 16 : 10);
ptr = str;
while(*ptr) {
*buf++=*ptr++;
}
} else if (*p == 'p') {

val.p = va_arg(list, void*);
ptrtoa(val.p, str, 16);
ptr = str;
while(*ptr) {
*buf++=*ptr++;
}
} else if (*p == 'u') {

val.u = va_arg(list, unsigned int);
lltoa(val.u, str, 10);
ptr = str;
while(*ptr) {
*buf++=*ptr++;
}
} else if (*p == 'l' && *(p+1) == 'l') {

p++;
val.ll = va_arg(list, long long);
lltoa(val.ll,str, 10);
ptr = str;
while(*ptr) {
*buf++=*ptr++;
}
} else if (*p == 's') {

ptr = val.s = va_arg(list, char*);
while(*ptr) {
*buf++=*ptr++;
}
}
}
} else {

*buf++=*p;
}

p++;
}

*buf='\0';
}
18 changes: 16 additions & 2 deletions util.h
Original file line number Diff line number Diff line change
Expand Up @@ -32,5 +32,19 @@ void itoa(int val, char *str, int base);
void ltoa(long val, char *str, int base);
void lltoa(long long val, char *str, int base);
void ptrtoa(void *val, char *str, bool maxfill);

#endif // _COMMON_H
void sprintf(char *buf, char *fmt, ...);

typedef enum _va_type {

VA_BYTE = 0,
VA_PERCENT = 1,
VA_CHAR = 2,
VA_UCHAR = 3,
VA_INT = 4,
VA_UINT = 5,
VA_HEX = 6,
VA_SHORT = 7,
VA_USHORT = 8
} va_type;

#endif // _UTIL_H

0 comments on commit d23fa45

Please sign in to comment.