SPACEHAWKS' WORLDNEWS
CGI Script 4

 

CGI Script 4

Mivel leginkább úgy tanulunk, ha látjuk is munkánk eredményét, ezért a már
három számon át folyó elmélet mellett most a gyakorlatba fogjuk átültetni
tudásunkat. Nem is akármit, egy szavazógépet fogunk létrehozni...

Szavazógépünk azt a célt fogja szolgálni, hogy számolja az egy kérdésre
adott igen/nem válaszok számát, és a szavazatok jelenlegi állását
megjelenítse számunkra. (Nem, nem optikai csalódás, az itt emlegetett
szavazógépet bárki megtekinthette már itt az újságbam, amikor a címoldalon
kotorászott)

Menjünk akkor végig azon, milyen feladatokat is kell majd végrehajtania
szavazógépünknek. Lesz egy kiinduló html-ünk, rajta egy kérdéssel, és egy
igen valamint egy nem gombbal. Ezzel nem lesz sok problémánk, egyszerûen
elhelyezünk a szövegünk alá két form mezôt, mindkettôben egy-egy button form
objectet, egyiken IGEN, a másikon pedig NEM felirattal. Mind a két form
action mezôjében természetesen a jövendô CGI scriptünk URL-je szerepel majd,
a CGI scriptünk majd az EV.Query_String-bôl (http_post method esetén az
stdinbôl) kihámozza, hogy most melyik form is hívta ôt: hiszen a submit
button értéke az egyik esetben NEM, a másik esetben pedig IGEN lesz.
(Maradunk, csakúgy mint az újságnál az angol nyelvnél, tehát természetesen
egy YES, illetve NOT üzenetet fogunk elküldeni. Ha valaki nem szeretné, hogy
a buttonon ez a két felirat díszelegjen az alkalmazzon a button helyett image
buttont. Azon nem az látszik, ami az értéke.)

Itt vagyunk már a cgi scriptünknél. A CGI-nknek elôször is rögzítenie kell
a szavazatot. Ezt a következôképpen fogjuk megtenni. Létrehozunk egy file-t,
amiben eltároljuk a szavazatokat, aminek tartalma mondjuk 48 igen és 23 nem
esetén a következô lesz:

48
23

Ami itt nem látszik, hogy a két értéket Amiga esetén egy enter, PC esetén
pedig egy $0D0A páros választja el. Ez nekünk, mint korszerû adatbázis
messzemenôen meg is felel... (A forrás, lévén egy PC-s Linux serveren lett
elhelyezve, ezért $0D0A-val számol)

Itt kell még gondolnunk arra is, hogy mi van akkor, ha valaki csalni
próbál, és többször akar szavazni? Hogyan lehetne ezt kiküszöbölni?

A megoldás ugyan csak részleges (tökéletes megoldás nem létezik), de nekünk
nagyszerûen meg fog felelni: eltároljuk az illetÔ IP címét. Ha a szavazat
rögzítése elôtt végignézzük ezeket az eltárolt IP címeket, hogy egyezik-e a
jelenlegivel, akkor jó eséllyel védhetjük ki a statikus IP címekrôl történô
csalást. A dinamikus IP címmel rendelkezô szavazót viszont anyja sem ismeri
meg, ellenük tehát nem tudunk, így nem is akarunk védekezni... (Egyébként van
módja, de igen költség és kapcsolatigényes lenne a dolog, meg némiképp a
személyiségi jogok problémakörét is felvetné).

Hogy pedig mindezzel ilyen nagyszerûen megvagyunk, meg is jeleníthetnénk a
dolgok állását. Ez már egyszerû lesz, mindössze egy válasz html-t kell
generálnunk az stdout porton, ahol kiírjuk, mennyi igen és mennyi nem
szavazat gyûlt össze a feltett kérdéssel kapcsolatban...

Mindezt akkor ültessük is át a gyakorlatba. Lássuk az alapvetôbb részeket,
mielôtt nyakunkba vennénk az egész forrást.

Mi a http_post method-ot választottuk az adatok elküldésére, lévén ez nem
látszik az url-ben. Mivel a gombunkat submit-nak hívják, ezért az érkezô adat
a kettô közül lesz valamelyik (az egyik gomb neve submit5, a másiké submit6):

submit5=yes
submit6=not

Ez azért jó, mert mind a kettô egyforma hosszú. Rögtön érkezéskor le is
ellenôrizhetjük, hogy az EV.Content_Length környezeti változó ilyen hosszú-e.
Ha nem, akkor nem is foglalkozunk a dolgokkal.

if (atoi(EV.Content_Length)!=11)
{
printf("ERROR");
printf("</BODY>\n");
printf("</HTML>\n");
return 1;
}

Mivel pedig egyszer már megírtam, én beleteszem minden forrásomba azt az elég
béna kis kódrészletet, ami a konvertált speciális karakterekkel érkezô
szöveget visszakonvertálja abba a formába, amit a felhasználó eredetileg
beírt. Van ugyanis egy-két nagyon illúzióromboló magyar site, ahol a cgi nem
képes lekezelni például a magyar ékezeteket, és a szöveget úgy kell beírni,
hogy é helyett mondjuk "e´", ô helyett "o""-t kell írni... Egyszóval
borzalom.


contentlength = atoi(EV.Content_Length);

for (i=0;i<contentlength;i++) //a posted-be beolvassuk az stdin-en
{ //érkezô adatokat
posted[i] = getchar();
}

//atkonvertaljuk

contentlength = atoi(EV.Content_Length);
k=0; //converted i-je, mivel menetkozben az i-t valtoztatni fogjuk

for (i=0;i<=contentlength;i++)
{
if (posted[i]==37) //%-jel, ez konvertált karaktert jelöl
{
j=0;
//a %-jel után következô elsô szám
if (posted[i+1]==48){j=j+(0*16);}
if (posted[i+1]==49){j=j+(1*16);}
if (posted[i+1]==50){j=j+(2*16);}
if (posted[i+1]==51){j=j+(3*16);}
if (posted[i+1]==52){j=j+(4*16);}
if (posted[i+1]==53){j=j+(5*16);}
if (posted[i+1]==54){j=j+(6*16);}
if (posted[i+1]==55){j=j+(7*16);}
if (posted[i+1]==56){j=j+(8*16);}
if (posted[i+1]==57){j=j+(9*16);}
if (posted[i+1]==65){j=j+(10*16);}
if (posted[i+1]==66){j=j+(11*16);}
if (posted[i+1]==67){j=j+(12*16);}
if (posted[i+1]==68){j=j+(13*16);}
if (posted[i+1]==69){j=j+(14*16);}
if (posted[i+1]==70){j=j+(15*16);}
//a %-jel után következô második szám
if (posted[i+2]==48){j=j+0;}
if (posted[i+2]==49){j=j+1;}
if (posted[i+2]==50){j=j+2;}
if (posted[i+2]==51){j=j+3;}
if (posted[i+2]==52){j=j+4;}
if (posted[i+2]==53){j=j+5;}
if (posted[i+2]==54){j=j+6;}
if (posted[i+2]==55){j=j+7;}
if (posted[i+2]==56){j=j+8;}
if (posted[i+2]==57){j=j+9;}
if (posted[i+2]==65){j=j+10;}
if (posted[i+2]==66){j=j+11;}
if (posted[i+2]==67){j=j+12;}
if (posted[i+2]==68){j=j+13;}
if (posted[i+2]==69){j=j+14;}
if (posted[i+2]==70){j=j+15;}

converted[k]=j;
i=i+2; //eloreallitjuk a mutatot, hogy a %xx-bol ne torodjon az xx-ekkel
}
else
{
if (posted[i] == 43)
{
converted[k] = 32;
}
else
{
converted[k]=posted[i];
}
}
k=k+1;
}


És itt már a converted nevû változónkban pontosan az eredetileg elküldött
adat van, hiába konvertálgatta a pimó kis browser meg server együttvéve :)
Fel is daraboljuk gyorsan:

convertedtokens=strtok(converted,"=&"); //a tartalma most submit lesz
convertedtokens=strtok(NULL,"=&"); //most pedig a submit értéke

Itt most a convertedtokens változóban vagy yes, vagy pedig not található.
Ezt követôen megnyitogatjuk azt a file-t (in nevû streamként), amiben az ip
címek találhatóak, és összehasonlítjuk ôket az aktuális ip-vel. Azt, hogy az
aktuális látogató járt-e már nálunk, a marvolt változónk értékébôl
allapíthatjuk majd meg az összehasonlítások végén.


length=ftell(in);
fseek(in,length,SEEK_SET);
marvolt=0;

betu=fgetc(in);
for (i=0;k!=2;i++) //k két értéket vehet majd fel
{ //1 lesz, ha enterhez értünk, tehát új ip jön
k=0; //és 2, ha elértük a file végét
for(j=0;k<1;j++)
{
betugyujto[j]=betu;
betu=fgetc(in);
if (feof(in)) {k=2;}
if (betu==10) {k=1;}
}
betugyujto[j]=NULL;
if (k!=2)
{
betu=fgetc(in);
betu=fgetc(in);
}
ptr=strcmp(EV.Remote_Addr,betugyujto);
if (ptr==0) { marvolt=1; }


}
fflush(in);
fclose(in);

Az elôbb ha nem is mondtam, de olvasásra, tehát rt flag-ekkel nyitottuk meg a
file-unkat. Most azonban hozzá kell írni a listához a jelenlegi ip címet is,
tehát most append, azaz at flagg-el fogjuk megnyitni, és kiírjuk az entert
(ami alapján késôbb majd azonosítjuk az ip-k végét), majd magát az aktuális
ip címet is. (Mindezt természetesen csak akkor, ha ez az ip cím még nem
szerepel a listában)

fseek (in,0L,SEEK_END);

fputc(10,in);
fputc(13,in);
fprintf(in,"%s",EV.Remote_Addr);

fflush(in);
fclose(in);

Ezt követôen ugyanígy megnyitjuk olvasásra a szavazatokat tartalmazó
file-unkat, beolvassuk a két értéket. Abban az esetben, ha az ip címünk most
szerepelt elôször, akkor megvizsgáljuk a felhasználó szavazatát, és a
megfelelô szavazatot növeljük egyel. Mi a két értéket egy a és egy b nevû
változóban tároljuk, az ehhez a részhez tartozó programrész pedig akkor a
következô:

if (marvolt!=1)
{//marvoltifiiibegins

ptr=strcmp(convertedtokens,yes);
if (ptr==0)
{
a=a+1;
}

ptr=strcmp(convertedtokens,not);
if (ptr==0)
{
b=b+1;
}
}//marvoltifiiiends

Végezetül ismét megnyitjuk a file-unkat, immár azonban írásra (wt flag), és
szépen, mintha mi sem történt volna a módosított értékeket visszaírjuk
szépen:

fprintf(out,"%d",a);
fputc(10,out);
fputc(13,out);
fprintf(out,"%d",b);
fflush(out);
fclose(out);

Ezután egy kis bûvészkedés jön, mert ezidáig nem mutattunk a felhasználónak
semmit. Számoljunk egy kis százalékot, mert az úgy ugye snassz, ha a
felhasználónak csak kiírjuk a két értéket. Ellenben ha százalékértékre épülô
grafikont csinálunk... Az mindjárt más. Jelen esetben, ha a 100% az 300
pixelnek felel meg, az eljárás a következô (hogy megôrizzük eredeti
értéküket, egy a2 és egy b2 nevû változóval fogunk játszani):

a2=a;
b2=b;
c=a2+b2;
if (a2==b2)
{
a2=150;
b2=150;
}
else
{
eredmeny = div ((b2*100),c);
b2 = eredmeny.quot;
b2=b2*3;

eredmeny = div ((a2*100),c);
a2 = eredmeny.quot;
a2=a2*3;

}

Az a2-ben és b2-ben található értéket immár csak meg kell adni a megfelelô
image magasságának, és gyönyörû szép, és fôként megfelelô arányú csíkokat
fogunk kapni. Kész is volnánk... Az egész nem is volt olyan bonyolult.
Végezetül tehát következzen az egész forrás... Lehet összehasonlítgatni a
mûködô eredetivel...


#include <stdio.h>
#include <stdio.h>
#include <stdlib.h>
#include <memory.h>
#include <fcntl.h>
#include <string.h>


int a;
int a2;
int b;
int b2;
int c;
int i;
int j;
int k;
int l;
int m;
div_t eredmeny;
long length;
int marvolt;
char *yes="yes";
char *not="not";
char betu;
char betu2;
char betugyujto[3000];
char querybekap[3000];
char filenev[80];
char filenevw[80];

int ptr;
int contentlength;
char posted[256];
char converted[256];
char convertedcache[256];
char *convertedtokens;


struct Environment {
char *Auth_Password;
char *Auth_Type;
char *Auth_User;
char *Content_Length;
char *Content_Type;
char *Gateway_Interface;
char *HTTP_Accept;
char *HTTP_Form;
char *HTTP_Referer;
char *HTTP_User_Agent;
char *Path_Info;
char *Path_Translated;
char *Query_String;
char *Remote_Addr;
char *Remote_Host;
char *Remote_Ident;
char *Remote_User;
char *Request_Method;
char *Server_Name;
char *Server_Port;
char *Server_Protocol;
char *Server_Software;
char *Script_Name;
char *Server_Admin;
};

int main(void)
{
FILE *in, *out, *main;

struct Environment EV;

EV.HTTP_Accept = getenv("HTTP_ACCEPT");
EV.Auth_Password = getenv("AUTH_PASSWORD");
EV.Auth_Type = getenv("AUTH_TYPE");
EV.Auth_User = getenv("AUTH_USER");
EV.Content_Length = getenv("CONTENT_LENGTH");
EV.Content_Type = getenv("CONTENT_TYPE");
EV.HTTP_Form = getenv("HTTP_FORM");
EV.Gateway_Interface = getenv("GATEWAY_INTERFACE");
EV.Path_Info = getenv("PATH_INFO");
EV.Path_Translated = getenv("PATH_TRANSLATED");
EV.Query_String = getenv("QUERY_STRING");
EV.HTTP_Referer = getenv("HTTP_REFERER");
EV.HTTP_User_Agent = getenv("HTTP_USER_AGENT");
EV.Remote_Addr = getenv("REMOTE_ADDR");
EV.Remote_Host = getenv("REMOTE_HOST");
EV.Remote_Ident = getenv("REMOTE_IDENT");
EV.Remote_User = getenv("REMOTE_USER");
EV.Request_Method = getenv("REQUEST_METHOD");
EV.Script_Name = getenv("SCRIPT_NAME");
EV.Server_Admin = getenv("SERVER_ADMIN");
EV.Server_Name = getenv("SERVER_NAME");
EV.Server_Port = getenv("SERVER_PORT");
EV.Server_Protocol = getenv("SERVER_PROTOCOL");
EV.Server_Software = getenv("SERVER_SOFTWARE");


strcpy(querybekap,EV.Query_String);

printf("Content-type: text/html\n");
printf("\n");
printf("<!DOCTYPE HTML PUBLIC \"-//W30//DTD W3 HTML 4.0//EN\">\n");
printf("<HTML>\n");
printf("<HEAD><TITLE>CGI developed by Labormedia Author Emeric SH</TITLE>");
printf("<META http-equiv='Content-Type' content='text/html; charset=windows-1250'>");
printf("</HEAD>\n");


printf("<BODY bgcolor='#FFFFFF' background='../images/headbackgr.gif'>\n");

if (atoi(EV.Content_Length)!=11)
{
printf("ERROR");

printf("</BODY>\n");
printf("</HTML>\n");
return 1;
}


////====================================================================
contentlength = atoi(EV.Content_Length);

for (i=0;i<contentlength;i++)
{
posted[i] = getchar(); // printf("%c",a);
// putchar(posted[i]);
}

//atkonvertaljuk ekezetesse

contentlength = atoi(EV.Content_Length);
k=0; //converted i-je, mivel menetkozben az i-t valtoztatni fogjuk

for (i=0;i<=contentlength;i++)
{
if (posted[i]==37)
{
j=0;
//first number check
if (posted[i+1]==48){j=j+(0*16);}
if (posted[i+1]==49){j=j+(1*16);}
if (posted[i+1]==50){j=j+(2*16);}
if (posted[i+1]==51){j=j+(3*16);}
if (posted[i+1]==52){j=j+(4*16);}
if (posted[i+1]==53){j=j+(5*16);}
if (posted[i+1]==54){j=j+(6*16);}
if (posted[i+1]==55){j=j+(7*16);}
if (posted[i+1]==56){j=j+(8*16);}
if (posted[i+1]==57){j=j+(9*16);}
if (posted[i+1]==65){j=j+(10*16);}
if (posted[i+1]==66){j=j+(11*16);}
if (posted[i+1]==67){j=j+(12*16);}
if (posted[i+1]==68){j=j+(13*16);}
if (posted[i+1]==69){j=j+(14*16);}
if (posted[i+1]==70){j=j+(15*16);}
//second number check
if (posted[i+2]==48){j=j+0;}
if (posted[i+2]==49){j=j+1;}
if (posted[i+2]==50){j=j+2;}
if (posted[i+2]==51){j=j+3;}
if (posted[i+2]==52){j=j+4;}
if (posted[i+2]==53){j=j+5;}
if (posted[i+2]==54){j=j+6;}
if (posted[i+2]==55){j=j+7;}
if (posted[i+2]==56){j=j+8;}
if (posted[i+2]==57){j=j+9;}
if (posted[i+2]==65){j=j+10;}
if (posted[i+2]==66){j=j+11;}
if (posted[i+2]==67){j=j+12;}
if (posted[i+2]==68){j=j+13;}
if (posted[i+2]==69){j=j+14;}
if (posted[i+2]==70){j=j+15;}

converted[k]=j;
// printf("%c",converted[k]);
i=i+2; //eloreallitjuk a mutatot, hogy a %xx-bol ne torodjon az xx-ekkel
}
else
{
if (posted[i] == 43)
{
converted[k] = 32;
// printf("%c",converted[k]);
}
else
{
converted[k]=posted[i];
// printf("%c",converted[k]); //NE FELEJTSD EL dummy[j]-t visszaallitani [i]-re!!
} //meg feltolteni az ujat
}
k=k+1;
}
//ekezetes kiiratas vege
//printf("<BR> convertedafterhexconversion %s",converted);


//-------------------------------------------------------------------
//--A CONVERTED[] CHAR TOMBBEN MEGTALALHATO AZ EKEZETESITETT INPUT---
//--HOGY HANY KARAKTERBOL ALL, AZ A contentlength VALTOZOBAN VAN-----

//-------------------------------------------------------------------


convertedtokens=strtok(converted,"=&"); //a tartalma most submit lesz
convertedtokens=strtok(NULL,"=&"); //most pedig a submit értéke


//==
//== FILE OPEN HEGYEK
//==


if ((in = fopen("../../../emeric/test/gauge.txt", "rt"))
== NULL)
{
printf("<BR>gauge.txt<BR>");
printf("Unable to open data file. Please try again, or check back later.");
printf("</BODY>\n");
printf("</HTML>\n");


return 1;
}

length=ftell(in);
fseek(in,length,SEEK_SET);
marvolt=0;

betu=fgetc(in);
for (i=0;k!=2;i++)
{
k=0;
for(j=0;k<1;j++)
{
betugyujto[j]=betu;
betu=fgetc(in);
if (feof(in)) {k=2;}
if (betu==10) {k=1;}
}
betugyujto[j]=NULL;
if (k!=2)
{
betu=fgetc(in);
betu=fgetc(in);
}
ptr=strcmp(EV.Remote_Addr,betugyujto);
if (ptr==0) { marvolt=1; }


}
fflush(in);
fclose(in);

if (marvolt!=1)
{//marvoltifbegins

if ((in = fopen("../../../emeric/test/gauge.txt", "at"))
== NULL)
{
printf("<BR>gauge.txt<BR>");
printf("Unable to open data file. Please try again, or check back later.");
printf("</BODY>\n");
printf("</HTML>\n");


return 1;
}


fseek (in,0L,SEEK_END);

fputc(10,in);
fputc(13,in);
fprintf(in,"%s",EV.Remote_Addr);

fflush(in);
fclose(in);
}//marvoltifends


//########BEOLVASSUK A SZAMOKAT##############

if ((out = fopen("../../../emeric/test/vote.txt", "rt"))
// if ((in = fopen(filenev, "rt"))

== NULL)
{
printf("<BR>vote.txt<BR>");
printf("Unable to open data file. Please try again, or check back later.");
printf("</BODY>\n");
printf("</HTML>\n");


return 1;
}

for (i=0;betu!=10;i++)
{
betu=fgetc(out);
//fputc(betu,stdout);
betugyujto[i]=betu;
}
betugyujto[i]=NULL;
//printf("%s, %d",betugyujto,strlen(betugyujto));
a=atoi(betugyujto);


for (i=0;!feof(out);i++)
{
betu=fgetc(out);
betugyujto[i]=betu;
}
betugyujto[i]=NULL;
b=atoi(betugyujto);

fflush(out);
fclose(out);


///#########NOVELES, HA LEHET##############

if (marvolt!=1)
{//marvoltifiiibegins

ptr=strcmp(convertedtokens,yes);
//printf("<BR>ahasonlitas %d",ptr);
if (ptr==0)
{
a=a+1;
}

ptr=strcmp(convertedtokens,not);
//printf(" bhasonlitas %d<BR>\n",ptr);
if (ptr==0)
{
b=b+1;
}
}//marvoltifiiiends

//#########SZAMOK VISSZAIRASA##################

if (marvolt!=1)
{//marvoltifIIbegins
if ((out = fopen("../../../emeric/test/vote.txt", "wt"))
// if ((in = fopen(filenev, "rt"))

== NULL)
{
printf("<BR>vote.txt<BR>");
printf("Unable to open data file. Please try again, or check back later.");
printf("</BODY>\n");
printf("</HTML>\n");


return 1;
}

fprintf(out,"%d",a);
fputc(10,out);
fputc(13,out);
fprintf(out,"%d",b);
fflush(out);
fclose(out);
}//marvoltifIIends


a2=a;
b2=b;
c=a2+b2;
if (a2==b2)
{
a2=150;
b2=150;
}
else
{
eredmeny = div ((b2*100),c);
b2 = eredmeny.quot;
b2=b2*3;

eredmeny = div ((a2*100),c);
a2 = eredmeny.quot;
a2=a2*3;

}


///#######################################
///### PRINTING MISC HTML DATA BEGINS ####
///#######################################

printf("<table border='0' width='600' cellspacing='0' cellpadding='0' vspace='0' hspace='0' align='center'>\n");
printf(" <tr>\n");
printf(" <td rowspan='2' colspan='3' valign='top'><img src='../../sh/worldnews/images/v2design/totheleft.jpg' width='176' height='326'></td>\n");
printf(" <td valign='top' bgcolor='ffffff'><img src='../../sh/worldnews/images/v2design/tothetop2.jpg' width='464' height='223'></td>\n");
printf(" </tr>\n");
printf(" <tr height='1'>\n");
printf(" <td valign='top' height='1' bgcolor='ffffff'>\n");
printf(" <div align='center'><font size='4' face='Arial, Helvetica, sans-serif'><b>VOTE\n");
printf(" FOR POWERUP OR WARPOS KERNEL<br>\n");
printf(" QUERY: IS POWERUP BETTER THAN WARPUP?</b></font></div>\n");
printf(" </td>\n");
printf(" </tr>\n");
printf(" <tr>\n");
printf(" <td valign='top' bgcolor='1414f0'><img src='../../sh/worldnews/images/v2design/3part1.jpg' width='140' height='13'></td>\n");
printf(" <td valign='top' bgcolor='#C2C2FB'><img src='../../sh/worldnews/images/v2design/3part2.jpg' width='5' height='13'></td>\n");
printf(" <td valign='top' bgcolor='ffffff'><img src='../../sh/worldnews/images/v2design/3part3.jpg' width='31' height='13'></td>\n");
printf(" <td valign='top' height='1' bgcolor='ffffff'>\n");
printf(" <div align='center'><BR><BR><BR><BR>\n");
printf(" <table border='0' width='400' bgcolor='#AAAAE4' cellspacing='0' cellpadding='0' vspace='0' hspace='0'>\n");
printf(" <tr>\n");
printf(" <td>&nbsp;</td>\n");
printf(" <td>&nbsp;</td>\n");
printf(" <td>&nbsp;</td>\n");
printf(" </tr>\n");
printf(" <tr>\n");
printf(" <td align='center' valign='bottom'><img src='../../sh/worldnews/images/redgauge.gif' width='81' height='");
printf("%d",a2);
printf("'></td>\n");
printf(" <td>&nbsp;</td>\n");
printf(" <td align='center' valign='bottom'><img src='../../sh/worldnews/images/greengauge.gif' width='81' height='");
printf("%d",b2);
printf("'></td>\n");
printf(" </tr>\n");
printf(" <tr>\n");
printf(" <td bgcolor='#8888E4'>\n");
printf(" <div align='center'><font size='2' face='Arial, Helvetica, sans-serif'><b>VOTES\n");
printf(" FOR POWERUP<br>\n");
printf(" 00");
printf("%d",a);

printf("</b></font></div>\n");
printf(" </td>\n");
printf(" <td>&nbsp;</td>\n");
printf(" <td bgcolor='#8888E4'>\n");
printf(" <div align='center'><font size='2' face='Arial, Helvetica, sans-serif'><b>VOTES\n");
printf(" FOR WARPUP<br>\n");
printf(" 00");
printf("%d",b);
printf("</b></font></div>\n");
printf(" </td>\n");
printf(" </tr>\n");
printf(" <tr>\n");
printf(" <td bgcolor='#888888' align='center'>\n");
printf(" <form method='post' action='http://abakusz.matav.hu/cgi-bin/emeric/gauge.cgi' name=''>\n");
printf(" <input type='submit' name='submit5' value='yes'>\n");
printf(" </form>\n");
printf(" </td>\n");
printf(" <td>&nbsp;</td>\n");
printf(" <td bgcolor='#888888' align='center'>\n");
printf(" <form method='post' action='http://abakusz.matav.hu/cgi-bin/emeric/gauge.cgi' name=''>\n");
printf(" <input type='submit' name='submit6' value='not'>\n");
printf(" </form>\n");
printf(" </td>\n");
printf(" </tr>\n");
printf(" </table>\n");
printf(" <p>&nbsp;</p>\n");
printf(" </div>\n");
printf(" </td>\n");
printf(" </tr>\n");
printf(" <tr>\n");
printf(" <td valign='top' bgcolor='#1414F0' colspan='4'>&nbsp;</td>\n");
printf(" </tr>\n");
printf("</table>\n");


///#######################################
///### PRINTING MISC HTML DATA ENDS ####
///#######################################

printf("</BODY>\n");
printf("</HTML>\n");


return 0;

}


Mivel a múltkor kaptam némi visszajelzést: ezek a források linux alatt és
gcc-vel kerültek fordításra. Mivel a c fordítók csak elviekben egyeznek meg,
ezért nem kizárt, hogy máshol ezt-azt módosítani kell rajtuk - bár igyekeztem
mindenhol a legprimitívebb megoldásokhoz folyamodni, hogy semmi gépspecifikus
ne legyen a forrásokban. Remélem ebben sincs túlzottan... Sok sikert mindenki
szavazógépéhez :)

Emeric SH