Kunimasa Noda
/
lpc812_mlx90620
MLX90620 Viewer
xprintf.c@0:a2d3a9f771b8, 2014-04-04 (annotated)
- Committer:
- kunipm9
- Date:
- Fri Apr 04 14:01:24 2014 +0000
- Revision:
- 0:a2d3a9f771b8
1st
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
kunipm9 | 0:a2d3a9f771b8 | 1 | /*------------------------------------------------------------------------/ |
kunipm9 | 0:a2d3a9f771b8 | 2 | / Universal string handler for user console interface |
kunipm9 | 0:a2d3a9f771b8 | 3 | /-------------------------------------------------------------------------/ |
kunipm9 | 0:a2d3a9f771b8 | 4 | / |
kunipm9 | 0:a2d3a9f771b8 | 5 | / Copyright (C) 2011, ChaN, all right reserved. |
kunipm9 | 0:a2d3a9f771b8 | 6 | / |
kunipm9 | 0:a2d3a9f771b8 | 7 | / * This software is a free software and there is NO WARRANTY. |
kunipm9 | 0:a2d3a9f771b8 | 8 | / * No restriction on use. You can use, modify and redistribute it for |
kunipm9 | 0:a2d3a9f771b8 | 9 | / personal, non-profit or commercial products UNDER YOUR RESPONSIBILITY. |
kunipm9 | 0:a2d3a9f771b8 | 10 | / * Redistributions of source code must retain the above copyright notice. |
kunipm9 | 0:a2d3a9f771b8 | 11 | / |
kunipm9 | 0:a2d3a9f771b8 | 12 | /-------------------------------------------------------------------------*/ |
kunipm9 | 0:a2d3a9f771b8 | 13 | |
kunipm9 | 0:a2d3a9f771b8 | 14 | #include "xprintf.h" |
kunipm9 | 0:a2d3a9f771b8 | 15 | |
kunipm9 | 0:a2d3a9f771b8 | 16 | |
kunipm9 | 0:a2d3a9f771b8 | 17 | #if _USE_XFUNC_OUT |
kunipm9 | 0:a2d3a9f771b8 | 18 | #include <stdarg.h> |
kunipm9 | 0:a2d3a9f771b8 | 19 | void (*xfunc_out)(unsigned char); /* Pointer to the output stream */ |
kunipm9 | 0:a2d3a9f771b8 | 20 | static char *outptr; |
kunipm9 | 0:a2d3a9f771b8 | 21 | |
kunipm9 | 0:a2d3a9f771b8 | 22 | /*----------------------------------------------*/ |
kunipm9 | 0:a2d3a9f771b8 | 23 | /* Put a character */ |
kunipm9 | 0:a2d3a9f771b8 | 24 | /*----------------------------------------------*/ |
kunipm9 | 0:a2d3a9f771b8 | 25 | |
kunipm9 | 0:a2d3a9f771b8 | 26 | void xputc (char c) |
kunipm9 | 0:a2d3a9f771b8 | 27 | { |
kunipm9 | 0:a2d3a9f771b8 | 28 | if (_CR_CRLF && c == '\n') xputc('\r'); /* CR -> CRLF */ |
kunipm9 | 0:a2d3a9f771b8 | 29 | |
kunipm9 | 0:a2d3a9f771b8 | 30 | if (outptr) { |
kunipm9 | 0:a2d3a9f771b8 | 31 | *outptr++ = (unsigned char)c; |
kunipm9 | 0:a2d3a9f771b8 | 32 | return; |
kunipm9 | 0:a2d3a9f771b8 | 33 | } |
kunipm9 | 0:a2d3a9f771b8 | 34 | |
kunipm9 | 0:a2d3a9f771b8 | 35 | if (xfunc_out) xfunc_out((unsigned char)c); |
kunipm9 | 0:a2d3a9f771b8 | 36 | } |
kunipm9 | 0:a2d3a9f771b8 | 37 | |
kunipm9 | 0:a2d3a9f771b8 | 38 | |
kunipm9 | 0:a2d3a9f771b8 | 39 | |
kunipm9 | 0:a2d3a9f771b8 | 40 | /*----------------------------------------------*/ |
kunipm9 | 0:a2d3a9f771b8 | 41 | /* Put a null-terminated string */ |
kunipm9 | 0:a2d3a9f771b8 | 42 | /*----------------------------------------------*/ |
kunipm9 | 0:a2d3a9f771b8 | 43 | |
kunipm9 | 0:a2d3a9f771b8 | 44 | void xputs ( /* Put a string to the default device */ |
kunipm9 | 0:a2d3a9f771b8 | 45 | const char* str /* Pointer to the string */ |
kunipm9 | 0:a2d3a9f771b8 | 46 | ) |
kunipm9 | 0:a2d3a9f771b8 | 47 | { |
kunipm9 | 0:a2d3a9f771b8 | 48 | while (*str) |
kunipm9 | 0:a2d3a9f771b8 | 49 | xputc(*str++); |
kunipm9 | 0:a2d3a9f771b8 | 50 | } |
kunipm9 | 0:a2d3a9f771b8 | 51 | |
kunipm9 | 0:a2d3a9f771b8 | 52 | |
kunipm9 | 0:a2d3a9f771b8 | 53 | void xfputs ( /* Put a string to the specified device */ |
kunipm9 | 0:a2d3a9f771b8 | 54 | void(*func)(unsigned char), /* Pointer to the output function */ |
kunipm9 | 0:a2d3a9f771b8 | 55 | const char* str /* Pointer to the string */ |
kunipm9 | 0:a2d3a9f771b8 | 56 | ) |
kunipm9 | 0:a2d3a9f771b8 | 57 | { |
kunipm9 | 0:a2d3a9f771b8 | 58 | void (*pf)(unsigned char); |
kunipm9 | 0:a2d3a9f771b8 | 59 | |
kunipm9 | 0:a2d3a9f771b8 | 60 | |
kunipm9 | 0:a2d3a9f771b8 | 61 | pf = xfunc_out; /* Save current output device */ |
kunipm9 | 0:a2d3a9f771b8 | 62 | xfunc_out = func; /* Switch output to specified device */ |
kunipm9 | 0:a2d3a9f771b8 | 63 | while (*str) /* Put the string */ |
kunipm9 | 0:a2d3a9f771b8 | 64 | xputc(*str++); |
kunipm9 | 0:a2d3a9f771b8 | 65 | xfunc_out = pf; /* Restore output device */ |
kunipm9 | 0:a2d3a9f771b8 | 66 | } |
kunipm9 | 0:a2d3a9f771b8 | 67 | |
kunipm9 | 0:a2d3a9f771b8 | 68 | |
kunipm9 | 0:a2d3a9f771b8 | 69 | |
kunipm9 | 0:a2d3a9f771b8 | 70 | /*----------------------------------------------*/ |
kunipm9 | 0:a2d3a9f771b8 | 71 | /* Formatted string output */ |
kunipm9 | 0:a2d3a9f771b8 | 72 | /*----------------------------------------------*/ |
kunipm9 | 0:a2d3a9f771b8 | 73 | /* xprintf("%d", 1234); "1234" |
kunipm9 | 0:a2d3a9f771b8 | 74 | xprintf("%6d,%3d%%", -200, 5); " -200, 5%" |
kunipm9 | 0:a2d3a9f771b8 | 75 | xprintf("%-6u", 100); "100 " |
kunipm9 | 0:a2d3a9f771b8 | 76 | xprintf("%ld", 12345678L); "12345678" |
kunipm9 | 0:a2d3a9f771b8 | 77 | xprintf("%04x", 0xA3); "00a3" |
kunipm9 | 0:a2d3a9f771b8 | 78 | xprintf("%08LX", 0x123ABC); "00123ABC" |
kunipm9 | 0:a2d3a9f771b8 | 79 | xprintf("%016b", 0x550F); "0101010100001111" |
kunipm9 | 0:a2d3a9f771b8 | 80 | xprintf("%s", "String"); "String" |
kunipm9 | 0:a2d3a9f771b8 | 81 | xprintf("%-4s", "abc"); "abc " |
kunipm9 | 0:a2d3a9f771b8 | 82 | xprintf("%4s", "abc"); " abc" |
kunipm9 | 0:a2d3a9f771b8 | 83 | xprintf("%c", 'a'); "a" |
kunipm9 | 0:a2d3a9f771b8 | 84 | xprintf("%f", 10.0); <xprintf lacks floating point support> |
kunipm9 | 0:a2d3a9f771b8 | 85 | */ |
kunipm9 | 0:a2d3a9f771b8 | 86 | |
kunipm9 | 0:a2d3a9f771b8 | 87 | static |
kunipm9 | 0:a2d3a9f771b8 | 88 | void xvprintf ( |
kunipm9 | 0:a2d3a9f771b8 | 89 | const char* fmt, /* Pointer to the format string */ |
kunipm9 | 0:a2d3a9f771b8 | 90 | va_list arp /* Pointer to arguments */ |
kunipm9 | 0:a2d3a9f771b8 | 91 | ) |
kunipm9 | 0:a2d3a9f771b8 | 92 | { |
kunipm9 | 0:a2d3a9f771b8 | 93 | unsigned int r, i, j, w, f; |
kunipm9 | 0:a2d3a9f771b8 | 94 | unsigned long v; |
kunipm9 | 0:a2d3a9f771b8 | 95 | char s[16], c, d, *p; |
kunipm9 | 0:a2d3a9f771b8 | 96 | |
kunipm9 | 0:a2d3a9f771b8 | 97 | |
kunipm9 | 0:a2d3a9f771b8 | 98 | for (;;) { |
kunipm9 | 0:a2d3a9f771b8 | 99 | c = *fmt++; /* Get a char */ |
kunipm9 | 0:a2d3a9f771b8 | 100 | if (!c) break; /* End of format? */ |
kunipm9 | 0:a2d3a9f771b8 | 101 | if (c != '%') { /* Pass through it if not a % sequense */ |
kunipm9 | 0:a2d3a9f771b8 | 102 | xputc(c); continue; |
kunipm9 | 0:a2d3a9f771b8 | 103 | } |
kunipm9 | 0:a2d3a9f771b8 | 104 | f = 0; |
kunipm9 | 0:a2d3a9f771b8 | 105 | c = *fmt++; /* Get first char of the sequense */ |
kunipm9 | 0:a2d3a9f771b8 | 106 | if (c == '0') { /* Flag: '0' padded */ |
kunipm9 | 0:a2d3a9f771b8 | 107 | f = 1; c = *fmt++; |
kunipm9 | 0:a2d3a9f771b8 | 108 | } else { |
kunipm9 | 0:a2d3a9f771b8 | 109 | if (c == '-') { /* Flag: left justified */ |
kunipm9 | 0:a2d3a9f771b8 | 110 | f = 2; c = *fmt++; |
kunipm9 | 0:a2d3a9f771b8 | 111 | } |
kunipm9 | 0:a2d3a9f771b8 | 112 | } |
kunipm9 | 0:a2d3a9f771b8 | 113 | for (w = 0; c >= '0' && c <= '9'; c = *fmt++) /* Minimum width */ |
kunipm9 | 0:a2d3a9f771b8 | 114 | w = w * 10 + c - '0'; |
kunipm9 | 0:a2d3a9f771b8 | 115 | if (c == 'l' || c == 'L') { /* Prefix: Size is long int */ |
kunipm9 | 0:a2d3a9f771b8 | 116 | f |= 4; c = *fmt++; |
kunipm9 | 0:a2d3a9f771b8 | 117 | } |
kunipm9 | 0:a2d3a9f771b8 | 118 | if (!c) break; /* End of format? */ |
kunipm9 | 0:a2d3a9f771b8 | 119 | d = c; |
kunipm9 | 0:a2d3a9f771b8 | 120 | if (d >= 'a') d -= 0x20; |
kunipm9 | 0:a2d3a9f771b8 | 121 | switch (d) { /* Type is... */ |
kunipm9 | 0:a2d3a9f771b8 | 122 | case 'S' : /* String */ |
kunipm9 | 0:a2d3a9f771b8 | 123 | p = va_arg(arp, char*); |
kunipm9 | 0:a2d3a9f771b8 | 124 | for (j = 0; p[j]; j++) ; |
kunipm9 | 0:a2d3a9f771b8 | 125 | while (!(f & 2) && j++ < w) xputc(' '); |
kunipm9 | 0:a2d3a9f771b8 | 126 | xputs(p); |
kunipm9 | 0:a2d3a9f771b8 | 127 | while (j++ < w) xputc(' '); |
kunipm9 | 0:a2d3a9f771b8 | 128 | continue; |
kunipm9 | 0:a2d3a9f771b8 | 129 | case 'C' : /* Character */ |
kunipm9 | 0:a2d3a9f771b8 | 130 | xputc((char)va_arg(arp, int)); continue; |
kunipm9 | 0:a2d3a9f771b8 | 131 | case 'B' : /* Binary */ |
kunipm9 | 0:a2d3a9f771b8 | 132 | r = 2; break; |
kunipm9 | 0:a2d3a9f771b8 | 133 | case 'O' : /* Octal */ |
kunipm9 | 0:a2d3a9f771b8 | 134 | r = 8; break; |
kunipm9 | 0:a2d3a9f771b8 | 135 | case 'D' : /* Signed decimal */ |
kunipm9 | 0:a2d3a9f771b8 | 136 | case 'U' : /* Unsigned decimal */ |
kunipm9 | 0:a2d3a9f771b8 | 137 | r = 10; break; |
kunipm9 | 0:a2d3a9f771b8 | 138 | case 'X' : /* Hexdecimal */ |
kunipm9 | 0:a2d3a9f771b8 | 139 | r = 16; break; |
kunipm9 | 0:a2d3a9f771b8 | 140 | default: /* Unknown type (passthrough) */ |
kunipm9 | 0:a2d3a9f771b8 | 141 | xputc(c); continue; |
kunipm9 | 0:a2d3a9f771b8 | 142 | } |
kunipm9 | 0:a2d3a9f771b8 | 143 | |
kunipm9 | 0:a2d3a9f771b8 | 144 | /* Get an argument and put it in numeral */ |
kunipm9 | 0:a2d3a9f771b8 | 145 | v = (f & 4) ? va_arg(arp, long) : ((d == 'D') ? (long)va_arg(arp, int) : (long)va_arg(arp, unsigned int)); |
kunipm9 | 0:a2d3a9f771b8 | 146 | if (d == 'D' && (v & 0x80000000)) { |
kunipm9 | 0:a2d3a9f771b8 | 147 | v = 0 - v; |
kunipm9 | 0:a2d3a9f771b8 | 148 | f |= 8; |
kunipm9 | 0:a2d3a9f771b8 | 149 | } |
kunipm9 | 0:a2d3a9f771b8 | 150 | i = 0; |
kunipm9 | 0:a2d3a9f771b8 | 151 | do { |
kunipm9 | 0:a2d3a9f771b8 | 152 | d = (char)(v % r); v /= r; |
kunipm9 | 0:a2d3a9f771b8 | 153 | if (d > 9) d += (c == 'x') ? 0x27 : 0x07; |
kunipm9 | 0:a2d3a9f771b8 | 154 | s[i++] = d + '0'; |
kunipm9 | 0:a2d3a9f771b8 | 155 | } while (v && i < sizeof(s)); |
kunipm9 | 0:a2d3a9f771b8 | 156 | if (f & 8) s[i++] = '-'; |
kunipm9 | 0:a2d3a9f771b8 | 157 | j = i; d = (f & 1) ? '0' : ' '; |
kunipm9 | 0:a2d3a9f771b8 | 158 | while (!(f & 2) && j++ < w) xputc(d); |
kunipm9 | 0:a2d3a9f771b8 | 159 | do xputc(s[--i]); while(i); |
kunipm9 | 0:a2d3a9f771b8 | 160 | while (j++ < w) xputc(' '); |
kunipm9 | 0:a2d3a9f771b8 | 161 | } |
kunipm9 | 0:a2d3a9f771b8 | 162 | } |
kunipm9 | 0:a2d3a9f771b8 | 163 | |
kunipm9 | 0:a2d3a9f771b8 | 164 | |
kunipm9 | 0:a2d3a9f771b8 | 165 | void xprintf ( /* Put a formatted string to the default device */ |
kunipm9 | 0:a2d3a9f771b8 | 166 | const char* fmt, /* Pointer to the format string */ |
kunipm9 | 0:a2d3a9f771b8 | 167 | ... /* Optional arguments */ |
kunipm9 | 0:a2d3a9f771b8 | 168 | ) |
kunipm9 | 0:a2d3a9f771b8 | 169 | { |
kunipm9 | 0:a2d3a9f771b8 | 170 | va_list arp; |
kunipm9 | 0:a2d3a9f771b8 | 171 | |
kunipm9 | 0:a2d3a9f771b8 | 172 | |
kunipm9 | 0:a2d3a9f771b8 | 173 | va_start(arp, fmt); |
kunipm9 | 0:a2d3a9f771b8 | 174 | xvprintf(fmt, arp); |
kunipm9 | 0:a2d3a9f771b8 | 175 | va_end(arp); |
kunipm9 | 0:a2d3a9f771b8 | 176 | } |
kunipm9 | 0:a2d3a9f771b8 | 177 | |
kunipm9 | 0:a2d3a9f771b8 | 178 | |
kunipm9 | 0:a2d3a9f771b8 | 179 | void xsprintf ( /* Put a formatted string to the memory */ |
kunipm9 | 0:a2d3a9f771b8 | 180 | char* buff, /* Pointer to the output buffer */ |
kunipm9 | 0:a2d3a9f771b8 | 181 | const char* fmt, /* Pointer to the format string */ |
kunipm9 | 0:a2d3a9f771b8 | 182 | ... /* Optional arguments */ |
kunipm9 | 0:a2d3a9f771b8 | 183 | ) |
kunipm9 | 0:a2d3a9f771b8 | 184 | { |
kunipm9 | 0:a2d3a9f771b8 | 185 | va_list arp; |
kunipm9 | 0:a2d3a9f771b8 | 186 | |
kunipm9 | 0:a2d3a9f771b8 | 187 | |
kunipm9 | 0:a2d3a9f771b8 | 188 | outptr = buff; /* Switch destination for memory */ |
kunipm9 | 0:a2d3a9f771b8 | 189 | |
kunipm9 | 0:a2d3a9f771b8 | 190 | va_start(arp, fmt); |
kunipm9 | 0:a2d3a9f771b8 | 191 | xvprintf(fmt, arp); |
kunipm9 | 0:a2d3a9f771b8 | 192 | va_end(arp); |
kunipm9 | 0:a2d3a9f771b8 | 193 | |
kunipm9 | 0:a2d3a9f771b8 | 194 | *outptr = 0; /* Terminate output string with a \0 */ |
kunipm9 | 0:a2d3a9f771b8 | 195 | outptr = 0; /* Switch destination for device */ |
kunipm9 | 0:a2d3a9f771b8 | 196 | } |
kunipm9 | 0:a2d3a9f771b8 | 197 | |
kunipm9 | 0:a2d3a9f771b8 | 198 | |
kunipm9 | 0:a2d3a9f771b8 | 199 | void xfprintf ( /* Put a formatted string to the specified device */ |
kunipm9 | 0:a2d3a9f771b8 | 200 | void(*func)(unsigned char), /* Pointer to the output function */ |
kunipm9 | 0:a2d3a9f771b8 | 201 | const char* fmt, /* Pointer to the format string */ |
kunipm9 | 0:a2d3a9f771b8 | 202 | ... /* Optional arguments */ |
kunipm9 | 0:a2d3a9f771b8 | 203 | ) |
kunipm9 | 0:a2d3a9f771b8 | 204 | { |
kunipm9 | 0:a2d3a9f771b8 | 205 | va_list arp; |
kunipm9 | 0:a2d3a9f771b8 | 206 | void (*pf)(unsigned char); |
kunipm9 | 0:a2d3a9f771b8 | 207 | |
kunipm9 | 0:a2d3a9f771b8 | 208 | |
kunipm9 | 0:a2d3a9f771b8 | 209 | pf = xfunc_out; /* Save current output device */ |
kunipm9 | 0:a2d3a9f771b8 | 210 | xfunc_out = func; /* Switch output to specified device */ |
kunipm9 | 0:a2d3a9f771b8 | 211 | |
kunipm9 | 0:a2d3a9f771b8 | 212 | va_start(arp, fmt); |
kunipm9 | 0:a2d3a9f771b8 | 213 | xvprintf(fmt, arp); |
kunipm9 | 0:a2d3a9f771b8 | 214 | va_end(arp); |
kunipm9 | 0:a2d3a9f771b8 | 215 | |
kunipm9 | 0:a2d3a9f771b8 | 216 | xfunc_out = pf; /* Restore output device */ |
kunipm9 | 0:a2d3a9f771b8 | 217 | } |
kunipm9 | 0:a2d3a9f771b8 | 218 | |
kunipm9 | 0:a2d3a9f771b8 | 219 | |
kunipm9 | 0:a2d3a9f771b8 | 220 | |
kunipm9 | 0:a2d3a9f771b8 | 221 | /*----------------------------------------------*/ |
kunipm9 | 0:a2d3a9f771b8 | 222 | /* Dump a line of binary dump */ |
kunipm9 | 0:a2d3a9f771b8 | 223 | /*----------------------------------------------*/ |
kunipm9 | 0:a2d3a9f771b8 | 224 | |
kunipm9 | 0:a2d3a9f771b8 | 225 | void put_dump ( |
kunipm9 | 0:a2d3a9f771b8 | 226 | const void* buff, /* Pointer to the array to be dumped */ |
kunipm9 | 0:a2d3a9f771b8 | 227 | unsigned long addr, /* Heading address value */ |
kunipm9 | 0:a2d3a9f771b8 | 228 | int len, /* Number of items to be dumped */ |
kunipm9 | 0:a2d3a9f771b8 | 229 | int width /* Size of the items (DF_CHAR, DF_SHORT, DF_LONG) */ |
kunipm9 | 0:a2d3a9f771b8 | 230 | ) |
kunipm9 | 0:a2d3a9f771b8 | 231 | { |
kunipm9 | 0:a2d3a9f771b8 | 232 | int i; |
kunipm9 | 0:a2d3a9f771b8 | 233 | const unsigned char *bp; |
kunipm9 | 0:a2d3a9f771b8 | 234 | const unsigned short *sp; |
kunipm9 | 0:a2d3a9f771b8 | 235 | const unsigned long *lp; |
kunipm9 | 0:a2d3a9f771b8 | 236 | |
kunipm9 | 0:a2d3a9f771b8 | 237 | |
kunipm9 | 0:a2d3a9f771b8 | 238 | xprintf("%08lX ", addr); /* address */ |
kunipm9 | 0:a2d3a9f771b8 | 239 | |
kunipm9 | 0:a2d3a9f771b8 | 240 | switch (width) { |
kunipm9 | 0:a2d3a9f771b8 | 241 | case DW_CHAR: |
kunipm9 | 0:a2d3a9f771b8 | 242 | bp = buff; |
kunipm9 | 0:a2d3a9f771b8 | 243 | for (i = 0; i < len; i++) /* Hexdecimal dump */ |
kunipm9 | 0:a2d3a9f771b8 | 244 | xprintf(" %02X", bp[i]); |
kunipm9 | 0:a2d3a9f771b8 | 245 | xputc(' '); |
kunipm9 | 0:a2d3a9f771b8 | 246 | for (i = 0; i < len; i++) /* ASCII dump */ |
kunipm9 | 0:a2d3a9f771b8 | 247 | xputc((bp[i] >= ' ' && bp[i] <= '~') ? bp[i] : '.'); |
kunipm9 | 0:a2d3a9f771b8 | 248 | break; |
kunipm9 | 0:a2d3a9f771b8 | 249 | case DW_SHORT: |
kunipm9 | 0:a2d3a9f771b8 | 250 | sp = buff; |
kunipm9 | 0:a2d3a9f771b8 | 251 | do /* Hexdecimal dump */ |
kunipm9 | 0:a2d3a9f771b8 | 252 | xprintf(" %04X", *sp++); |
kunipm9 | 0:a2d3a9f771b8 | 253 | while (--len); |
kunipm9 | 0:a2d3a9f771b8 | 254 | break; |
kunipm9 | 0:a2d3a9f771b8 | 255 | case DW_LONG: |
kunipm9 | 0:a2d3a9f771b8 | 256 | lp = buff; |
kunipm9 | 0:a2d3a9f771b8 | 257 | do /* Hexdecimal dump */ |
kunipm9 | 0:a2d3a9f771b8 | 258 | xprintf(" %08LX", *lp++); |
kunipm9 | 0:a2d3a9f771b8 | 259 | while (--len); |
kunipm9 | 0:a2d3a9f771b8 | 260 | break; |
kunipm9 | 0:a2d3a9f771b8 | 261 | } |
kunipm9 | 0:a2d3a9f771b8 | 262 | |
kunipm9 | 0:a2d3a9f771b8 | 263 | xputc('\n'); |
kunipm9 | 0:a2d3a9f771b8 | 264 | } |
kunipm9 | 0:a2d3a9f771b8 | 265 | |
kunipm9 | 0:a2d3a9f771b8 | 266 | #endif /* _USE_XFUNC_OUT */ |
kunipm9 | 0:a2d3a9f771b8 | 267 | |
kunipm9 | 0:a2d3a9f771b8 | 268 | |
kunipm9 | 0:a2d3a9f771b8 | 269 | |
kunipm9 | 0:a2d3a9f771b8 | 270 | #if _USE_XFUNC_IN |
kunipm9 | 0:a2d3a9f771b8 | 271 | unsigned char (*xfunc_in)(void); /* Pointer to the input stream */ |
kunipm9 | 0:a2d3a9f771b8 | 272 | |
kunipm9 | 0:a2d3a9f771b8 | 273 | /*----------------------------------------------*/ |
kunipm9 | 0:a2d3a9f771b8 | 274 | /* Get a line from the input */ |
kunipm9 | 0:a2d3a9f771b8 | 275 | /*----------------------------------------------*/ |
kunipm9 | 0:a2d3a9f771b8 | 276 | |
kunipm9 | 0:a2d3a9f771b8 | 277 | int xgets ( /* 0:End of stream, 1:A line arrived */ |
kunipm9 | 0:a2d3a9f771b8 | 278 | char* buff, /* Pointer to the buffer */ |
kunipm9 | 0:a2d3a9f771b8 | 279 | int len /* Buffer length */ |
kunipm9 | 0:a2d3a9f771b8 | 280 | ) |
kunipm9 | 0:a2d3a9f771b8 | 281 | { |
kunipm9 | 0:a2d3a9f771b8 | 282 | int c, i; |
kunipm9 | 0:a2d3a9f771b8 | 283 | |
kunipm9 | 0:a2d3a9f771b8 | 284 | |
kunipm9 | 0:a2d3a9f771b8 | 285 | if (!xfunc_in) return 0; /* No input function specified */ |
kunipm9 | 0:a2d3a9f771b8 | 286 | |
kunipm9 | 0:a2d3a9f771b8 | 287 | i = 0; |
kunipm9 | 0:a2d3a9f771b8 | 288 | for (;;) { |
kunipm9 | 0:a2d3a9f771b8 | 289 | c = xfunc_in(); /* Get a char from the incoming stream */ |
kunipm9 | 0:a2d3a9f771b8 | 290 | if (!c) return 0; /* End of stream? */ |
kunipm9 | 0:a2d3a9f771b8 | 291 | if (c == '\r') break; /* End of line? */ |
kunipm9 | 0:a2d3a9f771b8 | 292 | if (c == '\b' && i) { /* Back space? */ |
kunipm9 | 0:a2d3a9f771b8 | 293 | i--; |
kunipm9 | 0:a2d3a9f771b8 | 294 | if (_LINE_ECHO) xputc(c); |
kunipm9 | 0:a2d3a9f771b8 | 295 | continue; |
kunipm9 | 0:a2d3a9f771b8 | 296 | } |
kunipm9 | 0:a2d3a9f771b8 | 297 | if (c >= ' ' && i < len - 1) { /* Visible chars */ |
kunipm9 | 0:a2d3a9f771b8 | 298 | buff[i++] = c; |
kunipm9 | 0:a2d3a9f771b8 | 299 | if (_LINE_ECHO) xputc(c); |
kunipm9 | 0:a2d3a9f771b8 | 300 | } |
kunipm9 | 0:a2d3a9f771b8 | 301 | } |
kunipm9 | 0:a2d3a9f771b8 | 302 | buff[i] = 0; /* Terminate with a \0 */ |
kunipm9 | 0:a2d3a9f771b8 | 303 | if (_LINE_ECHO) xputc('\n'); |
kunipm9 | 0:a2d3a9f771b8 | 304 | return 1; |
kunipm9 | 0:a2d3a9f771b8 | 305 | } |
kunipm9 | 0:a2d3a9f771b8 | 306 | |
kunipm9 | 0:a2d3a9f771b8 | 307 | |
kunipm9 | 0:a2d3a9f771b8 | 308 | int xfgets ( /* 0:End of stream, 1:A line arrived */ |
kunipm9 | 0:a2d3a9f771b8 | 309 | unsigned char (*func)(void), /* Pointer to the input stream function */ |
kunipm9 | 0:a2d3a9f771b8 | 310 | char* buff, /* Pointer to the buffer */ |
kunipm9 | 0:a2d3a9f771b8 | 311 | int len /* Buffer length */ |
kunipm9 | 0:a2d3a9f771b8 | 312 | ) |
kunipm9 | 0:a2d3a9f771b8 | 313 | { |
kunipm9 | 0:a2d3a9f771b8 | 314 | unsigned char (*pf)(void); |
kunipm9 | 0:a2d3a9f771b8 | 315 | int n; |
kunipm9 | 0:a2d3a9f771b8 | 316 | |
kunipm9 | 0:a2d3a9f771b8 | 317 | |
kunipm9 | 0:a2d3a9f771b8 | 318 | pf = xfunc_in; /* Save current input device */ |
kunipm9 | 0:a2d3a9f771b8 | 319 | xfunc_in = func; /* Switch input to specified device */ |
kunipm9 | 0:a2d3a9f771b8 | 320 | n = xgets(buff, len); /* Get a line */ |
kunipm9 | 0:a2d3a9f771b8 | 321 | xfunc_in = pf; /* Restore input device */ |
kunipm9 | 0:a2d3a9f771b8 | 322 | |
kunipm9 | 0:a2d3a9f771b8 | 323 | return n; |
kunipm9 | 0:a2d3a9f771b8 | 324 | } |
kunipm9 | 0:a2d3a9f771b8 | 325 | |
kunipm9 | 0:a2d3a9f771b8 | 326 | |
kunipm9 | 0:a2d3a9f771b8 | 327 | /*----------------------------------------------*/ |
kunipm9 | 0:a2d3a9f771b8 | 328 | /* Get a value of the string */ |
kunipm9 | 0:a2d3a9f771b8 | 329 | /*----------------------------------------------*/ |
kunipm9 | 0:a2d3a9f771b8 | 330 | /* "123 -5 0x3ff 0b1111 0377 w " |
kunipm9 | 0:a2d3a9f771b8 | 331 | ^ 1st call returns 123 and next ptr |
kunipm9 | 0:a2d3a9f771b8 | 332 | ^ 2nd call returns -5 and next ptr |
kunipm9 | 0:a2d3a9f771b8 | 333 | ^ 3rd call returns 1023 and next ptr |
kunipm9 | 0:a2d3a9f771b8 | 334 | ^ 4th call returns 15 and next ptr |
kunipm9 | 0:a2d3a9f771b8 | 335 | ^ 5th call returns 255 and next ptr |
kunipm9 | 0:a2d3a9f771b8 | 336 | ^ 6th call fails and returns 0 |
kunipm9 | 0:a2d3a9f771b8 | 337 | */ |
kunipm9 | 0:a2d3a9f771b8 | 338 | |
kunipm9 | 0:a2d3a9f771b8 | 339 | int xatoi ( /* 0:Failed, 1:Successful */ |
kunipm9 | 0:a2d3a9f771b8 | 340 | char **str, /* Pointer to pointer to the string */ |
kunipm9 | 0:a2d3a9f771b8 | 341 | long *res /* Pointer to the valiable to store the value */ |
kunipm9 | 0:a2d3a9f771b8 | 342 | ) |
kunipm9 | 0:a2d3a9f771b8 | 343 | { |
kunipm9 | 0:a2d3a9f771b8 | 344 | unsigned long val; |
kunipm9 | 0:a2d3a9f771b8 | 345 | unsigned char c, r, s = 0; |
kunipm9 | 0:a2d3a9f771b8 | 346 | |
kunipm9 | 0:a2d3a9f771b8 | 347 | |
kunipm9 | 0:a2d3a9f771b8 | 348 | *res = 0; |
kunipm9 | 0:a2d3a9f771b8 | 349 | |
kunipm9 | 0:a2d3a9f771b8 | 350 | while ((c = **str) == ' ') (*str)++; /* Skip leading spaces */ |
kunipm9 | 0:a2d3a9f771b8 | 351 | |
kunipm9 | 0:a2d3a9f771b8 | 352 | if (c == '-') { /* negative? */ |
kunipm9 | 0:a2d3a9f771b8 | 353 | s = 1; |
kunipm9 | 0:a2d3a9f771b8 | 354 | c = *(++(*str)); |
kunipm9 | 0:a2d3a9f771b8 | 355 | } |
kunipm9 | 0:a2d3a9f771b8 | 356 | |
kunipm9 | 0:a2d3a9f771b8 | 357 | if (c == '0') { |
kunipm9 | 0:a2d3a9f771b8 | 358 | c = *(++(*str)); |
kunipm9 | 0:a2d3a9f771b8 | 359 | switch (c) { |
kunipm9 | 0:a2d3a9f771b8 | 360 | case 'x': /* hexdecimal */ |
kunipm9 | 0:a2d3a9f771b8 | 361 | r = 16; c = *(++(*str)); |
kunipm9 | 0:a2d3a9f771b8 | 362 | break; |
kunipm9 | 0:a2d3a9f771b8 | 363 | case 'b': /* binary */ |
kunipm9 | 0:a2d3a9f771b8 | 364 | r = 2; c = *(++(*str)); |
kunipm9 | 0:a2d3a9f771b8 | 365 | break; |
kunipm9 | 0:a2d3a9f771b8 | 366 | default: |
kunipm9 | 0:a2d3a9f771b8 | 367 | if (c <= ' ') return 1; /* single zero */ |
kunipm9 | 0:a2d3a9f771b8 | 368 | if (c < '0' || c > '9') return 0; /* invalid char */ |
kunipm9 | 0:a2d3a9f771b8 | 369 | r = 8; /* octal */ |
kunipm9 | 0:a2d3a9f771b8 | 370 | } |
kunipm9 | 0:a2d3a9f771b8 | 371 | } else { |
kunipm9 | 0:a2d3a9f771b8 | 372 | if (c < '0' || c > '9') return 0; /* EOL or invalid char */ |
kunipm9 | 0:a2d3a9f771b8 | 373 | r = 10; /* decimal */ |
kunipm9 | 0:a2d3a9f771b8 | 374 | } |
kunipm9 | 0:a2d3a9f771b8 | 375 | |
kunipm9 | 0:a2d3a9f771b8 | 376 | val = 0; |
kunipm9 | 0:a2d3a9f771b8 | 377 | while (c > ' ') { |
kunipm9 | 0:a2d3a9f771b8 | 378 | if (c >= 'a') c -= 0x20; |
kunipm9 | 0:a2d3a9f771b8 | 379 | c -= '0'; |
kunipm9 | 0:a2d3a9f771b8 | 380 | if (c >= 17) { |
kunipm9 | 0:a2d3a9f771b8 | 381 | c -= 7; |
kunipm9 | 0:a2d3a9f771b8 | 382 | if (c <= 9) return 0; /* invalid char */ |
kunipm9 | 0:a2d3a9f771b8 | 383 | } |
kunipm9 | 0:a2d3a9f771b8 | 384 | if (c >= r) return 0; /* invalid char for current radix */ |
kunipm9 | 0:a2d3a9f771b8 | 385 | val = val * r + c; |
kunipm9 | 0:a2d3a9f771b8 | 386 | c = *(++(*str)); |
kunipm9 | 0:a2d3a9f771b8 | 387 | } |
kunipm9 | 0:a2d3a9f771b8 | 388 | if (s) val = 0 - val; /* apply sign if needed */ |
kunipm9 | 0:a2d3a9f771b8 | 389 | |
kunipm9 | 0:a2d3a9f771b8 | 390 | *res = val; |
kunipm9 | 0:a2d3a9f771b8 | 391 | return 1; |
kunipm9 | 0:a2d3a9f771b8 | 392 | } |
kunipm9 | 0:a2d3a9f771b8 | 393 | |
kunipm9 | 0:a2d3a9f771b8 | 394 | #endif /* _USE_XFUNC_IN */ |