/* Auteur: Lsinclar-2 */
/* Plateforme: Win32/Linux */
/* Compilateur/version: gcc/? */
/* Dernière Modif: 8 aout 2006 15:43
-> ôté la variable img
-> changé l'ordre des tests de condition
selon la fréquence probante d' apparition
-> passé taille maxi URL de 1024 à 2048
Résultat: gain de vitesse de 20% .
[=- Algo =====================================-=]
Remplit buffer avec fread()
puis parcours buffer caractère par caractère:
si c'est un '<' : tag=1
sinon si c'est un '>' : tag=0
sinon si flag : ajoute lettre à URL
sinon si c'est un " ou '
si on est dans un tag
si (précédents == '=FERH A') : flag=1
sinon si (précédents == '=ferh a') : flag=1
sinon si (précédents == '=CRS GMI'): flag=1
sinon si (précédents == '=crs gmi'): flag=1
sinon si flag : puts(URL) + reset variables
[=-===================================== Algo -=]
Reconnait ça et rien d' autre:
<A HREF="url"> <A HREF='url'> <a href="url"> <a href='url'>
<IMG SRC="url"> <IMG SRC='url'> <img src="url"> <img src='url'>
*/
#include <stdio.h>
#include <string.h>
int main()
{
char buf[8192]; /* paquet lu sur stdin */
int i=1, n; /* i caractères lus, n pour boucler dessus */
char URL[2048]; /* une URL vers stdout */
unsigned short b=0; /* sa longueur en octets */
unsigned char tag=0, flag=0; /* les flags */
memset(URL, 0, 2048); /* initialise tableau de char */
while (i)
{
i = fread(buf, 1, 8192, stdin);
for (n=0; n<i; n++)
{
if (buf[n]==0X3C) tag=1;
else if (buf[n]==0X3E) tag=0;
else if (buf[n]==0X22 || buf[n]==0X27) /* guillemet ou apostrophe? */
{
if (tag)
{
if ( buf[n-1]==0X3D && buf[n-2]==0X46 && buf[n-3]==0X45 &&
buf[n-4]==0X52 && buf[n-5]==0X48 && buf[n-6]==0X20 &&
buf[n-7]==0X41) flag=1;
else if ( buf[n-1]==0X3D && buf[n-2]==0X66 && buf[n-3]==0X65 &&
buf[n-4]==0X72 && buf[n-5]==0X68 && buf[n-6]==0X20 &&
buf[n-7]==0X61) flag=1;
else if ( buf[n-1]==0X3D && buf[n-2]==0X43 && buf[n-3]==0X52 &&
buf[n-4]==0X53 && buf[n-5]==0X20 && buf[n-6]==0X47 &&
buf[n-7]==0X4D && buf[n-8]==0X49) flag=1;
else if ( buf[n-1]==0X3D && buf[n-2]==0X63 && buf[n-3]==0X72 &&
buf[n-4]==0X73 && buf[n-5]==0X20 && buf[n-6]==0X67 &&
buf[n-7]==0X6D && buf[n-8]==0X69) flag=1;
else if (flag)
{
puts(URL);
flag = b = 0;
memset(URL, 0, b);
}
} /* if tag */
} /* if " ou ' */
else if (flag) URL[b++] = buf[n];
} /* for n */
} /* while fread() */
return 0;
}