VB CGI-C Libraries
Lingua: Italiano
Linguaggio: C
Sistema operativo: Unix/DOS
Descrizione
Queste librerie contengono una serie di funzioni utili per la realizzazione di programmi CGI in linguaggio C, e per altre operazioni collaterali come la manipolazione di stringhe.
Installazione
E' necessario includere nei programmi C gli header (file .h) delle librerie che si desidera utilizzare. E' poi ovviamente necessario compilare anche i corrispondenti file .c insieme ai propri: sotto Unix, con gcc, basta aggiungerli sulla riga di comando (esempio: gcc miofile.c formlib.c pairlist.c), mentre con certi compilatori per DOS (ad esempio Borland Turbo C) è necessario creare un "progetto" in cui includere tutti i sorgenti necessari.
Guida all'uso
Per la sintassi e il funzionamento delle singole funzioni vi rimando ai commenti negli header.
Comunque, ecco la struttura tipica di un programma che legge l'output prodotto da un modulo WWW con il metodo POST, e che possa quindi essere indicato come valore dell'attributo ACTION della tag FORM:
#include "formlib.h" void main(void) { T_LIST lista; char *p, *q; ListCreate(&lista); if (!MethodIsPOST()) exit(1); if (!TypeIsForm()) exit(2); GetPOSTVars(&lista); p = ListRead(&lista, "Variabile 1"); q = ListRead(&lista, "Variabile 2"); if ((p != NULL) && (q != NULL)) { ... elaborazione dei dati forniti dall'utente ... SendMIMEHeading(); ... stampa della pagina di output ... } ListFree(&lista); }In altre parole, per prima cosa deve essere definita una lista (ListCreate()), quindi devono essere effettuati i controlli sul tipo di dati forniti dal server HTTP al programma (MethodIsPOST() e TypeIsForm()), e infine devono essere caricati nella lista i valori dei campi della form (GetPOSTVars()); è poi possibile leggere dalla lista i singoli campi (ListRead()), e, se essi sono stati letti correttamente, elaborarli e generare una pagina di output da rispedire all'utente; alla fine si può deallocare la memoria della lista (ListFree()).
Le variabili fornite dall'utente possono essere lette con la chiamata
p = ListRead(&lista, "Nome del campo INPUT");
dove p è un char * (non è necessario allocare memoria): per leggere dei numeri è necessario convertire la stringa restituita in p in un numero usando funzioni come atoi(). La funzione restituisce NULL se per qualche motivo non esiste o non è stato letto un campo con tale nome, quindi è bene effettuare un controllo subito dopo la chiamata a ListRead(). Per manipolare le stringhe fornite dall'utente possono essere utili le numerose funzioni di libreria disponibili includendo STRINLIB (si veda la descrizione in strinlib.h).
La pagina da restituire all'utente può essere generata "al volo" mediante delle semplici printf() che stampano il sorgente HTML sullo stdout; tuttavia, prima della prima printf() deve essere chiamata la funzione di inizializzazione dell'output SendMIMEHeading(). Se non volete generare una pagina al volo, ma soltanto spedire una pagina preconfezionata sempre uguale, vi consiglio di includere anche la libreria OUTFILE e di utilizzare al posto delle printf() la funzione OutputFile().
Durante l'elaborazione dei dati avrete sicuramente la possibilità di verificare delle condizioni d'errore. Poichè il programma va fatto girare non direttamente, ma richiamato dal server HTTP, è impossibile mandare semplicemente messaggi d'errore sullo stdout, come si fa normalmente. Vi conviene quindi utilizzare la chiamata SendError("messaggio");, che provvede a generare una intera pagina HTML contenente il messaggio d'errore da voi indicato come argomento. In questo modo potrete avvertire correttamente gli utenti del programma con messaggi d'errore. Ovviamente, la funzione va utilizzata prima di cominciare a scrivere sull'output la pagina di risposta vera e propria: anche per questo è bene separare nettamente la fase di elaborazione da una fase finale in cui si stampa tutta la pagina di risposta.
Per aiutarvi nel debug, potete anche utilizzare le funzioni della libreria LOG: esse permettono di creare un file di log e di scrivervi messaggi in modo "sicuro", in modo che, anche se il programma si pianta a metà, tutto quello che è stato loggato in precedenza venga scritto e sia leggibile a posteriori, aiutandovi a capire dove sta il problema.
Se lo scopo della form è quello di far spedire una mail, sarà necessario richiamare esternamente il programma di spedizione della posta (sotto Unix tipicamente si usa il comando sendmail -t < mail.txt, dove mail.txt è un file di testo che contiene l'intera mail, header inclusi). Si può allora scrivere un programma che legga l'input e generi il testo della mail su un file, e poi uno script che esegua tale programma e poi sendmail -t; come ACTION della form va ovviamente indicato lo script. Comunque, per CGI di questo tipo è particolarmente indicato l'uso del linguaggio Perl: vi sconsiglio il C.
Se al posto del metodo POST si vuole utilizzare il metodo GET, è sufficiente sostituire la funzione GetPOSTVars() con GetGETVars(), eliminare il controllo su TypeIsForm(), e sostituire il controllo del metodo con MethodIsGET().
Un'ultima nota: quando si usa la libreria FORMLIB è necessario utilizzare anche PAIRLIST; per poter utilizzare la libreria STRINLIB con GCC è necessario includere all'inizio del suo header anche STRING2T, e compilare anche tale file. STRING2T non è invece necessaria quando si usa Turbo C.
Scarica il programma
Archivio TAR GZippato (Unix)
Archivio ZIP (DOS)