Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
26 commits
Select commit Hold shift + click to select a range
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .gitignore
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
/build
/llvm_build
/llvm_build*
.idea
*.exe
/.vscode/*.log
Expand Down
3 changes: 3 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,9 @@ Der Changelog von DDP. Sortiert nach Release.

## In Entwicklung

- [Fix] Duden/Uri parset nun absolute Uris der Form /pfad?query korrekt
- [Neu] Duden/Netzwerk stellt Typen und Funktionen für (low-level) TCP und UDP Kommunikation zur Verfügung.
- [Fix] Konstanten können nun nicht mehr in Zuweisungen oder als Referenzen verwendet werden
- [Neu] Numerische Datentypen werden in Zuweisungen jetzt automatisch in einander umgewandelt
- [Neu] Es gibt jetzt den Byte Datentyp, der eine natürliche Zahl im Bereich 0 bis einschließlich 255 darstellt
- [Neu] Typanpassende Ausdrücke können nun als Referenzen übergeben werden, solange sie nur Typaliase bzw. Typdefinitionen behandeln
Expand Down
4 changes: 4 additions & 0 deletions cmd/internal/linker/link.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import (
"fmt"
"os"
"path/filepath"
"runtime"
"strings"

"github.com/DDP-Projekt/Kompilierer/cmd/internal/gcc"
Expand Down Expand Up @@ -138,6 +139,9 @@ func LinkDDPFiles(options Options) ([]byte, error) {
args = append(args, "-llzma")
args = append(args, "-lbz2")
args = append(args, "-llz4")
if runtime.GOOS == "windows" {
args = append(args, "-lws2_32")
}

// add additional gcc-flags such as other needed libraries
if options.GCCFlags != "" {
Expand Down
9 changes: 9 additions & 0 deletions lib/runtime/include/DDP/ddpwindows.h
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,15 @@

#define NOMINMAX
#define WIN32_LEAN_AND_MEAN

#ifndef WINVER
#define WINVER 0x0A00
#endif // WINVER

#ifndef _WIN32_WINNT
#define _WIN32_WINNT 0x0A00
#endif // _WIN32_WINNT

#include <Windows.h>

#endif // DDPOS_WINDOWS
Expand Down
9 changes: 9 additions & 0 deletions lib/stdlib/Duden/C.ddp
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,8 @@

[ Repräsentiert einen C-Zeiger (void*) ]
Wir definieren einen Zeiger öffentlich als eine Zahl.
[ Repräsentiert einen int ]
Wir definieren einen C_int oeffentlich als einen Buchstaben.

Die öffentliche Funktion C_Null gibt einen Zeiger zurück, macht:
Gib 0 als Zeiger zurück.
Expand Down Expand Up @@ -46,3 +48,10 @@ Die öffentliche Funktion Erstelle_Byte_Puffer mit dem Parameter n vom Typ Zahl,
ist in "libddpstdlib.a" definiert
Und kann so benutzt werden:
"ein neuer Puffer der Länge <n>"

[ close(int fd) ]
Die oeffentliche Funktion close mit dem Parameter fd vom Typ C_int, gibt nichts zurück,
ist in "libddpstdlib.a" definiert
und kann so benutzt werden:
"Schließe <fd>",
"schließe <fd>"
32 changes: 32 additions & 0 deletions lib/stdlib/Duden/Listen.ddp
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,12 @@ ist in "libddpstdlib.a" definiert
Und kann so benutzt werden:
"efficient_list_append <list> <elem> <v>"

[Hilfsfunktion für Hinzufügen_X]
Die generische Funktion efficient_list_append_list mit den Parametern list, other und v vom Typ T Listen Referenz, T Listen Referenz und Variablen Referenz, gibt nichts zurück,
ist in "libddpstdlib.a" definiert
Und kann so benutzt werden:
"efficient_list_append_list <list> <other> <v>"

[
Fügt ein Element ans Ende der gegeben Liste an.
]
Expand All @@ -24,6 +30,16 @@ Und kann so benutzt werden:
"Füge <elm> an <liste> an",
"füge <elm> an <liste> an"

[
Fügt eine Liste ans Ende der gegeben Liste an.
]
Die öffentliche generische Funktion Hinzufügen_Liste_Liste mit den Parametern liste und other vom Typ T Listen Referenz und T Liste, gibt nichts zurück, macht:
Die Variable v ist der Standardwert von einem T.
efficient_list_append_list liste other v.
Und kann so benutzt werden:
"Füge <other> an <liste> an",
"füge <other> an <liste> an"

Die generische Funktion efficient_list_insert mit den Parametern list, index, elem und v vom Typ T Listen Referenz, Zahl, T Referenz und Variablen Referenz, gibt nichts zurück,
ist in "libddpstdlib.a" definiert
Und kann so benutzt werden:
Expand Down Expand Up @@ -59,6 +75,11 @@ ist in "libddpstdlib.a" definiert
Und kann so benutzt werden:
"efficient_list_prepend <liste> <elem> <v>"

Die generische Funktion efficient_list_prepend_list mit den Parametern liste, other und v vom Typ T Listen Referenz, T Listen Referenz und Variablen Referenz, gibt nichts zurück,
ist in "libddpstdlib.a" definiert
Und kann so benutzt werden:
"efficient_list_prepend_list <liste> <other> <v>"

[
Fügt ein Element an Anfang der gegeben Liste an.
Ist der Index invalide wird ein Laufzeitfehler ausgelöst
Expand All @@ -70,6 +91,17 @@ Die öffentliche generische Funktion Voranstellen_Liste mit den Parametern liste
Und kann so benutzt werden:
"Stelle <elm> vor <liste>"

[
Fügt eine Liste an Anfang der gegeben Liste an.
Ist der Index invalide wird ein Laufzeitfehler ausgelöst
]
Die öffentliche generische Funktion Voranstellen_Liste_Liste mit den Parametern liste und other vom Typ T Listen Referenz und T Liste, gibt nichts zurück, macht:
[Speichere elm verkettet mit liste in liste.]
Die Variable v ist der Standardwert von einem T.
efficient_list_prepend_list liste other v.
Und kann so benutzt werden:
"Stelle <other> vor <liste>"

Die generische Funktion efficient_list_delete_range mit den Parametern list, start, end und v vom Typ T Listen Referenz, Zahl, Zahl und Variablen Referenz, gibt nichts zurück,
ist in "libddpstdlib.a" definiert
Und kann so benutzt werden:
Expand Down
244 changes: 244 additions & 0 deletions lib/stdlib/Duden/Netzwerk.ddp
Original file line number Diff line number Diff line change
@@ -0,0 +1,244 @@
[
Duden/Netzwerk stellt low-level Funktionen zum Arbeiten mit Sockets zur Verfügung.
]

Binde "Duden/C" ein.
Binde "Duden/Fehlerbehandlung" ein.
Binde "Duden/Laufzeit" ein.
Binde "Duden/Texte" ein.

Die Funktion Init_Windows gibt einen Wahrheitswert zurück,
ist in "libddpstdlib.a" definiert
und kann so benutzt werden:
"windows sockets initialisiert wurden"

Der Wahrheitswert windows_initialisiert ist wahr, wenn windows sockets initialisiert wurden.

Wir definieren eine AddressInfo öffentlich als einen Zeiger.

Wir nennen die öffentliche Kombination aus
der Zahl padding1,
der Zahl padding2,
der Zahl padding3,
der Zahl padding4,
der Zahl padding5,
der Zahl padding6,
der Zahl padding7,
der Zahl padding8,
der Zahl padding9,
der Zahl padding10,
der Zahl padding11,
der Zahl padding12,
der Zahl padding13,
der Zahl padding14,
der Zahl padding15,
der Zahl padding16,
dem C_int size,
eine KlientenAddresse,
und erstellen sie so:
"eine leere KlientenAddresse",
"eine ungefüllte KlientenAddresse"

Wir nennen die öffentliche Kombination aus
dem C_int fd,
dem C_int familie,
dem C_int typ,
einen Socket.

[ AF_UNSPEC ]
Der öffentliche C_int IPV4_ODER_IPV6 ist 0 als Buchstabe als C_int.
[ AF_INET ]
Der öffentliche C_int IPV4 ist 2 als Buchstabe als C_int.
[ SOCK_STREAM ]
Der öffentliche C_int TCP ist 1 als Buchstabe als C_int.
[ SOCK_DGRAM ]
Der öffentliche C_int UDP ist 2 als Buchstabe als C_int.

[ AF_INET6 ]
Die öffentliche Funktion AF_IPV6 gibt einen C_int zurück, macht:
Gib (26, falls das Betriebssystem gleich "Windows" ist, ansonsten 10) als Buchstabe als C_int zurück.
Und kann so benutzt werden:
"IPV6"

Die öffentliche Funktion Lade_AddressInfo mit den Parametern familie, typ, name und service vom Typ C_int, C_int, Text und Text, gibt eine AddressInfo zurück,
ist in "libddpstdlib.a" definiert
und kann so benutzt werden:
"die AddressInfo der Familie <familie> vom Typ <typ> für den Namen <name> und den Service <service>" oder
"die <familie> <typ> AddressInfo für den Namen <name> und den Service <service>" oder
"eine AddressInfo der Familie <familie> vom Typ <typ> für den Namen <name> und den Service <service>" oder
"eine <familie> <typ> AddressInfo für den Namen <name> und den Service <service>"

Die öffentliche Funktion freeaddrinfo mit dem Parameter info vom Typ AddressInfo, gibt nichts zurück,
ist in "libddpstdlib.a" definiert
und kann so benutzt werden:
"Befreie <info>"

[
Wandelt die ERSTE addresse in AddrInfo zu einem Text um.
]
Die öffentliche Funktion AddressInfo_zu_Text mit dem Parameter info vom Typ AddressInfo, gibt einen Text zurück,
ist in "libddpstdlib.a" definiert
und überlädt den "als" Operator.

Die öffentliche Funktion Socket_Erstellen mit den Parametern familie und typ vom Typ C_int und C_int, gibt einen Socket zurück,
ist in "libddpstdlib.a" definiert
und kann so benutzt werden:
"ein Socket der Familie <familie> vom Typ <typ>",
"einen Socket der Familie <familie> vom Typ <typ>"

Die öffentliche Funktion Socket_Erstellen_Typ mit dem Parameter typ vom Typ C_int, gibt einen Socket zurück, macht:
Gib einen Socket der Familie IPV4 vom Typ typ zurück.
Und kann so benutzt werden:
"ein <typ> Socket",
"einen <typ> Socket"

Die Funktion Schließe_Socket_Windows mit dem Parameter sock vom Typ Socket, gibt nichts zurück,
ist in "libddpstdlib.a" definiert
und kann so benutzt werden:
"schließe <sock> unter Windows"

Die öffentliche Funktion Schließe_Socket mit dem Parameter sock vom Typ Socket, gibt nichts zurück, macht:
Wenn das Betriebssystem gleich "Windows" ist, schließe sock unter Windows.
Sonst schließe (fd von sock).
Und kann so benutzt werden:
"Schließe <sock>"

Die öffentliche Funktion Socket_Binden mit den Parametern sock und info vom Typ Socket und AddressInfo, gibt nichts zurück,
ist in "libddpstdlib.a" definiert
und kann so benutzt werden:
"Setze <sock> auf <info>"

Die öffentliche Funktion Socket_Binden_Name_Service mit den Parametern sock, name und service vom Typ Socket, Text und Text, gibt nichts zurück, macht:
Die AddressInfo info ist die AddressInfo der Familie (familie von sock) vom Typ (typ von sock) für den Namen name und den Service service.
Setze sock auf info.
Befreie info.
Und kann so benutzt werden:
"Setze <sock> auf <name> <service>"

Die öffentliche Funktion Socket_Binden_Name_Port mit den Parametern sock, name und service vom Typ Socket, Text und Zahl, gibt nichts zurück, macht:
Setze sock auf name (service als Text).
Und kann so benutzt werden:
"Setze <sock> auf <name> <service>"

Die öffentliche Funktion Socket_Verbinden mit den Parametern sock und info vom Typ Socket und AddressInfo, gibt nichts zurück,
ist in "libddpstdlib.a" definiert
und kann so benutzt werden:
"Verbinde <sock> mit <info>"

Die öffentliche Funktion Socket_Verbinden_Name_Service mit den Parametern sock, name und service vom Typ Socket, Text und Text, gibt nichts zurück, macht:
Die AddressInfo info ist die AddressInfo der Familie (familie von sock) vom Typ (typ von sock) für den Namen name und den Service service.
Verbinde sock mit info.
Befreie info.
Und kann so benutzt werden:
"Verbinde <sock> mit <name> <service>"

Die öffentliche Funktion Socket_Verbinden_Name_Port mit den Parametern sock, name und port vom Typ Socket, Text und Zahl, gibt nichts zurück, macht:
Verbinde sock mit name (port als Text).
Und kann so benutzt werden:
"Verbinde <sock> mit <name> <port>"

Die öffentliche Funktion Socket_Zuhoeren mit den Parametern sock und backlog vom Typ Socket und Zahl, gibt nichts zurück,
ist in "libddpstdlib.a" definiert
und kann so benutzt werden:
"Lass <sock> auf maximal <backlog> Verbindungen warten" oder
"Lass <sock> auf maximal <backlog> Verbindung warten"

Die öffentliche Funktion Socket_Verbindung_Annehmen mit den Parametern sock und client vom Typ Socket und KlientenAddresse Referenz, gibt einen Socket zurück,
ist in "libddpstdlib.a" definiert
und kann so benutzt werden:
"die nächste Verbindung von <client> auf <sock>"

Die öffentliche Funktion Socket_Verbindung_Annehmen_Ohne_Klient mit dem Parameter sock vom Typ Socket, gibt einen Socket zurück, macht:
Die KlientenAddresse client ist eine leere KlientenAddresse.
Der Socket verbindung ist die nächste Verbindung von client auf sock.
Gib verbindung zurück.
Und kann so benutzt werden:
"die nächste Verbindung auf <sock>"

Die öffentliche Funktion Socket_Senden mit den Parametern verbindung und daten vom Typ Socket und Byte Listen Referenz, gibt eine Zahl zurück,
ist in "libddpstdlib.a" definiert
und kann so benutzt werden:
"Sende <daten> über <verbindung>" oder
"wie viele Bytes von <daten> über <verbindung> gesendet wurden"

Die öffentliche Funktion Socket_Senden_Wert mit den Parametern verbindung und daten vom Typ Socket und Byte Liste, gibt eine Zahl zurück, macht:
Gib wie viele Bytes von daten über verbindung gesendet wurden zurück.
Und kann so benutzt werden:
"Sende <daten> über <verbindung>" oder
"wie viele Bytes von <daten> über <verbindung> gesendet wurden"

Die öffentliche Funktion Socket_Empfangen mit den Parametern verbindung und max vom Typ Socket und Zahl, gibt eine Byte Liste zurück,
ist in "libddpstdlib.a" definiert
und kann so benutzt werden:
"maximal <max> Bytes aus <verbindung>",
"maximal die nächsten <max> Bytes aus <verbindung>",
"maximal den nächsten <max> Bytes aus <verbindung>"

Die öffentliche Funktion Socket_Senden_An_Klient mit den Parametern verbindung, daten und client vom Typ Socket, Byte Listen Referenz und KlientenAddresse, gibt eine Zahl zurück,
ist in "libddpstdlib.a" definiert
und kann so benutzt werden:
"Sende <daten> über <verbindung> an <client>" oder
"wie viele Bytes von <daten> über <verbindung> an <client> gesendet wurden"

Die öffentliche Funktion Socket_Senden_An mit den Parametern verbindung, daten und info vom Typ Socket, Byte Listen Referenz und AddressInfo, gibt eine Zahl zurück,
ist in "libddpstdlib.a" definiert
und kann so benutzt werden:
"Sende <daten> über <verbindung> an <info>" oder
"wie viele Bytes von <daten> über <verbindung> an <info> gesendet wurden"

Die öffentliche Funktion Socket_Empfangen_Von mit den Parametern verbindung, max und client vom Typ Socket, Zahl und KlientenAddresse Referenz, gibt eine Byte Liste zurück,
ist in "libddpstdlib.a" definiert
und kann so benutzt werden:
"das nächste maximal <max> Bytes große Packet aus <verbindung> von <client>",
"dem nächsten maximal <max> Bytes großen Packet aus <verbindung> von <client>"

Die öffentliche Funktion Socket_Empfangen_Von_Ohne_Klient mit den Parametern verbindung und max vom Typ Socket und Zahl, gibt eine Byte Liste zurück, macht:
Die KlientenAddresse client ist eine leere KlientenAddresse.
Gib das nächste maximal max Bytes große Packet aus verbindung von client zurück.
Und kann so benutzt werden:
"das nächste maximal <max> Bytes große Packet aus <verbindung>",
"dem nächsten maximal <max> Bytes großen Packet aus <verbindung>"

Die öffentliche Funktion Socket_Senden_Text mit den Parametern verbindung und daten vom Typ Socket und Text Referenz, gibt eine Zahl zurück, macht:
Gib wie viele Bytes von (den Bytes von daten) über verbindung gesendet wurden zurück.
Und kann so benutzt werden:
"Sende <daten> über <verbindung>" oder
"wie viele Bytes von <daten> über <verbindung> gesendet wurden"

Die öffentliche Funktion Socket_Senden_Text_Wert mit den Parametern verbindung und daten vom Typ Socket und Text, gibt eine Zahl zurück, macht:
Gib wie viele Bytes von daten über verbindung gesendet wurden zurück.
Und kann so benutzt werden:
"Sende <daten> über <verbindung>" oder
"wie viele Bytes von <daten> über <verbindung> gesendet wurden"

Die öffentliche Funktion Socket_Empfangen_Text mit den Parametern verbindung und max vom Typ Socket und Zahl, gibt einen Text zurück, macht:
Gib die Bytes (maximal max Bytes aus verbindung) als Text zurück.
Und kann so benutzt werden:
"der maximal <max> Bytes lange Text aus <verbindung>",
"der nächste maximal <max> Bytes lange Text aus <verbindung>",
"dem nächste maximal <max> Bytes lange Text aus <verbindung>"

Die öffentliche Funktion Socket_Senden_An_Klient_Text mit den Parametern verbindung, daten und client vom Typ Socket, Text Referenz und KlientenAddresse, gibt eine Zahl zurück, macht:
Gib wie viele Bytes von (den Bytes von daten) über verbindung gesendet wurden zurück.
Und kann so benutzt werden:
"Sende <daten> über <verbindung> an <client>" oder
"wie viele Bytes von <daten> über <verbindung> an <client> gesendet wurden"

Die öffentliche Funktion Socket_Senden_An_Text mit den Parametern verbindung, daten und info vom Typ Socket, Text Referenz und AddressInfo, gibt eine Zahl zurück, macht:
Gib wie viele Bytes von daten über verbindung an info gesendet wurden zurück.
Und kann so benutzt werden:
"Sende <daten> über <verbindung> an <info>" oder
"wie viele Bytes von <daten> über <verbindung> an <info> gesendet wurden"

Die öffentliche Funktion Socket_Empfangen_Von_Text mit den Parametern verbindung, max und client vom Typ Socket, Zahl und KlientenAddresse Referenz, gibt einen Text zurück, macht:
Gib die Bytes (das nächste maximal max Bytes große Packet aus verbindung von client) als Text zurück.
Und kann so benutzt werden:
"der nächste maximal <max> Bytes große Text aus <verbindung> von <client>",
"dem nächsten maximal <max> Bytes großen Text aus <verbindung> von <client>"

Die öffentliche Funktion Socket_Empfangen_Von_Ohne_Klient_Text mit den Parametern verbindung und max vom Typ Socket und Zahl, gibt einen Text zurück, macht:
Die KlientenAddresse client ist eine leere KlientenAddresse.
Gib die Bytes (das nächste maximal max Bytes große Packet aus verbindung von client) als Text zurück.
Und kann so benutzt werden:
"der nächste maximal <max> Bytes große Text aus <verbindung>",
"dem nächsten maximal <max> Bytes großen Text aus <verbindung>"
Loading