El Libro del CGI

Útil código que permite manipular y elaborar de manera mas flexible programas de tipo CGI en cualquier plataforma.   La forma de uso de este código es la siguiente:

Nombre del archivo: cgiutils.c


/* cgiutils.c
* (c) 1995-1996 William E. Weinman
* 1.1 -- splitword() now skips leading spaces
*/

/* splitword(char *out, char *in, char stop)
*
* moves all the characters up to the first occurance of stop from in to out, then
* terminates out. then copies in, begining with the first character after stop, to
* the begining of in (effectively shifting it to the begining).
*/
void splitword(char *out, char *in, char stop)
{
int i, j;

while(*in == ' ') in++; /* skip past any spaces */

for(i = 0; in[i] && (in[i] != stop); i++)
out[i] = in[i];

out[i] = '\0'; /* terminate it */
if(in[i]) ++i; /* position past the stop */

while(in[i] == ' ') i++; /* skip past any spaces */

for(j = 0; in[j]; ) /* shift the rest of the in */
in[j++] = in[i++];
}

char x2c(char *x)
{
register char c;

/* note: (x & 0xdf) makes x upper case */
c = (x[0] >= 'A' ? ((x[0] & 0xdf) - 'A') + 10 : (x[0] - '0'));
c *= 16;
c += (x[1] >= 'A' ? ((x[1] & 0xdf) - 'A') + 10 : (x[1] - '0'));
return(c);
}

/* this function goes through the URL char-by-char and converts all the "escaped" (hex-encoded) sequences to characters

this version also converts pluses to spaces. I've seen this done in a separate step, but it seems to me more efficient to do it this way.
*/

void unescape_url(char *url)
{
register int i, j;

for(i = 0, j = 0; url[j]; ++i, ++j)
{
if((url[i] = url[j]) == '%')
{
url[i] = x2c(&url[j + 1]);
j += 2;
}
else if (url[i] == '+')
url[i] = ' ';
}
url[i] = '\0'; /* terminate it at the new length */
}

Nombre del archivo: cgi.c

#include <string.h>
#include <stdlib.h>
#include <stdio.h>
#include "cgiutils.c" //se incluye en archivo
struct {
    char name[128]
    char val[128]
}

int GET = 0;  // por default es el método POST
void main(){
    char *qs, *ct, *cl;
    int i, icl, rc;

    if((qs=getenv("QUERRY_STRING")) != NULL)
        GET = 1;  // método GET
    else {
        ct = getenv("CONTENT_TYPE");
        cl = getenv("CONTENT_LENGTH");
        if (cl == NULL)
            exit(1);
        icl = atoi(cl);
        if (strcmp(ct, "aplication/x-www-from-urlencoded"))
            exit(1);
        else if (icl == 0)
            exit(1);
        if ((qs = malloc(icl+1)) == NULL)
            exit(1);
        if ((rc = frea(qs, icl, 1, stdin)) != 1)
            exit(1);
        qs[icl]='\0';
    }

    for (i=0; qs[0] != '\0'; i++) {
        splitword(elements[i].val, qs, '&');
        unescape_url(elements[i].val);
        splitword(elements[i].name, elements[i].val, '=');
    }

    printf ("Content-type: text/plain\n\n")
    printf ("Variables:\n\n);

    for (i=0; elements[i].name[0]; i++)
        printf("%s = %s\n", elements[i].name, elements[i].val);
}

Con esto es creará un arreglo que contendra el nombre de la variable y su valor.


GD 1.4

Código que se encarga de crear imágenes con formato GIF.  El siguiente archivo muestra una forma util de la forma en que puede ser utilizado.

Nombre del archivo: giftxt.c

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <gd/gd.h>
#include <gd/gd.c>

#define DIRECTORIO "images/numeros"
#define DIGIT_WIDTH (11)
#define DIGIT_HEIGHT (16)

char infile[] = "X.gif";

void main(int argc, char **argv){
    gdImagePtr imgout, imgin;
    FILE *fpin, *fpout;
    int i;
    int outwidth;
    char *instr;
    char *outfile = NULL;

    if (argv[1])
        instr = argv[1];
    else
        exit(0);

    if (argv[2])
        outfile = argv[2];

    outwidth = DIGIT_WIDTH *strlen(instr);

    imgout = gdImageCreate(outwidth, DIGIT_HEIGHT);

    for (i=0; instr[i]; i++){
        *infile = instr[i];
        fpin = fopen(strcat(DIRECTORIO, infile), "rb");
        if (fpin) {
            imgin = gdImageCreateFromGif(fpin);
            fclose(fpin);
            gdImageCopy(imgout, imgin, i*DIGIT_WIDTH, 0, 0, 0, DIGIT_WIDTH, DIGIT_HEIGHT);
        }
    }
    fpout = outfile ? fopen(outfile, "wb") : stdout;
    gdImageGif(imgout, fpout);
    if (fpout == stdout)
        fflush(stdout);
    else
        fclose(fpout);

    gdImageDestroy(imgin);
    gdImageDestroy(imgout);
}

Este programa utiliza la biblioteca gd de Tom Boutell para manejar los archivos GIF y explisitamenet contatena archivos GIF que son pasados por la línea de comandos.  Así, si se escribe giftxt 123 mygif.gif, el programa buscara los archivos 1.gif, 2.gif y 3.gif y luego los concatenara correctamente para dar salidaa un archivo llamada mygif.gif que contendra la image 123 .  Su uso debe serel siguiente: giftxt <cadena> [archivo de salida].  Si se omite, por default sera la salida estandar.    Su modo de compilación en sistemas que tengan instalado el compilador C gcc es el siguiente: gcc -o giftxt giftxt.c -lgd -lm.

Si quieres saber más, puedes entrar al lugar de Tom Boutell para ver más infomación.


Turbo Pascal 6

Este fragmento de código consiste en una unidad de Turbo Pascal que permite medir con exactitud el tiempo que transcurre en un lapso determinado de un proceso.

Nombre del archivo: crono.pas

Unit CRONO;
Interface
Uses DOS;

Procedure ActivarReloj;
Procedure PararReloj;

Implementation

Var
    h, m, s, s100: Word;
    Arranque,
    Parada: Real;

Procedure AcivarReloj;
Begin
GetTime(h,m,s,s100);
Arranque := (h*3600) + (m*60) + s + (s100/100);
End;

Procedure PararReloj;
Begin
GetTime(h,m,s,s100);
Parada := (h*3600) + (m*60) + s + (s100/100);
WriteLn ('Tiempo transcurrido = ', (Parada - Arranque):0:2);
End;

End.

Nombre del archivo: ejemplo.pas

Program Ejemplo;
Uses CRONO;

Begin
ActivarReloj;
  { Código de tu programa }
PararReloj;

WriteLn;
Write('Pulse ENTER...');
ReadLn;
End.

El segundo fragmento de este programa es un ejemplo que muestra como llamar esta unidad.  Al llamar la rutina ActivarReloj, el programa graba en una variable el tiempo exacto del reloj del sistema.  Cuando ejecuta ParaReloj, se realiza una diferencia de horarios y se visualizan en pantalla.  Este tipo de código es útil para la depuración y optimización de una aplicación en su etapa de desarrollo.


Cómo Programar en C/C++

/* Funcion recursiva para calcular le factorial y la serie Fibonacci */
#include <stdio.h>

long factorial(long);
long fibonacci(long);

main(){
    int i;
    for (i = 1; i <= 10; i++)
        printf("%2d! = %1d\n", i, factorial(i));

    printf ("\n");

    for (i = 1; i <= 10; i++)
        printf("Fibonacci(%2d) = %1d\n", i, fibonacci(i));
}

long factorial (long number){
    if (number <= 1)
        return 1;
    else
        return (number * factorial(number -1));
}

long fibonacci(long n){
    if (n == 0 || n == 1)
        return n;
    else
        return fibonacci(n - 1) + fibonacci(n - 2);
}

STARMEDIA        CERRAR