naja, mein gentoo hier funktioniert besser als mein slackware. cool sollte das bedeuten (eines meiner universal-wörter). und leet bin ich nicht. und jetz nutz ich mal meinen prozessor *g* (system updaten)
Sie sind nicht angemeldet. Bitte melden Sie sich an oder registrieren Sie sich.
devshare.de » Beiträge von braveheart
naja, mein gentoo hier funktioniert besser als mein slackware. cool sollte das bedeuten (eines meiner universal-wörter). und leet bin ich nicht. und jetz nutz ich mal meinen prozessor *g* (system updaten)
@matho:
Nun hat mir Manphil gesagt, dass er das nicht schön findet, weil man nicht beim ahover die Adresse iim Status sehen kann.
ok, ich hab mich verlesen
nichtsdestotrotz find ich, animation gehört auf keine webseite.
irgendwie war dein posting nicht viel konstruktiver als meins *g*
bzw. die cdrtools 2.0 können auch ohne scsiemu
mein favorit ist - ich habs nämlich - gentoo (slackware is nich so cool)
<einwurf>
... und sich fragen, ob der ganze bloat nötig is ...
</einwurf>
@sometimes2: Ich meinte, dass das scheiß viel kostet (sorry).
Wieso machst du nicht 3 select boxen, von denen du immer eine ausblendest? *dumm-frag*
lass doch die kopierschutz scheiße. das lohnt sich wirklich nicht. geht ja nicht gerade um 100.000 Euro.
@Basti: Ich muss doch wohl nicht immer konstruktiv sein?
@Tink: Jo, weiß ich. Bin ja nich blind. Wollte nur klarmachen, dass Templates nicht nur das sind, was ihr unter ihnen versteht. Und dann wollte ich natürlich auch noch verwirren <img src="/forum/images/graemlins/laugh.gif" alt="" />.
Na, das kann ja nich so stehen bleiben... War PHP nicht eigentlich selbst eine Sprache für Templates? Templates... darunter verstehe ich sowas:
template<class T, class Y = type_traits<T> > Y::iterator func(Y::iterator start, Y::iterator end, Y::arg v);
edit: ok, ok, das geht zwar nicht soo gut, aber das:
template<class T, class Y = type_traits<T> > struct F { static Y::iterator func(Y::iterator start, Y::iterator end, Y::arg v); }; Ich nehme mal an, das ist nicht auf Anhieb verständlich. Deshalb erklär ich es mal:
Es gibt eine Klasse CgiIn und eine Funktion apply_template. Zunächts das einfachere, apply_template: Es gibt den übergebenen String mit ersetzten Templates an einen Stream. Die Templates (keine berühmt-berüchtigten von mir so geliebten C++ Templates) funktionieren so: Normal werden die Buchstaben einfach durchgegeben. Wird jedoch ein $number[$] angetroffen, so wird durch den entsprechenden Text ersetzt.
Interessanter ist da schon die Klasse CgiIn. Ihr Konstruktor ist in zwei Phasen aufgeteilt: Lesen und Parsen. In der Lese-Phase werden die vom CGI-Layer übergebenen Daten in die Variable input gespeichert. In der zweiten Phase werden dann die name=value Paare mit ihrer Nummer gespeichert. (Um die Zugriffszeiten zu verkürzen, habe ich festgelegt, dass auf die Namen mit Nummern zugegriffen wird).
Na das war jetzt ziemlich viel auf wenig Text. Kommt davon, wenn man schreibfaul ist.
Dann gibts da noch:
template.h
#ifndef TEMPLATE_H
#define TEMPLATE_H
#include <ostream>
#include <cstdlib>
void apply_template(std::ostream &, const char *, const char **, std::size_t);
#endif
template.cpp
#include <ostream>
#include <cstdlib>
#include <stdexcept>
#include <cctype>
using namespace std;
void apply_template(ostream &stream, const char *tmpl, const char **replacements, size_t n) {
while (*tmpl) {
if (*tmpl == '$' && *++tmpl != '$') {
int v = 0;
while (isdigit(*tmpl))
v = *tmpl++ - '0' + v * 10;
if (*tmpl == '$')
++tmpl;
if (v < n)
stream << replacements[v];
else
throw out_of_range("Too high number in template()");
} else
stream << *tmpl++;
}
}
c++bb.cpp
#include <iostream>
#include <stdexcept>
#include "cgiin.h"
#include "template.h"
using namespace std;
int main() {
cout << "Content-type: text/html" << endl << endl;
const char *n[1] = { "a" }, *k[1];
CgiIn cgi(n, 1);
*k = cgi.get(0);
apply_template(cout, "<a href="c++bb?a=$0X">$0$1</a>", k, 1);
}
Makefile
CXX = g++
CXXFLAGS = -g -pipe
all: c++bb
clean:
rm *.o c++bb
redo: clean all
c++bb: c++bb.o cgiin.o template.o
$(CXX) $(CXXFLAGS) -o c++bb c++bb.o cgiin.o template.o
c++bb.o: c++bb.cpp
$(CXX) $(CXXFLAGS) -o c++bb.o -c c++bb.cpp
cgiin.o: cgiin.cpp
$(CXX) $(CXXFLAGS) -o cgiin.o -c cgiin.cpp
template.o: template.cpp
$(CXX) $(CXXFLAGS) -o template.o -c template.cpp
c++bb.cpp: cgiin.h template.h
cgiin.cpp: cgiin.h
template.cpp:
Weil das Ganze aber aus der Datenbank kommt, kann ich keine Grafiken einsetzen, sonder muss auf Text zurückgreifen.
Den Satz kann ich nicht nachvollziehen.
Als alter C++ Fan:
cgiin.h:
#ifndef CGIIN_H
#include <cstdlib>
class CgiIn {
const char **names;
const char **values;
int number;
char *input;
static const char * const TRUE, * const EMPTY;
public:
/*
CgiIn::CgiIn(const char **, size_t)
This is the constructor for our CgiIn object. It takes two parameters:
- a list of strings
- the size of the list
This list contains the recognized names.
*/
CgiIn(const char **s, std::size_t n);
~CgiIn() {
delete [] input;
delete [] values;
}
const char *get(int i) const {
return values[i] ? values[i] : EMPTY;
}
const char *operator[](int i) const { return values[i]; }
private:
void readInput();
void parseInput();
CgiIn(const CgiIn &) {}
};
#endif
cgiin.cpp:
#include <stdexcept>
#include <iostream>
#include <cstdlib>
#include <cstring>
#include <cstdio>
#include <cctype>
#include "cgiin.h"
using namespace std;
const char * const CgiIn::TRUE = "TRUE";
const char * const CgiIn::EMPTY = "";
namespace {
inline int hexval(char c) {
c = toupper(c);
if (c >= '0' && c <= '9')
return c - '0';
else
return c - 'A' + 10;
}
void unescape(char *in) {
char *buf = in;
while (*in)
switch (*in) {
case '%':
*buf++ = hexval(in[1]) * 16 + hexval(in[2]);
in += 3;
break;
case '+':
*buf++ = ' ';
++in;
break;
default:
*buf++ = *in++;
}
*buf = 0;
}
}
CgiIn::CgiIn(const char **s, size_t n)
: names(s), values(new const char *[n]), number(n) {
for (int i = 0; i < number; ++i)
values[i] = 0;
readInput();
parseInput();
}
/*
[private] CgiIn::readInput
This reads in the CGI data.
*/
void CgiIn::readInput() {
const char *meth_s = getenv("REQUEST_METHOD");
if (meth_s == 0)
throw runtime_error("Invocation in non-CGI context");
enum { GET, POST } method =
strcmp(meth_s, "GET") == 0 ? GET : POST;
if (method == GET) {
const char *query = getenv("QUERY_STRING");
input = new char[strlen(query)];
strcpy(input, query);
} else if (method == POST) {
int len = atoi(getenv("CONTENT_LENGTH"));
input = new char[len+1];
fread(input, 1, len, stdin);
input[len] = 0;
}
}
/*
[private] CgiIn::parseInput()
This function parses the member input of the form:
name=value&name2=value2&name3
The first token is a name. If there is a '=' appended, the next token is considered
a value otherwise a name. If there is a '&' then the next token is considered a name
etcetera.
*/
void CgiIn::parseInput() {
enum mode_t { NAME, VALUE } mode = NAME;
char *p = input;
int val;
while (*p) {
char *begin = p;
// Read in one token
while (*p != '&' && *p != '=' && *p)
++p;
enum mode_t next_mode =
(*p == '&' || *p == 0) ? NAME : VALUE;
*p++ = 0;
unescape(begin);
if (mode == NAME) { // a name
// Find the index of the string.
val = -1;
for (int i = 0; i < number; i++)
if (strncmp(names[i], begin, p - begin) == 0) {
val = i;
break;
}
// If the next mode is NAME, then remember that the name
// was found.
if (next_mode == NAME && val != -1)
values[val] = TRUE;
} else if (val != -1) // a value
values[val] = begin;
mode = next_mode;
}
}
das fürs erste
kann alles an meinem alten Browser liegen - NS 4.75
<img src="/forum/images/graemlins/shocked.gif" alt="" /> Rechner zu lahm für NS 7?
@whitehouse: na das brauch ich ja da nicht *g* ... machs konstruktiv und erweitere es für einen Dateiupload ;o)
Wenn du mir multipart/form-data erklärst... <img src="/forum/images/graemlins/wink.gif" alt="" />
Ausserdem mach ich das (kann zwar auch etwas Perl - für nen C++'ler ziemlich gut <img src="/forum/images/graemlins/wink.gif" alt="" />) lieber in C++.
PS: Kannst ja sehen, wie sowas in C++ aussieht...
Sollte das hier nicht nach CGI? *g*
@Hannes: <destruktiv> Du hast multipart/form-data vergessen... </>
Schon viel besser (h40b80)...
[color="red"]H[/color][color="green"]a[/color][color="blue"]l[/color][color="orange"]l[/color][color="yellow"]o[/color]! <img src="/forum/images/graemlins/grin.gif" alt="" />
Oder wie das genau heisst. Programmier grad ne kleine CGI-Library in C++ und die sollte das wohl auch können. Nur: Wie funktioniert "multipart/formdata"? <img src="/forum/images/graemlins/confused.gif" alt="" />
Neues Board neues Glück *g*. Nur das Eingabefenster is n bissl klein *g*. Und die Smilies...
@gi: Dein erster Beitrag war ja mal wirklich zynisch. Das gefällt mir *g*.
OK *fg*: Beim Starten kommt ne Fehlermeldung <img border="0" title="" alt="[Ha!]" src="images/icons/tongue.gif" />
dito die 2.
aber brauchst ja nich gleich schreien <img border="0" title="" alt="[Winken]" src="images/icons/wink.gif" />
@wintelknecht: Bin auf dreckiges C++ umgestiegen. <img border="0" title="" alt="[Breites Grinsen]" src="images/icons/grin.gif" />
Schau mal nach Newtons Annäherungsverfahren.
devshare.de » Beiträge von braveheart
Powered by PunBB, unterstützt von Informer Technologies, Inc.
Currently installed 7 official extensions. Copyright © 2003–2009 PunBB.