Lowlevel
Lowlevel => Lowlevel-Coding => Thema gestartet von: hackgod am 17. May 2006, 21:56
-
He Leute,
bin grad am überlegen, wie ich printf() realisieren kann, da ich halt ein paar Sachen kontrollierter ausgeben muss. Also der Ablauf der Funktion wäre ja in etwa folgender:
1. Formatstring und Args übergeben
2. FS auf bestimmte Sachen überprüfen, z.B. %s, %d
3. Wenn vorhanden, entsprechendes Arg abrufen, an Konvertierfunktion übergeben und ausgeben
4. Wenn keine Args übergeben, FS einfach als String ausgeben
So, nu meine Fragen: stimmt der Ablauf in etwa? hat jemand Beispiele für Konvertierungsfunktionen? wie realisiere ich am Besten die Liste für die Args?
mfg
hackgod
-
Früher hab ich immer aus der vsprintf-Funktion von Linux 0.0.1 genommen. Die ist schön einfach und praktisch ohne Anpassungen benutzbar.
Wenn du es dir selber stricken willst, solltest du 2, 3, und 4 zusammenlegen. (Wenn du es nicht eh schon getan hättest.) Also in einer Schleife jedes Zeichen des Formatstrings durchlaufen, und wenn dir dabei ein % über den Weg kommt, dann entsprechend dem darauffolgenden Zeichen handeln, sonst einfach das Zeichen ausgeben.
hat jemand Beispiele für Konvertierungsfunktionen?
Ich hoffe pseudocode reicht dir. Sonst schau in die Linux-0.0.1-Quellen zu vsprintf (die Funktion heisst da itoa oder so), da ist das selbe Prinzip verwendet.
// radix ist die basis, n die zahl
char digits[] = "0123456789abcdefghijklmnopqrstuvwxyz";
while(n > 0)
{
lege digits[(n % radix)] auf den stack
n = n / radix;
}
while(elemente auf dem stack)
{
c = pop(element)
gib c aus.
}
// (der stack ist kein richtiger stack sondern ein array)
wie realisiere ich am Besten die Liste für die Args?
Meistens macht man da irgendwas mit va_args (aus stdlib.h, siehe wieder Linux 0.0.1), aber ich hab mir da vor kurzem selbst was gestrickt:
void printf(char * format, ...)
{
int * args = ((int*)&format) + 1;
// das erste Argument nach format ist jetzt in args[0], das zweite in args[1], usw.
}