initial import
[dosrtxon] / libs / imago / src / ftmodule.c
1 /*
2 libimago - a multi-format image file input/output library.
3 Copyright (C) 2010 John Tsiombikas <nuclear@member.fsf.org>
4
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.
9
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.
14
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 */
18
19 #include <stdlib.h>
20 #include <string.h>
21 #include "ftmodule.h"
22
23 static struct list_node {
24         struct ftype_module *module;
25         struct list_node *next;
26 } *modules;
27
28 /* defined in modules.c which is generated by configure */
29 void img_modules_init();
30
31 static int done_init;
32
33 int img_register_module(struct ftype_module *mod)
34 {
35         struct list_node *node;
36
37         if(!(node = malloc(sizeof *node))) {
38                 return -1;
39         }
40
41         node->module = mod;
42         node->next = modules;
43         modules = node;
44         return 0;
45 }
46
47 struct ftype_module *img_find_format_module(struct img_io *io)
48 {
49         struct list_node *node;
50
51         if(!done_init) {
52                 img_modules_init();
53                 done_init = 1;
54         }
55
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 }
65
66 struct ftype_module *img_guess_format(const char *fname)
67 {
68         struct list_node *node;
69         char *suffix;
70         int suffix_len;
71
72         if(!done_init) {
73                 img_modules_init();
74                 done_init = 1;
75         }
76
77         if(!(suffix = strrchr(fname, '.'))) {
78                 return 0;       /* no suffix, can't guess ... */
79         }
80         suffix_len = (int)strlen(suffix);
81
82         node = modules;
83         while(node) {
84                 char *suflist = node->module->suffix;
85                 char *start, *end;
86
87                 while(*suflist) {
88                         if(!(start = strstr(suflist, suffix))) {
89                                 break;
90                         }
91                         end = start + suffix_len;
92
93                         if(*end == ':' || *end == 0) {
94                                 return node->module;    /* found it */
95                         }
96                         suflist = end;
97                 }
98
99                 node = node->next;
100         }
101         return 0;
102 }
103
104 struct ftype_module *img_get_module(int idx)
105 {
106         struct list_node *node;
107
108         if(!done_init) {
109                 img_modules_init();
110                 done_init = 1;
111         }
112
113         node = modules;
114         while(node && idx--) {
115                 node = node->next;
116         }
117         return node->module;
118 }