/* Auteur: Ti-R-3 */
/* Plateforme: Win32 */
/* Compilateur/version:gcc(mingw-special)/? */
/*-------------------------------------------------------------------*/
/* Auteur: Renan Lavarec (nickname: Ti-R) */
/* This is free to use and modify provided my name is included. */
/*-------------------------------------------------------------------*/
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <fcntl.h>
typedef unsigned int UINT;
typedef unsigned char UCHAR;
typedef int bool;
#define false 0
#define true 1
#define MAX_LINK_SIZE 1024
char *buffer;
char *pt_buffer;
char final_link[MAX_LINK_SIZE];
char *pt_current_link;
int max_keyword_size=4;
int len;
int nb_link=0;
inline void ParseLink(char **_s, uint32_t* _low_case_name, uint32_t* _up_case_name)
{
static uint32_t tmp_i;
static uint32_t count_max_link_size;
++(*_s);
while(**_s)
{
// Try to find '='
while(**_s)
{
if((**_s)=='>')
return;
if(**_s=='=')
break;
++(*_s);
}
// Compare if it is href/img and so on in from of the '='
if(*_low_case_name == (tmp_i = *(uint32_t*)((*_s)-4)) || *_up_case_name == tmp_i)
{
++(*_s);
if((**_s)=='"')
{
// Get the link
++(*_s);
pt_current_link=final_link;
count_max_link_size = MAX_LINK_SIZE;
while(--count_max_link_size)
{
if(!(**_s))
return;
if((**_s)=='>')
return;
if(**_s=='"')
{
(*pt_current_link)='\0';
++(*_s);
break;
}
(*pt_current_link++)=**_s;
++(*_s);
}
// Display the link
fprintf(stdout,"%s\n",final_link);
// After finding the link, jump to the end >
while((**_s))
{
if((**_s)=='>')
return;
++(*_s);
}
}
}
++(*_s);
}
}
void GetLink(char **_s)
{
ParseLink(_s, (uint32_t*)"href", (uint32_t*)"HREF");
}
void GetImg(char **_s)
{
ParseLink(_s, (uint32_t*)" src", (uint32_t*)" SRC");
}
void Parse()
{
// Get the size of file
fseek(stdin, 0, SEEK_END);
int buffer_size = ftell(stdin);
rewind(stdin);
// Allocate memory
buffer = malloc(buffer_size+1);
buffer[buffer_size]='\0';
// Copy all file in the memory
fread(buffer, 1, buffer_size, stdin);
void (*pt_functions[256])(char **);
memset(pt_functions,0,sizeof(void (*)(char **))*256);
pt_functions['a']=GetLink;
pt_functions['A']=GetLink;
pt_functions['i']=GetImg;
pt_functions['I']=GetImg;
final_link[MAX_LINK_SIZE-1]='\0';
pt_buffer = buffer;
char **_s = &pt_buffer;
while((**_s))
{
if((**_s)=='<')
{
++(*_s);
if(pt_functions[(UCHAR)**_s])
pt_functions[(UCHAR)**_s](_s);
}
else
++(*_s);
}
free(buffer);
}
int main(int argc, char *argv[])
{
Parse();
return EXIT_SUCCESS;
}