netlabs.org EPM Distribution Version 1.21

(DE) Neuigkeiten zu den Themen OS/2, eCS, und dem OS/2-Forum
(EN) News about OS/2, eCS and the OS/2 Forum
Benutzeravatar
aschn
Beiträge: 1363
Registriert: Mi 25. Dez 2013, 22:47

Beitrag von aschn »

erdmann hat geschrieben: Mo 4. Mai 2020, 14:31 Und noch zwei Dinge. Sag mir Bescheid wenn ich stattdessen im NEPMD Bugtracker etwas anlegen soll:
Nee, brauchst Du nicht. Ich arbeite seit einigen Jahren alleine daran und spare mir eher den Aufwand so etwas zu pflegen. Meine lokale TODO-Datei hat 10.000 Zeilen, vieles ist mehrfach vorhanden und das neueste steht oben, andere würden sagen: Chaos pur. So geht mir kaum noch etwas verloren. Das, was ganz unten steht, sehe ich nur selten durch, lösche dabei vieles oder setze ein "OK" davor, um den Überblick zu bewahren.
erdmann hat geschrieben: Mo 4. Mai 2020, 14:31 1) ... [Alt-1] ... Wenn man nämlich beliebigen Text selektiert fängt NEPMD an, die komplette Festplatte nach einer "Datei" mit dem Namen des selektierten Textes zu durchsuchen.
Hier nicht. Das hab ich doch schon vor etlichen Jahren geändert. Vor 12 Jahren hatte sich Greg Jarvis darüber beschwert, wie John und ich ALT_1 verändert hatten. Da lief das wirklich so ab, wie Du schreibst - nicht die ganze Platte, aber ab der aktuellen Datei viele Ebenen zurück und jedes Mal rekursiv.

Das ist doch inzwischen ganz harmlos geworden: Das erste Suchen geht praktisch sofort zu Ende, auch wenn nichts gefunden wird. In diesem Fall wird eine Eintragsbox geöffnet, die ein neues Suchverzeichnis abfragt.

Halt!... Wenn Du natürlich im Root oder eine Ebene darunter startest, dann müsste tatsächlich die ganze Partition durchsucht werden. Ich muss da also etwas einbauen, um FindFileInList beizubringen, nur eine bestimmte Anzahl Ebenen (z.B. 3) rekursiv zu suchen. Dann sollte das gelöst sein. Sehe ich mir an. OK, müsste ich an NepmdSearchTree übergeben, also C.

Hier noch ein Tipp, der Dir bei Alt_1 helfen könnte: Die uralte Umgebungsvariable ESEARCH kannst Du setzen um Alt_1 auch darin suchen zu lassen. Darin wird dann auch vor dem rekursiven Suchen gesucht. Ich hab hier z.B. die Datei
myepm\bin\myemp.env
erstellt mit dem Inhalt:

Code: Alles auswählen

ESEARCH=G:\dev\toolkt45\H!;
Vgl. auch die Kommentare am Anfang von
netlabs\bin\epm.env
Das Ausrufezeichen am Ende eines Verzeichnisses bedeutet, dass auch Unterverzeichnisse durchsucht werden. Das wird von FindFileInList ausgewertet.

Später hinzugefügt: Das mit der begrenzten Rekursion hab ich fertig. Mal morgen testen, ob es funktioniert.
Zuletzt geändert von aschn am Mo 4. Mai 2020, 19:27, insgesamt 1-mal geändert.
Andreas Schnellbacher
Benutzeravatar
aschn
Beiträge: 1363
Registriert: Mi 25. Dez 2013, 22:47

Beitrag von aschn »

Ich hab das mit Alt_1 fertig. Die Änderung an der C-Funktion war das einfachste dabei. Ich musste einen Großteil des E-Codes für Alt_1 neu strukturieren und die rcs aller Funktionen ergänzen und vereinheitlichen. Dabei sind noch etliche Fehler zum Vorschein gekommen. Vieles ist zwar jetzt getestet, aber ich werd das demnächst noch verstärkt nutzen, bis 1.22 fertig ist.

Lars, wenn ich Dir die Version zum Testen schicken kann oder soll, sag Bescheid.
Andreas Schnellbacher
erdmann
Beiträge: 594
Registriert: Mo 4. Jan 2016, 14:36

Beitrag von erdmann »

Hallo Andreas,

hier noch ein REXX EPM makro, welches für eine C Datei nach einem beliebigen Identifier in allen (rekursiv) eingebundenen H Dateien sucht.
Kannst ja mal schauen ob man das in irgendeiner Weise generalisieren kann (z.B. indem nicht in INCLUDE bzw. SMINCLUDE sucht sondern in einer Verzeichnisliste die der Benutzer spezifizieren kann). Ich brauche so eine Funktionalität dauernd um mir z.B. Konstantenwerte oder auch typedef Definitionen anschauen zu können.
/* this is an EPM REXX script */
if RxFuncQuery('SysLoadFuncs') == 1 then do
   call RxFuncAdd 'SysLoadFuncs','REXXUTIL.DLL','SysLoadFuncs'
   call SysLoadFuncs
end

'extract /getmarktype'
if getmarktype.1 == '' then
  return 1

'extract /getline'
if getline.1 == '' then
  return 1

'extract /getmark'
if getmark.0 < 4 then
  return 1

if getmark.1 <> getmark.2 then
  return 1

if getmark.3 == getmark.4 then
  return 1


start = getmark.3
len = getmark.4-getmark.3
string = substr(getline.1,start,len)
string = strip(string)
string = strip(string,'B',',')
string = strip(string,'B',';')
string = strip(string,'L','*')
string = strip(string,'B','(')
string = strip(string,'B',')')

'extract /filename'
/*
 * preset the number of files to 0
 */
files.0 = 0
/*
 * recursively search for all included files
 */
rc = buildFileList(filename.1)
/*
 * after finishing listing all the files,
 * close each one of them because otherwise
 * the SysFileSearch call will fail
 * in opening ANY file that was found
 */
do i=1 to files.0
  rc = lineout(files.i)
end

do i=1 to files.0
  rc = SysFileSearch(string,files.i,results.,'CN')
  if results.0 > 0 then
  do
     lineno = word(results.1,1)
     "e /b "files.i" '"lineno"'"
  end
end
return 0



buildFileList: procedure expose files.
parse arg sourcefile
do while lines(sourcefile)
  line = linein(sourcefile)
  parse upper value word(line,1) with keywrd .
  if keywrd == '#INCLUDE' then
  do
    fullfile = ''
    parse var line . '<' file '>'
    if file == '' then
    do
      parse var line . '"' file '"'
      if file <> '' then
      do
        file = strip(file,'B')
        fullfile = filespec('d',sourcefile)||filespec('p',sourcefile)||file
        fullfile = stream(fullfile,'c','query exists')
      end
    end
    if fullfile == '' then
    do
      searchpath = 'INCLUDE'
      pos = lastpos('.',file)
      if pos > 0 then
      do
        ext = substr(file,pos+1)
        parse upper var ext ext
        if ext == 'IDL' then
        do
          searchpath = 'SMINCUDE'
        end
      end
      fullfile = SysSearchPath(searchpath,file)
    end
    if fullfile \= '' then
    do
      rc = buildFileList(fullfile)
      files.0 = files.0+1
      i = files.0
      files.i = fullfile
    end
  end
end
return 0
Zuletzt geändert von erdmann am Mi 6. Mai 2020, 21:28, insgesamt 2-mal geändert.
Benutzeravatar
aschn
Beiträge: 1363
Registriert: Mi 25. Dez 2013, 22:47

Beitrag von aschn »

Das sollte/müsste mit der vorhin hochgeladenen Version schon gehen. Daher mein Angebot zum Testen.
Andreas Schnellbacher
erdmann
Beiträge: 594
Registriert: Mo 4. Jan 2016, 14:36

Beitrag von erdmann »

Wie und wo geht das ? Mit Alt-1 auf jeden Fall nicht. Das öffnet rekursiv alle in einer Datei inkludierten Header Dateien. Aber es öffnet nicht alle Header Dateien die einen bestimmten (aus der Textmarkierung gewonnenen) Identifier enthalten, oder etwa doch ?

Bitte schick mir mal deine Version zum Testen. Meine Email hast du glaube ich. Ansonsten kann ich die dir über eine private Message hier zukommen lassen.

Danke !

Lars
Benutzeravatar
aschn
Beiträge: 1363
Registriert: Mi 25. Dez 2013, 22:47

Beitrag von aschn »

Hallo Lars,

[Konstantenwerte oder auch typedef Definitionen]
erdmann hat geschrieben: Do 7. Mai 2020, 08:41 Aber es öffnet nicht alle Header Dateien die einen bestimmten (aus der Textmarkierung gewonnenen) Identifier enthalten
jetzt hab ich's verstanden. Ich will sehen, ob ich so etwas schnell eingebaut bekomme.
erdmann hat geschrieben: Do 7. Mai 2020, 08:41 Bitte schick mir mal deine Version zum Testen.
Lass mich heute erst nochmal versuchen das einzubauen.
erdmann hat geschrieben: Do 7. Mai 2020, 08:41 Meine Email hast du glaube ich.
Ja, klar.

Vielen Dank
Andreas Schnellbacher
Benutzeravatar
aschn
Beiträge: 1363
Registriert: Mi 25. Dez 2013, 22:47

Beitrag von aschn »

So, das fängt langsam an mir zu gefallen. Dein EPM-REXX-Skript ist beeindruckend kurz. Jetzt, wo ich weiß was es machen soll, funktioniert es auch. In E gibt es leider keinen Ersatz für SysFileSearch.

Wenn man versucht die nepmdlib.dll dafür zu erweitern, steht man vor dem Problem, wie soll man's an E übergeben? E kennt keine Arrays, nur ein einstufiges Pseudo-Array, das in Wirklichkeit eine versteckte Datei ist, aber von C aus nur mit E-Befehlen erreichbar wäre, was etwas langsamer ist. Wenn man die Ergebnisse in einer Schleife übergibt, so wie Christian das bei seinen anderen Funktionen (notgedrungen) gemacht hat, dann hat man das Problem, dass das nicht rekursiv geht.

Zweite Möglichkeit wäre die Dateien alle von E durchsuchen zu lassen. Dann hätte man auch alle Möglichkeiten, einchließlich regex. Die Dateien werden in einer Schleife in den EPM geladen und durchsucht. Das erschien mir zuerst zu langsam. Daraufhin hab ich mir die EPM-Tags nochmal angesehen. Wenn ich dort alle .e-Dateien nach defcs und defprocs durchsuchen lasse, dann geht das rasend schnell. Hier auf der SSD denke ich, das funktioniert gar nicht. Diese Möglichkeit ist zwar deutlch langsamer als irgendwas in C, aber es reicht noch.

Dritte Möglichkeit wäre grep.exe zu verwenden. So haben wir das bei FindDef für die Suche von Funktionen gemacht. Das müsste man dann für jede Datei einzeln aus einer E-Proc heraus aufrufen. Mit der Vielzahl an quietshell-Befehlen wird das dann auch nicht schneller als die zweite Methode werden.

Vierte Möglichkeit wäre die einfachste: REXX-Skript so ähnlich einbauen. Mir widerstrebt es nur irgendetwas in REXX zu verwenden, nur weil es das schon gibt.

An der Funktionalität würde ich noch verbessern wollen: Suchen des Strings unter dem Cursor, alternativ, wenn nur 1 Zeile markiert ist: Markierung. Auflisten aller gefundenen Dateien in einer Listbox mit der Möglichkeit zum Öffnen im neuem EPM-Fenster, wie bei FindDef.

Ich werd dann mal die zweite Möglickeit angehen.
Zuletzt geändert von aschn am Do 7. Mai 2020, 20:01, insgesamt 1-mal geändert.
Andreas Schnellbacher
erdmann
Beiträge: 594
Registriert: Mo 4. Jan 2016, 14:36

Beitrag von erdmann »

Schau mal was es an Editor Kommandos gibt. Z.B. gibt's ja sowas wie LIST und auch OPATH, ok das ist hier nicht dasselbe.
Ansonsten würde ich eben nackten REXX bzw. E code schreiben um die Datei nach Schlüsselwort zu durchsuchen.
Keinesfalls würde ich hier den großen "C" Hammer herausholen. Das würde ich nur im absoluten Notfall machen.
Geschwindigkeitsmäßig habe ich hier NULL Probleme mit REXX. Es ist SEHR schnell. Auf jeden Fall schnell genug für jeden praktischen Anwendungsfall.
Ach und dann gibts ja noch das DYNALINK32 Kommando. Da kannst du jede beliebige Funktion aus einer DLL aufrufen ...
Zuletzt geändert von erdmann am Fr 8. Mai 2020, 23:22, insgesamt 2-mal geändert.
Antworten