Skip to content

Commit

Permalink
Added Windows path functions to Duden/Pfade (#39)
Browse files Browse the repository at this point in the history
  • Loading branch information
NotLe0n committed Apr 24, 2024
1 parent f11345a commit 9721565
Show file tree
Hide file tree
Showing 6 changed files with 798 additions and 90 deletions.
227 changes: 192 additions & 35 deletions lib/stdlib/Duden/Pfade.ddp
Original file line number Diff line number Diff line change
@@ -1,11 +1,11 @@
[
Pfad Manipulationsfunktionen. NUR FÜR UNIX!
]


Binde "Duden/Texte" ein.
Binde "Duden/Zeichen" ein.
Binde Betriebssystem und Arbeitsverzeichnis aus "Duden/Laufzeit" ein.

[
UNIX Funktionen
]

[
Gibt den Pfad-Trennzeichen, der dem Betriebssystem entspricht zurück.
Auf Linux: '/'
Expand All @@ -20,12 +20,14 @@ Und kann so benutzt werden:
"das Pfad-Trennzeichen"

[
Gibt zurück ob der gegebene UNIX Pfad ein absoluter oder relativer Pfad ist
Gibt zurück ob der gegebene UNIX Pfad ein absoluter oder relativer Pfad ist.
Der Rückgabewert ist wahr wenn der erste Buchstabe des gegebenen Textes ein '/' ist.
]
Die öffentliche Funktion Ist_Absolut mit dem Parameter t vom Typ Text, gibt einen Wahrheitswert zurück, macht:
Gib wahr, wenn '/' am Anfang von t steht zurück.
Die öffentliche Funktion UNIX_Ist_Absolut mit dem Parameter t vom Typ Text, gibt einen Wahrheitswert zurück, macht:
Wenn die Länge von t gleich 0 ist, gib falsch zurück.
Gib wahr, wenn (t an der Stelle 1) gleich '/' ist zurück.
Und kann so benutzt werden:
"<t> ein Absoluter Pfad ist"
"<t> ein absoluter UNIX Pfad ist"

[
Säubert/Normalisiert einen UNIX Pfad:
Expand All @@ -40,7 +42,7 @@ Und kann so benutzt werden:
Entspricht Go's path.clean funktion
https://pkg.go.dev/path#Clean
]
Die öffentliche Funktion Säubern mit dem Parameter t vom Typ Text, gibt einen Text zurück, macht:
Die öffentliche Funktion UNIX_Säubern mit dem Parameter t vom Typ Text, gibt einen Text zurück, macht:
Wenn t gleich "" ist, gib "." zurück.
Der Wahrheitswert rooted ist wahr, wenn t an der Stelle 1 gleich '/' ist.
Die Zahl n ist die Länge von t.
Expand Down Expand Up @@ -88,17 +90,17 @@ Die öffentliche Funktion Säubern mit dem Parameter t vom Typ Text, gibt einen
Wenn path leer ist, speichere "." in path.
Gib path zurück.
Und kann so benutzt werden:
"der Pfad <t> gesäubert"
"der UNIX Pfad <t> gesäubert"

[
Verbindet zwei UNIX Pfade mit einem '/' und säubert zuletzt.
]
Die öffentliche Funktion Verbinden mit den Parametern a und b vom Typ Text und Text, gibt einen Text zurück, macht:
Die öffentliche Funktion UNIX_Verbinden mit den Parametern a und b vom Typ Text und Text, gibt einen Text zurück, macht:
Wenn a leer ist, gib b zurück.
Wenn b leer ist, gib a zurück.
Gib der Pfad (a verkettet mit '/' verkettet mit b) gesäubert zurück.
Gib der UNIX Pfad (a verkettet mit '/' verkettet mit b) gesäubert zurück.
Und kann so benutzt werden:
"die Pfade <a> und <b> verbunden"
"die UNIX Pfade <a> und <b> verbunden"

[
Pfade Terminologie:
Expand All @@ -113,17 +115,17 @@ Und kann so benutzt werden:
]

[
Nimmt einen Relativen Pfad t und gibt den vollständigen absoluten Pfad zurück.
Nimmt einen Relativen UNIX Pfad t und gibt den vollständigen absoluten Pfad zurück.
]
Die öffentliche Funktion VollständigerPfad mit dem Parameter t vom Typ Text, gibt einen Text zurück, macht:
Die öffentliche Funktion UNIX_VollständigerPfad mit dem Parameter t vom Typ Text, gibt einen Text zurück, macht:
Der Text cwd ist der Arbeitsverzeichnis.
Gib die Pfade cwd und t verbunden zurück.
Gib die UNIX Pfade cwd und t verbunden zurück.
Und kann so benutzt werden:
"den absoluten Pfad zu <t>",
"der absoluten Pfad zu <t>"
"den absoluten UNIX Pfad zu <t>",
"der absoluten UNIX Pfad zu <t>"

[
Gibt den Pfad ohne das letze Element zurück.
Gibt den UNIX Pfad ohne das letze Element zurück.
Falls der Pfad leer ist, wird ein "." zurück gegeben.
Falls der Pfad nur aus "/" gefolg von nicht-"/" Zeichen, wird "/" zurückgegeben.

Expand All @@ -137,7 +139,7 @@ Und kann so benutzt werden:
f(".") = "."
f("") = "."
]
Die öffentliche Funktion Ordnerpfad mit dem Parameter t vom Typ Text, gibt einen Text zurück, macht:
Die öffentliche Funktion UNIX_Ordnerpfad mit dem Parameter t vom Typ Text, gibt einen Text zurück, macht:
Die Zahl i ist die Länge von t.

Solange i größer als 0 ist, mache:
Expand All @@ -150,11 +152,11 @@ Die öffentliche Funktion Ordnerpfad mit dem Parameter t vom Typ Text, gibt eine
Verringere i um 1.
Gib "." zurück.
Und kann so benutzt werden:
"den Ordnerpfad von <t>",
"der Ordnerpfad von <t>"
"den UNIX Ordnerpfad von <t>",
"der UNIX Ordnerpfad von <t>"

[
Gibt den letzten Element eines Pfades zurück. Falls der Pfad leer ist, wird "." ausgegeben.
Gibt den letzten Element eines UNIX Pfades zurück. Falls der Pfad leer ist, wird "." ausgegeben.

f("/a/b/c/d.png") = "d.png"
f("/a/b/c/d") = "d"
Expand All @@ -166,7 +168,7 @@ Und kann so benutzt werden:
f("..") = ".."
f("") = "."
]
Die öffentliche Funktion Basisname mit dem Parameter t vom Typ Text, gibt einen Text zurück, macht:
Die öffentliche Funktion UNIX_Basisname mit dem Parameter t vom Typ Text, gibt einen Text zurück, macht:
Der Text t2 ist (t mit allen '/' danach entfernt).
Die Zahl i ist die Länge von t2.
Wenn t2 gleich "" ist, gib "." zurück.
Expand All @@ -175,11 +177,11 @@ Die öffentliche Funktion Basisname mit dem Parameter t vom Typ Text, gibt einen
Verringere i um 1.
Gib t2 ab dem (i plus 1). Element zurück.
Und kann so benutzt werden:
"den Basisnamen von <t>",
"der Basisname von <t>"
"den UNIX Basisnamen von <t>",
"der UNIX Basisname von <t>"

[
Gibt den Dateinamen einer Datei zurück. Wenn der Pfad nicht im Format von '*/*.*' ist wird ein leerer Text zurück gegeben.
Gibt den Dateinamen einer Datei zurück. Wenn der UNIX Pfad nicht im Format von '*/*.*' ist wird ein leerer Text zurück gegeben.

f("/a/b/c/test.txt") = "test"
f("/a/b/c/test.txt.exe") = "test"
Expand All @@ -192,7 +194,7 @@ Und kann so benutzt werden:
f("noext") = ""
f("") = ""
]
Die öffentliche Funktion Datei_Name mit dem Parameter t vom Typ Text, gibt einen Text zurück, macht:
Die öffentliche Funktion UNIX_Datei_Name mit dem Parameter t vom Typ Text, gibt einen Text zurück, macht:
Die Zahl i ist die Länge von t.
Die Zahl ende ist -1.
Solange i größer als 0 ist, mache:
Expand All @@ -202,12 +204,11 @@ Die öffentliche Funktion Datei_Name mit dem Parameter t vom Typ Text, gibt eine
Wenn ende kleiner als 1 ist, gib "" zurück.
Gib t im Bereich von i plus 1 bis ende zurück.
Und kann so benutzt werden:
"den Dateinamen von <t>",
"der Dateiname von <t>"
"den UNIX Dateinamen von <t>",
"der UNIX Dateiname von <t>"

[
Gibt die Erweiterung einer Datei zurück. Wenn der Pfad eines Ordners gegeben wurde, die Datei bei dem Pfad keine Erweiterung hat
oder der Parameter t leer ist, wird einen leeren Text zurück gegeben.
Gibt die Erweiterung einer Datei zurück. Wenn der UNIX Pfad t ein Ordner ist oder leer ist, wird einen leeren Text zurück gegeben.

f("/a/b/c/bar.css") = "css"
f("/a/b/c/foo.tar.gz") = "tar.gz"
Expand All @@ -219,7 +220,7 @@ Und kann so benutzt werden:
f("noext") = ""
f("") = ""
]
Die öffentliche Funktion Erweiterung mit dem Parameter t vom Typ Text, gibt einen Text zurück, macht:
Die öffentliche Funktion UNIX_Erweiterung mit dem Parameter t vom Typ Text, gibt einen Text zurück, macht:
Die Zahl i ist die Länge von t.
Die Zahl extStart ist i.
Solange i größer als 0 ist, mache:
Expand All @@ -229,4 +230,160 @@ Die öffentliche Funktion Erweiterung mit dem Parameter t vom Typ Text, gibt ein
Wenn extStart größer als, oder die Länge von t ist, gib "" zurück.
Gib t ab dem extStart. Element zurück.
Und kann so benutzt werden:
"die Erweiterung der Datei bei <t>"
"die UNIX Erweiterung der Datei bei <t>"


[
Windows Funktionen
]


[
Gibt wahr zurück wenn der gegebene Windows Pfad mit einem "\" anfängt oder der zweite Buchstabe ein Doppelpunkt ist ("C:").
]
Die öffentliche Funktion Windows_Ist_Absolut mit dem Parameter t vom Typ Text, gibt einen Wahrheitswert zurück, macht:
Wenn t gleich "" ist, gib falsch zurück.
Wenn t an der Stelle 1 gleich '\\' ist, gib wahr zurück. [ "\Users\admin\" ]
Gib wahr, wenn die Länge von t größer als, oder 2 ist und (t an der Stelle 1) ein lateinischer Buchstabe ist und t an der Stelle 2 gleich ':' ist zurück. [ "C:\Users\admin\" ]
Und kann so benutzt werden:
"<t> ein absoluter Windows Pfad ist"

[
Säubert/Normalisiert einen gegebenen Windows Pfad. Entfernt keine doppelten Schrägstrichen (\\)!

f("C:\\Users\\admin") = "C:\Users\admin"
f("C:\\Users\\admin\\") = "C:\Users\admin\"
f("C:\\Users\\admin\\..") = "C:\Users"
f("C:\\Users\\admin\\..\\") = "C:\Users\"
f("C:\\Users\\admin\\.") = "C:\Users\admin"
f("C:\\Users\\admin\\.\\") = "C:\Users\admin\"
f("C:\\Users\\..\\admin\\.") = "C:\admin"
f("C:\\Users\\\\admin") = "C:\Users\\admin"
f("C:\\..") = "C:\"
f("C:") = "C:\"
f("..") = "\"
f(".") = "\"
f("") = "\"
]
Die öffentliche Funktion Windows_Saeubern mit dem Parameter t vom Typ Text, gibt einen Text zurück,
ist in "libddpstdlib.a" definiert
Und kann so benutzt werden:
"der Windows Pfad <t> gesäubert"

[
Verbindet zwei Windows Pfade und säubert zuletzt.
]
Die öffentliche Funktion Windows_Pfad_Verbinden mit den Parametern a und b vom Typ Text und Text, gibt einen Text zurück,
ist in "libddpstdlib.a" definiert
Und kann so benutzt werden:
"die Windows Pfade <a> und <b> verbunden"

[
Pfade Terminologie:

Beispiel: "C:\Users\admin\Documents\test.tar.gz"

Laufwerkbuchstabe: 'C'
Vollständiger Pfad: "C:\Users\admin\Documents\test.tar.gz"
Ordnerpfad: "C:\Users\admin\Documents"
Basisname: "test.tar.gz"
Dateiname: "test"
Erweiterung: "tar.gz"
]

[
Gibt den Laufwerkbuchstaben des gegebenen Windows Pfads zurück. Wenn keiner existiert wird ' ' zurück gegeben.
Falls der Laufwerkbuchstaben kein Buchstabe zwischen a-Z ist wird auch ' ' zurückgegeben.
]
Die öffentliche Funktion Windows_Laufwerkbuchstabe mit dem Parameter t vom Typ Text, gibt einen Buchstaben zurück, macht:
Wenn die Länge von t kleiner als 2 ist, gib ' ' zurück.
Wenn t an der Stelle 2 ungleich ':' ist, gib ' ' zurück.
Wenn nicht (t an der Stelle 1) ein lateinischer Buchstabe ist, gib ' ' zurück.
Gib t an der Stelle 1 zurück.
Und kann so benutzt werden:
"der Laufwerkbuchstabe von <t>",
"den Laufwerkbuchstaben von <t>"

[
Nimmt einen Relativen Windows Pfad t und gibt den vollständigen absoluten Pfad zurück.
]
Die öffentliche Funktion Windows_VollständigerPfad mit dem Parameter t vom Typ Text, gibt einen Text zurück, macht:
Der Text cwd ist der Arbeitsverzeichnis.
Gib die Windows Pfade cwd und t verbunden zurück.
Und kann so benutzt werden:
"den absoluten Windows Pfad zu <t>",
"der absoluten Windows Pfad zu <t>"

[
Gibt den Windows Pfad ohne das letze Element zurück.
Falls der Pfad leer ist, wird ein "." zurück gegeben.
Falls der Pfad nur aus "C:\" gefolgt von nicht-"/" oder nicht-"\" Zeichen, wird "C:\" zurückgegeben.
Falls der Pfad nur aus "\" oder "/" gefolgt von nicht-"/" oder nicht-"\" Zeichen, wird "\" zurückgegeben.
]
Die öffentliche Funktion Windows_Ordnerpfad mit dem Parameter t vom Typ Text, gibt einen Text zurück, macht:
Die Zahl i ist die Länge von t.

Solange i größer als 0 ist, mache:
Wenn t an der Stelle i gleich '\\' ist oder t an der Stelle i gleich '/' ist, dann:
Der Text dir ist t bis zum i. Element.
Entferne alle '\\' nach dir.
Wenn die Länge von dir gleich 0 ist, gib "\\" zurück. [ "\abc" -> "\" ]
Wenn ':' am Ende von dir steht, gib dir verkettet mit '\\' zurück. [ "C:\abc" -> "C:\" ]

Gib dir zurück.
Verringere i um 1.
Gib "." zurück.
Und kann so benutzt werden:
"den Windows Ordnerpfad von <t>",
"der Windows Ordnerpfad von <t>"

[
Gibt das letzte Element des gegebenen Windows Pfads zurück.
]
Die öffentliche Funktion Windows_Basisname mit dem Parameter t vom Typ Text, gibt einen Text zurück, macht:
Die Zahl ende ist die Länge von t.
Wenn ende gleich 0 ist, gib "." zurück.
Solange t an der Stelle ende gleich '\\' ist oder t an der Stelle ende gleich '/' ist, verringere ende um 1.

Die Zahl i ist ende.
Solange i größer als 0 ist, mache:
Der Buchstabe curr ist t an der Stelle i.
Wenn (curr gleich '\\' ist oder curr gleich '/' ist oder curr gleich ':' ist), verlasse die Schleife.
Verringere i um 1.
Gib t im Bereich von (i plus 1) bis ende zurück.
Und kann so benutzt werden:
"den Windows Basisnamen von <t>",
"der Windows Basisname von <t>"

[
Gibt den Dateinamen einer Datei zurück. Wenn der Windows Pfad nicht im Format von '*\*.*', '*\*.*' oder '*:*.*' ist wird ein leerer Text zurück gegeben.
]
Die öffentliche Funktion Windows_Datei_Name mit dem Parameter t vom Typ Text, gibt einen Text zurück, macht:
Die Zahl i ist die Länge von t.
Die Zahl ende ist -1.
Solange i größer als 0 ist, mache:
Der Buchstabe curr ist t an der Stelle i.
Wenn curr gleich '.' ist, speichere i minus 1 in ende.
Wenn curr gleich '\\' ist oder curr gleich '/' ist oder curr gleich ':' ist, verlasse die Schleife.
Verringere i um 1.
Wenn ende kleiner als 1 ist, gib "" zurück.
Gib t im Bereich von i plus 1 bis ende zurück.
Und kann so benutzt werden:
"den Windows Dateinamen von <t>",
"der Windows Dateiname von <t>"

[
Gibt die Erweiterung einer Datei zurück. Wenn der Windows Pfad t ein Ordner ist oder leer ist, wird einen leeren Text zurück gegeben.
]
Die öffentliche Funktion Windows_Erweiterung mit dem Parameter t vom Typ Text, gibt einen Text zurück, macht:
Die Zahl i ist die Länge von t.
Die Zahl extStart ist i.
Solange i größer als 0 ist, mache:
Der Buchstabe curr ist t an der Stelle i.
Wenn curr gleich '.' ist, speichere i plus 1 in extStart.
Wenn curr gleich '\\' ist oder curr gleich '/' ist oder curr gleich ':' ist, verlasse die Schleife.
Verringere i um 1.
Wenn extStart größer als, oder die Länge von t ist, gib "" zurück.
Gib t ab dem extStart. Element zurück.
Und kann so benutzt werden:
"die Windows Erweiterung der Datei bei <t>"
12 changes: 12 additions & 0 deletions lib/stdlib/include/winapi-path.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
#ifndef WINAPI_PATH_H
#define WINAPI_PATH_H

#define MAX_PATH 260
#include "ddptypes.h"
#include <string.h>


bool PathCanonicalize(char *buffer, const char *path);
char *PathCombine(char *lpszDest, const char *lpszDir, const char *lpszFile);

#endif // WINAPI_PATH_H
39 changes: 39 additions & 0 deletions lib/stdlib/source/path.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
#include "ddpmemory.h"
#include "ddptypes.h"
#include "winapi-path.h"
#include <stdio.h>
#include <string.h>


void Windows_Saeubern(ddpstring *ret, ddpstring *path) {
char cleaned[MAX_PATH];
if (!PathCanonicalize(cleaned, path->str)) {
*ret = DDP_EMPTY_STRING;
ret->str = DDP_ALLOCATE(char, 1);
ret->str[0] = '\0';
ret->cap = 1;
return;
}
int len = strlen(cleaned) + 1;
char *str = DDP_ALLOCATE(char, len);
memcpy(str, cleaned, len);
ret->str = str;
ret->cap = len;
}

void Windows_Pfad_Verbinden(ddpstring *ret, ddpstring *a, ddpstring *b) {
char joined[MAX_PATH];
if (!PathCombine(joined, a->str, b->str)) {
*ret = DDP_EMPTY_STRING;
ret->str = DDP_ALLOCATE(char, 1);
ret->str[0] = '\0';
ret->cap = 1;
return;
}

int len = strlen(joined) + 1;
char *str = DDP_ALLOCATE(char, len);
memcpy(str, joined, len);
ret->str = str;
ret->cap = len;
}
Loading

0 comments on commit 9721565

Please sign in to comment.