git.y1.nz

gbdk-2020

GameBoy Development Kit
download: https://git.y1.nz/archives/gbdk.tar.gz
README | Files | Log | Refs | LICENSE

gbdk-lib/libc/targets/sm83/gprintf.c

      1 #include <stdint.h>
      2 #include <stdarg.h>
      3 #include <gb/drawing.h>
      4 
      5 int8_t gprintf(char *fmt, ...) NONBANKED
      6 {
      7   va_list ap;
      8   int8_t nb = 0;
      9 
     10   va_start(ap, fmt);
     11   for(; *fmt; fmt++)
     12     if(*fmt == '%') {
     13       switch(*++fmt) {
     14       case 'c': {
     15 	/* char */
     16 	  char c = va_arg(ap, char);
     17 	  wrtchr(c);
     18 	  break;
     19       }
     20       case 'd': {
     21 	/* decimal int */
     22 	  int8_t b = va_arg(ap, int8_t);
     23 	  gprintn(b, 10, SIGNED);
     24 	  break;
     25       }
     26       case 'u': {
     27 	  /* unsigned int */
     28 	  int8_t b = (int8_t)va_arg(ap, int);
     29 	  gprintn(b, 10, UNSIGNED);
     30 	  break;
     31       }
     32       case 'o': {
     33 	  /* octal int */
     34 	  int8_t b = va_arg(ap, int8_t);
     35 	  gprintn(b, 8, UNSIGNED);
     36 	  break;
     37       }
     38       case 'x': {
     39 	  /* hexadecimal int */
     40 	  int8_t b = va_arg(ap, int8_t);
     41 	  gprintn(b, 16, UNSIGNED);
     42 	  break;
     43       }
     44       case 's': {
     45 	  /* string */
     46 	  char *s = va_arg(ap, char *);
     47 	  gprint(s);
     48 	  break;
     49       }
     50 #if 0
     51       case 'l':
     52 	/* long */
     53 	switch(*++fmt) {
     54 	case 'd':
     55 	  /* decimal long */
     56 	  gprintln(va_arg(ap, int16_t), 10, SIGNED);
     57 	  break;
     58 	case 'u':
     59 	  /* unsigned long */
     60 	  gprintln(va_arg(ap, int16_t), 10, UNSIGNED);
     61 	  break;
     62 	case 'o':
     63 	  /* octal long */
     64 	  gprintln(va_arg(ap, int16_t), 8, UNSIGNED);
     65 	  break;
     66 	case 'x':
     67 	  /* hexadecimal long */
     68 	  gprintln(va_arg(ap, int16_t), 16, UNSIGNED);
     69 	  break;
     70 	}
     71 	break;
     72 #endif
     73       case '%':
     74 	/* % */
     75 	wrtchr(*fmt);
     76 	break;
     77       default:
     78 	return -1;
     79       }
     80       nb++;
     81     } else
     82       wrtchr(*fmt);
     83   va_end(ap);
     84 
     85   return nb;
     86 }

This webpage is intended to be an accessible preview of this repository. To get a fuller picture, clone it and use the git CLI.