# Fonction PCODE ID = 860027343
REGISTRE ENTIER date_art
REGISTRE POINTEUR Table_Externe
REGISTRE POINTEUR cle

############################################################################
#
# Nom du fichier: rechercheDicho
# 
# Fonction:
#    Recherche dichotomique de la valeur correspondante a la cle
#    dans la table externe
#
# En entree :
#    cle
#    Table_Externe
#    date_art
#
# En sortie:
#    si OK      : pt_valeur
#    Erreur     : g_inull
#
############################################################################
# 23/03/2011 Creation DRE 
############################################################################

#------------------------------------------------------------------------------------

#nombre de valeur dans la table
REGISTRE  ENTIER	nb_entree
#indice de debut
REGISTRE  ENTIER	id  
#indice de fin
REGISTRE  ENTIER	ifin  
#indice de milieu
REGISTRE  ENTIER	im
#different de 0 tant que la valeur "cle" n'aura pas ete trouvee  
REGISTRE  ENTIER	trouve
REGISTRE  ENTIER	erreur
#REGISTRE  ENTIER	NbCycle

REGISTRE  POINTEUR	pt_cle
REGISTRE  POINTEUR	pt_valeur
REGISTRE  POINTEUR	pt_clevaleur
REGISTRE  POINTEUR	pt_Buffer



date_art = depilerENTIER()
Table_Externe = depilerPOINTEUR()
cle = depilerPOINTEUR()
#Allocation des pointeurs
pt_cle	=	"pt_clept_cle01234567890123456789-01234567890123456"
pt_valeur  = 	"pt_valeurpt_valeur012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901"
pt_Buffer =    	"pt_Bufferpt_Buffer01234567890123456789-01234567890123456789;012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456"
pt_clevaleur = 	"pt_clevaleurpt_clevaleur01234567890123456789-01234567890123456789;0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234"

#Initialisation des variables
#NbCycle = 0
trouve = -1  
id = 0
#Recherce du nombre d'occurence de la table externe
nb_entree = i_get_tab_nb_entries(Table_Externe,date_art)
ifin = nb_entree - 1

#Initialisation des pointeurs
i_strcpy(pt_cle,g_inull)
i_strcpy(pt_valeur,g_inull)
i_strcpy(pt_clevaleur,g_inull)
i_strcpy(pt_Buffer,g_inull)

#boucle de recherche
POINT Boucle_rechercheDicho
	SI(trouve != 0 && ((ifin - id) >= 0))
	ALORS
#		NbCycle = NbCycle + 1
		#on determine l'indice de milieu
		im = (id + ifin)/2
		erreur=i_get_tab_one_entry (Table_Externe,date_art,im,pt_Buffer)
		#on ajoute un ';' pour facilit? l'utilisation de 'i_recupererValeur'
		erreur=i_format_str2(pt_clevaleur,"%s%s",pt_Buffer,";")
		erreur=i_recupererValeur(pt_clevaleur,pt_cle,i_strlen(pt_clevaleur),';')
		trouve =  i_strplcmp ( cle, pt_cle, 0, i_strlen(pt_cle))
		SI trouve < 0
		ALORS
			ifin = im - 1
		SINON
			id = im + 1
		FINSI
		SAUT Boucle_rechercheDicho		
	FINSI
#FIN Boucle_rechercheDicho
#trace1("Nombre de cycle de recherche = %d  ", NbCycle)

SI trouve == 0
ALORS
	erreur=i_recupererValeur(pt_clevaleur,pt_valeur,i_strlen(pt_clevaleur),';')
	#trace2 ("valeur associee a <%s> : <%s>", cle, pt_valeur)
	RETOUR pt_valeur
SINON
	#trace("cle non trouvee dans la table externe")
	RETOUR 0
FINSI

