Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- // Finite state machine for parsing XML tags of interest
- void RSSReader::runStateMachine(char ch) {
- switch (state) {
- case INIT:
- // Make buffers empty
- memset(titleBuffer, 0, sizeof(titleBuffer));
- memset(descBuffer, 0, sizeof(descBuffer));
- memset(dateBuffer, 0, sizeof(dateBuffer));
- // Next state
- state = CHK_START;
- break;
- case CHK_START:
- if (ch == '<') {
- state = TEST_FIRST_CHAR;
- }
- break;
- case TEST_FIRST_CHAR:
- if (ch == date[0]) {
- dateIndex = 1;
- state = CHK_DATE;
- }
- else if (ch == title[0]) {
- titleIndex = 1;
- state = CHK_TITLE;
- } else if (ch == desc[0]) {
- descIndex = 1;
- state = CHK_DESC;
- } else {
- state = CHK_START;
- }
- break;
- case CHK_DATE:
- if (ch != date[dateIndex]) {
- state = CHK_START;
- break;
- }
- dateIndex++;
- if (ch == '>') {
- dateIndex = 0;
- state = GET_DATE;
- }
- break;
- case CHK_TITLE:
- if (ch != title[titleIndex]) {
- state = CHK_START;
- break;
- }
- titleIndex++;
- if (ch == '>') {
- titleIndex = 0;
- state = GET_TITLE;
- }
- break;
- case CHK_DESC:
- if (ch != desc[descIndex]) {
- state = CHK_START;
- break;
- }
- descIndex++;
- if (ch == '>') {
- descIndex = 0;
- state = GET_DESC;
- }
- break;
- case GET_TITLE:
- if (ch != '<') {
- titleBuffer[titleIndex++] = ch;
- } else {
- titleBuffer[titleIndex++] = '\0';
- if ((strlen(titleBuffer) != 0) && (titleCallback != NULL)) {
- titleCallback(titleBuffer);
- }
- state = CHK_START;
- }
- break;
- case GET_DESC:
- if ((ch != '<') && (ch != '&')) {
- descBuffer[descIndex++] = ch;
- } else {
- descBuffer[descIndex++] = '\0';
- if ((strlen(descBuffer) != 0) && (descCallback != NULL)) {
- descCallback(descBuffer);
- }
- state = CHK_START;
- }
- break;
- case GET_DATE:
- if (ch != '<') {
- dateBuffer[dateIndex++] = ch;
- } else {
- // Just return the date not the time
- dateBuffer[17] = '\0';
- if ((strlen(dateBuffer) != 0) && (dateCallback != NULL)) {
- dateCallback(dateBuffer);
- }
- state = CHK_START;
- }
- break;
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement