summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDr.Smile <vabnick@gmail.com>2021-05-08 20:42:45 +0300
committerDr.Smile <vabnick@gmail.com>2021-06-10 19:57:33 +0300
commita6792e2a7bbe8b47d05ca23fb5900cedf4227b39 (patch)
tree65ca5f29333f696664e35bc938785c48a3a235a8
parent6fc9855dac44699242ded580040838da032c3a9d (diff)
downloadlibass-a6792e2a7bbe8b47d05ca23fb5900cedf4227b39.tar.bz2
libass-a6792e2a7bbe8b47d05ca23fb5900cedf4227b39.tar.xz
compare: reorganize code
-rw-r--r--compare/compare.c205
1 files changed, 100 insertions, 105 deletions
diff --git a/compare/compare.c b/compare/compare.c
index 24d7829..f8e0f9e 100644
--- a/compare/compare.c
+++ b/compare/compare.c
@@ -359,23 +359,12 @@ typedef struct {
Item *items;
} ItemList;
-static bool init_items(ItemList *list)
-{
- size_t n = 256;
- list->n_items = list->max_items = 0;
- list->items = malloc(n * sizeof(Item));
- if (!list->items)
- return out_of_memory();
- list->max_items = n;
- return true;
-}
-
static bool add_item(ItemList *list)
{
if (list->n_items < list->max_items)
return true;
- size_t n = 2 * list->max_items;
+ size_t n = list->max_items ? 2 * list->max_items : 256;
Item *next = realloc(list->items, n * sizeof(Item));
if (!next)
return out_of_memory();
@@ -455,34 +444,53 @@ static bool add_img_item(ItemList *list, const char *file, size_t len)
return true;
}
-
-static int print_usage(const char *program)
+static bool process_input(ItemList *list, const char *path, ASS_Library *lib)
{
- const char *fmt =
- "Usage: %s [-i] <input-dir> [-o <output-dir>] [-s <scale:1-8>]\n";
- printf(fmt, program);
- return 1;
-}
+ DIR *dir = opendir(path);
+ if (!dir) {
+ printf("Cannot open input directory '%s'!\n", path);
+ return false;
+ }
+ struct dirent *file;
+ while ((file = readdir(dir))) {
+ const char *name = file->d_name;
+ if (name[0] == '.')
+ continue;
+ const char *ext = strrchr(name + 1, '.');
+ if (!ext)
+ continue;
-void msg_callback(int level, const char *fmt, va_list va, void *data)
-{
- if (level > 3)
- return;
- printf("libass: ");
- vprintf(fmt, va);
- printf("\n");
+ if (!strcmp(ext, ".png")) {
+ if (add_img_item(list, name, ext - name))
+ continue;
+ } else if (!strcmp(ext, ".ass")) {
+ if (add_sub_item(list, name, ext - name))
+ continue;
+ } else if (!strcmp(ext, ".ttf") || !strcmp(ext, ".otf") || !strcmp(ext, ".pfb")) {
+ if (load_font(lib, path, name))
+ continue;
+ printf("Cannot load font '%s'!\n", name);
+ } else {
+ continue;
+ }
+ closedir(dir);
+ return false;
+ }
+ closedir(dir);
+ return true;
}
-int main(int argc, char *argv[])
+
+enum {
+ INPUT, OUTPUT, SCALE
+};
+
+static bool parse_cmdline(int pos[3], int argc, char *argv[])
{
- enum {
- INPUT, OUTPUT, SCALE
- };
- int pos[3] = {0};
for (int i = 1; i < argc; i++) {
if (argv[i][0] != '-') {
if (pos[INPUT])
- return print_usage(argv[0]);
+ goto fail;
pos[INPUT] = i;
continue;
}
@@ -491,32 +499,51 @@ int main(int argc, char *argv[])
case 'i': index = INPUT; break;
case 'o': index = OUTPUT; break;
case 's': index = SCALE; break;
- default: return print_usage(argv[0]);
+ default: goto fail;
}
if (argv[i][2] || ++i >= argc || pos[index])
- return print_usage(argv[0]);
+ goto fail;
pos[index] = i;
}
- if (!pos[INPUT])
- return print_usage(argv[0]);
+ if (pos[INPUT])
+ return true;
+
+fail:;
+ const char *fmt =
+ "Usage: %s [-i] <input-dir> [-o <output-dir>] [-s <scale:1-8>]\n";
+ printf(fmt, argv[0]);
+ return false;
+}
+
+void msg_callback(int level, const char *fmt, va_list va, void *data)
+{
+ if (level > 3)
+ return;
+ printf("libass: ");
+ vprintf(fmt, va);
+ printf("\n");
+}
+
+int main(int argc, char *argv[])
+{
+ int pos[3] = {0};
+ if (!parse_cmdline(pos, argc, argv))
+ return 1;
+
+ ASS_Library *lib = NULL;
+ ItemList list = {0};
+ int result = 1;
int scale = 1;
if (pos[SCALE]) {
const char *arg = argv[pos[SCALE]];
if (arg[0] < '1' || arg[0] > '8' || arg[1]) {
printf("Invalid scale value, should be 1-8!\n");
- return 1;
+ goto end;
}
scale = arg[0] - '0';
}
- const char *input = argv[pos[INPUT]];
- DIR *dir = opendir(input);
- if (!dir) {
- printf("Cannot open input directory '%s'!\n", input);
- return 1;
- }
-
const char *output = NULL;
if (pos[OUTPUT]) {
output = argv[pos[OUTPUT]];
@@ -524,69 +551,30 @@ int main(int argc, char *argv[])
if (stat(output, &st)) {
if (mkdir(output, 0755)) {
printf("Cannot create output directory '%s'!\n", output);
- closedir(dir);
- return 1;
+ goto end;
}
} else if (!(st.st_mode & S_IFDIR)) {
printf("Invalid output directory '%s'!\n", output);
- closedir(dir);
- return 1;
+ goto end;
}
}
- ASS_Library *lib = ass_library_init();
+ lib = ass_library_init();
if (!lib) {
printf("ass_library_init failed!\n");
- closedir(dir);
- return 1;
+ goto end;
}
ass_set_message_cb(lib, msg_callback, NULL);
ass_set_extract_fonts(lib, true);
- ItemList list;
- if (!init_items(&list)) {
- ass_library_done(lib);
- closedir(dir);
- return 1;
- }
-
- while (true) {
- struct dirent *file = readdir(dir);
- if (!file)
- break;
- const char *name = file->d_name;
- if (name[0] == '.')
- continue;
- const char *ext = strrchr(name + 1, '.');
- if (!ext)
- continue;
-
- if (!strcmp(ext, ".png")) {
- if (add_img_item(&list, name, ext - name))
- continue;
- } else if (!strcmp(ext, ".ass")) {
- if (add_sub_item(&list, name, ext - name))
- continue;
- } else if (!strcmp(ext, ".ttf") || !strcmp(ext, ".otf") || !strcmp(ext, ".pfb")) {
- if (load_font(lib, input, name))
- continue;
- printf("Cannot load font '%s'!\n", name);
- } else {
- continue;
- }
- delete_items(&list);
- ass_library_done(lib);
- closedir(dir);
- return 1;
- }
- closedir(dir);
+ const char *input = argv[pos[INPUT]];
+ if (!process_input(&list, input, lib))
+ goto end;
ASS_Renderer *renderer = ass_renderer_init(lib);
if (!renderer) {
printf("ass_renderer_init failed!\n");
- delete_items(&list);
- ass_library_done(lib);
- return 1;
+ goto end;
}
ass_set_fonts(renderer, NULL, NULL, ASS_FONTPROVIDER_NONE, NULL, 0);
@@ -596,16 +584,18 @@ int main(int argc, char *argv[])
unsigned total = 0, good = 0;
qsort(list.items, list.n_items, sizeof(Item), item_compare);
for (size_t i = 0; i < list.n_items; i++) {
- if (strcmp(prev, list.items[i].name)) {
- if (track)
+ char *name = list.items[i].name;
+ if (strcmp(prev, name)) {
+ if (track) {
ass_free_track(track);
- prev = list.items[i].name;
- prefix = strlen(prev);
+ track = NULL;
+ }
+ prev = name;
+ prefix = strlen(name);
if (list.items[i].time < 0)
- track = load_track(lib, input, prev);
+ track = load_track(lib, input, name);
else {
- printf("Missing subtitle file '%s.ass'!\n", prev);
- track = NULL;
+ printf("Missing subtitle file '%s.ass'!\n", name);
total++;
}
continue;
@@ -614,7 +604,6 @@ int main(int argc, char *argv[])
total++;
if (!track)
continue;
- char *name = list.items[i].name;
name[prefix] = '-'; // restore initial filename
if (process_image(renderer, track, input, output,
name, list.items[i].time, scale))
@@ -622,14 +611,20 @@ int main(int argc, char *argv[])
}
if (track)
ass_free_track(track);
- delete_items(&list);
ass_renderer_done(renderer);
- ass_library_done(lib);
- if (good < total) {
+ if (!total) {
+ printf("No images found!\n");
+ } else if (good < total) {
printf("Only %u of %u images have passed test\n", good, total);
- return 1;
+ } else {
+ printf("All %u images have passed test\n", total);
+ result = 0;
}
- printf("All %u images have passed test\n", total);
- return 0;
+
+end:
+ delete_items(&list);
+ if (lib)
+ ass_library_done(lib);
+ return result;
}