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