Autor Thema: printf().. wie realisieren? Liste für Args?  (Gelesen 3986 mal)

hackgod

  • Beiträge: 70
    • Profil anzeigen
Gespeichert
« 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

Jidder

  • Administrator
  • Beiträge: 1 625
    • Profil anzeigen
Gespeichert
« Antwort #1 am: 18. May 2006, 01:08 »
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.

Zitat
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)


Zitat
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.
}
Dieser Text wird unter jedem Beitrag angezeigt.

 

Einloggen