config parser
This commit is contained in:
parent
8e401acc8c
commit
ee046a07e6
7 changed files with 163 additions and 30 deletions
9
Makefile
9
Makefile
|
@ -2,7 +2,12 @@ CC?=cc
|
||||||
CFLAGS?=-pedantic -Wall -Wextra -s -Os
|
CFLAGS?=-pedantic -Wall -Wextra -s -Os
|
||||||
|
|
||||||
all:
|
all:
|
||||||
$(CC) $(CFLAGS) img.c -o 8img
|
$(CC) -c -I src/ -o obj/db.o src/db.c
|
||||||
|
$(CC) -c -I src/ -o obj/config.o src/config.c
|
||||||
|
$(CC) -c -I src/ -o obj/builder.o src/builder.c
|
||||||
|
$(CC) -c -I src/ -o obj/funcs.o src/funcs.c
|
||||||
|
|
||||||
|
$(CC) $(CFLAGS) -I src -o 8img obj/db.o obj/config.o obj/builder.o obj/funcs.o src/main.c
|
||||||
|
|
||||||
clean:
|
clean:
|
||||||
rm 8img
|
rm obj/*
|
||||||
|
|
20
config
20
config
|
@ -2,19 +2,17 @@
|
||||||
ROOT www
|
ROOT www
|
||||||
|
|
||||||
# Html generator
|
# Html generator
|
||||||
CSS style.css
|
CSS style.css
|
||||||
LOGO logo.png
|
LOGO logo.png
|
||||||
|
DESC 8img
|
||||||
DESC 8img
|
TITLE / img
|
||||||
TITLE / img
|
POSTS_AT_PAGE 5
|
||||||
POST_PER_PAGE 5
|
|
||||||
|
|
||||||
# RSS generator
|
# RSS generator
|
||||||
LINK https://nlight.tilde.team/img/
|
LINK https://nlight.tilde.team/img/
|
||||||
XML_FILE index.xml
|
XML_FILE index.xml
|
||||||
|
LANGUAGE en-US
|
||||||
LANGUAGE en-US
|
MAX_POSTS 20
|
||||||
MAX_POST_COUNT 20
|
|
||||||
|
|
||||||
# Date
|
# Date
|
||||||
DATE_FORMAT %a, %d %h %Y %H:%M:%S %z
|
DATE_FORMAT %a, %d %h %Y %H:%M:%S %z
|
||||||
|
|
0
obj/.gitignore
vendored
Normal file
0
obj/.gitignore
vendored
Normal file
|
@ -25,7 +25,7 @@ char *GetDate(const char *fmt, time_t time) {
|
||||||
}
|
}
|
||||||
|
|
||||||
struct DB_STR *build_html_page(const struct CONFIG cfg, FILE *fp, const char *file, const struct UNIQ_TAGS ut, struct DB_STR *db, const size_t page, const size_t pages) {
|
struct DB_STR *build_html_page(const struct CONFIG cfg, FILE *fp, const char *file, const struct UNIQ_TAGS ut, struct DB_STR *db, const size_t page, const size_t pages) {
|
||||||
fprintf(fp, "<html>\n<head>\n<link rel='stylesheet' href='%s'>\n<title>%s</title>\n<meta charset='UTF-8'>\n</head>\n<body>\n<center><a href='index.html'><img id='logo' src='%s'></a>\n<h1 id='desc'>%s | <a href='%s'>RSS</a><br>%s/p%zu</h1></center>\n", CSS, TITLE, LOGO, DESC, XML_FILE, file, page);
|
fprintf(fp, "<html>\n<head>\n<link rel='stylesheet' href='%s'>\n<title>%s</title>\n<meta charset='UTF-8'>\n</head>\n<body>\n<center><a href='index.html'><img id='logo' src='%s'></a>\n<h1 id='desc'>%s | <a href='%s'>RSS</a><br>%s/p%zu</h1></center>\n", cfg.css, cfg.title, cfg.logo, cfg.desc, cfg.xml_file, file, page);
|
||||||
|
|
||||||
/* Tags */
|
/* Tags */
|
||||||
fputs("<center><div class='alltags'>\n<a href='index.html'>all</a>", fp);
|
fputs("<center><div class='alltags'>\n<a href='index.html'>all</a>", fp);
|
||||||
|
@ -150,7 +150,7 @@ void build_xml(const struct CONFIG cfg, struct DB_STR *db) {
|
||||||
return;
|
return;
|
||||||
|
|
||||||
/* Header */
|
/* Header */
|
||||||
fprintf(fp, "<?xml version='1.0' encoding='UTF-8' ?>\n<rss version='2.0' xmlns:atom='http://www.w3.org/2005/Atom'>\n<channel>\n\t<atom:link href='%s' rel='self' type='application/rss+xml' />\n\t<title>%s</title>\n\t<link>%s</link>\n\t<description>%s</description>\n\t<language>%s</language>\n", LINK, TITLE, LINK, DESC, LANGUAGE);
|
fprintf(fp, "<?xml version='1.0' encoding='UTF-8' ?>\n<rss version='2.0' xmlns:atom='http://www.w3.org/2005/Atom'>\n<channel>\n\t<atom:link href='%s' rel='self' type='application/rss+xml' />\n\t<title>%s</title>\n\t<link>%s</link>\n\t<description>%s</description>\n\t<language>%s</language>\n", cfg.link, cfg.desc, cfg.link, cfg.desc, cfg.language);
|
||||||
|
|
||||||
/* Content */
|
/* Content */
|
||||||
size_t count = 0;
|
size_t count = 0;
|
||||||
|
@ -161,15 +161,15 @@ void build_xml(const struct CONFIG cfg, struct DB_STR *db) {
|
||||||
/* Post */
|
/* Post */
|
||||||
fprintf(fp, "\n<item>\n\t<title>%s</title>\n\t<link>%s%s%s</link>\n\t<guid>%s%s%s</guid>\n\t<pubDate>\n\t\t%s\t</pubDate>\n\t<description><![CDATA[\n\t\t<p><img src='%s%s%s' alt='plup'></p>\n\t\t<p>",
|
fprintf(fp, "\n<item>\n\t<title>%s</title>\n\t<link>%s%s%s</link>\n\t<guid>%s%s%s</guid>\n\t<pubDate>\n\t\t%s\t</pubDate>\n\t<description><![CDATA[\n\t\t<p><img src='%s%s%s' alt='plup'></p>\n\t\t<p>",
|
||||||
bckp->filename,
|
bckp->filename,
|
||||||
LINK, CHECK_URL(LINK), bckp->filename,
|
cfg.link, CHECK_URL(cfg.link), bckp->filename,
|
||||||
LINK, CHECK_URL(LINK), bckp->filename,
|
cfg.link, CHECK_URL(cfg.link), bckp->filename,
|
||||||
GetDate(cfg.date_fmt, bckp->birthtime),
|
GetDate(cfg.date_fmt, bckp->birthtime),
|
||||||
LINK, CHECK_URL(LINK), bckp->filename);
|
cfg.link, CHECK_URL(cfg.link), bckp->filename);
|
||||||
|
|
||||||
/* Tags */
|
/* Tags */
|
||||||
for (size_t i = 0; i < bckp->size; i++)
|
for (size_t i = 0; i < bckp->size; i++)
|
||||||
fprintf(fp, "<a href='%s%s%s.html'> %s</a> ",
|
fprintf(fp, "<a href='%s%s%s.html'> %s</a> ",
|
||||||
LINK, CHECK_URL(LINK), bckp->tags[i],
|
cfg.link, CHECK_URL(cfg.link), bckp->tags[i],
|
||||||
bckp->tags[i]);
|
bckp->tags[i]);
|
||||||
|
|
||||||
fputs("</p>\n\t]]></description>\n</item>", fp);
|
fputs("</p>\n\t]]></description>\n</item>", fp);
|
||||||
|
|
119
src/config.c
119
src/config.c
|
@ -1,7 +1,122 @@
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <ctype.h>
|
||||||
|
#include <errno.h>
|
||||||
#include "funcs.h"
|
#include "funcs.h"
|
||||||
#include "config.h"
|
#include "config.h"
|
||||||
|
|
||||||
int parse_config(struct CONFIG *cfg, const char *cfg_path) {
|
void free_cfg(struct CONFIG *cfg) {
|
||||||
cfg->root = "www";
|
char **var1[] = {&cfg->root, &cfg->css, &cfg->logo, &cfg->desc, &cfg->title, &cfg->link, &cfg->xml_file, &cfg->language, &cfg->date_fmt};
|
||||||
|
char var2[] = {cfg->root_alloc, cfg->css_alloc, cfg->logo_alloc, cfg->desc_alloc, cfg->title_alloc, cfg->link_alloc, cfg->xml_file_alloc, cfg->language_alloc, cfg->date_fmt_alloc};
|
||||||
|
|
||||||
|
for (size_t i = 0; i < sizeof(var2); i++)
|
||||||
|
if (var2[i] && *(var1[i]))
|
||||||
|
free(*(var1[i]));
|
||||||
|
}
|
||||||
|
|
||||||
|
const char *skip_space(const char *str) {
|
||||||
|
const char *ptr = str;
|
||||||
|
while (isspace(*ptr))
|
||||||
|
ptr++;
|
||||||
|
|
||||||
|
return ptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
int add_str(const char *prog_name, char **dst, char *flag, const char *src) {
|
||||||
|
if (!(*src))
|
||||||
|
return 1;
|
||||||
|
|
||||||
|
*dst = strdup(skip_space(src));
|
||||||
|
if (*dst == NULL) {
|
||||||
|
fprintf(stderr, "%s: strdup: %s\n", prog_name, strerror(errno));
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
*flag = 1;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int add_int(const char *prog_name, size_t line, size_t *dst, const char *src) {
|
||||||
|
char *ptr = "";
|
||||||
|
*dst = strtoul(skip_space(src), &ptr, 10);
|
||||||
|
|
||||||
|
if (*ptr) {
|
||||||
|
fprintf(stderr, "%s: incorrect number at line %zu: %s\n", prog_name, line, ptr);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int parse_config(struct CONFIG *cfg, const char *cfg_path) {
|
||||||
|
FILE *fp = file_open(cfg->prog_name, cfg_path, "r");
|
||||||
|
if (fp == NULL)
|
||||||
|
return 1;
|
||||||
|
|
||||||
|
char *str = NULL;
|
||||||
|
ssize_t bytes = 0;
|
||||||
|
size_t n = 0;
|
||||||
|
|
||||||
|
size_t line = 0;
|
||||||
|
int ret = 0;
|
||||||
|
|
||||||
|
while ((bytes = getline(&str, &n, fp)) > 0 && ret == 0) {
|
||||||
|
line++;
|
||||||
|
if (str[0] == '\0' || str[0] == '\n' || str[0] == '#')
|
||||||
|
continue;
|
||||||
|
|
||||||
|
char *ptr = strrchr(str, '\n');
|
||||||
|
if (ptr != NULL)
|
||||||
|
*ptr = '\0';
|
||||||
|
|
||||||
|
if ((ptr = strstr(str, "ROOT")))
|
||||||
|
ret = add_str(cfg->prog_name, &cfg->root, &cfg->root_alloc, ptr + sizeof("ROOT"));
|
||||||
|
|
||||||
|
else if ((ptr = strstr(str, "CSS")))
|
||||||
|
ret = add_str(cfg->prog_name, &cfg->css, &cfg->css_alloc, ptr + sizeof("CSS"));
|
||||||
|
|
||||||
|
else if ((ptr = strstr(str, "LOGO")))
|
||||||
|
ret = add_str(cfg->prog_name, &cfg->logo, &cfg->logo_alloc, ptr + sizeof("LOGO"));
|
||||||
|
|
||||||
|
else if ((ptr = strstr(str, "DESC")))
|
||||||
|
ret = add_str(cfg->prog_name, &cfg->desc, &cfg->desc_alloc, ptr + sizeof("DESC"));
|
||||||
|
|
||||||
|
else if ((ptr = strstr(str, "TITLE")))
|
||||||
|
ret = add_str(cfg->prog_name, &cfg->title, &cfg->title_alloc, ptr + sizeof("TITLE"));
|
||||||
|
|
||||||
|
else if ((ptr = strstr(str, "LINK")))
|
||||||
|
ret = add_str(cfg->prog_name, &cfg->link, &cfg->link_alloc, ptr + sizeof("LINK"));
|
||||||
|
|
||||||
|
else if ((ptr = strstr(str, "XML_FILE")))
|
||||||
|
ret = add_str(cfg->prog_name, &cfg->xml_file, &cfg->xml_file_alloc, ptr + sizeof("XML_FILE"));
|
||||||
|
|
||||||
|
else if ((ptr = strstr(str, "LANGUAGE")))
|
||||||
|
ret = add_str(cfg->prog_name, &cfg->language, &cfg->language_alloc, ptr + sizeof("LANGUAGE"));
|
||||||
|
|
||||||
|
else if ((ptr = strstr(str, "DATE_FORMAT")))
|
||||||
|
ret = add_str(cfg->prog_name, &cfg->date_fmt, &cfg->date_fmt_alloc, ptr + sizeof("DATE_FORMAT"));
|
||||||
|
|
||||||
|
else if ((ptr = strstr(str, "POSTS_AT_PAGE")))
|
||||||
|
ret = add_int(cfg->prog_name, line, &cfg->posts_at_page, ptr + sizeof("POSTS_AT_PAGE"));
|
||||||
|
|
||||||
|
else if ((ptr = strstr(str, "MAX_POSTS")))
|
||||||
|
ret = add_int(cfg->prog_name, line, &cfg->max_posts, ptr + sizeof("MAX_POSTS"));
|
||||||
|
|
||||||
|
else {
|
||||||
|
fprintf(stderr, "%s: syntax error on %zu: %s\n", cfg->prog_name, line, str);
|
||||||
|
ret = 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fclose(fp);
|
||||||
|
if (str)
|
||||||
|
free(str);
|
||||||
|
|
||||||
|
if (ret) {
|
||||||
|
fprintf(stderr, "%s: parser error\n", cfg->prog_name);
|
||||||
|
free_cfg(cfg);
|
||||||
|
}
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
24
src/config.h
24
src/config.h
|
@ -56,25 +56,41 @@ struct CONFIG {
|
||||||
char *prog_name;
|
char *prog_name;
|
||||||
|
|
||||||
char *root;
|
char *root;
|
||||||
|
char root_alloc;
|
||||||
|
|
||||||
/* HTML */
|
/* HTML */
|
||||||
char *css;
|
char *css;
|
||||||
char *logo;
|
char css_alloc;
|
||||||
char *desc;
|
|
||||||
char *title;
|
|
||||||
size_t posts_at_page;
|
|
||||||
|
|
||||||
|
char *logo;
|
||||||
|
char logo_alloc;
|
||||||
|
|
||||||
|
char *desc;
|
||||||
|
char desc_alloc;
|
||||||
|
|
||||||
|
char *title;
|
||||||
|
char title_alloc;
|
||||||
|
|
||||||
|
size_t posts_at_page;
|
||||||
|
|
||||||
/* RSS */
|
/* RSS */
|
||||||
char *link;
|
char *link;
|
||||||
|
char link_alloc;
|
||||||
|
|
||||||
char *xml_file;
|
char *xml_file;
|
||||||
|
char xml_file_alloc;
|
||||||
|
|
||||||
char *language;
|
char *language;
|
||||||
|
char language_alloc;
|
||||||
|
|
||||||
size_t max_posts;
|
size_t max_posts;
|
||||||
|
|
||||||
/* Date format */
|
/* Date format */
|
||||||
char *date_fmt;
|
char *date_fmt;
|
||||||
|
char date_fmt_alloc;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
void free_cfg(struct CONFIG *cfg);
|
||||||
int parse_config(struct CONFIG *cfg, const char *cfg_path);
|
int parse_config(struct CONFIG *cfg, const char *cfg_path);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -11,7 +11,7 @@
|
||||||
struct CONFIG cfg;
|
struct CONFIG cfg;
|
||||||
|
|
||||||
void help(void) {
|
void help(void) {
|
||||||
////
|
free_cfg(&cfg);
|
||||||
|
|
||||||
printf("%s -[f:d:h] [add/rebuild/version/del]:\n\tadd [img] [tag1] [tag2]...\n\trebuild\n\tversion\n\tdel [image id]\n\nOptions:\n\t-d STR set description\n\t-f STR Path to config file\n\t-h This menu\n", cfg.prog_name);
|
printf("%s -[f:d:h] [add/rebuild/version/del]:\n\tadd [img] [tag1] [tag2]...\n\trebuild\n\tversion\n\tdel [image id]\n\nOptions:\n\t-d STR set description\n\t-f STR Path to config file\n\t-h This menu\n", cfg.prog_name);
|
||||||
exit(0);
|
exit(0);
|
||||||
|
@ -196,7 +196,7 @@ int main(int argc, char **argv) {
|
||||||
if (chdir(cfg.root) < 0) {
|
if (chdir(cfg.root) < 0) {
|
||||||
fprintf(stderr, "%s: chdir: %s\n", cfg.prog_name, strerror(errno));
|
fprintf(stderr, "%s: chdir: %s\n", cfg.prog_name, strerror(errno));
|
||||||
|
|
||||||
////
|
free_cfg(&cfg);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -216,12 +216,11 @@ int main(int argc, char **argv) {
|
||||||
ret = rebuild(cfg);
|
ret = rebuild(cfg);
|
||||||
|
|
||||||
else if (!strcmp(argv[0], "version"))
|
else if (!strcmp(argv[0], "version"))
|
||||||
printf("%s (8img) version: 2.0.1\nWritten under WTFPL License.\n", cfg.prog_name);
|
printf("%s (8img) version: 2.0.2\nWritten under WTFPL License.\n", cfg.prog_name);
|
||||||
|
|
||||||
else
|
else
|
||||||
help();
|
help();
|
||||||
|
|
||||||
////
|
free_cfg(&cfg);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue