Hola germanst,
Bueno, vamos por partes.. :)
Cita: Quisiera ver si me podes explicar mas o menos la funcion Recibe_parametros (...) en esta hay cosas que no se bien que hacen o para que son, por ejemplo size_t longitud, la condicion del if, la asignacion de *param, el fread
Bien, veamos:
- El tipo de datos size_t es usado para manipular cantidades numéricas que de alguna forma representan el tamaño o longitud de algo. Muchas veces funciona como alias de un tipo de dato ``unsigned long int''. Por ejemplo, en algún archivo de cabecera (aquellos que terminan en la extensión `.h') podría estar definido de esta forma:
Código:
typedef unsigned long int size_t;
- La siguiente condición:
Código:
content_length && (!content_type ||
strcmp (content_type, "application/x-www-form-urlencoded") == 0)
Básicamente revisa que: el valor de `content_length' no sea NULL ('\0') y que al mismo tiempo suceda una de dos cosas: o bien que `content_type' sea NULL, o que el contenido de `content_type' coincida con la cadena "application/x-www-form-urlencoded". Esto debido a que la función strcmp() de la librería string.h recibe apuntadores a dos cadenas y devuelve un cero si ambas cadenas resultan ser equivalentes.
- La asignación de `*param' tiene que ver con la gestión dinámica de memoria. Te aconsejo que para más detalles consultes libros de C o material de referencia variado, ya que por sí solo este es un tema bastante extenso como para cubrirlo en un mensaje como éste.
Básicamente la expresión puede ser descrita de la siguiente manera: reserve memoria mediante la función malloc() y almacene el apuntador al segmento de memoria reservado en `*param'.
El segmento presente antes del llamado a malloc, (char *), es lo que se conoce como casting o moldeado de datos, que obliga a que la referencia devuelta por malloc() sea tratada como un apuntador a `char' (esto del moldeamiento de datos tiene sentido cuando se está familiarizado con la forma en que se hacen las cosas en C. No tienes que preocuparte mucho con este tipo de cosas por ahora... :)
La expresión que es enviada como argumento a malloc() indica la cantidad de memoria que debe ser reservada: (longitud+1)*sizeof(char). Esto quiere decir: reserve tantos bytes de memoria como el resultado de sumar uno al valor de `longitud' y multiplicarlo por el espacio de memoria que ocupa un valor tipo `char'. La gracia de sumar 1 a `longitud' es que en C las cadenas suelen manipularse como referencias a datos tipo `char' que apuntan a una secuencia de caracteres ubicados en la memoria. Para delimitar el fin de la cadena, se usa un caracter especial, el NULL, '\0', y por esto reservamos memoria contando el espacio adicional para éste caracter.
- La siguiente sentencia:
Código:
fread (*param, sizeof(char), longitud, stdin);
Quiere decir más o menos lo siguiente: leer desde el descriptor de archivo `stdin' tantos datos como indique el valor de `longitud', asumiendo que cada dato es de tamaño `sizeof(char)', y almacenar la información leída en `*param'.
En C, el descriptor de archivo especial `stdin' es una referencia que apunta a la entrada estándar del sistema, la cual generalmente está asociada con un dispositivo de entrada como el teclado, aunque en nuestro caso en particular usamos `stdin' para leer la entrada que proviene desde la interfaz CGI.
Para más información, puedes consultar en algún libro o en otras fuentes de información sobre la sintaxis y el propósito de la función fread(), que hace parte de la librería estándar stdio.h.
Cita: La funcion Transforma_ASCCI no veo en que momento hace la transformacion, me imagino que debe ser en sscanf, pero no tengo idea que hace eso.
Efectivamente, la "tranformación" ocurre al momento de hacer el llamado a sscanf(). La familia de funciones *scanf() y *printf() (como sscanf(), fscanf(), vscanf(), vsscanf(), vfscanf(), etc.) trabajan todas en base a una cadena que puede contener diferentes especificadores de conversión. Es un tema bonito pero me temo que lo suficientemente extenso como para abandonar la idea de tratar de abarcarlo aquí.
Te diré eso sí que la sentencia:
Código:
sscanf (secuencia, "%x", &valor);
Hace más o menos lo siguiente: leer desde la cadena cuya referencia está almacenada en `secuencia' un valor hexadecimal (indicado por el especificador `%x') que será almacenado en la variable `valor'.
El símbolo `&' que precede a `valor' tiene como propósito enviar tal argumento a la función sscanf()
por referencia, lo que implica que debe ser pasada una referencia a la variable, y no el valor mismo de la misma. El operador `&' en C devuelve una referencia hacia una variable determinada (la dirección de memoria asociada con la variable). Si aun no estás muy familiarizado con este concepto, no te preocupes. Tan solo ten en mente que cuando envíes variables tipo `char', o `int', por ejemplo, como argumentos a una función como scanf() o sscanf(), por lo general querrás colocar el operador `&' antes del nombre de cada variable.
Cita: Que es if (!param)? pregunta si la variable esta vacia?. Lo mismo con if (cadena).
En C, estructuras de control como `if' básicamente controlan el flujo de un programa según el valor al que sea evaluada una determinada expresión. Como en C no existe un tipo de datos booleano nativo, esto por lo general quiere decir que la expresión es verificada por dos posibles casos: si la expresión evalúa a cero, o si la expresión evalúa a cualquier cosa distinta a cero.
Así que, por ejemplo, la expresión:
Sería equivalente a:
Ya que en ambos casos, la idea es que si el valor de `cadena' evalúa a cualquier cosa distinta a cero, el bloque principal del `if' debe ser ejecutado. Incidentalmente, cabe anotar que 0 es entre otras cosas el valor de la macro NULL. Una de las formas en las que comúnmente es definida tal macro es '\0', lo cual quiere decir "un caracter sencillo igual al valor ASCII asociado con el número decimal 0.
De forma similar, la condición if (!param) chequea si param
no es un valor que evalúe a algo distinto a cero. Como probablemente sabrás, el signo de admiración (!) actúa como operador lógico NOT en C.
Cita: El system ("Pause") no lo pongo, no?
Yo lo he comentado ya que en mi sistema el comando `Pause' no tiene ningún sentido, y de otra forma no me permitiría la ejecución normal de la aplicación. Pero si quieres usarlo mientras depuras la aplicación en tu máquina, no hay problema, úsalo libremente si deseas... :)
Cita: Bueno, por ahora eso es todo, ojala que puedas seguir ayudandome asi lo puedo terminar.
Me parece muy bien. Estás en todo tu derecho de preguntar si no has entendido algo, y aquí algo que creo que es común a todos los que visitamos estos foros es nuestro deseo de aprender y de colaborar con quienes desean hacerlo también.
Te deseo la mejor de las suertes.
Un cordial saludo