EHTF - Extensible Hydro Thalamus Format

Zur Vorstellung von Komponenten und Units für Lazarus
MAC
Beiträge: 770
Registriert: Sa 21. Feb 2009, 13:46
OS, Lazarus, FPC: Windows 7 (L 1.3 Built 43666 FPC 2.6.2)
CPU-Target: 32Bit

EHTF - Extensible Hydro Thalamus Format

Beitrag von MAC »

Hallo Lazarusforum.

EINLEITUNG

Ich habe angeküngigt, ein von mir verwendetes Format zu veröffentlichen.
Sein name ist EHTF und es sollte mir in erster linie dazu dienen Variablen zwischen 2 Computer über einen String auszutauschen. Allerdings kann man damit mitlerweile bequem Einstellungen Laden/Speichern oder ähnliches machen.
EHTF ist wie ein Tree aufgebaut, es gibt also ein haufen Nodes. Der Hauptnode selber ist von der gleichen Klasse als die Subnodes.
Da ich ein Format brauchte und keine lust hatte mich mit irgendwas anderem auseinander zu setzen hab ich mir einfach ein eigenes gebaut.
Ein Großer Vorteil An EHTF ist, das man damit mit einer einfachen Case abfrage einen Interpreter bauen kann um z.B verschiedene Eintellungen zu laden/speichen

GROBER AUFBAU

Jeder Node besitzt 4 Eigenschaften
    1. Einen Array aus Werten. (Values)
    Ein Wert ist in einem Record gespeichert, welcher string / integer / float / boolean /pointer unterstützt und ein byte besitzt in welchem der Casetyp gespeichert ist.
    Auf die Werte kann man entweder Direkt (Values) oder indirekt mit einigen Überprüfungen (SValues) zugreifen.
    2. Ein About teil für Metainformationen, der Name unter den man diese Eigenschaften findet.
    3. Weitere Nodes, (Childs)
    4. Einen Parent - eigentlich brauch man diesen nicht, ich hab ihn vorsorglich aber schonmal hinzugeführt.

BEISPIEL

So ist ein Node aufgebaut

Code: Alles auswählen

Hello<World>

dabei ist Hello der about teil , < ist das begin zeichen , > beendet den node und world ist der text.
Hier ist "Möglichkeiten bei Geldscheinen" der about teil, wie man sieht darf dieser alle zeichen enthalten.
Seit Version 0.9.2 ist es nun auch möglich mehrere Werte in einem Node zu schreiben und die schreibweise zu vereinfachen:

Code: Alles auswählen

Möglichkeiten bei Geldscheinen<5|10|20|50|100|200|500>


GEPLANT

    Suche nach Speicherlecks ( in ehtf an sich schau es gut aus, aber im Editor noch nicht :D
    Anpassung an den DOM - standart
    integrierte MultiThreading - Funktion zum laden meherer Strings gleichzeitig , bzw performanceverbesserung !! // Bei tausenden von nodes kann es schon mal ne sekunde dauern...
EDITOR

um das ganze zu bearbeiten, hab ich mir auch einen kleinen Editor gebastelt, dieser liegt mit Source bei.
Er hilft einen eigentlich nur die übersicht zu behalten und beinhaltet die funktionen aus String oder File zu laden/Speichern.
Außerdem kann man direkt einen ganzen node mit subnodes kopieren...

CHANGELOG
    0.9.7: Projekt nun auf LazForge! Neue Version mit vielen Verbesserungen, besonders bei der Performance, ehtf größsten Teils Stabil (ich hab noch keinen Fatal Error in der ehtf.pas gefunden). EHTF-Edit Testversion, nicht Stabil .
    0.9.4: Export zu XML möglich (experimentel, es werden noch nicht alle Features unterstützt...). Bug beim Speichern/Laden behoben bei dem Leere Values hinzugefügt wurden
    0.9.3: System-Tag ist eingebaut, Jetzt ist es möglich jede Nachricht zu speichern/wieder zu konvertieren... ">" wird in "~<60>" umgewandelt, da 60 der ascii code von ">" ist...
    0.9.2: Diverse Bugfixes - Jetzt ist es möglich mehrere Texte pro Node zu speichern, Diese werden jetzt Values genannt !


DOWNLOAD
Der Download befindet sich nun auf LazForge: http://forge.lazarusforum.de/projects/ehtf-edit


Ich weis das es keinen Hydro Thalamus gibt, aber ich fand die anspielung so toll, dass ich mein ICP programm so genannt habe :D
Dateianhänge
Interpreter auf EHTF basierend
Interpreter auf EHTF basierend
Zuletzt geändert von MAC am So 27. Mai 2012, 14:32, insgesamt 6-mal geändert.

Code: Alles auswählen

Signatur := nil;

carli
Beiträge: 657
Registriert: Sa 9. Jan 2010, 17:32
OS, Lazarus, FPC: Linux 2.6.x, SVN-Lazarus, FPC 2.4.0-2
CPU-Target: 64Bit

Re: EHTF - Extensible Hydro Thalamus Format

Beitrag von carli »

Wie behandelst du Zeichen wie <,>,# wenn sie in einem String vorkommen?

Wenn du das ganze objektorientiert kapselst und das DOM-Interface dafür implementierst, könnte's sogar von Nutzen sein.

MAC
Beiträge: 770
Registriert: Sa 21. Feb 2009, 13:46
OS, Lazarus, FPC: Windows 7 (L 1.3 Built 43666 FPC 2.6.2)
CPU-Target: 32Bit

Re: EHTF - Extensible Hydro Thalamus Format

Beitrag von MAC »

<> in einem string führt aktuell noch zu einem Fehler.
Ein # ist egal.
Meine Idee ist, das wie in GEPLANT erwähnt mit einem System Tag, welcher die folgenden nodes beim laden beeinflusst.
Dann währe jede kombination möglich außer dieses System Tag. Das könnte man aber auch umgehen in dem man es kurzzeitig system2-tag nennt:

Code: Alles auswählen

system<Ich mache jetzt nen bööösen Fehler>

Code: Alles auswählen

system<system-tag<system2>>   
system<Dieses macht jetzt leider keinen fehler mehr>
system2<system-tag<system>>


Im momment ist das aber alled nur theoretisch.
Das ganze ist aktuell Objektorientiert gekapselt, da es so am praktischten ist.

Ich hab keine ahnung wie man ein DOM-Interface implementiert, aber hat das nicht was mit dem aufbau von einem HTM dokument zu tun (wikipedia)

Code: Alles auswählen

Signatur := nil;

Christian
Beiträge: 6079
Registriert: Do 21. Sep 2006, 07:51
OS, Lazarus, FPC: iWinux (L 1.x.xy FPC 2.y.z)
CPU-Target: AVR,ARM,x86(-64)
Wohnort: Dessau
Kontaktdaten:

Re: EHTF - Extensible Hydro Thalamus Format

Beitrag von Christian »

Ich bin eigentlich echt kein Freund von "warum machst du das" Fragen, aber ich kann mich hier nicht zusammenreissen. Du kannst jedes Objekt das ich glaub von TPersistent abgeleitet ist auf mehrere Arten streamen. Über TReader/Writer. Als XML, Binary oder Text. Das geht bei Delphi und FPC von Hause aus.
Wenn du das bereits wusstest und es aus mir gerad nur unverständlichen gründen machst ignorier den Beitrag bitte.
W.m.k.A.h.e.m.F.h. -> http://www.gidf.de/

carli
Beiträge: 657
Registriert: Sa 9. Jan 2010, 17:32
OS, Lazarus, FPC: Linux 2.6.x, SVN-Lazarus, FPC 2.4.0-2
CPU-Target: 64Bit

Re: EHTF - Extensible Hydro Thalamus Format

Beitrag von carli »

MAC hat geschrieben:Ich hab keine ahnung wie man ein DOM-Interface implementiert, aber hat das nicht was mit dem aufbau von einem HTM dokument zu tun (wikipedia)


Ich erwarte nicht, dass du das Interface aus dem Kopf kennst, aber die paar Methoden a la "removeChild" und "appendChild" wirst du doch wohl implementiert bekommen.

Ansonsten gebe ich Christian recht, muss aber hinzufügen, dass ein TWriter-Tutorial mal ganz nett wäre.

MAC
Beiträge: 770
Registriert: Sa 21. Feb 2009, 13:46
OS, Lazarus, FPC: Windows 7 (L 1.3 Built 43666 FPC 2.6.2)
CPU-Target: 32Bit

Re: EHTF - Extensible Hydro Thalamus Format

Beitrag von MAC »

nein, das wusste ich nicht- bzw ich kenn mich damit nicht aus.
Der zweck davon ist einfach irgendwelche Daten im string zu speichern...

Die Funktionen kann ich hinzufügen, werd ich demnächst machen...

Code: Alles auswählen

Signatur := nil;

carli
Beiträge: 657
Registriert: Sa 9. Jan 2010, 17:32
OS, Lazarus, FPC: Linux 2.6.x, SVN-Lazarus, FPC 2.4.0-2
CPU-Target: 64Bit

Re: EHTF - Extensible Hydro Thalamus Format

Beitrag von carli »

MAC hat geschrieben:Die Funktionen kann ich hinzufügen, werd ich demnächst machen...


Die 2 Beispiele waren nur exemplarisch.
Das DOM-Interface besteht aus mehr, der Standard ist hier beschrieben: http://www.w3.org/TR/DOM-Level-1/introduction.html

Solange du eine nicht mindestens genauso komfortabele Schnittstelle anbieten kannst, wird wohl niemand deine Lib benutzen.

MAC
Beiträge: 770
Registriert: Sa 21. Feb 2009, 13:46
OS, Lazarus, FPC: Windows 7 (L 1.3 Built 43666 FPC 2.6.2)
CPU-Target: 32Bit

Re: EHTF - Extensible Hydro Thalamus Format

Beitrag von MAC »

Ich habe gerade ein Problem mit dieser Funktion.
Sie soll ein Text wieder in ein Node zurückumwandeln.

Mal ganz davon abgesehen das man die funktion noch optimieren kann.
Diese Funktion geht schrittweise vor. immer ein schritt im text und schnappt sich zeichen für zeichen. Das zeichen wird in charpuffer, also als Char gespeichert.
Jetzt wirds interessant:
wenn ich in einem text mit > ende und darauf direkt ein < folgt:
wird der text sofort im programmcode auf '' gesetzt.
danach wird text als about des nodes verwendet.
Wenn ich jetzt diese procedure laufen lasse.
Dann besitzt der about string, welcher '' seien sollte. den wert $0, Wird dieser jetzt ausgelesen bzw ein anderer Wert um $0 erweitert erhalte ich einen SIGSEGV error...
Zumindest unter 32Bit programmen. Das ist im übrigen, der (einer der) Fehler wieso Freeminer nicht unter 32 Bit funktioniert...


Code: Alles auswählen

function HTStrtoNode(astring:string;vardec:TVarDec):THTNode;
var
   deep,i:integer;
   atext:ansistring;
   charpuffer:char;
   obj:array of THTNode;
 
 
procedure d(b:boolean = True);
begin
if b then inc(deep)
   else dec(deep);
setlength(obj,deep+1);
end;
 
begin
result := THTNode.Create;
deep := -1;
setlength(obj,1);
obj[0] := nil;
atext := ''; // variable atext
for i := 0 to length(astring) do
    begin
    charpuffer := astring[i];
    if charpuffer = vardec._Begin then   // <
       begin
       d;
       if deep = 1 then
          begin
          setlength(result.nodes,length(result.nodes)+1);
          result.nodes[high(result.nodes)] := THTNode.Create;
          result.nodes[high(result.nodes)].about := atext;// variable atext
          obj[deep] := result.nodes[high(result.nodes)];
          end;
      if deep > 1 then
          begin
          setlength(obj[deep-1].nodes,length(obj[deep-1].nodes)+1);
          obj[deep-1].nodes[high(obj[deep-1].nodes)] := THTNode.Create;
          obj[deep-1].nodes[high(obj[deep-1].nodes)].about := atext;// variable atext
          obj[deep] := obj[deep-1].nodes[high(obj[deep-1].nodes)];
          end;
       atext := '';// variable atext
       end
      else
       begin
       if charpuffer = vardec._End then // >
          begin
          if deep > 0 then
             begin
             if (length(obj[deep].about) = 1) and (
                (obj[deep].about[1] = vardec._integer) or
                (obj[deep].about[1] = vardec._float) or
                (obj[deep].about[1] = vardec._string)) then
                begin
                obj[deep].text := HTStrtoSVar(obj[deep].about[1] + atext,vardec); // variable atext
                end
               else
                begin
                obj[deep].text := HTStrtoSVar('s' + atext,vardec); // variable atext
                end;
             end;
          d(false);
          atext := ''; // variable atext
          end   // weder < noch >
         else atext := atext + charpuffer; // variable atext
       end;
    end;
end;


selbst wenn man sicher geht und beim erstellen die variablen alle auf 0 setzt komtm der fehler

Code: Alles auswählen

....about&#058;= '';
....text._string:='';
....text.art:=0;

Code: Alles auswählen

Signatur := nil;

carli
Beiträge: 657
Registriert: Sa 9. Jan 2010, 17:32
OS, Lazarus, FPC: Linux 2.6.x, SVN-Lazarus, FPC 2.4.0-2
CPU-Target: 64Bit

Re: EHTF - Extensible Hydro Thalamus Format

Beitrag von carli »

Für Pascal ist '' und nil dasselbe.
Prüfe doch einfach vor einem Zugriff auf den Speicher, ob der string nicht '' ist.

Benutzeravatar
m.fuchs
Lazarusforum e. V.
Beiträge: 2636
Registriert: Fr 22. Sep 2006, 19:32
OS, Lazarus, FPC: Winux (Lazarus 2.0.10, FPC 3.2.0)
CPU-Target: x86, x64, arm
Wohnort: Berlin
Kontaktdaten:

Re: EHTF - Extensible Hydro Thalamus Format

Beitrag von m.fuchs »

carli hat geschrieben:Für Pascal ist '' und nil dasselbe.

Ganz sicher ist dem nicht so.
Software, Bibliotheken, Vorträge und mehr: https://www.ypa-software.de

carli
Beiträge: 657
Registriert: Sa 9. Jan 2010, 17:32
OS, Lazarus, FPC: Linux 2.6.x, SVN-Lazarus, FPC 2.4.0-2
CPU-Target: 64Bit

Re: EHTF - Extensible Hydro Thalamus Format

Beitrag von carli »

m.fuchs hat geschrieben:
carli hat geschrieben:Für Pascal ist '' und nil dasselbe.

Ganz sicher ist dem nicht so.



Programm:

Code: Alles auswählen

program test;
{$mode objfpc}{$H+}
var x: string;
begin
 x:='';
 writeln(ptrint(x));
end.


Ausgabe:

Benutzeravatar
m.fuchs
Lazarusforum e. V.
Beiträge: 2636
Registriert: Fr 22. Sep 2006, 19:32
OS, Lazarus, FPC: Winux (Lazarus 2.0.10, FPC 3.2.0)
CPU-Target: x86, x64, arm
Wohnort: Berlin
Kontaktdaten:

Re: EHTF - Extensible Hydro Thalamus Format

Beitrag von m.fuchs »

Sorry, aber außer einem Runtime-Error krieg ich da nix.
Software, Bibliotheken, Vorträge und mehr: https://www.ypa-software.de

MAC
Beiträge: 770
Registriert: Sa 21. Feb 2009, 13:46
OS, Lazarus, FPC: Windows 7 (L 1.3 Built 43666 FPC 2.6.2)
CPU-Target: 32Bit

Re: EHTF - Extensible Hydro Thalamus Format

Beitrag von MAC »

Ich bin noch nicht so Richtig auf den Fehler gekommen. Da ich ihn aber auch nicht 100% reproduzieren kann habe ich das format einfach mal weiterentwickelt.

Und es hat sich einiges getan.
E gibt jetzt ein _array zeichen (standart ist '|' )
Dieses Zeichen trennt mehrere Werte eines Nodes - Richtig gehört, dadurch kann man einem Node gleich mehrere Werte zuweisen anstatt es über Subnodes zu machen. (mehrere Werte, aber nur ein about).
Außerdem kann nun ein Node gleichzeitig x belibig viele Werte und Subnotes haben. , Da das trennzeichen | den letzten wert mit dem ersten about trennt.
z.B

Code: Alles auswählen

EinABout<Wert1|Wert2|About2<Subnode>>

Code: Alles auswählen

Signatur := nil;

MAC
Beiträge: 770
Registriert: Sa 21. Feb 2009, 13:46
OS, Lazarus, FPC: Windows 7 (L 1.3 Built 43666 FPC 2.6.2)
CPU-Target: 32Bit

Re: EHTF - Extensible Hydro Thalamus Format

Beitrag von MAC »

So, nun sollte es möglich sein alles zu Laden/Speichern.
ich verwende jetzt ein Case in dem Record wo die variable gespeichert wird...

Ich habe mal ein Bild eines von mir geschriebenen Interpreters für eine Memo angezeigt. Mit hilfe von EHTF ist es einfach zwischen 2 Text-Blöcke eine anweisung zu setzten , zum beispiel die Farbe zu verändern...
Außerdem hab ich den 1. Post bearbeitet - gekürzt und aktuallisiert.

Code: Alles auswählen

Signatur := nil;

carli
Beiträge: 657
Registriert: Sa 9. Jan 2010, 17:32
OS, Lazarus, FPC: Linux 2.6.x, SVN-Lazarus, FPC 2.4.0-2
CPU-Target: 64Bit

Re: EHTF - Extensible Hydro Thalamus Format

Beitrag von carli »

Nettes Bild, das du da reinstellst.
Aber du solltest auch Export von EHTF nach XML und andersrum bauen

Antworten