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> </td>\n");
printf(" <td> </td>\n");
printf(" <td> </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> </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> </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> </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> </p>\n");
printf(" </div>\n");
printf(" </td>\n");
printf(" </tr>\n");
printf(" <tr>\n");
printf(" <td valign='top' bgcolor='#1414F0' colspan='4'> </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