/* 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; }