Newsgroup: it.comp.lang.c
Titolo: gestione diretta di va_list

    Salve a tutti....
    Sto scrivendo l'interprete di un mio linguaggio e vorrei
"appoggiarmi" alla libreria del C per alcune funzioni interne. Per
quanto riguarda quelle con un numero fisso di argomenti la cosa è
banale perché ho delle funzioni che prendono i valori dallo stack
(quello del *mio* programma) e posso quindi richiamare cose come
'fopen' e tutte le funzioni ad argomenti fissi.
    Il mio grosso problema è 'printf' e affini. Ho tentato di
portare il sorgente di printf modificandolo in modo che prenda gli
argomenti dal "mio" stack, ma la cosa si è dimostrata fallimentare
per una serie di ragioni tra cui la dipendenza dalla macchina e la
non corrispondenza col significato dei tipi tra il C e il mio
linguaggio. Lo DEVO escludere a priori. Ciò che vi chiedo è dunque:
    A) potrei manipolare DIRETTAMENTE va_list e compagnia bella e
poi chiamare printf? Tenete conto che non sono un gran programmatore
e (siccome per me va_list è sempre stata uno dei più grandi misteri
dell'informatica) chiederei che la risposta fosse adeguata alle mie
(scarse) capacità. Tutto quello di cui dispongo sono 3 funzioni che
mi danno rispettivamente 1) la quantità di argomenti sul mio stack,
2) il tipo di ciascuno e 3) l'accesso al suddetto valore. Se
qualcuno mi risponde, potrebbe farlo con un esempio di codice, che è
il solo modo che capisco per apprendere???
    B) se quanto in A fosse fattibile, in quale misura è
indipendente dalla macchina? Ovviamente sarebbe la cosa per me
prioritaria, anche a scapito della velocità....
    C) Come posso trovare i dettagli di come funziona va_list magari
nelle FAQ o simili? L'esame delle macro di definizione non è che mi
abbia aiutato gran che, non avendo alcuna chiave di lettura.
    Grazie a tutti!!!!
    Corrado

     Il mio grosso problema è 'printf' e affini........
Tratto dall' help del mio borland c 2.00:
#include <stdio.h>
#include <stdarg.h>
int vpf(char *fmt, ...)
{
   va_list argptr;           /*    puntatore ai dati da prelevare    */
   int cnt;
                             /*    Carica i dati dallo stack della
funzione a partire dall' primo argomento    */
   va_start(argptr, fmtt);    ( non e' una funzione ma una macro )
                             /*
                                     dati 2 argomenti "fissi" si occupa
di stampare tutto su stdout
                            */
   cnt = vprintf(fmt, argptr);
                            /*
                                        termina l'accesso alla  lista di
argomenti,
                            */
   va_end(argptr);    ( non e' una funzione ma una macro )
   return(cnt);
}
int main(void)
{
   int inumber = 30;
   float fnumber = 90.0;
   char *string = "abc";
   vpf("%d %f %s\n",inumber,fnumber,string);
   return 0;
}
NB:    Il programmatore non entra in merito all' entita' degli n
argomenti ma demanda il compito a vprintf:
           per entrare nel merito di tali argomenti si deve usare la
macro 'va_arg' per prelevare ciascun valore.
Ivan Molella

 si trasforma in tragedia!!!!
Ma è davvero una tragedia? Ripeto, non so su cosa deve girare il
tuo interprete e potrei scrivere una enorme ca$$ata 8), ma su un 
PC entry-level (almeno 400 Mhz ;) dubito che un utente noterebbe
la differenza tra la versione 'lenta' e l'ipotetica 'veloce'. ;)
Ciao ciao,
Andrea
-- 
"...Unix, MS-DOS, and Windows NT (also known as the Good, the Bad, and 
 the Ugly)."
(by Matt Welsh)


    Non mi offendo affatto :-) se non altro perché non riesco a
capire in che senso potrei. Dal punto di vista del solo aspetto
"intellettuale" ammiro molto il mondo dell' "hack",
    Ciao anche a te e.... a presto!
    Corrado