MLX90620 Viewer

Dependencies:   MLX90620 mbed

Committer:
kunipm9
Date:
Fri Apr 04 14:01:24 2014 +0000
Revision:
0:a2d3a9f771b8
1st

Who changed what in which revision?

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