Soldered SD Card Arduino Library 1.0.0
Easily read and write files to and form the SD card breakout! A fork of the original SDFat library by Bill Greiman.
Loading...
Searching...
No Matches
StdioStream.h
Go to the documentation of this file.
1
25#ifndef StdioStream_h
26#define StdioStream_h
31#include "ios.h"
32#include <limits.h>
33//------------------------------------------------------------------------------
37const uint8_t STREAM_BUF_SIZE = 64;
39const uint8_t UNGETC_BUF_SIZE = 2;
40//------------------------------------------------------------------------------
41// Get rid of any macros defined in <stdio.h>.
42#include <stdio.h>
43#undef clearerr
44#undef fclose
45#undef feof
46#undef ferror
47#undef fflush
48#undef fgetc
49#undef fgetpos
50#undef fgets
51#undef fopen
52#undef fprintf
53#undef fputc
54#undef fputs
55#undef fread
56#undef freopen
57#undef fscanf
58#undef fseek
59#undef fsetpos
60#undef ftell
61#undef fwrite
62#undef getc
63#undef getchar
64#undef gets
65#undef perror
66//#undef printf // NOLINT
67#undef putc
68#undef putchar
69#undef puts
70#undef remove
71#undef rename
72#undef rewind
73#undef scanf
74#undef setbuf
75#undef setvbuf
76//#undef sprintf // NOLINT
77#undef sscanf
78#undef tmpfile
79#undef tmpnam
80#undef ungetc
81#undef vfprintf
82#undef vprintf
83#undef vsprintf
84
85// make sure needed macros are defined
86#ifndef EOF
88#define EOF (-1)
89#endif // EOF
90#ifndef NULL
92#define NULL 0
93#endif // NULL
94#ifndef SEEK_CUR
96#define SEEK_CUR 1
97#endif // SEEK_CUR
98#ifndef SEEK_END
100#define SEEK_END 2
101#endif // SEEK_END
102#ifndef SEEK_SET
104#define SEEK_SET 0
105#endif // SEEK_SET
106//------------------------------------------------------------------------------
113{
114 public:
119 {
120 }
121 //----------------------------------------------------------------------------
123 void clearerr()
124 {
125 m_status &= ~(S_ERR | S_EOF);
126 }
127 //----------------------------------------------------------------------------
139 int fclose();
140 //----------------------------------------------------------------------------
144 int feof()
145 {
146 return (m_status & S_EOF) != 0;
147 }
148 //----------------------------------------------------------------------------
152 int ferror()
153 {
154 return (m_status & S_ERR) != 0;
155 }
156 //----------------------------------------------------------------------------
167 int fflush();
168 //----------------------------------------------------------------------------
176 int fgetc()
177 {
178 return m_r-- == 0 ? fillGet() : *m_p++;
179 }
180 //----------------------------------------------------------------------------
203 char *fgets(char *str, size_t num, size_t *len = 0);
204 //----------------------------------------------------------------------------
265 bool fopen(const char *path, const char *mode);
266 //----------------------------------------------------------------------------
275 int fputc(int c)
276 {
277 return m_w-- == 0 ? flushPut(c) : *m_p++ = c;
278 }
279 //----------------------------------------------------------------------------
288 int fputs(const char *str);
289 //----------------------------------------------------------------------------
306 size_t fread(void *ptr, size_t size, size_t count);
307 //----------------------------------------------------------------------------
324 int fseek(int32_t offset, int origin);
325 //----------------------------------------------------------------------------
331 int32_t ftell();
332 //----------------------------------------------------------------------------
347 size_t fwrite(const void *ptr, size_t size, size_t count);
348 //----------------------------------------------------------------------------
359 inline __attribute__((always_inline)) int getc()
360 {
361 return m_r-- == 0 ? fillGet() : *m_p++;
362 }
363 //----------------------------------------------------------------------------
375 inline __attribute__((always_inline)) int putc(int c)
376 {
377 return m_w-- == 0 ? flushPut(c) : *m_p++ = c;
378 }
379 //----------------------------------------------------------------------------
384 inline __attribute__((always_inline)) int putCRLF()
385 {
386 if (m_w < 2)
387 {
388 if (!flushBuf())
389 {
390 return -1;
391 }
392 }
393 *m_p++ = '\r';
394 *m_p++ = '\n';
395 m_w -= 2;
396 return 2;
397 }
398 //----------------------------------------------------------------------------
403 size_t print(char c)
404 {
405 return putc(c) < 0 ? 0 : 1;
406 }
407 //----------------------------------------------------------------------------
414 size_t print(const char *str)
415 {
416 int n = fputs(str);
417 return n < 0 ? 0 : n;
418 }
419 //----------------------------------------------------------------------------
420#if (defined(ARDUINO) && ENABLE_ARDUINO_FEATURES) || defined(DOXYGEN)
427 size_t print(const __FlashStringHelper *str);
428#endif // (defined(ARDUINO) && ENABLE_ARDUINO_FEATURES) || defined(DOXYGEN)
429 //----------------------------------------------------------------------------
438 size_t print(double val, uint8_t prec = 2)
439 {
440 return print(static_cast<float>(val), prec);
441 }
442 //----------------------------------------------------------------------------
451 size_t print(float val, uint8_t prec = 2)
452 {
453 int n = printDec(val, prec);
454 return n > 0 ? n : 0;
455 }
456 //----------------------------------------------------------------------------
463 template <typename T> size_t print(T val)
464 {
465 int n = printDec(val);
466 return n > 0 ? n : 0;
467 }
468 //----------------------------------------------------------------------------
473 size_t println()
474 {
475 return putCRLF() > 0 ? 2 : 0;
476 }
477 //----------------------------------------------------------------------------
486 size_t println(double val, uint8_t prec = 2)
487 {
488 return println(static_cast<float>(val), prec);
489 }
490 //----------------------------------------------------------------------------
499 size_t println(float val, uint8_t prec = 2)
500 {
501 int n = printDec(val, prec);
502 return n > 0 && putCRLF() > 0 ? n + 2 : 0;
503 }
504 //----------------------------------------------------------------------------
511 template <typename T> size_t println(T val)
512 {
513 int n = print(val);
514 return putCRLF() > 0 ? n + 2 : 0;
515 }
516 //----------------------------------------------------------------------------
521 int printDec(char n)
522 {
523 if (CHAR_MIN == 0)
524 {
525 return printDec((unsigned char)n);
526 }
527 else
528 {
529 return printDec((signed char)n);
530 }
531 }
532 //----------------------------------------------------------------------------
537 int printDec(signed char n);
538 //----------------------------------------------------------------------------
543 int printDec(unsigned char n)
544 {
545 return printDec((uint16_t)n);
546 }
547 //----------------------------------------------------------------------------
552 int printDec(int16_t n);
553 //----------------------------------------------------------------------------
558 int printDec(uint16_t n);
559 //----------------------------------------------------------------------------
564 int printDec(int32_t n);
565 //----------------------------------------------------------------------------
570 int printDec(uint32_t n);
571 //----------------------------------------------------------------------------
577 int printDec(double value, uint8_t prec)
578 {
579 return printDec(static_cast<float>(value), prec);
580 }
581 //----------------------------------------------------------------------------
587 int printDec(float value, uint8_t prec);
588 //----------------------------------------------------------------------------
595 int printField(double value, char term, uint8_t prec = 2)
596 {
597 return printField(static_cast<float>(value), term, prec) > 0;
598 }
599 //----------------------------------------------------------------------------
606 int printField(float value, char term, uint8_t prec = 2)
607 {
608 int rtn = printDec(value, prec);
609 return rtn < 0 || putc(term) < 0 ? -1 : rtn + 1;
610 }
611 //----------------------------------------------------------------------------
617 template <typename T> int printField(T value, char term)
618 {
619 int rtn = printDec(value);
620 return rtn < 0 || putc(term) < 0 ? -1 : rtn + 1;
621 }
622 //----------------------------------------------------------------------------
628 int printHex(uint32_t n);
629 //----------------------------------------------------------------------------
635 int printHexln(uint32_t n)
636 {
637 int rtn = printHex(n);
638 return rtn < 0 || putCRLF() != 2 ? -1 : rtn + 2;
639 }
640 //----------------------------------------------------------------------------
649 bool rewind();
650 //----------------------------------------------------------------------------
665 int ungetc(int c);
666 //============================================================================
667 private:
668 bool fillBuf();
669 int fillGet();
670 bool flushBuf();
671 int flushPut(uint8_t c);
672 char *fmtSpace(uint8_t len);
673 int write(const void *buf, size_t count);
674 //----------------------------------------------------------------------------
675 // S_SRD and S_WR are never simultaneously asserted
676 static const uint8_t S_SRD = 0x01; // OK to read
677 static const uint8_t S_SWR = 0x02; // OK to write
678 static const uint8_t S_SRW = 0x04; // open for reading & writing
679 static const uint8_t S_EOF = 0x10; // found EOF
680 static const uint8_t S_ERR = 0x20; // found error
681 //----------------------------------------------------------------------------
683 uint8_t m_status = 0;
684 uint8_t *m_p = m_buf;
685 uint8_t m_r = 0;
686 uint8_t m_w;
687};
688//------------------------------------------------------------------------------
689#endif // StdioStream_h
const uint8_t UNGETC_BUF_SIZE
Definition StdioStream.h:39
const uint8_t STREAM_BUF_SIZE
Definition StdioStream.h:37
Basic file class.
Definition FatFile.h:112
StdioStream implements a minimal stdio stream.
Definition StdioStream.h:113
int printField(T value, char term)
Definition StdioStream.h:617
size_t print(float val, uint8_t prec=2)
Definition StdioStream.h:451
size_t print(const char *str)
Definition StdioStream.h:414
int fgetc()
Definition StdioStream.h:176
uint8_t m_r
Definition StdioStream.h:685
char * fmtSpace(uint8_t len)
Definition StdioStream.cpp:519
uint8_t m_status
Definition StdioStream.h:683
size_t print(double val, uint8_t prec=2)
Definition StdioStream.h:438
size_t fread(void *ptr, size_t size, size_t count)
Definition StdioStream.cpp:182
__attribute__((always_inline)) int putc(int c)
Definition StdioStream.h:375
size_t println(double val, uint8_t prec=2)
Definition StdioStream.h:486
static const uint8_t S_ERR
Definition StdioStream.h:680
__attribute__((always_inline)) int putCRLF()
Definition StdioStream.h:384
size_t println(T val)
Definition StdioStream.h:511
int printField(float value, char term, uint8_t prec=2)
Definition StdioStream.h:606
__attribute__((always_inline)) int getc()
Definition StdioStream.h:359
int printField(double value, char term, uint8_t prec=2)
Definition StdioStream.h:595
int fclose()
Definition StdioStream.cpp:28
bool fopen(const char *path, const char *mode)
Definition StdioStream.cpp:114
bool flushBuf()
Definition StdioStream.cpp:482
static const uint8_t S_SRW
Definition StdioStream.h:678
int fputs(const char *str)
Definition StdioStream.cpp:176
int printDec(unsigned char n)
Definition StdioStream.h:543
size_t print(T val)
Definition StdioStream.h:463
int fseek(int32_t offset, int origin)
Definition StdioStream.cpp:208
int fflush()
Definition StdioStream.cpp:52
int32_t ftell()
Definition StdioStream.cpp:258
StdioStream()
Definition StdioStream.h:118
int fputc(int c)
Definition StdioStream.h:275
char * fgets(char *str, size_t num, size_t *len=0)
Definition StdioStream.cpp:64
static const uint8_t S_SWR
Definition StdioStream.h:677
void clearerr()
Definition StdioStream.h:123
int printDec(double value, uint8_t prec)
Definition StdioStream.h:577
size_t println(float val, uint8_t prec=2)
Definition StdioStream.h:499
static const uint8_t S_SRD
Definition StdioStream.h:676
int ungetc(int c)
Definition StdioStream.cpp:414
int printDec(char n)
Definition StdioStream.h:521
int write(const void *buf, size_t count)
Definition StdioStream.cpp:281
uint8_t * m_p
Definition StdioStream.h:684
int feof()
Definition StdioStream.h:144
bool fillBuf()
Definition StdioStream.cpp:449
size_t println()
Definition StdioStream.h:473
size_t print(char c)
Definition StdioStream.h:403
uint8_t m_buf[STREAM_BUF_SIZE]
Definition StdioStream.h:682
size_t fwrite(const void *ptr, size_t size, size_t count)
Definition StdioStream.cpp:276
bool rewind()
Definition StdioStream.cpp:400
int printHex(uint32_t n)
Definition StdioStream.cpp:392
int flushPut(uint8_t c)
Definition StdioStream.cpp:509
int fillGet()
Definition StdioStream.cpp:438
int printHexln(uint32_t n)
Definition StdioStream.h:635
uint8_t m_w
Definition StdioStream.h:686
int ferror()
Definition StdioStream.h:152
static const uint8_t S_EOF
Definition StdioStream.h:679
static bool value
Definition DigitalPin.h:210
static uint8_t mode
Definition DigitalPin.h:186
ios_base and ios classes