summaryrefslogtreecommitdiff
path: root/main.c
diff options
context:
space:
mode:
Diffstat (limited to 'main.c')
-rwxr-xr-xmain.c453
1 files changed, 453 insertions, 0 deletions
diff --git a/main.c b/main.c
new file mode 100755
index 0000000..366ac50
--- /dev/null
+++ b/main.c
@@ -0,0 +1,453 @@
+#include "main.h"
+
+
+char** allocRegex(const char* str_req,const char* str_regex, int nbExp)
+{
+ int err;
+ regex_t preg;
+
+ err = regcomp (&preg, str_regex, REG_EXTENDED);
+ if (err == 0)
+ {
+ int match;
+ size_t nmatch = 0;
+ regmatch_t *pmatch = NULL;
+ nmatch = preg.re_nsub;
+ pmatch = malloc (sizeof (*pmatch) * nmatch);
+ if (pmatch)
+ {
+ match = regexec (&preg, str_req, nmatch, pmatch, 0);
+ regfree (&preg);
+
+ if (match == 0)
+ {
+ char** arg = malloc( nbExp * sizeof *arg);
+ int i;
+ for(i = 0; i < nbExp ; ++i)
+ {
+ int start = pmatch[i].rm_so;
+ int end = pmatch[i].rm_eo;
+ size_t size = end - start;
+ arg[i] = malloc (sizeof *arg[i] * (size + 1));
+ if (arg[i])
+ {
+ strncpy (arg[i], &str_req[start], size);
+ arg[i][size] = '\0';
+ }
+ }
+ return arg;
+ }
+ else
+ goto regexErr;
+ }
+ else
+ goto regexErr2;
+ }
+
+ regexErr:
+ fprintf(stderr, "L'analyse de %s a provoquer une erreur\n", str_req);
+ exit (EXIT_FAILURE);
+ regexErr2:
+ fprintf (stderr, "L'analyse de %s a provoquer 2 erreurs\n", str_req);
+ exit (EXIT_FAILURE);
+}
+#define puts(b) FCGX_FPrintF(req->out,"%s\n", b)
+#define printf(...) FCGX_FPrintF(req->out, __VA_ARGS__)
+void start(char* titre, char* description, FCGX_Request *req) {
+ puts("Content-Type: text/html;\r\n\r");
+ printf("<!DOCTYPE html>\n"
+ "<html> "
+ "<head> "
+ "<meta charset=\"utf-8\" /><title>%s</title>"
+ "<meta name=\"viewport\" content=\"width=device-width, initial-scale=1\" />"
+ "<link rel=\"canonical\" href=\"http://ache.one/\"/>" //<link rel=\"next\" href=\"http://ache.one/index.cgi?page=2\"/>"
+ "<link rel=\"shortcut icon\" type=\"image/svg\" href=\"/res/ache.ico\" />"
+ "<link rel=\"stylesheet\" type=\"text/css\" title=\"Design\" href=\"design/design.css\" />"
+ "<style>"
+ "@import url(\"design/design.css\");"
+ "</style>"
+ "<meta name= \"description\" content=\"%s\" />"
+ "</head>"
+ "<body>\n"
+ , titre, description);
+}
+void end(FCGX_Request *req)
+{
+ puts(" <div id=\"foot\"></div>");
+ puts("</body>"
+ "</html>");
+}
+void sideBar(FCGX_Request *req) {
+ puts("<aside id=\"side-bar\">");
+ afficherSVG("./res/ache.svg", req);
+ puts("<h2> Ache </h2>\n"
+ "<div id=\"desc\">"
+ " Étudiant en Math-Info <br />"
+ " <span id=\"about\">GNU\\Linux, C, C++, Python, Math, ... <br /> </span>"
+ "</div>"
+ "<nav>"
+ " <ul>"
+ " <li class=\"about_bar\">");
+ afficherSVG("./res/tw.svg", req);
+ puts("</li>"
+ "<li class=\"about_bar\">");
+ afficherSVG("./res/gith.svg", req);
+ puts("</li>"
+ "<li class=\"about_bar\">");
+ afficherSVG("./res/rss.svg", req);
+ puts("</li>"
+ "</ul>"
+ " </nav>"
+ "<nav><ul>"
+ "<li class=\"sommaire_blien\"><a href=\"http://ache.one\">Accueil</a></li>"
+ "<li class=\"sommaire_blien\"><a href=\"http://projet.ache.one/\"><s>Projets</s></a></li>"
+ "<li class=\"sommaire_blien\"><a href=\"http://ache.one/contact/\">Contact</a></li>"
+ "</ul></nav>"
+"</aside>");
+}
+void erreur(const char* motif, FCGX_Request *req)
+{
+ start("Erreur", "Page d'erreur", req);
+ puts("<big><big>Error</big></big><br /><br />");
+ puts(motif);
+ end(req);
+ exit(0);
+}
+void afficherSVG(char* chemin, FCGX_Request* req) {
+ char* c = 0;
+ char ligne[201] = {0};
+ FILE* fichier = fopen(chemin, "r");
+ if(fichier)
+ {
+ while( c = fgets (ligne, 200, fichier) ) {
+ if( strstr(ligne, "<svg ") || strstr(ligne, "< svg"))
+ break;
+ }
+ if( c ) {
+ do
+ printf("%s", ligne);
+ while( fgets(ligne, 200, fichier) );
+ }
+ }
+}
+void voirAussi(FCGX_Request *req)
+{
+ fprintf(stdout, "Hello\n");
+ int nbArt = 0, i = 0;
+ FILE* fichier = fopen("article/_liste", "r");
+
+ if( !fichier ) {
+ perror("");
+ return;
+ }
+ char t[50] = {0};
+ char* tmp_h = NULL;
+
+ printf("%s", "<div id=\"autres_articles\"><h4>Voir aussi :</h4>");
+ while(fgets(t, 50, fichier))++nbArt;
+ rewind(fichier);
+
+ if( nbArt<5 )
+ {
+ while( fgets(t, 100, fichier))
+ {
+ char date[20] = {0}, titre[50] = {0}, ident[50] = {0};
+ for(tmp_h=t;*tmp_h;tmp_h++)
+ if( isspace(*tmp_h) )
+ *tmp_h = '\0';
+
+ getinfo(t, titre, date, ident);
+ printf("<div><a href=\"index.cgi?article=%d\">%s</a></div>", i++, titre);
+ }
+ fclose(fichier);
+ }
+ else
+ {
+ char tab[4] = {-1, -1, -1, -1};
+ while(i<4)
+ {
+ char date[20] = {0}, titre[50] = {0}, ident[50] = {0};
+ int has, z;
+ rewind(fichier);
+ do
+ has = rand() % nbArt;
+ while( memchr(tab, has, 4) );
+ z = has;
+ while( fgets(t, 100, fichier) && has-- );
+ for(tmp_h=t;*tmp_h;tmp_h++)
+ if( isspace(*tmp_h) )
+ *tmp_h = '\0';
+ getinfo(t, titre, date, ident);
+ printf("<div><a href=\"index.cgi?article=%d\">%s</a></div>", z, titre);
+ tab[i++] = z;
+ }
+ fclose(fichier);
+ }
+ printf("</div>");
+}
+void slideContenu(char* article, int num, FCGX_Request* req)
+{
+ char d[20], t[50] = "Vive la lettre H !", i[50];
+ int type = getinfo(article, t, d, i);
+ (void)num;
+ int year, month, day;
+ sscanf(d, "%d/%d/%d", &day, &month, &year);
+ printf( "<article id=\"contenu\" role=\"article\" class=\"post hentry clearfix\">");
+ switch(type)
+ {
+ case 0:
+ {
+ char tab[50] = {0};
+ strncpy(tab, i, strrchr(i, '.')-i);
+ strcat(tab, ".png");
+ printf("<object type=\"image/svg+xml\" data=\"%s\" style=\"float:left;width:100px;height:100px;\">"
+ "<img src=\"%s\" alt=\"Logo Article\"/>"
+ "<p>%s</p>"
+ "</object>",i,tab,i);
+ }
+ break;
+ case 1:
+ printf("<img id=\"fr\" src=\"%s\" alt=\"%s\" />", i, i);
+ break;
+ case 2:
+ printf("<iframe src=\"%s\" frameborder=\"0\" style=\"border:0;overflow:hidden;width:100px;height:100px;float:left;\"></iframe>", i);
+ }
+ printf(
+ "<header>"
+ "<h1 id=\"contenu_top2\">%s</h1>"
+ "<p>Post&eacute; le <time datetime=\"%d-%.2d-%d\">%s</time></p>"
+ "</header>"
+ , t, year, month, day, d);
+
+ puts("<section class=\"entry-content clearfix\">");
+ lireIntro(article, req);
+ puts("</section>");
+ puts("</article>");
+}
+void contenu(char* article, int num, FCGX_Request* req)
+{
+ char d[20], t[50] = "Vive la lettre H !", i[50];
+ int type = getinfo(article, t, d, i);
+ (void)num;
+ int year, month, day;
+ sscanf(d, "%d/%d/%d", &day, &month, &year);
+ printf(
+ "<article id=\"contenu\" role=\"article\" class=\"post hentry clearfix\">"
+ "<header>"
+ "<h1 id=\"contenu_top2\">%s</h1>"
+ "<p>Post&eacute; le <time datetime=\"%d-%.2d-%d\">%s</time></p>"
+ "</header>"
+ , t, year, month, day, d);
+ switch(type)
+ {
+ case 0:
+ {
+ char tab[50] = {0};
+ strncpy(tab, i, strrchr(i, '.')-i);
+ strcat(tab, ".png");
+ printf("<object type=\"image/svg+xml\" data=\"%s\" style=\"float:right;width:200px;height:200px;\">"
+ "<img src=\"%s\" alt=\"Logo Article\"/>"
+ "<p>%s</p>"
+ "</object>",i,tab,i);
+ }
+ break;
+ case 1:
+ printf("<img id=\"fr\" src=\"%s\" alt=\"%s\" />", i, i);
+ break;
+ case 2:
+ printf("<iframe src=\"%s\" frameborder=\"0\" style=\"border:0;overflow:hidden;width:250px;height:250px;float:right;\"></iframe>", i);
+ }
+ puts("<section class=\"entry-content clearfix\">");
+ lireArticle(article, req);
+ puts("</section>");
+ puts("</article>");
+}
+#define putchar(a) FCGX_PutChar( a, req->out)
+void lireArticle(char* chemin, FCGX_Request* req)
+{
+ int c = 0;
+ FILE* fichier = fopen(chemin, "r");
+ if(fichier)
+ {
+ while((c = fgetc (fichier)) != '\n');
+ while((c = fgetc (fichier)) != EOF)
+ {
+ if(c != 195)
+ if(c != '\n')
+ putchar(c);
+ else
+ printf("%s", "<br />");
+ else
+ {
+ c = fgetc (fichier);
+ switch(c)
+ {
+ CaSe(160, "&agrave;");// a
+ CaSe(162, "&agrave;");
+ CaSe(164, "&acirc;");
+ CaSe(128, "&Agrave;");
+ CaSe(130, "&Acirc;");
+ CaSe(132, "&Auml;");
+ CaSe(169, "&eacute;");//e
+ CaSe(168, "&egrave;");
+ CaSe(170, "&egrave;");
+ CaSe(171, "&euml;");
+ CaSe(137, "&Eacute;");
+ CaSe(136, "&Egrave;");
+ CaSe(138, "&Ecirc;");
+ CaSe(139, "&Euml;");// o
+ CaSe(180, "&otilde;");
+ CaSe(182, "&ouml;");
+ CaSe(148, "&Ocirc;");
+ CaSe(150, "&Ouml;");// u
+ CaSe(185, "&ugrave;");
+ CaSe(187, "&ucirc;");
+ CaSe(188, "&uuml;");
+ CaSe(153, "&Ugrave;");
+ CaSe(155, "&Ucirc;");
+ CaSe(156, "&Uuml;");
+ CaSe(174, "&icirc;");// i
+ CaSe(175, "&iuml;");
+ CaSe(142, "&Icirc");
+ CaSe(143, "&Iuml;");
+ CaSe(167, "&ccedil;");// c
+ CaSe(135, "&Ccedil;");
+ default:
+ printf("%d", c);
+ }
+ }
+ }
+ fclose(fichier);
+ }
+}
+void lireIntro(char* chemin, FCGX_Request* req)
+{
+ int c = 0;
+ FILE* fichier = fopen(chemin, "r");
+ if(fichier)
+ {
+ while((c = fgetc (fichier)) != '\n');
+ while((c = fgetc (fichier)) != EOF && c != '\n') {
+ if(c != 195)
+ if(c != '\n')
+ putchar(c);
+ else
+ printf("%s", "<br />");
+ else
+ {
+ c = fgetc (fichier);
+ switch(c)
+ {
+ CaSe(160, "&agrave;");// a
+ CaSe(162, "&agrave;");
+ CaSe(164, "&acirc;");
+ CaSe(128, "&Agrave;");
+ CaSe(130, "&Acirc;");
+ CaSe(132, "&Auml;");
+ CaSe(169, "&eacute;");//e
+ CaSe(168, "&egrave;");
+ CaSe(170, "&egrave;");
+ CaSe(171, "&euml;");
+ CaSe(137, "&Eacute;");
+ CaSe(136, "&Egrave;");
+ CaSe(138, "&Ecirc;");
+ CaSe(139, "&Euml;");// o
+ CaSe(180, "&otilde;");
+ CaSe(182, "&ouml;");
+ CaSe(148, "&Ocirc;");
+ CaSe(150, "&Ouml;");// u
+ CaSe(185, "&ugrave;");
+ CaSe(187, "&ucirc;");
+ CaSe(188, "&uuml;");
+ CaSe(153, "&Ugrave;");
+ CaSe(155, "&Ucirc;");
+ CaSe(156, "&Uuml;");
+ CaSe(174, "&icirc;");// i
+ CaSe(175, "&iuml;");
+ CaSe(142, "&Icirc");
+ CaSe(143, "&Iuml;");
+ CaSe(167, "&ccedil;");// c
+ CaSe(135, "&Ccedil;");
+ default:
+ printf("%d", c);
+ }
+ }
+ }
+ fclose(fichier);
+ }
+}
+#undef putchar
+
+
+#undef puts
+#undef printf
+/*
+void confirmation(void)
+{
+ puts("<div id=\"menu\">"
+ "<div id=\"boutons\">"
+ "<div id=\"bouton\">"
+ "<div id=\"close\"><div></div><div></div></div>"
+ "</div>"
+ "</div>"
+ "<div id=\"boutons\">"
+ "<div id=\"bouton\">"
+ "<div id=\"reduire\"><div></div></div>"
+ "</div>"
+ "</div>"
+ "<div id=\"menu_mes\"><br/>"
+ "Voulez confirmez l'envoye de ce ??? ? "
+ "</div>"
+ "</div>");
+}*/
+int getinfo(char* chemin, char* titre, char* date, char* image)
+{
+ char line[300] = "", type[5] = "";
+ char** infos;
+
+ FILE* fichier = fopen(chemin, "r");
+ if(fichier)
+ {
+///*
+ fgets(line, 300, fichier);
+ line[strlen(line)-1] = 0;
+ infos = allocRegex(line, "([[:print:]]+)\\|([[:print:]]+)\\|([[:print:]]+)\\|([[:print:]]+)()", 5);
+ fclose(fichier);
+
+ strcpy(titre, infos[1]) ;
+ strcpy(date , infos[2]) ;
+ strcpy(type , infos[3]) ;
+ strcpy(image, infos[4]) ;
+
+ free(infos[0]), free(infos[1]), free(infos[2]), free(infos[3]), free(infos[4]), free(infos);
+/*
+ fscanf(fichier, "%[^|\n]s", titre);
+ fscanf(fichier, "|%[^\n|]s", date);
+ fscanf(fichier, "|%[^\n|]s", type);
+ fscanf(fichier, "|%[^\n|]s", image);
+ fclose(fichier);
+ */
+ return ((!strcmp(type, "svg")) ? 0 : (!strcmp(type, "png")) ? 1 : (!strcmp(type, "js")) ? 2 : -1);
+ }
+ return -2;
+}
+void imput_(char* str)
+{
+ char* str2 = str;
+ do
+ {
+ if(*str == '+')
+ *str2++ = ' ';
+ else if(*str == '%')
+ {
+ int u = 0;
+ char t[3] = "";
+ sscanf(++str, "%2c", t);
+ sscanf(t, "%x", &u);
+ *str2++ = u;
+ ++str;
+ }
+ else
+ *str2++ = *str;
+ }while(*str++);
+}