Add -l option

This commit is contained in:
Nikita Ivanov 2022-05-23 01:07:08 +05:00
parent 7b6c2518e6
commit 277ff54f8b
No known key found for this signature in database
GPG Key ID: 6E656AC5B97B5133
3 changed files with 86 additions and 17 deletions

86
ctpv.c
View File

@ -9,11 +9,19 @@
#include "utils.h" #include "utils.h"
#include "previews.h" #include "previews.h"
#define ANY_TYPE "*"
static const char any_type[] = ANY_TYPE;
static magic_t magic; static magic_t magic;
static struct { static struct {
int server; enum {
} ctpv; MODE_PREVIEW,
MODE_SERVER,
MODE_LIST,
} mode;
} ctpv = { MODE_PREVIEW };
static void cleanup(void) { static void cleanup(void) {
cleanup_previews(); cleanup_previews();
@ -31,6 +39,11 @@ static int init_magic() {
return OK; return OK;
} }
static void init_previews_v(void)
{
init_previews(previews, LEN(previews));
}
static const char *get_mimetype(char const *path) { static const char *get_mimetype(char const *path) {
const char *r = magic_file(magic, path); const char *r = magic_file(magic, path);
if (!r) { if (!r) {
@ -49,15 +62,9 @@ static const char *get_ext(char const *path) {
return &r[1]; return &r[1];
} }
static int server(void)
{
/* TODO */
return OK;
}
#define GET_PARG(a, i) (a) = argc > (i) ? argv[i] : NULL #define GET_PARG(a, i) (a) = argc > (i) ? argv[i] : NULL
static int client(int argc, char *argv[]) static int preview(int argc, char *argv[])
{ {
char *f, *w, *h, *x, *y; char *f, *w, *h, *x, *y;
GET_PARG(f, 0); GET_PARG(f, 0);
@ -72,7 +79,7 @@ static int client(int argc, char *argv[])
ERRCHK_RET_OK(init_magic()); ERRCHK_RET_OK(init_magic());
init_previews(previews, LEN(previews)); init_previews_v();
const char *mimetype = get_mimetype(f); const char *mimetype = get_mimetype(f);
ERRCHK_RET(!mimetype); ERRCHK_RET(!mimetype);
@ -90,15 +97,53 @@ static int client(int argc, char *argv[])
return OK; return OK;
} }
static int server(void)
{
/* TODO */
return OK;
}
static int list(void)
{
init_previews_v();
size_t len;
Preview p, **list = get_previews_list(&len);
const char *t, *s;
puts("List of available previews:");
for (size_t i = 0; i < len; i++) {
p = *list[i];
t = p.type;
s = p.subtype;
if (!t) {
t = any_type;
s = any_type;
} else if (!s) {
s = any_type;
}
printf("\t%s/%s\n", t, s);
}
puts("\nNote: '" ANY_TYPE "' means that it matches any mimetype.");
return OK;
}
int main(int argc, char *argv[]) int main(int argc, char *argv[])
{ {
program = argc > 0 ? argv[0] : "ctpv"; program = argc > 0 ? argv[0] : "ctpv";
int c; int c;
while ((c = getopt(argc, argv, "s")) != -1) { while ((c = getopt(argc, argv, "sl")) != -1) {
switch (c) { switch (c) {
case 's': case 's':
ctpv.server = 1; ctpv.mode = MODE_SERVER;
break;
case 'l':
ctpv.mode = MODE_LIST;
break; break;
default: default:
return EXIT_FAILURE; return EXIT_FAILURE;
@ -106,10 +151,21 @@ int main(int argc, char *argv[])
} }
int ret; int ret;
if (ctpv.server) switch (ctpv.mode) {
case MODE_PREVIEW:
ret = preview(argc, &argv[optind]);
break;
case MODE_SERVER:
ret = server(); ret = server();
else break;
ret = client(argc, &argv[optind]); case MODE_LIST:
ret = list();
break;
default:
print_errorf("unknowm mode: %d", ctpv.mode);
ret = ERR;
break;
}
cleanup(); cleanup();

View File

@ -143,12 +143,17 @@ static Preview *find_by_mimetype(char const *mimetype)
return NULL; return NULL;
} }
Preview *find_preview(char const *ext, char const *mimetype) static void check_init_previews(void)
{ {
if (!sorted_by_ext || !sorted_by_mimetype) { if (!sorted_by_ext || !sorted_by_mimetype) {
print_error("init_previews() not called"); print_error("init_previews() not called");
abort(); abort();
} }
}
Preview *find_preview(char const *ext, char const *mimetype)
{
check_init_previews();
Preview *ret = NULL; Preview *ret = NULL;
if (mimetype) if (mimetype)
@ -183,3 +188,10 @@ int run_preview(Preview *p, PreviewArgs *pa)
return ret; return ret;
} }
Preview **get_previews_list(size_t *len)
{
check_init_previews();
*len = prevs_length;
return sorted_by_mimetype;
}

View File

@ -15,5 +15,6 @@ void init_previews(Preview *ps, size_t len);
void cleanup_previews(void); void cleanup_previews(void);
Preview *find_preview(char const *ext, char const *mimetype); Preview *find_preview(char const *ext, char const *mimetype);
int run_preview(Preview *p, PreviewArgs *pa); int run_preview(Preview *p, PreviewArgs *pa);
Preview **get_previews_list(size_t *len);
#endif #endif