diff --git a/README.txt b/README.txt index a67a9fa..b0f5695 100644 --- a/README.txt +++ b/README.txt @@ -2,10 +2,9 @@ Performance: - 11 sec when processing a - 564kb database containing - 1685 files on orange pi 4 lts (cpu freq: 816Mhz) - And 5sec at 1.8GHz + 4 sec when processing a + 304kb database containing + 1841 files on celeron n2840 Dependencies: @@ -13,10 +12,10 @@ Dependencies: * *nix system -The db contains a the filename and tags +The db contains a the filename, tags and description exp: - image.png ,photo,sky - cat.png ,animal,photo + image.png|photo,sky + cat.png|animal,photo|Cute photo To configure, edit config.h and recompile diff --git a/img.c b/img.c index 383b422..ae664af 100644 --- a/img.c +++ b/img.c @@ -12,6 +12,7 @@ struct DB_STR { char *filename; + char *desc; struct stat stat; char stat_filled; @@ -77,7 +78,7 @@ void copy(const char *src, const char *dst) { fclose(ofp); } -void add(char **list, const int size) { +void add(char **list, const int size, const char *desc) { char *name = NULL; char new_path[PATH_MAX + 1]; @@ -105,17 +106,27 @@ void add(char **list, const int size) { exit(1); } - /* Write "filename ,tag1,tag2..." to the db */ - fprintf(fp, "%s ", name); - for (int i = 1; i < size; i++) { - if (strchr(list[i], ',') == NULL || strchr(list[i], ' ') == NULL) - fprintf(fp, ",%s", list[i]); + /* Write "filename|tag1,tag2...|desc" to the db */ + fprintf(fp, "%s|", name); - else - fprintf(stderr, "8img: tag '%s' contain ',' or ' '\n", list[i]); + if (size > 1) { + for (int i = 1; i < size; i++) { + if (strchr(list[i], ',') == NULL || strchr(list[i], ' ') == NULL) + fprintf(fp, "%s%c", list[i], (i == size - 1) ? '|' : ','); + + else + fprintf(stderr, "8img: tag '%s' contain ',' or ' '\n", list[i]); + } } + else + fputs("no_context|", fp); + + if (desc) + fputs(desc, fp); + fputc('\n', fp); + free(name); fclose(fp); } @@ -132,6 +143,9 @@ void free_db(struct DB_STR *db) { if (db->filename != NULL) free(db->filename); + if (db->desc != NULL) + free(db->desc); + if (db->tags != NULL) { for (size_t i = 0; i < db->size; i++) if (db->tags[i] != NULL) @@ -172,41 +186,49 @@ struct DB_STR *new_db_value(char *str) { if (db == NULL) return NULL; - /* Filename */ - char *tok = strtok(str, " "); - char *ptr = strrchr(tok, '\n'); + memset(db, 0, sizeof(struct DB_STR)); + + char *ptr = strrchr(str, '\n'); if (ptr != NULL) *ptr = '\0'; - db->filename = strdup(tok); - if (db->filename == NULL) + /* Filename */ + char *tok_rest = str; + char *tok = strtok_r(tok_rest, "|", &tok_rest); + if (tok != NULL) { + db->filename = strdup(tok); + if (db->filename == NULL) + goto NDV_CLOSE; + } + + else goto NDV_CLOSE; /* Tags */ - tok = strtok(NULL, " "); - if (tok == NULL) - db->tags = NULL; - - else { - ptr = strrchr(tok, '\n'); - if (ptr != NULL) - *ptr = '\0'; - + tok = strtok_r(tok_rest, "|", &tok_rest); + if (tok != NULL) { + db->size = 1; for (size_t i = 0; i < strlen(tok); i++) if (tok[i] == ',' && tok[i + 1]) db->size++; size_t allocated = 0; - char *tok2 = strtok(tok, ","); - while (tok2 != NULL) { + + char *tok2_rest = tok; + char *tok2; + while ((tok2 = strtok_r(tok2_rest, ",", &tok2_rest)) != NULL) { if (append_tag(db, tok2, allocated)) goto NDV_CLOSE; allocated++; - tok2 = strtok(NULL, ","); } } + /* Desc */ + tok = strtok_r(tok_rest, "|", &tok_rest); + if (tok != NULL) + db->desc = strdup(tok); + /* Stats */ char new_path[PATH_MAX + 1]; snprintf(new_path, sizeof(new_path) - 1, "%s/%s", ROOT, db->filename); @@ -269,12 +291,12 @@ RDB_CLOSE: } struct DB_STR *build_html_page(FILE *fp, const char *file, const struct UNIQ_TAGS ut, struct DB_STR *db, const size_t page, const size_t pages) { - fprintf(fp, "\n\n\n%s\n\n\n
\n

%s
%s/p%zu

\n", CSS, TITLE, LOGO, DESC, file, page); + fprintf(fp, "\n\n\n%s\n\n\n\n
\n

%s | RSS
%s/p%zu

\n", CSS, TITLE, LOGO, DESC, XML_FILE, file, page); /* Tags */ fputs("
\nall", fp); for (size_t i = 0; i < ut.size; i++) - fprintf(fp, " %s", ut.tags[i], ut.tags[i]); + fprintf(fp, " %s", ut.tags[i], ut.tags[i]); fputs("\n


\n", fp); @@ -299,6 +321,9 @@ struct DB_STR *build_html_page(FILE *fp, const char *file, const struct UNIQ_TAG for (size_t i = 0; i < p->size; i++) fprintf(fp, " %s", p->tags[i], p->tags[i]); + if (p->desc) + fprintf(fp, " | %s", p->desc); + fputs("\n


\n", fp); p = i; @@ -497,7 +522,7 @@ void rebuild(void) { } void help(void) { - puts("8img [add/rebuild/version]:\n\tadd [img] [tag1] [tag2] [...]\n\trebuild\n\tversion"); + puts("8img -[d:] [add/rebuild/version]:\n\tadd [img] [tag1] [tag2]...\n\trebuild\n\tversion\nOptions:\n\t-d STR set description"); exit(0); } @@ -508,18 +533,32 @@ int main(int argc, char **argv) { mkdir(ROOT, 0777); srand(getpid()); - argv++; - argc--; + char *desc = NULL; + + int opt; + while ((opt = getopt(argc, argv, "d:t:")) != -1) { + switch (opt) { + case 'd': + desc = optarg; + break; + + default: + help(); + } + } + + argv += optind; + argc -= optind; /* Parse args */ if (!strcmp(argv[0], "add") && argc > 1) - add(argv + 1, argc - 1); + add(argv + 1, argc - 1, desc); else if (!strcmp(argv[0], "rebuild")) rebuild(); else if (!strcmp(argv[0], "version")) - puts("8img version: 1.0.2\nWritten under WTFPL License."); + puts("8img version: 1.1\nWritten under WTFPL License."); else help();