http://mbed.org/users/shintamainjp/notebook/starboard_expbrd-one_ex1_en/

Dependencies:   mbed RemoteIR SuperTweet ConfigFile EthernetNetIf

Committer:
shintamainjp
Date:
Fri Oct 29 23:17:01 2010 +0000
Revision:
0:db299c5a18ba
Child:
1:c4cfd136f9c7
Initial version.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
shintamainjp 0:db299c5a18ba 1
shintamainjp 0:db299c5a18ba 2 #include "StreamFilter.h"
shintamainjp 0:db299c5a18ba 3
shintamainjp 0:db299c5a18ba 4 /**
shintamainjp 0:db299c5a18ba 5 * Create.
shintamainjp 0:db299c5a18ba 6 *
shintamainjp 0:db299c5a18ba 7 * @param headtxt Head of a target.
shintamainjp 0:db299c5a18ba 8 * @param tailtxt Tail of a target.
shintamainjp 0:db299c5a18ba 9 */
shintamainjp 0:db299c5a18ba 10 StreamFilter::StreamFilter(const char *headtxt, const char *tailtxt)
shintamainjp 0:db299c5a18ba 11 : headcnt(0), tailcnt(0), head(headtxt), tail(tailtxt), content("") {
shintamainjp 0:db299c5a18ba 12 }
shintamainjp 0:db299c5a18ba 13
shintamainjp 0:db299c5a18ba 14 /**
shintamainjp 0:db299c5a18ba 15 * Dispose.
shintamainjp 0:db299c5a18ba 16 */
shintamainjp 0:db299c5a18ba 17 StreamFilter::~StreamFilter() {
shintamainjp 0:db299c5a18ba 18 }
shintamainjp 0:db299c5a18ba 19
shintamainjp 0:db299c5a18ba 20 /**
shintamainjp 0:db299c5a18ba 21 * Check state of done.
shintamainjp 0:db299c5a18ba 22 *
shintamainjp 0:db299c5a18ba 23 * @return Return true if it done.
shintamainjp 0:db299c5a18ba 24 */
shintamainjp 0:db299c5a18ba 25 bool StreamFilter::done() {
shintamainjp 0:db299c5a18ba 26 if ((headcnt == strlen(head)) && (tailcnt == strlen(tail))) {
shintamainjp 0:db299c5a18ba 27 return true;
shintamainjp 0:db299c5a18ba 28 }
shintamainjp 0:db299c5a18ba 29 return false;
shintamainjp 0:db299c5a18ba 30 }
shintamainjp 0:db299c5a18ba 31
shintamainjp 0:db299c5a18ba 32 /**
shintamainjp 0:db299c5a18ba 33 * Reset state.
shintamainjp 0:db299c5a18ba 34 */
shintamainjp 0:db299c5a18ba 35 void StreamFilter::reset() {
shintamainjp 0:db299c5a18ba 36 headcnt = 0;
shintamainjp 0:db299c5a18ba 37 tailcnt = 0;
shintamainjp 0:db299c5a18ba 38 memset(content, 0, sizeof(content));
shintamainjp 0:db299c5a18ba 39 }
shintamainjp 0:db299c5a18ba 40
shintamainjp 0:db299c5a18ba 41 /**
shintamainjp 0:db299c5a18ba 42 * Push a data to a internal buffer.
shintamainjp 0:db299c5a18ba 43 *
shintamainjp 0:db299c5a18ba 44 * @param c character.
shintamainjp 0:db299c5a18ba 45 */
shintamainjp 0:db299c5a18ba 46 void StreamFilter::push(char c) {
shintamainjp 0:db299c5a18ba 47 if (done()) {
shintamainjp 0:db299c5a18ba 48 return;
shintamainjp 0:db299c5a18ba 49 }
shintamainjp 0:db299c5a18ba 50
shintamainjp 0:db299c5a18ba 51 /*
shintamainjp 0:db299c5a18ba 52 * Check a text for the header.
shintamainjp 0:db299c5a18ba 53 */
shintamainjp 0:db299c5a18ba 54 if (headcnt < strlen(head)) {
shintamainjp 0:db299c5a18ba 55 if (c == head[headcnt]) {
shintamainjp 0:db299c5a18ba 56 headcnt++;
shintamainjp 0:db299c5a18ba 57 } else {
shintamainjp 0:db299c5a18ba 58 headcnt = 0;
shintamainjp 0:db299c5a18ba 59 }
shintamainjp 0:db299c5a18ba 60 return;
shintamainjp 0:db299c5a18ba 61 }
shintamainjp 0:db299c5a18ba 62 /*
shintamainjp 0:db299c5a18ba 63 * Check a text for the tailer.
shintamainjp 0:db299c5a18ba 64 */
shintamainjp 0:db299c5a18ba 65 if (tailcnt < strlen(tail)) {
shintamainjp 0:db299c5a18ba 66 if (c == tail[tailcnt]) {
shintamainjp 0:db299c5a18ba 67 tailcnt++;
shintamainjp 0:db299c5a18ba 68 return;
shintamainjp 0:db299c5a18ba 69 } else {
shintamainjp 0:db299c5a18ba 70 tailcnt = 0;
shintamainjp 0:db299c5a18ba 71 }
shintamainjp 0:db299c5a18ba 72 }
shintamainjp 0:db299c5a18ba 73 /*
shintamainjp 0:db299c5a18ba 74 * It's a content.
shintamainjp 0:db299c5a18ba 75 */
shintamainjp 0:db299c5a18ba 76 const int n = strlen(content);
shintamainjp 0:db299c5a18ba 77 if (n < sizeof(content) - 1) {
shintamainjp 0:db299c5a18ba 78 content[n + 0] = c;
shintamainjp 0:db299c5a18ba 79 content[n + 1] = '\0';
shintamainjp 0:db299c5a18ba 80 }
shintamainjp 0:db299c5a18ba 81 }
shintamainjp 0:db299c5a18ba 82
shintamainjp 0:db299c5a18ba 83 /**
shintamainjp 0:db299c5a18ba 84 * Get a content text.
shintamainjp 0:db299c5a18ba 85 *
shintamainjp 0:db299c5a18ba 86 * @param buf A pointer to a buffer.
shintamainjp 0:db299c5a18ba 87 * @param bufsiz Size of the buffer.
shintamainjp 0:db299c5a18ba 88 *
shintamainjp 0:db299c5a18ba 89 * @return true if it succeed.
shintamainjp 0:db299c5a18ba 90 */
shintamainjp 0:db299c5a18ba 91 bool StreamFilter::getContent(char *buf, size_t bufsiz) {
shintamainjp 0:db299c5a18ba 92 if (strlen(content) < bufsiz) {
shintamainjp 0:db299c5a18ba 93 strcpy(buf, content);
shintamainjp 0:db299c5a18ba 94 return true;
shintamainjp 0:db299c5a18ba 95 }
shintamainjp 0:db299c5a18ba 96 return false;
shintamainjp 0:db299c5a18ba 97 }