HTTP-Daten von 'primzahlen_cgi.txt'

Schalten sie die Zeilen-Nummern mit MausKlick ab, wenn sie die Datei am eigenen PC speichern wollen.

1
/*
2
    Berechnung von Primzahlen mit C++
3
    WebApp-(CGI)-Version 2013-02-01
4
    made by peter.schindler
5
*/
6

7
#include <stdio.h>
8
#include <stdlib.h>
9
#include <string.h>
10
#include <time.h>
11
using namespace std;
12

13
// void *__gxx_personality_v0; // Required by some Linux-Versions
14
void calc_prime_numbers(void);
15
int get_cgi_argument(char*,int);
16
int namval_to_ival(char*,char*,int);
17
void print_html_head(void);
18
void print_html_form(void);
19
void print_html_result(void);
20
void print_html_trailer(void);
21

22
// Global variables
23
char *myname;
24
long int unsigned pmax; // user-defined limit
25
long int unsigned res_found; // number of pns found
26
char res_sec[50]; // calc-time in s
27
char res_us[50];  // calc-time / pn in us
28

29
int main() {
30
   char argument_name[10];
31
   print_html_head();
32
   print_html_form();
33
   strcpy(argument_name,"max");
34
   pmax=get_cgi_argument(argument_name,0);
35
   if(pmax>0) {
36
      print_html_result();
37
      calc_prime_numbers();
38
   }
39
   print_html_trailer();
40
   return 0;
41
}
42

43
//########## Decode CGI-GET-Argument(s) ##########
44

45
int get_cgi_argument(char *argnam, int default_value) {
46
   int ival;
47
   char *sval;
48
   ival=default_value;
49
   try{
50
      sval=getenv("QUERY_STRING");
51
      if(sval){ival=namval_to_ival(argnam,sval,default_value);}
52
   }
53
   catch(...) {}
54
   return ival;
55
}
56

57
int namval_to_ival(char *n,char *nv,int defv) {
58
// Decode integer value from QUERYSTRING
59
   unsigned int i,j,k,m,iv;
60
   char cn,cnv,v[15];
61
   i=0;    // character in namevalue nv
62
   j=0;    // character in name
63
   k=0;    // character in value
64
   m=0;    // 0->seek name, 1->name ok until now, 2->value
65
   iv=defv;
66
   cn=n[0]; // character of name n
67
   while(i<strlen(nv) && m<3) {
68
      cnv=nv[i];  // character of nv
69
      if((cnv<38)||(cnv==92)||(cnv>122)) {cnv=0;} // Filter
70
      if(cnv) {
71
         // m=0: Seek name
72
         if(!m) {
73
            if(cnv==cn) {m=1; cn=n[++j];}
74
            else{cn=n[0];}
75
         }
76
         // m=1: Name is ok until now
77
         else if(m==1) {
78
            if(cnv==cn) {cn=n[++j];}
79
            else if(cnv=='=') {m=2;}
80
            else{m=0; cn=n[0];}
81
         }
82
         // m=2: Isolate value
83
         else{
84
            if(cnv=='&') {v[k]=0; m=3;}
85
            else{v[k++]=cnv;}
86
         }
87
      }
88
      i++;    // next character of namval
89
   }
90
   v[k]=0;
91
   sscanf(v,"%i",&iv);
92
   return iv;
93
}
94

95
//########## Calculate prime numbers ##########
96

97
void calc_prime_numbers(void) {
98
   long int unsigned nbytes,i,j,pn;
99
   long int unsigned *pi;
100
   long int unsigned *na;
101
   double t,tic;
102
   clock_t c_start,c_stop;
103
   if(pmax<1){pmax=1;}
104
   nbytes=pmax*sizeof(long int unsigned);
105
   na=(long int unsigned*)malloc(nbytes);
106

107
   // Init Array
108
   c_start=clock();
109
   na[0]=0; na[1]=0;
110
   for(i=2;i<pmax;i++) {pi=na+i; *pi=i;}
111

112
   // Sieve
113
   printf("<div class=\"result\">\n");
114
   printf("\t1 ");
115
   i=2; pn=2;
116
   while(pn) {
117
      if(!(i & 0xF)) {printf("\n\t");}
118
      printf("%ld ",pn);
119
      // Elimination loop
120
      pi=na+pn; *pi=0; j=pn*pn;
121
      while(j<=pmax) {
122
         pi=na+j; *pi=0; j+=pn;
123
      }
124
      // next pn
125
      j=pn+1; pn=0;
126
      while(j<pmax) {
127
         pi=na+j;
128
         if(*pi) {pn=j; j=pmax;}
129
         j++;
130
      }
131
      i++;
132
   }
133
   i--;
134
   c_stop=clock();
135

136
   free(na);
137
   printf("\n</div>\n");
138
   res_found=i;
139

140
   // Time
141
   tic=(double)CLOCKS_PER_SEC;
142
   if(c_stop) {t=(double)(c_stop-c_start)/tic;}
143
   else{t=0;}
144
   if(t) {
145
      if(t>=0.001) {sprintf(res_sec,"%0.3f",t);}
146
      else if(t>=0.000001) {sprintf(res_sec,"%0.6f",t);}
147
      else{sprintf(res_sec,"%f",t);}
148
   }
149
   else{sprintf(res_sec,"<%f",1.0/tic);}
150
   if(t) {
151
      t=t*1000000.0/(double)res_found;
152
      sprintf(res_us,"%0.3f",t);
153
   }
154
   else{
155
      t=1000000.0/tic/(double)res_found;
156
      sprintf(res_us,"<%0.3f",t);
157
   }
158
   printf("<hr />\n\n");
159
}
160

161
//########## HTML ##########
162

163
void print_html_head(void) {
164
   printf("Content-type: text/html\r\n\r\n");
165
   printf("<!DOCTYPE HTML>\n");
166
   printf("<html>\n");
167
   printf("<!--\n");
168
   printf("\tBerechnung von Primzahlen\n");
169
   printf("\tVersion 2013-02-01\n");
170
   printf("\tmade by peter.schindler\n");
171
   printf("-->\n");
172
   printf("<head>\n");
173
   printf("<meta charset="UTF-8">\n");
174
   printf("<title>Primzahlen @ C++</title>\n\n");
175

176
   printf("<style type=\"text/css\" media=\"screen\">\n");
177
   printf("/* <![CDATA[ */\n");
178
   printf("body{font-size:11pt; font-family:'Courier New',Courier,mono;}\n");
179
   printf("h1,h2,h3{margin:0px;}\n");
180
   printf("h1{color:#C00; font-size:16pt;}\n");
181
   printf("h2{color:#00C; font-size:12pt;}\n");
182
   printf(".result{background-color:#FFC; padding:5px;}\n");
183
   printf(".madeby{color:#888; font-family:'DejaVu Sans',Verdana,Helvetica,sans-serif; font-size:8pt; margin-top:20px; margin-bottom:20px;}\n");
184
   printf(".madeby a{color:inherit; text-decoration:none;}\n");
185
   printf(".madeby a:hover{color:#F00;}\n");
186
   printf("/* ]]>*/\n");
187
   printf("</style>\n\n");
188

189
   printf("<script type=\"text/javascript\">\n");
190
   printf("// <![CDATA[\n\n");
191
   printf("function my_onload() {\n");
192
   printf("\tdocument.f1.max.focus();\n");
193
   printf("\tif(res_pmax) {\n");
194
   printf("\t\tchild_text(\"res_max\",res_pmax);\n");
195
   printf("\t\tchild_text(\"res_found\",res_found);\n");
196
   printf("\t\tchild_text(\"res_sec\",res_sec);\n");
197
   printf("\t\tchild_text(\"res_us\",res_us);\n");
198
   printf("\t}\n");
199
   printf("}\n\n");
200
   printf("function child_text(nid,txt) {\n");
201
   printf("\ttry{\n");
202
   printf("\t\tvar n=document.getElementById(nid);\n");
203
   printf("\t\tn.firstChild.nodeValue=txt.toString();\n");
204
   printf("\t}\n");
205
   printf("\tcatch(e) {}\n");
206
   printf("}\n\n");
207
   printf("// ]]>\n");
208
   printf("</script>\n");
209

210
   printf("</head>\n\n");
211
   printf("<body onload=\"my_onload()\">\n");
212
   printf("<h1>Primzahlen</h1>\n");
213
   printf("Berechnung mit der Programmiersprache C++<br />\n");
214
   printf("<hr />\n\n");
215
}
216

217
void print_html_form(void) {
218
   printf("<div>\n");
219
   printf("\tGeben sie eine Obergrenze f C3 BC r die\n");
220
   printf("\tzu berechnenden Primzahlen an:\n");
221
   printf("</div>\n");
222
   try{myname=getenv("SCRIPT_NAME");}
223
   catch(...) {}
224
   if(myname) {printf("<form name=\"f1\" method=\"get\" action=\"%s\">\n",myname);}
225
   else{printf("<form name=\"f1\" method=\"get\" action=../../beispiele/cpp/%22primzahlen.exe/%22>\n");}
226
   printf("\t  C2 A0  Obergrenze\n");
227
   printf("</form>\n");
228
   printf("<button onclick=\"document.f1.submit()\">Berechnen</button>\n");
229
   printf("<hr />\n\n");
230
}
231

232
void print_html_result(void) {
233
   char bull[50];
234
   strcpy(bull," E2 97 8F ");
235
   printf("<h2>Ergebnis: Primzahlen < %ld</h2>\n",pmax);
236
   printf("%s\n",bull);
237
   printf("Es wurden <span id=\"res_found\">?</span> Primzahlen mit Werten ");
238
   printf("<=<span id=\"res_max\">%ld</span> gefunden.<br />\n",pmax);
239
   printf("%s Rechenzeit: <span id=\"res_sec\">?</span> s<br />\n",bull);
240
   printf("%s Rechenzeit pro Primzahl:  C2 B5 s\n",bull);
241
}
242

243
void print_html_trailer(void) {
244
   printf("<div class=\"madeby\">\n");
245
   printf("\tmade by peter.schindler\n");
246
   printf("</div>\n\n");
247

248
   printf("<script type=\"text/javascript\">\n");
249
   printf("// <![CDATA[\n");
250
   printf("// Ergebnis-Daten C++ -> Javascript\n");
251
   printf("var res_pmax=%ld;\n",pmax);
252
   printf("var res_found=%ld;\n",res_found);
253
   printf("var res_sec=\"%s\";\n",res_sec);
254
   printf("var res_us=\"%s\";\n",res_us);
255
   printf("// ]]>\n");
256
   printf("</script>\n\n");
257

258
   printf("</body>\n");
259
   printf("</html>\n\n");
260
}
261

262
// --- eof primzahlen.cpp ---
263