This is a port of the mruby/c tutorial Chapter 03 to the mbed environment.

Dependencies:   mbed

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.

Committer:
tk_takateku
Date:
Wed Feb 15 01:03:35 2017 +0000
Revision:
0:33feccbba3ff
Commit before publishing

Who changed what in which revision?

UserRevisionLine numberNew 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