mirror of
https://github.com/NikitaIvanovV/ctpv.git
synced 2024-11-24 13:53:07 +01:00
Fixes, improvements
This commit is contained in:
parent
154a0bfd41
commit
1651ae8df9
41
config.c
41
config.c
@ -1,3 +1,4 @@
|
|||||||
|
#include "ctpv.h"
|
||||||
#include "lexer.h"
|
#include "lexer.h"
|
||||||
#include "error.h"
|
#include "error.h"
|
||||||
#include "preview.h"
|
#include "preview.h"
|
||||||
@ -22,13 +23,18 @@ enum {
|
|||||||
static Lexer *lexer;
|
static Lexer *lexer;
|
||||||
static Token token;
|
static Token token;
|
||||||
static VectorPreview *previews;
|
static VectorPreview *previews;
|
||||||
static char *any_type;
|
|
||||||
|
static void any_type_null(char **s)
|
||||||
|
{
|
||||||
|
if (*s && strcmp(*s, any_type) == 0)
|
||||||
|
*s = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
static void add_preview(char *name, char *script, char *type, char *subtype,
|
static void add_preview(char *name, char *script, char *type, char *subtype,
|
||||||
char *ext)
|
char *ext)
|
||||||
{
|
{
|
||||||
if (type && strcmp(type, any_type) == 0)
|
any_type_null(&type);
|
||||||
type = NULL;
|
any_type_null(&subtype);
|
||||||
|
|
||||||
if (subtype && strcmp(subtype, any_type) == 0)
|
if (subtype && strcmp(subtype, any_type) == 0)
|
||||||
subtype = NULL;
|
subtype = NULL;
|
||||||
@ -160,6 +166,18 @@ static int command(void)
|
|||||||
return STAT_ERR;
|
return STAT_ERR;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int end(void)
|
||||||
|
{
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
while (1) {
|
||||||
|
ret = accept(TOK_NEW_LN);
|
||||||
|
CHECK_OK(ret);
|
||||||
|
}
|
||||||
|
|
||||||
|
return STAT_OK;
|
||||||
|
}
|
||||||
|
|
||||||
static int commands(void)
|
static int commands(void)
|
||||||
{
|
{
|
||||||
accept(TOK_NEW_LN);
|
accept(TOK_NEW_LN);
|
||||||
@ -167,21 +185,31 @@ static int commands(void)
|
|||||||
while (1) {
|
while (1) {
|
||||||
CHECK_NULL(accept(TOK_EOF));
|
CHECK_NULL(accept(TOK_EOF));
|
||||||
CHECK_OK(command());
|
CHECK_OK(command());
|
||||||
CHECK_OK(accept(TOK_NEW_LN));
|
CHECK_OK(end());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static int parse(void)
|
static int parse(void)
|
||||||
{
|
{
|
||||||
|
#ifndef PARSE_DEBUG
|
||||||
next_token();
|
next_token();
|
||||||
|
|
||||||
if (commands() == STAT_ERR)
|
if (commands() == STAT_ERR)
|
||||||
return ERR;
|
return ERR;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef PARSE_DEBUG
|
||||||
|
while (1) {
|
||||||
|
next_token();
|
||||||
|
if (token.type == TOK_EOF)
|
||||||
|
break;
|
||||||
|
printf("%s\n", lexer_token_type_str(token.type));
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
return OK;
|
return OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
int config_load(VectorPreview *prevs, char *filename, char *any_type_)
|
int config_load(VectorPreview *prevs, char *filename)
|
||||||
{
|
{
|
||||||
int ret = OK;
|
int ret = OK;
|
||||||
|
|
||||||
@ -190,7 +218,6 @@ int config_load(VectorPreview *prevs, char *filename, char *any_type_)
|
|||||||
|
|
||||||
lexer = lexer_init(f);
|
lexer = lexer_init(f);
|
||||||
previews = prevs;
|
previews = prevs;
|
||||||
any_type = any_type_;
|
|
||||||
|
|
||||||
ERRCHK_GOTO_OK(parse(), ret, file);
|
ERRCHK_GOTO_OK(parse(), ret, file);
|
||||||
|
|
||||||
|
2
config.h
2
config.h
@ -3,7 +3,7 @@
|
|||||||
|
|
||||||
#include "preview.h"
|
#include "preview.h"
|
||||||
|
|
||||||
int config_load(VectorPreview *prevs, char *filename, char *any_type_);
|
int config_load(VectorPreview *prevs, char *filename);
|
||||||
void config_cleanup(void);
|
void config_cleanup(void);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
41
ctpv.c
41
ctpv.c
@ -8,6 +8,7 @@
|
|||||||
#include <sys/stat.h>
|
#include <sys/stat.h>
|
||||||
#include <openssl/md5.h>
|
#include <openssl/md5.h>
|
||||||
|
|
||||||
|
#include "ctpv.h"
|
||||||
#include "error.h"
|
#include "error.h"
|
||||||
#include "utils.h"
|
#include "utils.h"
|
||||||
#include "config.h"
|
#include "config.h"
|
||||||
@ -15,9 +16,7 @@
|
|||||||
#include "preview.h"
|
#include "preview.h"
|
||||||
#include "previews.h"
|
#include "previews.h"
|
||||||
|
|
||||||
#define ANY_TYPE "*"
|
const char any_type[] = ANY_TYPE;
|
||||||
|
|
||||||
static char any_type[] = ANY_TYPE;
|
|
||||||
|
|
||||||
static magic_t magic;
|
static magic_t magic;
|
||||||
|
|
||||||
@ -37,7 +36,7 @@ static VectorPreview *previews;
|
|||||||
|
|
||||||
static void cleanup(void)
|
static void cleanup(void)
|
||||||
{
|
{
|
||||||
cleanup_previews();
|
previews_cleanup();
|
||||||
config_cleanup();
|
config_cleanup();
|
||||||
if (magic != NULL)
|
if (magic != NULL)
|
||||||
magic_close(magic);
|
magic_close(magic);
|
||||||
@ -78,17 +77,19 @@ static int get_config_file(char *buf, size_t len)
|
|||||||
return OK;
|
return OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int init_previews_v(void)
|
static int init_previews(void)
|
||||||
{
|
{
|
||||||
previews = vectorPreview_new(LEN(b_previews));
|
/* 20 is some arbitrary number, it's here in order to
|
||||||
|
* to save one realloc() if user has less then 20 custom previews */
|
||||||
|
previews = vectorPreview_new(LEN(b_previews) + 20);
|
||||||
vectorPreview_append_arr(previews, b_previews, LEN(b_previews));
|
vectorPreview_append_arr(previews, b_previews, LEN(b_previews));
|
||||||
|
|
||||||
char config_file[FILENAME_MAX];
|
char config_file[FILENAME_MAX];
|
||||||
get_config_file(config_file, LEN(config_file));
|
get_config_file(config_file, LEN(config_file));
|
||||||
|
|
||||||
ERRCHK_RET_OK(config_load(previews, config_file, any_type));
|
ERRCHK_RET_OK(config_load(previews, config_file));
|
||||||
|
|
||||||
init_previews(previews->buf, previews->len);
|
previews_init(previews->buf, previews->len);
|
||||||
|
|
||||||
return OK;
|
return OK;
|
||||||
}
|
}
|
||||||
@ -104,22 +105,6 @@ static const char *get_mimetype(const char *path)
|
|||||||
return r;
|
return r;
|
||||||
}
|
}
|
||||||
|
|
||||||
static const char *get_ext(const char *path)
|
|
||||||
{
|
|
||||||
const char *base;
|
|
||||||
|
|
||||||
if ((base = strrchr(path, '/')))
|
|
||||||
base += sizeof(*base);
|
|
||||||
else
|
|
||||||
base = path;
|
|
||||||
|
|
||||||
const char *dot = strchr(base, '.');
|
|
||||||
if (!dot || dot == base)
|
|
||||||
return NULL;
|
|
||||||
|
|
||||||
return &dot[1];
|
|
||||||
}
|
|
||||||
|
|
||||||
static int check_file(const char *f)
|
static int check_file(const char *f)
|
||||||
{
|
{
|
||||||
if (!f) {
|
if (!f) {
|
||||||
@ -207,7 +192,7 @@ static int preview(int argc, char *argv[])
|
|||||||
|
|
||||||
ERRCHK_RET_OK(init_magic());
|
ERRCHK_RET_OK(init_magic());
|
||||||
|
|
||||||
ERRCHK_RET_OK(init_previews_v());
|
ERRCHK_RET_OK(init_previews());
|
||||||
|
|
||||||
const char *mimetype;
|
const char *mimetype;
|
||||||
ERRCHK_RET(!(mimetype = get_mimetype(f)));
|
ERRCHK_RET(!(mimetype = get_mimetype(f)));
|
||||||
@ -223,7 +208,7 @@ static int preview(int argc, char *argv[])
|
|||||||
.cache_file = cache_file, .cache_valid = cache_valid,
|
.cache_file = cache_file, .cache_valid = cache_valid,
|
||||||
};
|
};
|
||||||
|
|
||||||
return run_preview(get_ext(f), mimetype, &args);
|
return preview_run(get_ext(f), mimetype, &args);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int server(void)
|
static int server(void)
|
||||||
@ -243,10 +228,10 @@ static int end(void)
|
|||||||
|
|
||||||
static int list(void)
|
static int list(void)
|
||||||
{
|
{
|
||||||
ERRCHK_RET_OK(init_previews_v());
|
ERRCHK_RET_OK(init_previews());
|
||||||
|
|
||||||
size_t len;
|
size_t len;
|
||||||
Preview p, **list = get_previews_list(&len);
|
Preview p, **list = previews_get(&len);
|
||||||
const char *n, *e, *t, *s;
|
const char *n, *e, *t, *s;
|
||||||
|
|
||||||
const char header_name[] = "Name", header_ext[] = "Extension",
|
const char header_name[] = "Name", header_ext[] = "Extension",
|
||||||
|
8
ctpv.h
Normal file
8
ctpv.h
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
#ifndef CTPV_H
|
||||||
|
#define CTPV_H
|
||||||
|
|
||||||
|
#define ANY_TYPE "*"
|
||||||
|
|
||||||
|
extern const char any_type[];
|
||||||
|
|
||||||
|
#endif
|
@ -40,7 +40,7 @@ static int cmp_previews(const void *p1, const void *p2)
|
|||||||
return i;
|
return i;
|
||||||
}
|
}
|
||||||
|
|
||||||
void init_previews(Preview *ps, size_t len)
|
void previews_init(Preview *ps, size_t len)
|
||||||
{
|
{
|
||||||
previews.len = len;
|
previews.len = len;
|
||||||
|
|
||||||
@ -56,7 +56,7 @@ void init_previews(Preview *ps, size_t len)
|
|||||||
qsort(previews.list, previews.len, PREVP_SIZE, cmp_previews);
|
qsort(previews.list, previews.len, PREVP_SIZE, cmp_previews);
|
||||||
}
|
}
|
||||||
|
|
||||||
void cleanup_previews(void)
|
void previews_cleanup(void)
|
||||||
{
|
{
|
||||||
if (!previews.list)
|
if (!previews.list)
|
||||||
return;
|
return;
|
||||||
@ -156,7 +156,7 @@ static int run(Preview *p, int *exitcode)
|
|||||||
ERRNOS); \
|
ERRNOS); \
|
||||||
} while (0)
|
} while (0)
|
||||||
|
|
||||||
int run_preview(const char *ext, const char *mimetype, PreviewArgs *pa)
|
int preview_run(const char *ext, const char *mimetype, PreviewArgs *pa)
|
||||||
{
|
{
|
||||||
if (pa->id || (pa->id = getenv("id")))
|
if (pa->id || (pa->id = getenv("id")))
|
||||||
ERRCHK_RET_OK(server_set_fifo_var(pa->id));
|
ERRCHK_RET_OK(server_set_fifo_var(pa->id));
|
||||||
@ -199,7 +199,7 @@ run:
|
|||||||
return exitcode == 0 ? OK : ERR;
|
return exitcode == 0 ? OK : ERR;
|
||||||
}
|
}
|
||||||
|
|
||||||
Preview **get_previews_list(size_t *len)
|
Preview **previews_get(size_t *len)
|
||||||
{
|
{
|
||||||
check_init_previews();
|
check_init_previews();
|
||||||
*len = previews.len;
|
*len = previews.len;
|
||||||
|
@ -19,9 +19,9 @@ typedef struct {
|
|||||||
int cache_valid;
|
int cache_valid;
|
||||||
} PreviewArgs;
|
} PreviewArgs;
|
||||||
|
|
||||||
void init_previews(Preview *ps, size_t len);
|
void previews_init(Preview *ps, size_t len);
|
||||||
void cleanup_previews(void);
|
void previews_cleanup(void);
|
||||||
int run_preview(const char *ext, const char *mimetype, PreviewArgs *pa);
|
int preview_run(const char *ext, const char *mimetype, PreviewArgs *pa);
|
||||||
Preview **get_previews_list(size_t *len);
|
Preview **previews_get(size_t *len);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
16
utils.c
16
utils.c
@ -130,3 +130,19 @@ int mkpath(char* file_path, mode_t mode)
|
|||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const char *get_ext(const char *path)
|
||||||
|
{
|
||||||
|
const char *base;
|
||||||
|
|
||||||
|
if ((base = strrchr(path, '/')))
|
||||||
|
base += sizeof(*base);
|
||||||
|
else
|
||||||
|
base = path;
|
||||||
|
|
||||||
|
const char *dot = strchr(base, '.');
|
||||||
|
if (!dot || dot == base)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
return &dot[1];
|
||||||
|
}
|
||||||
|
1
utils.h
1
utils.h
@ -35,5 +35,6 @@ int get_cache_dir(char *buf, size_t len, char *name);
|
|||||||
int get_config_dir(char *buf, size_t len, char *name);
|
int get_config_dir(char *buf, size_t len, char *name);
|
||||||
|
|
||||||
int mkpath(char* file_path, mode_t mode);
|
int mkpath(char* file_path, mode_t mode);
|
||||||
|
const char *get_ext(const char *path);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
Loading…
Reference in New Issue
Block a user