En serio podrias llegar a pasarlo a Pearl?, bueno, la verdad que para mi eso seria buenisimo, de verdad.
Te digo por las dudas lo que me dijeron ellos: "el fuente tiene que estar hecho en CGI/Perl...".
Bueno, yo te mando el codigo tal cual esta ahora, lo unico que tal vez yo antes de subirlo vaya a cambiarle sea el codigo html, pero lo demas quedaria tal cual, salvo una cosa: los tres archivos a los que se hace referencia deben estar en otro directorio, y no se como se hace.
Te cuento, el cgi va a estar en una carpeta llamada cgi-bin, pero los archivos en una carpeta llamada httpdocs, que no esta dentro de cgi-bin, sino que esta al mismo nivel, se entiende?
seria asi:
[principal]
| |
[cgi-bin] [httpdocs]
| |
archivo.cgi {los tres archivos
a los q' se hace referencia}
Bueno, aca va el codigo:
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
void Recibe_parametros(char **param);
int Identifica_variable(char *vble, char *param, int *n, int limite);
char Transforma_ASCII(char *cadena);
int main()
{
FILE *da, *da2, *cant;
char *cadena = NULL;
char nombre[40];
int p=0;
int contador=0;
#define ARCHIVO_SALIDA "inscriptos.xls"
#define ARCHIVO_SALIDA2 "inscrip_copia.xls"
#define ARCHIVO_CANT "contador.txt"
Recibe_parametros(&cadena);
da = fopen(ARCHIVO_SALIDA, "a");
da2 = fopen(ARCHIVO_SALIDA2, "a");
if (! da || ! da2)
exit (1);
fprintf (da, "\n");
fprintf (da2, "\n");
while (Identifica_variable(nombre, cadena, &p, 40))
{
fprintf (da, "%s\t", nombre);
fprintf (da2, "%s\t", nombre);
}
fclose(da);
fclose(da2);
cant = fopen(ARCHIVO_CANT, "r+");
if (! cant)
exit(1);
fscanf (cant, "%d", &contador);
contador++;
fseek (cant, (long)0, SEEK_SET); /* va al comienzo del archivo */
fprintf (cant, "%d", contador);
fclose (cant);
/* Imprime cabecera HTTP para cumplir con un requisito de la
* interfaz CGI */
printf ("Content-Type: text/html\n\n"
"<html>\n"
"<head><title>Gracias por anotarse en Baradero 2003</title></head>\n"
"<body bgcolor=#000000 text=#FFFFFF><div align=center>\n"
"<p> </p>\n"
"<p><b><font face=Arial, Helvetica, sans-serif size=4>\n"
"<u>SU NUMERO DE INSCRIPCION ES: %d</u></font></b></p>\n"
"</div></body>\n"
"</html>\n", contador);
if (cadena)
free(cadena); /* Libera la memoria de `cadena' */
return 0;
}
/* Guarda en "cadena" toda la informacion del formulario (enviado con
* el metodo POST) */
void Recibe_parametros(char **param)
{
/* Variables para almacenar apuntadores a valores de variables de
* entorno */
char *content_type;
char *content_length;
size_t longitud;
content_type = getenv ("CONTENT_TYPE");
content_length = getenv ("CONTENT_LENGTH");
if (content_length && (!content_type ||
strcmp (content_type, "application/x-www-form-urlencoded") == 0)) {
longitud = (size_t)atoi(content_length);
*param = (char *)malloc((longitud+1)*sizeof(char));
fread (*param, sizeof(char), longitud, stdin);
}
}
/* Recibe un puntero a la variable donde se guardaran los datos del
* campo, la cadena donde buscara esos datos, la posicion actual del
* puntero de la cadena, y un limite maximo de caracteres a
* leer. Devuelve cero si no hay mas valores disponibles, o 1 de lo
* contrario. */
int Identifica_variable(char *vble, char *param, int *n, int limite)
{
int i=0, cont=0;
if (!param)
return 0;
param += *n; /* Ir a la posicion n */
/* Ignorar el nombre de la variable, ir directo al valor */
while(*param != '=' && *param != '\0')
{
param++;
(*n)++;
}
if(*param == '='){
param++;
(*n)++;
while(*param != '&' && *param != '\0' && i < limite - 1)
{
cont = 1;
switch (*param) {
case '%':
vble[i++] = Transforma_ASCII(param);
param += 2;
*n += 2;
break;
case '+':
vble[i++] = ' ';
break;
default:
vble[i++] = *param;
}
param++;
(*n)++;
}
if (*param == '&' && cont == 0)
vble[i++] = ' '; /* Si no hay datos en la variable
* (ej: ape=&nom=pepe) */
vble[i] = '\0';
return 1;
}
else
return 0;
}
/* Transforma una secuencia hexadecimal `%xx' por el caracter
* correspondiente segun su valor ASCII. */
char Transforma_ASCII(char *cadena)
{
char secuencia[3];
unsigned valor;
if (*cadena != '%')
return '?'; /* Devolver un signo de interrogacion si no se
* recibe una secuencia valida */
strncpy (secuencia, cadena + 1, 2);
secuencia[2] = '\0';
sscanf (secuencia, "%x", &valor);
return (char)valor;
}
Bueno, te agradezco de antemano la buena voluntad, y seguimos en contacto. Chau!
Germán. |