vrshoot

view libs/imago/ftype_module.c @ 1:e7ca128b8713

looks nice :)
author John Tsiombikas <nuclear@member.fsf.org>
date Sun, 02 Feb 2014 00:35:22 +0200
parents
children
line source
1 /*
2 libimago - a multi-format image file input/output library.
3 Copyright (C) 2010 John Tsiombikas <nuclear@member.fsf.org>
5 This program is free software: you can redistribute it and/or modify
6 it under the terms of the GNU Lesser General Public License as published
7 by the Free Software Foundation, either version 3 of the License, or
8 (at your option) any later version.
10 This program is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 GNU Lesser General Public License for more details.
15 You should have received a copy of the GNU Lesser General Public License
16 along with this program. If not, see <http://www.gnu.org/licenses/>.
17 */
19 #include <stdlib.h>
20 #include <string.h>
21 #include "ftype_module.h"
23 static struct list_node {
24 struct ftype_module *module;
25 struct list_node *next;
26 } *modules;
28 /* defined in modules.c which is generated by configure */
29 void img_modules_init();
31 static int done_init;
33 int img_register_module(struct ftype_module *mod)
34 {
35 struct list_node *node;
37 if(!(node = malloc(sizeof *node))) {
38 return -1;
39 }
41 node->module = mod;
42 node->next = modules;
43 modules = node;
44 return 0;
45 }
47 struct ftype_module *img_find_format_module(struct img_io *io)
48 {
49 struct list_node *node;
51 if(!done_init) {
52 img_modules_init();
53 done_init = 1;
54 }
56 node = modules;
57 while(node) {
58 if(node->module->check(io) != -1) {
59 return node->module;
60 }
61 node = node->next;
62 }
63 return 0;
64 }
66 struct ftype_module *img_guess_format(const char *fname)
67 {
68 struct list_node *node;
69 char *suffix;
70 int suffix_len;
72 if(!done_init) {
73 img_modules_init();
74 done_init = 1;
75 }
77 if(!(suffix = strrchr(fname, '.'))) {
78 return 0; /* no suffix, can't guess ... */
79 }
80 suffix_len = strlen(suffix);
82 node = modules;
83 while(node) {
84 char *suflist = node->module->suffix;
85 char *start, *end;
87 while(*suflist) {
88 if(!(start = strstr(suflist, suffix))) {
89 break;
90 }
91 end = start + suffix_len;
93 if(*end == ':' || *end == 0) {
94 return node->module; /* found it */
95 }
96 suflist = end;
97 }
99 node = node->next;
100 }
101 return 0;
102 }
104 struct ftype_module *img_get_module(int idx)
105 {
106 struct list_node *node;
108 if(!done_init) {
109 img_modules_init();
110 done_init = 1;
111 }
113 node = modules;
114 while(node && idx--) {
115 node = node->next;
116 }
117 return node ? node->module : 0;
118 }