Ver Mensaje Individual
  #2 (permalink)  
Antiguo 20/08/2003, 03:06
leonardop
 
Fecha de Ingreso: julio-2003
Mensajes: 165
Antigüedad: 21 años, 7 meses
Puntos: 1
Hola mi amigo,

El problema que tienes entre manos es muy interesante, y me parece realmente fascinante que estés usando C como lenguaje de programación, especialmente cuando lo has preferido aun sin tener mucha experiencia con él, como nos cuentas.

Antes de continuar quiero hacer una aclaración. Para procesar información enviada por formularios web no es completamente necesario usar un programa orientado a CGI. Es solo uno de los caminos. Otras alternativas podrían involucrar el uso de tecnologías como PHP, ASP, y demás, que no necesariamente operan sobre la interfaz CGI.

Claro está que CGI es una opción válida, y resulta particularmente interesante cuando se construyen aplicaciones binarias en lenguajes como C.

Bueno, te voy a presentar una modificación del código que has compartido con nosotros --el cual, dicho sea de paso, me sorprende bastante proviniendo de alguien que, como lo has dicho, conoció C hace menos de una semana. ¿Sólo conoces Pascal por ahora? Por curiosidad, y si no es mucha indiscreción, ¿qué clase de profesión tienes? Si no eres programador, al menos debo decirte que tienes una tremenda disposición para este oficio... :)

Adicionalmente, quisiera preguntarte, ¿sobre qué tipo de entorno trabajas (sistema operativo, servidor web, compilador de C) (algo (system("PAUSE")) me dice que podría ser windows)?

En fin, pasemos a la parte divertida... (el código, por supuesto)

Código:
#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()
{
    char *cadena = NULL;
    char nombre[40];
    int p=0;

    Recibe_parametros(&cadena);

    /* Imprimir cabecera HTTP para cumplir con un requisito de la
     * interfaz CGI */
    printf ("Content-Type: text/html\n\n");

    printf ("Los valores recibidos mediante el metodo POST son:\n");

    while (Identifica_variable(nombre, cadena, &p, 40))
        printf ("  %s\n", nombre);

    if (cadena)
        free(cadena);  /* Liberar la memoria de `cadena' */

/*    system("PAUSE");  */

    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;

    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)
        {
            switch (*param) {
            case '%':
                vble[i++] = Transforma_ASCII(param);
                param += 2;
                *n += 2;
                break;

            case '+':
                vble[i++] = ' ';
                break;

            default:
                vble[i++] = *param;
            }
            param++;
            (*n)++;
        }

        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;
}
Espero que pueda serte útil por el momento. Eventualmente podemos reconsiderar el problema, cambiar cosas, buscar otros caminos... El problema es bonito y tenemos unos cuantos días de plazo ¿no es así? :)

Un cordial saludo