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