Microsoft Small Basic

Program Listing: QHQ707
'???DEBUG = "True"
DEBUG = "False"

'mise en forme de la fenêtre de saisie

TextWindow.Title = "TEST recherche AERONEF début à " + Clock.Time
TextWindow.Top=100
TextWindow.Left=1000

TextWindow.BackgroundColor ="Blue"
TextWindow.ForegroundColor ="Magenta"

'chargement des tableau des répertoires
initialise_répertoires()

PREMIER = "False"

lecture_recherche:

TextWindow.Write ("Entrez un masque de recherches : ")
recherche_texte= TextWindow.Read()

If Text.GetLength(recherche_texte) = 0 then
TextWindow.WriteLine ("Veuillez entrez un masque valide")
Goto lecture_recherche
endif

TextWindow.WriteLine ("Votre recherche est : " + recherche_texte + " de longueur=" + Text.GetLength(recherche_texte))

recherche_nombre = 0
texte = text.ConvertToUpperCase(recherche_texte)
texte_longueur = Text.GetLength(texte)

If (texte = "FIN") then
Goto lecture_recherche_fin
Endif

'recherche des mots du masque
découpe_recherche()

If recherche_nombre > 0 then
'au moins un mot valide dans le masque de recherche
trouvé_nombre = 0

lecture_répertoire()
PREMIER = "True"

If trouvé_nombre > 0 then
'au moins une référence du répertoire correspondant à la recherche


TextWindow.WriteLine ("VOIR çi-contre la liste des références trouvés pour :" + recherche_texte)


TextWindow.WriteLine ("fin de la liste pour : " + recherche_texte)
Else
TextWindow.WriteLine ("AUCUNE référence pour : " + recherche_texte)
EndIf

affiche_résultat()

Else
TextWindow.WriteLine ("vérifiez votre demande")
Endif

Goto lecture_recherche

lecture_recherche_fin:

TextWindow.Show()

'---------------------------------sous-routines ----------------------------
Sub initialise_répertoires
'création des répertoires

répertoire_texte[01] = "520"
répertoire_texte[02] = "A"
répertoire_texte[03] = "A 1"
répertoire_texte[04] = "A 103"
répertoire_texte[05] = "AB 139"
répertoire_texte[06] = "B 520"
répertoire_texte[07] = "B-52"
répertoire_texte[08] = "spitfire A"
répertoire_texte[09] = "spitfire AB"
répertoire_texte[10] = "SU 300 MK"
répertoire_texte[11] = "TA 520"
répertoire_texte[12] = "VV"

répertoire_maximum = 12

EndSub

Sub découpe_recherche
'découpage en mot dans une table du texte de recherche
'??? If (DEBUG) Then
'??? TextWindow.WriteLine ("DEBUG/découpe_recherche/texte : " + texte + "/longueur=" + texte_longueur)
'??? EndIf

mot = ""
caractère_position = 0
texte_position = 0
texte_longueur = texte_longueur + 1

While (texte_position < texte_longueur)

texte_position = texte_position + 1
caractère = Text.GetSubText(texte,texte_position,1)
caractère_unicode = text.GetCharacterCode(caractère)

If (caractère_unicode = 0) Or (caractère = " " Or caractère = "," ) Then

If caractère_position > 0 Then
'??? If (DEBUG) Then
'??? TextWindow.Writeline ("DEBUG/découpe_recherche/mot : " + mot + " position=" + caractère_position)
'??? EndIf
recherche_nombre = recherche_nombre + 1
recherche_mot[recherche_nombre] = mot
mot = ""
recherche_longueur[recherche_nombre] = caractère_position
caractère_position = 0
EndIf
Else
'??? If (DEBUG) Then
'??? TextWindow.WriteLine ("DEBUG/découpe_recherche/caractère : " + caractère + " UNI=" + caractère_unicode)
'??? EndIf
caractère_position = caractère_position + 1
mot = Text.Append(mot, caractère)
EndIf
EndWhile

'??? If (DEBUG) Then
'??? TextWindow.Writeline ("DEBUG/découpe_recherche/mot nombre =" + recherche_nombre)
'??? EndIf

EndSub

Sub lecture_répertoire
'balayage de tous les éléments du répertoire

répertoire_référence = 0

While (répertoire_référence < répertoire_maximum)

répertoire_référence = répertoire_référence + 1
texte = text.ConvertToUpperCase(répertoire_texte[répertoire_référence])
texte_longueur = Text.GetLength(texte)

répertoire_nombre = 0
complet_texte = ""
complet_position = 0

'extraction des mots du texte de la référence du répertoire
découpe_répertoire()

If répertoire_nombre > 0 Then
'au moins un mot valide pour la référence
If répertoire_nombre > 1 Then
'plus de UN mot alors recherche mots concaténés (=complet)
répertoire_nombre = répertoire_nombre + 1
répertoire_mot[répertoire_nombre] = complet_texte
répertoire_longueur[répertoire_nombre] = complet_position
'??? If (DEBUG) then
'??? TextWindow.Writeline ("DEBUG/découpe_répertoire/COMPLET texte : " + complet_texte + " longueur=" + complet_position)
'??? EndIf
EndIf
valide_position = 0
'recherche de correspondance des mots du répertoire

test_répertoire()

If (valide_position > 0) Then
'au moins un mot correspondant à la recherche
trouvé_nombre = trouvé_nombre + 1
trouvé_référence[trouvé_nombre] = répertoire_référence
trouvé_texte[trouvé_nombre] = répertoire_texte[répertoire_référence]
trouvé_liste[trouvé_nombre] = répertoire_nombre

récupère_mots()

EndIf
EndIf
EndWhile

EndSub

Sub découpe_répertoire
'découpage en mot dans une table du texte du répertoire
If (DEBUG) Then
TextWindow.WriteLine ("DEBUG/découpe_répertoire/référence(" + répertoire_référence + ") : " + texte + "/longueur=" + texte_longueur)
EndIf

mot = ""

caractère_position = 0
texte_position = 0
texte_longueur = texte_longueur + 1

While (texte_position < texte_longueur)

texte_position = texte_position + 1
caractère = Text.GetSubText(texte,texte_position,1)
caractère_unicode = text.GetCharacterCode(caractère)

'?? If (DEBUG) Then
'?? TextWindow.WriteLine ("DEBUG/découpe_répertoire/caractère : " + caractère + " UNI=" + caractère_unicode)
'?? EndIf

If (caractère_unicode = 0) Or (Text.IsSubText(" *?+-=!#£",caractère)) Then
If caractère_position > 0 Then
If (DEBUG) Then
TextWindow.Writeline ("DEBUG/découpe_répertoire/mot : " + mot + " longueur=" + caractère_position)
EndIf
répertoire_nombre = répertoire_nombre + 1
répertoire_mot[répertoire_nombre] = mot
mot = ""
répertoire_longueur[répertoire_nombre] = caractère_position
caractère_position = 0
EndIf
Else
complet_position = complet_position + 1
complet_texte = Text.Append(complet_texte, caractère)
caractère_position = caractère_position + 1
mot = Text.Append(mot, caractère)
EndIf
EndWhile

If (DEBUG) Then
TextWindow.Writeline ("DEBUG/découpe_répertoire/mot nombre =" + répertoire_nombre)
EndIf

EndSub


Sub test_répertoire
'vérification correspondance du texte du répertoire avec le masque de recherche

répertoire_position = 0

While (répertoire_position < répertoire_nombre)
'pour chaque mot de la référence répertoire
répertoire_position = répertoire_position + 1
recherche_position = 0
valide_nombre[répertoire_position] = 0

While (recherche_position < recherche_nombre)
'pour chaque mot du masque de recherche
recherche_position = recherche_position + 1
If (DEBUG) Then
TextWindow.Writeline ("DEBUG/test_répertoire/mot recherche : " + recherche_mot[recherche_position] + " /répertoire : " + répertoire_mot[répertoire_position])
EndIf

If recherche_mot[recherche_position] = répertoire_mot[répertoire_position] Then
'un mot identique (tous caractères)
ajoute_valide()

Else
'vérification si correspondance des caractères possibles (présence de masque)
masque_mot = recherche_mot[recherche_position]
masque_longueur = recherche_longueur[recherche_position]
texte = répertoire_mot[répertoire_position]
texte_longueur = répertoire_longueur[répertoire_position]
masque_valide = "NON"
If (DEBUG) Then
TextWindow.Writeline ("DEBUG/test_répertoire/masque mot : " + masque_mot + "/longueur=" + masque_longueur + " /texte : " + texte + "/longueur=" + texte_longueur)
EndIf
'vérification du mot (caractère par caractère) selon le masque
controle_mot()

If masque_valide = "OUI" Then
'le mot est valide pour un masque
ajoute_valide()

EndIf
EndIf
EndWhile
EndWhile

EndSub

Sub ajoute_valide
''récupération des indices des mots de recherche valides

valide_nombre[répertoire_position] = valide_nombre[répertoire_position] + 1
valide_position = valide_nombre[répertoire_position]

valide_recherche[répertoire_position][valide_position] = recherche_position

If (DEBUG) Then
TextWindow.Writeline ("DEBUG/ajoute_valide/nombre=" + valide_nombre[répertoire_position] + "/répertoire(" + répertoire_position + ")/recherche(" + recherche_position + ")")
EndIf

EndSub

Sub controle_mot
'controle du mot selon le masque

masque_position = 0
texte_position = 0
masque_précédent = " "
masque_strict = " "
valide_caractère = "OUI"

While (valide_caractère = "OUI")

If (texte_position < texte_longueur) then
'pour chaque caractère valide du répertoire
texte_position = texte_position + 1
caractère = Text.GetSubText(texte,texte_position,1)

controle_caractère()

Else
'en fin de mot
If (masque_position < masque_longueur) then
'pour caractère restant dans masque
caractère = " "

controle_caractère()

Else
'fin du controle des caractères
valide_caractère ="NON"
EndIf
EndIf

EndWhile

If (DEBUG) Then
TextWindow.WriteLine ("DEBUG/controle_mot/caractère-valide:" + valide_caractère + "-test:" + test_caractère)
EndIf

If (test_caractère = "FAUX") Then
'dernier caractère ne correspond pas
If (masque_strict = "=") Then
masque_valide = "NON"
Goto controle_mot_fin
EndIf

If (masque_strict = "!") Then
masque_valide = "OUI"
Goto controle_mot_fin
EndIf

masque_valide = "NON"
Goto controle_mot_fin
EndIf

'dernier caractère correspond
If (masque_strict = "=") Then
masque_valide = "OUI"
Goto controle_mot_fin
EndIf

If (masque_strict = "!") Then
masque_valide = "NON"
Goto controle_mot_fin
EndIf

masque_valide = "OUI"

controle_mot_fin:

EndSub

Sub controle_caractère
'controle caractère par caractère selon le masque

valide_caractère = "NON"
test_caractère = "FAUX"

If (masque_position < masque_longueur) Then
'pour chaque caractère du masque
masque_position = masque_position + 1
masque_test = Text.GetSubText(masque_mot,masque_position,1)
Else
If (Text.GetSubText(masque_mot,masque_position,1) = "*") then
'fin du masque avec * (caractères quelconque à suivre)
masque_test = "*"
Else
'fin du masque
masque_test = " "
EndIf
EndIf

If (DEBUG) Then
TextWindow.Writeline ("DEBUG/test_répertoire/caractère masque: " + masque_test + "/position=" + masque_position + " /texte : " + caractère + "/position=" + texte_position)
EndIf

If (caractère = masque_test) Then
'le caractère est identique (vérification si exclusion +-)
test_caractère = "VRAI"

test_précédent()

Else
'le caractère est différent (voir si masque caractère)
test_masque()

EndIf
masque_précédent = masque_test

EndSub

Sub test_précédent
'test caractère valide

If (masque_précédent = "+") Then
'caractère suivant obligatoire
If (test_caractère = "VRAI") Then
If (caractère = " ") Then
valide_caractère = "NON"
Else
valide_caractère = "OUI"
EndIf
Goto test_précédent_fin
EndIf
EndIf

If (masque_précédent = "-") Then
'caractère suivant interdit
If (test_caractère = "FAUX") Then
If (caractère = " ") Then
valide_caractère = "OUI"
Else
valide_caractère = "NON"
EndIf
Goto test_précédent_fin
EndIf
EndIf

If (test_caractère = "VRAI") Then

valide_caractère = "OUI"
Goto test_précédent_fin
EndIf

test_précédent_fin:

EndSub

Sub test_masque
'test caractère spéciaux du masque

If (masque_test = ".") Then
'masque répétition dernier caractère
valide_caractère = "OUI"
masque_test = masque_précédent
texte_position = texte_position - 1
Goto test_masque_fin
EndIf

If (masque_test = "=" Or masque_test = "!") Then
'masque identique ou différent
masque_strict = masque_test
Goto test_masque_fin
EndIf

If (masque_test = "+" Or masque_test = "-") Then
'masque obligatoire ou exclu pour caractère suivant
valide_caractère = "OUI"
masque_précédent = masque_test
Goto test_masque_fin
EndIf

If (masque_test = "*") Then
'masque aucun ou n'importe quel caractère
test_caractère = "VRAI"

test_précédent()

Goto test_masque_fin
EndIf

If (masque_test = "?") Then
'masque n'importe quel caractère
If (caractère = " ") then
test_caractère = "FAUX"
Else
test_caractère = "VRAI
EndIf

test_précédent()

Goto test_masque_fin
EndIf

If (masque_test = "#") Then
'masque chiffre (0 à 9)
If Text.IsSubText ("0123456789",caractère) then
test_caractère = "VRAI"
Else
test_caractère = "FAUX"
EndIf

test_précédent()

Goto test_masque_fin
EndIf

If (masque_test = "£") Then
'masque lettre (alphabet)
If Text.IsSubText ("ABCDEFGHIJKLMNOPQRSTUVWXYZ",caractère) then
test_caractère = "VRAI"
Else
test_caractère = "FAUX"
EndIf

test_précédent()

Goto test_masque_fin
EndIf

'PAS de masque et caractère différent

test_caractère = "FAUX"

test_précédent()

test_masque_fin:

EndSub


Sub récupère_mots
'récupération des mots du répertoires

répertoire_position = 0

While (répertoire_position < trouvé_liste[trouvé_nombre])

'pour chaque mot de la référence valide
répertoire_position = répertoire_position + 1
trouvé_mot[trouvé_nombre][répertoire_position] = répertoire_mot[répertoire_position]
trouvé_longueur[trouvé_nombre][répertoire_position] = répertoire_longueur[répertoire_position]
If (DEBUG) Then
TextWindow.Writeline ("DEBUG/récupère_mots/mot(" + répertoire_position + ") mot:" + répertoire_mot[répertoire_position] + "/longueur=" + répertoire_longueur[répertoire_position])
EndIf
trouvé_valide[trouvé_nombre][répertoire_position] = valide_nombre[répertoire_position]

récupère_valides()

valide_nombre[répertoire_position] = 0
EndWhile

EndSub

Sub récupère_valides
'récupération des correspondance répertoire/recherche

valide_position = 0

While (valide_position < valide_nombre[répertoire_position])

'pour chaque mot valide de la référence
valide_position = valide_position + 1

trouvé_recherche[trouvé_nombre][répertoire_position][valide_position] = valide_recherche[répertoire_position][valide_position]

If (DEBUG) then
TextWindow.Writeline ("DEBUG/récupère_valides/TROUVE nombre=" + trouvé_nombre + " répertoire=" + répertoire_position + " valide=" + valide_position + " IRC=" + trouvé_recherche[trouvé_nombre][répertoire_position][valide_position])
EndIf

EndWhile

EndSub

Sub affiche_résultat
'affichage de la liste des références si trouvés

If (PREMIER) then
GraphicsWindow.Clear()
EndIf

'création de la fenêtre graphique
If (trouvé_nombre = 0) Then
GraphicsWindow.Title = "recherche AERONEF - aucune référence pour : " + recherche_texte
Else
GraphicsWindow.Title = "recherche AERONEF - liste des (" + trouvé_nombre + ") références pour : " + recherche_texte
EndIf
GraphicsWindow.BackgroundColor = "Blue"
GraphicsWindow.Width = 800
GraphicsWindow.Height = 500

GraphicsWindow.Left=10
GraphicsWindow.Top=100

ligne_hauteur = 15
caractère_largeur = 8

'première ligne
ligne_position = 5 + ligne_hauteur
colonne_position = 1
ligne_texte = "liste des mots recherchés :"
ligne_longueur = Text.GetLength(ligne_texte)

GraphicsWindow.BrushColor = "White"
GraphicsWindow.DrawText(colonne_position,ligne_position,ligne_texte)

colonne_position = 300

recherche_position = 0
If (trouvé_nombre = 0) Then
GraphicsWindow.BrushColor = "Red"
Else
GraphicsWindow.BrushColor = "LimeGreen"
EndIf

While (recherche_position < recherche_nombre)
'pour chaque mot recherchés
recherche_position = recherche_position + 1
If (recherche_position > 1) Then
GraphicsWindow.DrawText(colonne_position,ligne_position,",")
colonne_position = colonne_position + caractère_largeur
EndIf

GraphicsWindow.DrawText(colonne_position,ligne_position, recherche_mot[recherche_position])

colonne_position = colonne_position + (recherche_longueur[recherche_position] * caractère_largeur)
EndWhile

If (trouvé_nombre > 0) Then

'deuxième ligne
GraphicsWindow.BrushColor = "White"
ligne_position = ligne_position + ligne_hauteur
colonne_position = 1
ligne_texte = "REPERTOIRE(REFERENCE)"

GraphicsWindow.DrawText(colonne_position,ligne_position,ligne_texte)

ligne_longueur = Text.GetLength(ligne_texte) + 2
colonne_position = colonne_position + (ligne_longueur * caractère_largeur)

GraphicsWindow.DrawText(colonne_position,ligne_position,":TEXTE")

'nouvelle ligne
ligne_position = ligne_position + ligne_hauteur

GraphicsWindow.DrawText(colonne_position,ligne_position,"/MOTs")

affiche_tableau()

EndIf

EndSub

Sub affiche_tableau
'affichage sous forme de tableau (LIGNE=répertoire, COLONNE =recherche)

trouvé_position = 0

While (trouvé_position < trouvé_nombre)

'pour chaque référence correspondant
trouvé_position = trouvé_position + 1
'nouvelle ligne
ligne_position = ligne_position + ligne_hauteur
colonne_position = 1
ligne_texte = Text.Append("AERONEF(", trouvé_référence[trouvé_position])
ligne_texte = Text.Append(ligne_texte, ")")

ligne_début = Text.GetLength(ligne_texte) + 1
ligne_texte = Text.Append(ligne_texte, ":")
ligne_texte = Text.Append(ligne_texte, trouvé_texte[trouvé_position])

ligne_longueur = Text.GetLength(ligne_texte)

GraphicsWindow.BrushColor = "OrangeRed"
GraphicsWindow.DrawText(colonne_position,ligne_position, ligne_texte)

colonne_position = colonne_position + (ligne_longueur * caractère_largeur)

affiche_mots()

Endwhile

EndSub

Sub affiche_mots
'affichage de la liste des mots

colonne_position = (ligne_début * caractère_largeur)
'premier mot sur nouvelle ligne
ligne_position = ligne_position + ligne_hauteur

répertoire_position = 0

While (répertoire_position < trouvé_liste[trouvé_position])
If (répertoire_position > 0) Then
If (trouvé_valide[trouvé_position][répertoire_position] > 0) Then
'nouvelle ligne pour mot suivant
ligne_position = ligne_position + ligne_hauteur
EndIf
EndIf
'pour chaque mot du répertoire
répertoire_position = répertoire_position + 1

ligne_texte = Text.Append("/",trouvé_mot[trouvé_position][répertoire_position])
If (trouvé_valide[trouvé_position][répertoire_position] > 0) Then

GraphicsWindow.BrushColor = "LimeGreen"
GraphicsWindow.DrawText(colonne_position,ligne_position, ligne_texte)

ligne_longueur = Text.GetLength(ligne_texte)
colonne_sauve = colonne_position + (ligne_longueur * caractère_largeur)
colonne_position = 300
ligne_texte = ""

affiche_valides()

ligne_texte = ""
colonne_position = colonne_sauve
Else
GraphicsWindow.BrushColor = "Red"
GraphicsWindow.DrawText(colonne_position,ligne_position, ligne_texte)
ligne_longueur = Text.GetLength(ligne_texte)
colonne_position = colonne_position + (ligne_longueur * caractère_largeur)
EndIf

EndWhile

EndSub

Sub affiche_valides
'chargement des indices des mots de recherche correspondant

valide_position = 0

While (valide_position < trouvé_valide[trouvé_position][répertoire_position])

valide_position = valide_position + 1

ligne_texte = Text.Append(ligne_texte,"/IRC(")
ligne_texte = Text.Append(ligne_texte, trouvé_recherche[trouvé_position][répertoire_position][valide_position])
ligne_texte = Text.Append(ligne_texte,")")

EndWhile

colonne_position = 300

GraphicsWindow.DrawText(colonne_position,ligne_position, ligne_texte)

EndSub