Newsgroup: it.comp.lang.c
Titolo: porting di "printf"

Ciao a tutti,
Sto riprendendo un vecchio progetto di un interprete
di un linguaggio C-like e mi ritrovo lo stesso
problema su cui mi arenai parecchio tempo fa. Dovrei
inserire "printf" tra le funzioni disponibili e mi
sono preso un po' dei sorgenti disponibili qua e là
per tentare di adattarli in modo che prendano il
puntatore al primo elemento di una lista i cui
elementi contengono il dato più il codice del suo
tipo, etc. Nessuno dei miei tentativi ha funzionato,
tutte le versioni sembrano lavorare a molto basso
livello (come ovvio) e io non sono granché esperto al
punto di saper mettere le mani su una cosa del genere
come bits, allineamenti eccetera. Qualcuno sa se
esiste una versione portabile di printf adatta al mio
caso o decentemente adattabile e dove si può prendere?
Grazie moltissime di ogni eventuale aiuto
Apx.

 inserire "printf"
Visto che vorresti fare un interprete e non un compilatore, non ti
conviene appoggiarti direttamente alle librerie del S.O.?
Se lavori sotto Windows carichi nel tuo interprete (che alla fine sara'
un eseguibile) msvcrt.dll con LoadLibrary().
dlopen() se lavori sotto Linux.
Quanto alla portabilita' del codice della printf(), dubito che troverai
esempi... Lo standard si limita a dire che deve essere presente e che
deve avere un certo prototipo, non dice niente su come deve essere
implementata.
C:\>iao Angelo
-- 
Posted via Mailgate.ORG Server - 
http://www.Mailgate.ORG

 tipo, etc.
Premettendo che non so neanche cos'è un interprete e perchè è diverso da 
un compilatore, ti rimando su questo sito, 
http://www.bloodshed.net/c/index.html
 dove se vedi tra i post c'è uno che 
ha scritto una printf "non uguale all'originale, ma comunque funzionante"!
ci sentiamo.. (mi sono sempre chiesto se è facile implementare le funzioni 
di tutti i giorni, printf e scanf incluse..)
Miki

Grazie a entrambi per i suggerimenti. Ad Angelo posso
dire che tutto sarebbe facile se "printf" avesse un
numero fisso di argomenti; in quei casi non ci vuol
nulla a incorporare ogni funzione che si voglia. Ma in
questo caso dovrei manipolare direttamente lo stack
dall'interno del mio interprete, perché la serie
"va_arg" e compagnia quello vuole. A Michael: vado,
vedo e spero...se no mi tocca fare una porcata orrenda
scomponendo la stringa di formato e chiamando printf
per ogni singola stampa. In questo modo posso
incorporarla in modo portabile ma temo che
l'esecuzione sia disastrosamente lenta.... vedremo e
ancora grazie!!!!
Apx.

 "va_arg" e compagnia quello vuole.
<begin code>
#include <stdio.h>
#include <stdlib.h>
#include <stdarg.h>
int myPrintf(char* format, ...)
{
   va_list args;
   unsigned long wrChars   = 0;
   va_start(args, format);
   wrChars = vfprintf(stdout, format, args);
   va_end(args);
   return wrChars;
}
int main(int argc, char* argv[])
{
   return myPrintf("%s vale %d\n","Funziona? Se si, il numero", 10);
}
<end code>
Non mi sembra cosi' difficile....
C:\>iao Angelo
P.S. Quando ho scritto il codice precedente dovevo essere
     ubriaco, non tenerne conto :-)


      ubriaco, non tenerne conto :-)
E noto con dispiacere che i postumi continuano... Penso di aver capito
il problema e qaunto scritto non risolve niente.
C:\>iao Angelo
