Procedure GFA_Bezeichner_Init
'Initialisiere Bezeichner-Variablen
Global GFA_Bezeichner(255) As Boolean, GFA_Nummer As Long, GFA_PrgZeile As String
Global GFA_Ruecksprung(1, 10) As Long, GFA_Ruecksprung_Pos As Long
'Initialisiere Buchstaben und Ziechen für Variablennamen
For GFA_Nummer = 0 To 255
If InStr(1, "ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890_abcdefghijklmnopqrstuvwxyz", Chr$(GFA_Nummer)) = 0 Then
GFA_Bezeichner(GFA_Nummer) = False
Else
GFA_Bezeichner(GFA_Nummer) = True
End If
Next GFA_Nummer
End Proc
Procedure GFA_Bezeichner_Suchen(GFA_Bezeichner_nur_Ausgabe As Boolean)
'Bezeichner unter Cursor erkennen und hinspringen
Dim GFA_Bezeichnung As String, GFA_Zeile_Nr As Long, GFA_Pos As Long, GFA_Klammer As Long
GFA_Bezeichnung = GFA_Bezeichner_hole_name()
GFA_Zeile_Nr = Gfa_ProcLine
'1. Durchlauf für lokale Definitionen
Repeat
GFA_Nummer = 0
GFA_PrgZeile = Gfa_Text(GFA_Zeile_Nr)
'Prüfe auf die diversen Schlüsselwörter
GFA_Nummer = GFA_Bezeichner_Check(GFA_PrgZeile, "DECLARE ", 8, GFA_Nummer)
GFA_Nummer = GFA_Bezeichner_Check(GFA_PrgZeile, "SUB ", 4, GFA_Nummer)
GFA_Nummer = GFA_Bezeichner_Check(GFA_PrgZeile, "SUBA ", 5, GFA_Nummer)
GFA_Nummer = GFA_Bezeichner_Check(GFA_PrgZeile, "FUNCTION ", 9, GFA_Nummer)
GFA_Nummer = GFA_Bezeichner_Check(GFA_PrgZeile, "FUNCTIONA ", 10, GFA_Nummer)
GFA_Nummer = GFA_Bezeichner_Check(GFA_PrgZeile, "PROCEDURE ", 10, GFA_Nummer)
GFA_Nummer = GFA_Bezeichner_Check(GFA_PrgZeile, "GLOBAL ", 7, GFA_Nummer)
GFA_Nummer = GFA_Bezeichner_Check(GFA_PrgZeile, "PUBLIC ", 7, GFA_Nummer)
GFA_Nummer = GFA_Bezeichner_Check(GFA_PrgZeile, "DIM ", 4, GFA_Nummer)
GFA_Nummer = GFA_Bezeichner_Check(GFA_PrgZeile, "PRIVATE ", 8, GFA_Nummer)
GFA_Nummer = GFA_Bezeichner_Check(GFA_PrgZeile, "LOCAL ", 6, GFA_Nummer)
GFA_Nummer = GFA_Bezeichner_Check(GFA_PrgZeile, "STATIC ", 7, GFA_Nummer)
GFA_Nummer = GFA_Bezeichner_Check(GFA_PrgZeile, "CONST ", 6, GFA_Nummer)
If GFA_Nummer > 0 Then
'Definitions-Kommando gefunden, Suche nach Bezeichner
GFA_Nummer = InStr(1, GFA_PrgZeile, GFA_Bezeichnung)
End If
If GFA_Nummer = 0 Then
'Keine Fundstelle, gehe zur nächsten Zeile
Inc GFA_Zeile_Nr
End If
Until GFA_Nummer <> 0 Or GFA_Zeile_Nr >= Gfa_ProcLine + Gfa_ProcLineCnt
'Wenn GFA_Nummer <> 0, dann wurde der Bezeichner gefunden
If GFA_Nummer = 0 Then
'2. Durchlauf für globale Definitionen
GFA_Zeile_Nr = 0
Repeat
GFA_Nummer = 0
GFA_PrgZeile = Gfa_Text(GFA_Zeile_Nr)
'Prüfe auf die diversen Schlüsselwörter
GFA_Nummer = GFA_Bezeichner_Check(GFA_PrgZeile, "DECLARE ", 8, GFA_Nummer)
GFA_Nummer = GFA_Bezeichner_Check(GFA_PrgZeile, "SUB ", 4, GFA_Nummer)
GFA_Nummer = GFA_Bezeichner_Check(GFA_PrgZeile, "SUBA ", 5, GFA_Nummer)
GFA_Nummer = GFA_Bezeichner_Check(GFA_PrgZeile, "FUNCTION ", 9, GFA_Nummer)
GFA_Nummer = GFA_Bezeichner_Check(GFA_PrgZeile, "FUNCTIONA ", 10, GFA_Nummer)
GFA_Nummer = GFA_Bezeichner_Check(GFA_PrgZeile, "PROCEDURE ", 10, GFA_Nummer)
GFA_Nummer = GFA_Bezeichner_Check(GFA_PrgZeile, "GLOBAL ", 7, GFA_Nummer)
GFA_Nummer = GFA_Bezeichner_Check(GFA_PrgZeile, "PUBLIC ", 7, GFA_Nummer)
GFA_Nummer = GFA_Bezeichner_Check(GFA_PrgZeile, "DIM ", 4, GFA_Nummer)
GFA_Nummer = GFA_Bezeichner_Check(GFA_PrgZeile, "PRIVATE ", 8, GFA_Nummer)
GFA_Nummer = GFA_Bezeichner_Check(GFA_PrgZeile, "LOCAL ", 6, GFA_Nummer)
GFA_Nummer = GFA_Bezeichner_Check(GFA_PrgZeile, "STATIC ", 7, GFA_Nummer)
GFA_Nummer = GFA_Bezeichner_Check(GFA_PrgZeile, "CONST ", 6, GFA_Nummer)
If GFA_Nummer > 0 Then
'Definitions-Kommando gefunden, Suche nach Bezeichner
GFA_Nummer = InStr(1, GFA_PrgZeile, GFA_Bezeichnung)
End If
If GFA_Nummer = 0 Then
'Keine Fundstelle, gehe zur nächsten Zeile
Inc GFA_Zeile_Nr
End If
Until GFA_Nummer <> 0 Or GFA_Zeile_Nr >= Gfa_LineCnt
End If
If GFA_Nummer = 0 Then
'Bezeichner nicht gefunden
Gfa_StatusText = "Bezeichner '" & GFA_Bezeichnung & "' nicht erkannt !"
Else
If GFA_Bezeichner_nur_Ausgabe Then
'Ausgabe des Textes in der Statuszeile
GFA_PrgZeile = Gfa_Text(GFA_Zeile_Nr)
GFA_Nummer = InStr(1, GFA_PrgZeile, GFA_Bezeichnung)
GFA_Pos = GFA_Nummer + Pred(Len(GFA_Bezeichnung))
GFA_Klammer = 0
Repeat
Inc GFA_Pos
Select Mid$(GFA_PrgZeile, GFA_Pos, 1)
Case "("
Inc GFA_Klammer
Case ")"
If GFA_Klammer > 0 Then
Dec GFA_Klammer
Inc GFA_Pos
End If
End Select
Until GFA_Klammer = 0 And (Mid$(GFA_PrgZeile, GFA_Pos, 1) = "," Or Mid$(GFA_PrgZeile, GFA_Pos, 1) = ")" Or GFA_Pos > Len(GFA_PrgZeile))
Gfa_StatusText = Mid$(GFA_PrgZeile, GFA_Nummer, GFA_Pos - GFA_Nummer)
Else
'Ruecksprung_Adresse merken
GFA_Ruecksprung(0, GFA_Ruecksprung_Pos) = Gfa_Line
GFA_Ruecksprung(1, GFA_Ruecksprung_Pos) = Gfa_Col
GFA_Ruecksprung_Pos = Mod(Succ(GFA_Ruecksprung_Pos), 11)
Gfa_Line = Succ(GFA_Zeile_Nr)
GFA_Nummer = InStr(1, Gfa_Text, GFA_Bezeichnung)
'Position anspringen
If GFA_Nummer > 0 Then
Dec GFA_Nummer
Gfa_Col = GFA_Nummer
Gfa_SelCol = Gfa_Col + Len(GFA_Bezeichnung)
End If
End If
End If
End Proc
Procedure GFA_Bezeichner_Ruecksprung
' Nach Procedur-Sprung zurück zur gemerkten Position
'Die Rücksprung-Positionen werden in einem Array gespeichert
'beim letzten Element, wird auf das erste gesprungen, es werden maximal 11 Positionen gespeichert
If GFA_Ruecksprung_Pos = 0 Then
GFA_Ruecksprung_Pos = 10
Else
Dec GFA_Ruecksprung_Pos
End If
'Prüfen auf gespeicherte Rücksprungadresse
If GFA_Ruecksprung(0, GFA_Ruecksprung_Pos) = 0 Then
'nichts gefunden, zurück zur alten Position
GFA_Ruecksprung_Pos = Mod(Succ(GFA_Ruecksprung_Pos), 11)
Else
'Cursor-Position setzen
Gfa_SelCol = Gfa_Col
Gfa_Line = GFA_Ruecksprung(0, GFA_Ruecksprung_Pos)
Gfa_Col = GFA_Ruecksprung(1, GFA_Ruecksprung_Pos)
GFA_Ruecksprung(GFA_Ruecksprung_Pos) = 0
EndIf
End Proc
Function GFA_Bezeichner_hole_name() As String
Dim GFA_Position As Long, GFA_Zeile As String, GFA_Anfang As Long, GFA_Ende As Long
'Cursor-Position und Text holen
GFA_Anfang = Gfa_Col
GFA_Ende = Gfa_Col
GFA_Zeile = Gfa_Text
'Von Cursor-Position aus den Anfang suchen, Auftreten des 1. Zeichens, das kein Variablenname ist
While GFA_Anfang > 1 And GFA_Bezeichner(Asc(Mid$(GFA_Zeile, GFA_Anfang, 1)))
Dec GFA_Anfang
Wend
'Von Cursor-Position aus das Ende suchen, Auftreten des 1. Zeichens, das kein Variablenname ist
While GFA_Ende < Len(GFA_Zeile) And GFA_Bezeichner(Asc(Mid$(GFA_Zeile, GFA_Ende, 1)))
Inc GFA_Ende
Wend
'Anfangs und End-Position korrigieren
If Not GFA_Bezeichner(Asc(Mid$(GFA_Zeile, GFA_Anfang, 1))) Then
Inc GFA_Anfang
End If
If Not GFA_Bezeichner(Asc(Mid$(GFA_Zeile, GFA_Ende, 1))) Then
Dec GFA_Ende
End If
'Bezeichner zurück geben
GFA_Bezeichner_hole_name = Mid$(GFA_Zeile, GFA_Anfang, GFA_Ende - GFA_Anfang + 1)
End Func
Function GFA_Bezeichner_Check(ByRef GFA_Check_PrgZeile As String, GFA_Check_Name As String, GFA_Check_Laenge As Long, GFA_Check_Nummer As Long) As Long
'Prüfen auf Kommando
If UCase$(Left$(Trim$(GFA_Check_PrgZeile), GFA_Check_Laenge)) = GFA_Check_Name Then
GFA_Check_PrgZeile = Mid$(Trim$(GFA_Check_PrgZeile), Succ(GFA_Check_Laenge))
GFA_Bezeichner_Check = 1
Else
GFA_Bezeichner_Check = GFA_Check_Nummer
End If
End Func
|