Das Experiment, an dem ich gerade arbeite, verwendet eine Softwarebasis mit einer komplizierten Quellhistorie und keiner gut definierten Lizenz. Es wäre ein beträchtlicher Aufwand, die Dinge zu rationalisieren und unter einer festen Lizenz zu veröffentlichen.
Es ist auch beabsichtigt, eine zufällige unixische Plattform zu betreiben, und nur einige der libc, die wir unterstützen, haben GNU getline, aber im Moment erwartet der Code das.
Kennt jemand eine Neuimplementierung der GNU getline
Semantik, die unter einer weniger restriktiven Lizenz verfügbar ist?
Bearbeiten :: Ich frage, weil Google nicht geholfen hat, und ich möchte es vermeiden, wenn möglich zu schreiben (es könnte eine lustige Übung sein, aber es kann nicht die beste sein meiner Zeit.)
Um genauer zu sein, ist die Schnittstelle in Frage:
%Vor%Sehen Sie sich Paul Hsiehs Seite auf Benutzereingabe an. Sie können dem Autor eine E-Mail senden, wenn Sie die genauen Bedingungen wissen möchten.
Ich bin verwirrt.
Ich schaute auf den Link, las die Beschreibung, und das ist ein gutes Dienstprogramm.
Aber, sagen Sie, Sie können diese Funktion einfach nicht auf Spezifikation umschreiben? Die Spezifikation scheint ziemlich klar zu sein,
Hier:
%Vor%15 Minuten, und ich habe C nicht in 10 Jahren geschrieben. Es unterbricht leicht den getline-Vertrag, indem es nur prüft, ob das lineptr NULL ist, anstatt NULL und n == 0. Sie können das beheben, wenn Sie möchten. (Der andere Fall ergab für mich keinen großen Sinn, ich denke, dass Sie in diesem Fall -1 zurückgeben könnten.)
Ersetzen Sie das '\ n' durch eine Variable, um "getdelim" zu implementieren.
Schreiben die Leute immer noch Code?
Wenn Sie für BSD kompilieren, verwenden Sie fgetln stattdessen
Verwenden Sie diese portablen Versionen von NetBSD: getdelim () und getline ()
Diese kommen von libnbcompat in pkgsrc und haben eine BSD-Lizenz am Anfang jeder Datei. Sie brauchen beides, weil getline () getdelim () aufruft. Holen Sie die neuesten Versionen beider Dateien. Siehe die BSD-Lizenz am Anfang jeder Datei. Ändern Sie die Dateien so, dass sie in Ihr Programm passen: Sie müssen möglicherweise getline () und getdelim () in einer Ihrer Header-Dateien deklarieren und beide Dateien so ändern, dass sie Ihre Header anstelle der nbcompat-Header enthalten.
Diese Version von getdelim () ist portabel, weil sie fgetc () aufruft. Im Gegensatz dazu würde ein getdelim () von einer libc (wie BSD libc oder musl libc) wahrscheinlich private Features dieser libc verwenden, so dass es nicht plattformübergreifend funktionieren würde.
In den Jahren seit POSIX 2008 hat getline () angegeben, haben mehr Unix-Plattformen das hinzugefügt getline () -Funktion. Es ist selten, dass getline () fehlt, aber es kann immer noch auf alten Plattformen passieren. Einige Leute versuchen, NetBSD pkgsrc auf alten Plattformen (wie PowerPC Mac OS X) zu booten, also wollen sie, dass libnbcompat fehlende POSIX-Funktionen wie getline () bereitstellt.
Der Code von Will Hartung leidet unter einem sehr ernsten Problem. realloc
wird höchstwahrscheinlich den alten Block freigeben und einen neuen zuweisen, aber der Zeiger p
im Code wird weiterhin auf das Original zeigen. Dieser versucht, dies zu beheben, indem er stattdessen Array-Indexierung verwendet. Es versucht auch, die POSIX-Standardlogik näher zu replizieren.