This is a port of the mruby/c tutorial Chapter 03 to the mbed environment.
For details, refer to the following.
http://www.s-itoc.jp/activity/research/mrubyc/mrubyc_tutorial/436
Note:There is a change in rtt0.h from the original source in the mruby/c. It was necessary for inclusion in C ++ source.
mrubyc/console.c@0:33feccbba3ff, 2017-02-15 (annotated)
- Committer:
- tk_takateku
- Date:
- Wed Feb 15 01:03:35 2017 +0000
- Revision:
- 0:33feccbba3ff
Commit before publishing
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
tk_takateku | 0:33feccbba3ff | 1 | /*! @file |
tk_takateku | 0:33feccbba3ff | 2 | @brief |
tk_takateku | 0:33feccbba3ff | 3 | console I/O module. |
tk_takateku | 0:33feccbba3ff | 4 | |
tk_takateku | 0:33feccbba3ff | 5 | <pre> |
tk_takateku | 0:33feccbba3ff | 6 | Copyright (C) 2015 Kyushu Institute of Technology. |
tk_takateku | 0:33feccbba3ff | 7 | Copyright (C) 2015 Shimane IT Open-Innovation Center. |
tk_takateku | 0:33feccbba3ff | 8 | |
tk_takateku | 0:33feccbba3ff | 9 | This file is distributed under BSD 3-Clause License. |
tk_takateku | 0:33feccbba3ff | 10 | |
tk_takateku | 0:33feccbba3ff | 11 | </pre> |
tk_takateku | 0:33feccbba3ff | 12 | */ |
tk_takateku | 0:33feccbba3ff | 13 | |
tk_takateku | 0:33feccbba3ff | 14 | #include <stdarg.h> |
tk_takateku | 0:33feccbba3ff | 15 | #include <string.h> |
tk_takateku | 0:33feccbba3ff | 16 | #include <stdint.h> |
tk_takateku | 0:33feccbba3ff | 17 | #include "hal/hal.h" |
tk_takateku | 0:33feccbba3ff | 18 | #include "console.h" |
tk_takateku | 0:33feccbba3ff | 19 | |
tk_takateku | 0:33feccbba3ff | 20 | |
tk_takateku | 0:33feccbba3ff | 21 | //================================================================ |
tk_takateku | 0:33feccbba3ff | 22 | /*! output string with format |
tk_takateku | 0:33feccbba3ff | 23 | |
tk_takateku | 0:33feccbba3ff | 24 | @param value output value |
tk_takateku | 0:33feccbba3ff | 25 | @param align left(-1) or right(1) |
tk_takateku | 0:33feccbba3ff | 26 | @param w width |
tk_takateku | 0:33feccbba3ff | 27 | @param base n base |
tk_takateku | 0:33feccbba3ff | 28 | @param pad padding character |
tk_takateku | 0:33feccbba3ff | 29 | */ |
tk_takateku | 0:33feccbba3ff | 30 | static void format_output_str(const char *value, int align, int w, char pad) |
tk_takateku | 0:33feccbba3ff | 31 | { |
tk_takateku | 0:33feccbba3ff | 32 | if( !value ) return; |
tk_takateku | 0:33feccbba3ff | 33 | |
tk_takateku | 0:33feccbba3ff | 34 | int len = strlen(value); |
tk_takateku | 0:33feccbba3ff | 35 | int n_pad = w - len; |
tk_takateku | 0:33feccbba3ff | 36 | |
tk_takateku | 0:33feccbba3ff | 37 | if( align == 1 ) { |
tk_takateku | 0:33feccbba3ff | 38 | while( n_pad-- > 0 ) { |
tk_takateku | 0:33feccbba3ff | 39 | console_putchar(pad); |
tk_takateku | 0:33feccbba3ff | 40 | } |
tk_takateku | 0:33feccbba3ff | 41 | } |
tk_takateku | 0:33feccbba3ff | 42 | hal_write(1, value, len); |
tk_takateku | 0:33feccbba3ff | 43 | while( n_pad-- > 0 ) { |
tk_takateku | 0:33feccbba3ff | 44 | console_putchar(pad); |
tk_takateku | 0:33feccbba3ff | 45 | } |
tk_takateku | 0:33feccbba3ff | 46 | } |
tk_takateku | 0:33feccbba3ff | 47 | |
tk_takateku | 0:33feccbba3ff | 48 | |
tk_takateku | 0:33feccbba3ff | 49 | //================================================================ |
tk_takateku | 0:33feccbba3ff | 50 | /*! output int value with format |
tk_takateku | 0:33feccbba3ff | 51 | |
tk_takateku | 0:33feccbba3ff | 52 | @param value output value |
tk_takateku | 0:33feccbba3ff | 53 | @param align left(-1) or right(1) |
tk_takateku | 0:33feccbba3ff | 54 | @param w width |
tk_takateku | 0:33feccbba3ff | 55 | @param base n base |
tk_takateku | 0:33feccbba3ff | 56 | @param pad padding character |
tk_takateku | 0:33feccbba3ff | 57 | */ |
tk_takateku | 0:33feccbba3ff | 58 | static void format_output_int(int32_t value, int align, int w, int base, char pad) |
tk_takateku | 0:33feccbba3ff | 59 | { |
tk_takateku | 0:33feccbba3ff | 60 | char buf[21]; |
tk_takateku | 0:33feccbba3ff | 61 | int sign = 0; |
tk_takateku | 0:33feccbba3ff | 62 | int idx = sizeof(buf); |
tk_takateku | 0:33feccbba3ff | 63 | buf[--idx] = 0; |
tk_takateku | 0:33feccbba3ff | 64 | |
tk_takateku | 0:33feccbba3ff | 65 | if( value < 0 ) { |
tk_takateku | 0:33feccbba3ff | 66 | sign = -1; |
tk_takateku | 0:33feccbba3ff | 67 | value = -value; |
tk_takateku | 0:33feccbba3ff | 68 | } |
tk_takateku | 0:33feccbba3ff | 69 | |
tk_takateku | 0:33feccbba3ff | 70 | do { |
tk_takateku | 0:33feccbba3ff | 71 | buf[--idx] = "0123456789ABCDEF"[value % base]; |
tk_takateku | 0:33feccbba3ff | 72 | value /= base; |
tk_takateku | 0:33feccbba3ff | 73 | } while( value != 0 && idx != 0 ); |
tk_takateku | 0:33feccbba3ff | 74 | |
tk_takateku | 0:33feccbba3ff | 75 | if( sign < 0 && align > 0 && pad == '0' ) { |
tk_takateku | 0:33feccbba3ff | 76 | console_putchar('-'); // when "%08d",-12345 then "-0012345" |
tk_takateku | 0:33feccbba3ff | 77 | w--; |
tk_takateku | 0:33feccbba3ff | 78 | } else if( sign < 0 && idx != 0 ) { |
tk_takateku | 0:33feccbba3ff | 79 | buf[--idx] = '-'; |
tk_takateku | 0:33feccbba3ff | 80 | } |
tk_takateku | 0:33feccbba3ff | 81 | |
tk_takateku | 0:33feccbba3ff | 82 | format_output_str(buf + idx, align, w, pad); |
tk_takateku | 0:33feccbba3ff | 83 | } |
tk_takateku | 0:33feccbba3ff | 84 | |
tk_takateku | 0:33feccbba3ff | 85 | |
tk_takateku | 0:33feccbba3ff | 86 | //================================================================ |
tk_takateku | 0:33feccbba3ff | 87 | /*! output unsigned int value with format |
tk_takateku | 0:33feccbba3ff | 88 | |
tk_takateku | 0:33feccbba3ff | 89 | @param value output value |
tk_takateku | 0:33feccbba3ff | 90 | @param align left(-1) or right(1) |
tk_takateku | 0:33feccbba3ff | 91 | @param w width |
tk_takateku | 0:33feccbba3ff | 92 | @param base n base |
tk_takateku | 0:33feccbba3ff | 93 | @param pad padding character |
tk_takateku | 0:33feccbba3ff | 94 | */ |
tk_takateku | 0:33feccbba3ff | 95 | static void format_output_uint(uint32_t value, int align, int w, int base, char pad) |
tk_takateku | 0:33feccbba3ff | 96 | { |
tk_takateku | 0:33feccbba3ff | 97 | char buf[21]; |
tk_takateku | 0:33feccbba3ff | 98 | int idx = sizeof(buf); |
tk_takateku | 0:33feccbba3ff | 99 | buf[--idx] = 0; |
tk_takateku | 0:33feccbba3ff | 100 | |
tk_takateku | 0:33feccbba3ff | 101 | do { |
tk_takateku | 0:33feccbba3ff | 102 | buf[--idx] = "0123456789ABCDEF"[value % base]; |
tk_takateku | 0:33feccbba3ff | 103 | value /= base; |
tk_takateku | 0:33feccbba3ff | 104 | } while( value != 0 && idx != 0 ); |
tk_takateku | 0:33feccbba3ff | 105 | |
tk_takateku | 0:33feccbba3ff | 106 | format_output_str(buf + idx, align, w, pad); |
tk_takateku | 0:33feccbba3ff | 107 | } |
tk_takateku | 0:33feccbba3ff | 108 | |
tk_takateku | 0:33feccbba3ff | 109 | |
tk_takateku | 0:33feccbba3ff | 110 | //================================================================ |
tk_takateku | 0:33feccbba3ff | 111 | /*! output a character |
tk_takateku | 0:33feccbba3ff | 112 | |
tk_takateku | 0:33feccbba3ff | 113 | @param c character |
tk_takateku | 0:33feccbba3ff | 114 | */ |
tk_takateku | 0:33feccbba3ff | 115 | void console_putchar(char c) |
tk_takateku | 0:33feccbba3ff | 116 | { |
tk_takateku | 0:33feccbba3ff | 117 | hal_write(1, &c, 1); |
tk_takateku | 0:33feccbba3ff | 118 | } |
tk_takateku | 0:33feccbba3ff | 119 | |
tk_takateku | 0:33feccbba3ff | 120 | |
tk_takateku | 0:33feccbba3ff | 121 | //================================================================ |
tk_takateku | 0:33feccbba3ff | 122 | /*! output string |
tk_takateku | 0:33feccbba3ff | 123 | |
tk_takateku | 0:33feccbba3ff | 124 | @param str str |
tk_takateku | 0:33feccbba3ff | 125 | */ |
tk_takateku | 0:33feccbba3ff | 126 | void console_print(const char *str) |
tk_takateku | 0:33feccbba3ff | 127 | { |
tk_takateku | 0:33feccbba3ff | 128 | hal_write(1, str, strlen(str)); |
tk_takateku | 0:33feccbba3ff | 129 | } |
tk_takateku | 0:33feccbba3ff | 130 | |
tk_takateku | 0:33feccbba3ff | 131 | |
tk_takateku | 0:33feccbba3ff | 132 | //================================================================ |
tk_takateku | 0:33feccbba3ff | 133 | /*! output formatted string |
tk_takateku | 0:33feccbba3ff | 134 | |
tk_takateku | 0:33feccbba3ff | 135 | @param fmt format string. |
tk_takateku | 0:33feccbba3ff | 136 | @note |
tk_takateku | 0:33feccbba3ff | 137 | */ |
tk_takateku | 0:33feccbba3ff | 138 | void console_printf(const char *fmt, ...) |
tk_takateku | 0:33feccbba3ff | 139 | { |
tk_takateku | 0:33feccbba3ff | 140 | va_list params; |
tk_takateku | 0:33feccbba3ff | 141 | va_start(params, fmt); |
tk_takateku | 0:33feccbba3ff | 142 | |
tk_takateku | 0:33feccbba3ff | 143 | int c; |
tk_takateku | 0:33feccbba3ff | 144 | while((c = *fmt++)) { |
tk_takateku | 0:33feccbba3ff | 145 | if( c != '%' ) { |
tk_takateku | 0:33feccbba3ff | 146 | console_putchar(c); |
tk_takateku | 0:33feccbba3ff | 147 | continue; |
tk_takateku | 0:33feccbba3ff | 148 | } |
tk_takateku | 0:33feccbba3ff | 149 | |
tk_takateku | 0:33feccbba3ff | 150 | int align = 1; // left(-1) or right(1) |
tk_takateku | 0:33feccbba3ff | 151 | char pad = ' '; // padding |
tk_takateku | 0:33feccbba3ff | 152 | int w = 0; // width |
tk_takateku | 0:33feccbba3ff | 153 | while( 1 ) { |
tk_takateku | 0:33feccbba3ff | 154 | switch( (c = *fmt++) ) { |
tk_takateku | 0:33feccbba3ff | 155 | case '-': |
tk_takateku | 0:33feccbba3ff | 156 | align = -1; |
tk_takateku | 0:33feccbba3ff | 157 | break; |
tk_takateku | 0:33feccbba3ff | 158 | |
tk_takateku | 0:33feccbba3ff | 159 | case '0': |
tk_takateku | 0:33feccbba3ff | 160 | if( pad == ' ' ) { |
tk_takateku | 0:33feccbba3ff | 161 | pad = '0'; |
tk_takateku | 0:33feccbba3ff | 162 | break; |
tk_takateku | 0:33feccbba3ff | 163 | } |
tk_takateku | 0:33feccbba3ff | 164 | // fall through. |
tk_takateku | 0:33feccbba3ff | 165 | |
tk_takateku | 0:33feccbba3ff | 166 | case '1': case '2': case '3': case '4': case '5': |
tk_takateku | 0:33feccbba3ff | 167 | case '6': case '7': case '8': case '9': |
tk_takateku | 0:33feccbba3ff | 168 | w = w * 10 + (c - '0'); |
tk_takateku | 0:33feccbba3ff | 169 | break; |
tk_takateku | 0:33feccbba3ff | 170 | |
tk_takateku | 0:33feccbba3ff | 171 | case '\0': |
tk_takateku | 0:33feccbba3ff | 172 | goto L_return; |
tk_takateku | 0:33feccbba3ff | 173 | |
tk_takateku | 0:33feccbba3ff | 174 | default: |
tk_takateku | 0:33feccbba3ff | 175 | goto L_exit; |
tk_takateku | 0:33feccbba3ff | 176 | } |
tk_takateku | 0:33feccbba3ff | 177 | } |
tk_takateku | 0:33feccbba3ff | 178 | |
tk_takateku | 0:33feccbba3ff | 179 | L_exit: |
tk_takateku | 0:33feccbba3ff | 180 | switch(c) { |
tk_takateku | 0:33feccbba3ff | 181 | case 's': |
tk_takateku | 0:33feccbba3ff | 182 | format_output_str(va_arg(params, char *), align, w, pad); |
tk_takateku | 0:33feccbba3ff | 183 | break; |
tk_takateku | 0:33feccbba3ff | 184 | |
tk_takateku | 0:33feccbba3ff | 185 | case 'd': |
tk_takateku | 0:33feccbba3ff | 186 | case 'i': |
tk_takateku | 0:33feccbba3ff | 187 | format_output_int(va_arg(params, int), align, w, 10, pad); |
tk_takateku | 0:33feccbba3ff | 188 | break; |
tk_takateku | 0:33feccbba3ff | 189 | |
tk_takateku | 0:33feccbba3ff | 190 | case 'u': |
tk_takateku | 0:33feccbba3ff | 191 | format_output_uint(va_arg(params, unsigned int), align, w, 10, pad); |
tk_takateku | 0:33feccbba3ff | 192 | break; |
tk_takateku | 0:33feccbba3ff | 193 | |
tk_takateku | 0:33feccbba3ff | 194 | case 'X': |
tk_takateku | 0:33feccbba3ff | 195 | case 'x': |
tk_takateku | 0:33feccbba3ff | 196 | format_output_uint(va_arg(params, unsigned int), align, w, 16, pad); |
tk_takateku | 0:33feccbba3ff | 197 | break; |
tk_takateku | 0:33feccbba3ff | 198 | |
tk_takateku | 0:33feccbba3ff | 199 | case 'c': |
tk_takateku | 0:33feccbba3ff | 200 | console_putchar(va_arg(params, int)); // ignore "%03c" and others. |
tk_takateku | 0:33feccbba3ff | 201 | break; |
tk_takateku | 0:33feccbba3ff | 202 | |
tk_takateku | 0:33feccbba3ff | 203 | default: |
tk_takateku | 0:33feccbba3ff | 204 | console_putchar(c); |
tk_takateku | 0:33feccbba3ff | 205 | } |
tk_takateku | 0:33feccbba3ff | 206 | } |
tk_takateku | 0:33feccbba3ff | 207 | |
tk_takateku | 0:33feccbba3ff | 208 | L_return: |
tk_takateku | 0:33feccbba3ff | 209 | va_end(params); |
tk_takateku | 0:33feccbba3ff | 210 | } |
tk_takateku | 0:33feccbba3ff | 211 |