#include #include char buf[100]; ibufstream ib; #define ibInit(s) ibInit_P(PSTR(s)) //---------------------------------------------------------- void ibInit_P(PGM_P p) { if (strlen_P(p) >= sizeof(buf)) { ib.init(""); ib.setstate(ios::badbit); } else { ib.clear(); strncpy_P(buf, p, sizeof(buf)); ib.init(buf); } } //------------------------------------------------------------------------------ void istreamBool() { bool b; ibInit(" 0 1 2"); testVerifyBool((ib >> b) && !b); testVerifyBool((ib >> b) && b); testVerifyBool(!(ib >> b) && !ib.good()); ibInit(" true false err"); testVerifyBool((ib >> boolalpha >> b) && b && ib.good()); testVerifyBool((ib >> b) && !b && ib.good()); testVerifyBool(!(ib >> b) && ib.fail()); ibInit("1"); testVerifyBool((ib >> noboolalpha >> b) && b && ib.eof()); } //------------------------------------------------------------------------------ void istreamChar() { char c; signed char sc; unsigned char uc; ibInit("c s u g"); testVerifyBool((ib >> c) && ib.good() && c == 'c'); testVerifyBool((ib >> sc) && ib.good() && sc == 's'); testVerifyBool((ib >> uc) && ib.good() && uc == 'u'); testVerifyBool(ib.get() == ' '); testVerifyBool(ib.peek() == 'g' && ib.good()); testVerifyBool(ib.get() == 'g' && ib.good()); testVerifyBool(ib.get() == -1 && ib.eof()); } //------------------------------------------------------------------------------ void istreamDouble() { double f; ibInit("0 .1 1. 2 3.4 .1e5 1e5 -1E6 +2.3e-3 -123.4567"); testVerifyBool((ib >> f) && f == 0 && ib.good()); testVerifyBool((ib >> f) && f == 0.1 && ib.good()); testVerifyBool((ib >> f) && f == 1.0 && ib.good()); testVerifyBool((ib >> f) && f == 2.0 && ib.good()); testVerifyBool((ib >> f) && f == 3.4 && ib.good()); testVerifyBool((ib >> f) && f == 10000.0 && ib.good()); testVerifyBool((ib >> f) && f == 1e5 && ib.good()); testVerifyBool((ib >> f) && f == -1E6 && ib.good()); testVerifyBool((ib >> f) && f == 2.3e-3 && ib.good()); testVerifyBool((ib >> f) && fabs(f + 123.4567) < 1e-5 && ib.eof()); if (fabs(f + 123.4567) >= 1e-5) Serial.println(f, 8); } //------------------------------------------------------------------------------ void istreamFloat() { float f; ibInit("0 .1 1. 2 3.4 .1e5 1e5 -1E6 +2.3e-3 -123.4567"); testVerifyBool((ib >> f) && f == 0 && ib.good()); testVerifyBool((ib >> f) && f == 0.1f && ib.good()); testVerifyBool((ib >> f) && f == 1.0 && ib.good()); testVerifyBool((ib >> f) && f == 2.0 && ib.good()); testVerifyBool((ib >> f) && f == 3.4f && ib.good()); testVerifyBool((ib >> f) && f == 10000.0 && ib.good()); testVerifyBool((ib >> f) && f == 1e5 && ib.good()); testVerifyBool((ib >> f) && f == -1E6 && ib.good()); testVerifyBool((ib >> f) && f == 2.3e-3f && ib.good()); testVerifyBool((ib >> f) && fabs(f + 123.4567f) < 1e-5 && ib.eof()); if (fabs(f + 123.4567) >= 1e-5) Serial.println(f, 8); } //------------------------------------------------------------------------------ void istreamGet() { char s[4]; ibInit("ab c"); testVerifyBool(ib.get() == 'a' && ib.good() && ib.gcount() == 1); testVerifyBool(ib.get() == 'b' && ib.good() && ib.gcount() == 1); testVerifyBool(ib.get() == ' ' && ib.good() && ib.gcount() == 1); testVerifyBool(ib.get() == 'c' && ib.good() && ib.gcount() == 1); testVerifyBool(ib.get() == -1 && ib.eof() && ib.gcount() == 0); ibInit("ab\ncdef"); ib.get(s, sizeof(s)); testVerifyBool(ib.good() && ib.gcount() == 2); testVerifyStr(s, "ab"); testVerifyBool(ib.get() == '\n' && ib.good() && ib.gcount() == 1); ib.get(s, sizeof(s)); testVerifyBool(ib.good() && ib.gcount() == 3); testVerifyStr(s, "cde"); ib.get(s, sizeof(s)); testVerifyBool(ib.eof() && ib.gcount() == 1); testVerifyStr(s, "f"); ibInit( "short line\n" "\n" "17 character line\n" "too long for buffer\n" "line with no nl" ); char buf[18]; ib.getline(buf, sizeof(buf)); testVerifyBool(ib.good() && ib.gcount() == 11); testVerifyStr(buf, "short line"); ib.getline(buf, sizeof(buf)); testVerifyBool(ib.good() && ib.gcount() == 1 && buf[0] == '\0'); ib.getline(buf, sizeof(buf)); testVerifyBool(ib.good() && ib.gcount() == 18); testVerifyStr(buf, "17 character line"); ib.getline(buf, sizeof(buf)); testVerifyBool(ib.fail() && !ib.eof() && ib.gcount() == 17); testVerifyStr(buf, "too long for buff"); ib.clear(); ib.getline(buf, sizeof(buf)); testVerifyBool(ib.good() && !ib.eof() && ib.gcount() == 3); testVerifyStr(buf, "er"); ib.getline(buf, sizeof(buf)); testVerifyBool(!ib.fail() && ib.eof() && ib.gcount() == 15); testVerifyStr(buf, "line with no nl"); } //------------------------------------------------------------------------------ void istreamNumber() { short s; signed short ss; unsigned short us; int i; signed int si; unsigned int ui; long l; signed long sl; unsigned long ul; ibInit("-32769"); testVerifyBool(!(ib >> s) && ib.fail()); ibInit("-32768 0 32767 32768"); testVerifyBool((ib >> s) && s == -32768 && ib.good()); testVerifyBool((ib >> s) && s == 0 && ib.good()); testVerifyBool((ib >> s) && s == 32767 && ib.good()); testVerifyBool(!(ib >> s) && ib.fail()); ibInit("-32769"); testVerifyBool(!(ib >> ss) && ib.fail()); ibInit("-32768 0 32767 32768"); testVerifyBool((ib >> ss) && ss == -32768 && ib.good()); testVerifyBool((ib >> ss) && ss == 0 && ib.good()); testVerifyBool((ib >> ss) && ss == 32767 && ib.good()); testVerifyBool(!(ib >> ss) && ib.fail()); ibInit("0 65535 65536"); testVerifyBool((ib >> us) && us == 0 && ib.good()); testVerifyBool((ib >> us) && us == 65535 && ib.good()); testVerifyBool(!(ib >> us) && ib.fail()); if (sizeof(int) == 2) { ibInit("-32769"); testVerifyBool(!(ib >> i) && ib.fail()); ibInit("-32768 0 32767 32768"); testVerifyBool((ib >> i) && i == -32768 && ib.good()); testVerifyBool((ib >> i) && i == 0 && ib.good()); testVerifyBool((ib >> i) && i == 32767 && ib.good()); testVerifyBool(!(ib >> i) && ib.fail()); ibInit("-32769"); testVerifyBool(!(ib >> si) && ib.fail()); ibInit("-32768 0 32767 32768"); testVerifyBool((ib >> si) && si == -32768 && ib.good()); testVerifyBool((ib >> si) && si == 0 && ib.good()); testVerifyBool((ib >> si) && si == 32767 && ib.good()); testVerifyBool(!(ib >> si) && ib.fail()); ibInit("0 65535 65536"); testVerifyBool((ib >> ui) && ui == 0 && ib.good()); testVerifyBool((ib >> ui) && ui == 65535 && ib.good()); testVerifyBool(!(ib >> ui) && ib.fail()); } else { ibInit("-2147483649"); testVerifyBool(!(ib >> i) && ib.fail()); ibInit("-2147483648 0 2147483647 2147483648"); testVerifyBool((ib >> i) && i == -2147483648 && ib.good()); testVerifyBool((ib >> i) && i == 0 && ib.good()); testVerifyBool((ib >> i) && i == 2147483647 && ib.good()); testVerifyBool(!(ib >> i) && ib.fail()); ibInit("-2147483649"); testVerifyBool(!(ib >> si) && ib.fail()); ibInit("-2147483648 0 2147483647 2147483648"); testVerifyBool((ib >> si) && si == -2147483648 && ib.good()); testVerifyBool((ib >> si) && si == 0 && ib.good()); testVerifyBool((ib >> si) && si == 2147483647 && ib.good()); testVerifyBool(!(ib >> si) && ib.fail()); ibInit("0 4294967295 4294967296"); testVerifyBool((ib >> ui) && ui == 0 && ib.good()); testVerifyBool((ib >> ui) && ui == 4294967295 && ib.good()); testVerifyBool(!(ib >> ui) && ib.fail()); } ibInit("-2147483649"); testVerifyBool(!(ib >> l) && ib.fail()); ibInit("-2147483648 0 2147483647 2147483648"); testVerifyBool((ib >> l) && l == -2147483648 && ib.good()); testVerifyBool((ib >> l) && l == 0 && ib.good()); testVerifyBool((ib >> l) && l == 2147483647 && ib.good()); testVerifyBool(!(ib >> l) && ib.fail()); ibInit("-2147483649"); testVerifyBool(!(ib >> sl) && ib.fail()); ibInit("-2147483648 0 2147483647 2147483648"); testVerifyBool((ib >> sl) && sl == -2147483648 && ib.good()); testVerifyBool((ib >> sl) && sl == 0 && ib.good()); testVerifyBool((ib >> sl) && sl == 2147483647 && ib.good()); testVerifyBool(!(ib >> sl) && ib.fail()); ibInit("0 4294967295 4294967296"); testVerifyBool((ib >> ul) && ul == 0 && ib.good()); testVerifyBool((ib >> ul) && ul == 4294967295 && ib.good()); testVerifyBool(!(ib >> ul) && ib.fail()); // octal hex ibInit("123 abc 0xdef 0XABC 567"); testVerifyBool((ib >> oct >> i) && i == 83); testVerifyBool((ib >> hex >> i) && i == 0xabc); testVerifyBool((ib >> i) && i == 0xdef); testVerifyBool((ib >> i) && i == 0xabc); testVerifyBool((ib >> dec >> i) && i ==567); } //------------------------------------------------------------------------------ void istreamStr() { char str[20]; ibInit("abc def\r\n hij"); testVerifyBool((ib >> str) && ib.good()); testVerifyStr(str, "abc"); testVerifyBool((ib >> str) && ib.good()); testVerifyStr(str, "def"); testVerifyBool((ib >> str) && ib.eof()); testVerifyStr(str, "hij"); } //------------------------------------------------------------------------------ void setup() { testBegin(); istreamBool(); istreamChar(); istreamDouble(); istreamFloat(); istreamGet(); istreamNumber(); istreamStr(); testEnd(); } //------------------------------------------------------------------------------ void loop() {}