|

Ú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.

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.
/* 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);
}
|