Ver Mensaje Individual
  #15 (permalink)  
Antiguo 27/08/2003, 10:16
germanst
 
Fecha de Ingreso: agosto-2003
Mensajes: 57
Antigüedad: 21 años, 6 meses
Puntos: 0
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>&nbsp;</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.