/* Auteur: Dark_Ebola */
/* Plateforme: Win32/Linux */
/* Compilateur/version: gcc/? */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
typedef struct flag_struct
{
int balise; //keep track of number of opened balises
unsigned int quote:
1; //are we in a quote?
unsigned int type:
2; //0 balise ?, 1 balise img, 2 balise a
unsigned int href:
1; //have we detected href?
unsigned int src:
1; //have we detected src?
unsigned int print:
1; //should we print it?
}
flag;
void parse()
{
const char *refs[] =
{"img\0","src\0","href"
};
int cur;
int counter=0,wcounter=0;
flag state =
{
0
};
while((cur = fgetc(stdin)) != EOF)
{//keep on reading stdin while everything's fine.
cur = tolower(cur);
if(cur == '\"')
{//toggle state.quote
state.quote = ~state.quote;
}
else if(!state.quote && cur == '<')
{//new marker, increment state.balise
state.balise++;
if(state.balise == 0)
{
wcounter = 0;
counter = 0;
state.print = 0;
}
}
else if(!state.quote && cur == '>')
{//closing a marker
state.balise--;
if(state.balise == 0)
{
wcounter = 0;
counter = 0;
state.print = 0;
}
}
else if((state.balise > 0) && isspace(cur) != 0)
{
if(counter >0)
wcounter++;
state.print = 0;
counter = 0;
}
else if(!state.quote && (state.balise > 0) && (counter <= 3))
{
if (wcounter == 0)
{//begining of a marker: we have our marker keyword ('a' or "img")
if(cur == refs[0][counter] && (state.type == 1 || state.type == 0))
{
state.type = 1;
}
else if(cur == 'a' && counter == 0)
{
state.type = 2;
}
else
{
state.type = 0;
}
}
else
{//determining if we ecounter "href" or "src"
if(cur == refs[2][counter] && state.type == 2 && (state.href || counter == 0))
{
state.href = 1;
}
else if(cur == refs[1][counter] && state.type == 1 && (state.src || counter == 0))
{
state.src = 1;
}
else
{
state.href = 0;
state.src = 0;
}
if((counter == 3 && state.href == 1) || (counter == 2 && state.src))
{//all conditions filled, we can now toggle state.print
state.print = 1;
printf("\n");
}
}
counter++;
}
else if(state.print)
{
if(counter > strlen(refs[state.type]))
fputc(cur,stdout);
else
counter++;
}
}
printf("\n");
return;
}
int main()
{
parse();
return EXIT_SUCCESS;
}