fix from mikes for building on apple with gcc 4.2.1
[blender.git] / source / blender / blenfont / intern / blf_dir.c
1 /**
2  * $Id$
3  *
4  * ***** BEGIN GPL LICENSE BLOCK *****
5  *
6  * This program is free software; you can redistribute it and/or
7  * modify it under the terms of the GNU General Public License
8  * as published by the Free Software Foundation; either version 2
9  * of the License, or (at your option) any later version. 
10  *
11  * This program is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14  * GNU General Public License for more details.
15  *
16  * You should have received a copy of the GNU General Public License
17  * along with this program; if not, write to the Free Software Foundation,
18  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
19  *
20  * The Original Code is Copyright (C) 2009 Blender Foundation.
21  * All rights reserved.
22  * 
23  * Contributor(s): Blender Foundation.
24  *
25  * ***** END GPL LICENSE BLOCK *****
26  */
27
28 #include <stdio.h>
29 #include <stdlib.h>
30 #include <string.h>
31
32 #include <ft2build.h>
33
34 #include FT_FREETYPE_H
35 #include FT_GLYPH_H
36
37 #include "MEM_guardedalloc.h"
38
39 #include "DNA_vec_types.h"
40
41 #include "BKE_utildefines.h"
42
43 #include "BLI_blenlib.h"
44
45 #include "BIF_gl.h"
46
47 #include "blf_internal_types.h"
48
49 static ListBase global_font_dir= { NULL, NULL };
50
51 static DirBLF *blf_dir_find(const char *path)
52 {
53         DirBLF *p;
54         
55         p= global_font_dir.first;
56         while (p) {
57                 if (!strcmp(p->path, path))
58                         return(p);
59                 p= p->next;
60         }
61         return(NULL);
62 }
63
64 void BLF_dir_add(const char *path)
65 {
66         DirBLF *dir;
67         
68         dir= blf_dir_find(path);
69         if (dir) /* already in the list ? just return. */
70                 return;
71         
72         dir= (DirBLF *)MEM_mallocN(sizeof(DirBLF), "BLF_dir_add");
73         dir->path= BLI_strdup(path);
74         BLI_addhead(&global_font_dir, dir);
75 }
76
77 void BLF_dir_rem(const char *path)
78 {
79         DirBLF *dir;
80         
81         dir= blf_dir_find(path);
82         if (dir) {
83                 BLI_remlink(&global_font_dir, dir);
84                 MEM_freeN(dir->path);
85                 MEM_freeN(dir);
86         }
87 }
88
89 char **BLF_dir_get(int *ndir)
90 {
91         DirBLF *p;
92         char **dirs;
93         char *path;
94         int i, count;
95         
96         count= BLI_countlist(&global_font_dir);
97         if (!count)
98                 return(NULL);
99         
100         dirs= (char **)MEM_mallocN(sizeof(char *) * count, "BLF_dir_get");
101         p= global_font_dir.first;
102         i= 0;
103         while (p) {
104                 path= BLI_strdup(p->path);
105                 dirs[i]= path;
106                 p= p->next;
107         }
108         *ndir= i;
109         return(dirs);
110 }
111
112 void BLF_dir_free(char **dirs, int count)
113 {
114         char *path;
115         int i;
116         
117         for (i= 0; i < count; i++) {
118                 path= dirs[i];
119                 MEM_freeN(path);
120         }
121         MEM_freeN(dirs);
122 }
123
124 char *blf_dir_search(const char *file)
125 {
126         DirBLF *dir;
127         char full_path[FILE_MAXDIR+FILE_MAXFILE];
128         char *s= NULL;
129
130         for(dir=global_font_dir.first; dir; dir= dir->next) {
131                 BLI_join_dirfile(full_path, sizeof(full_path), dir->path, file);
132                 if (BLI_exist(full_path)) {
133                         s= BLI_strdup(full_path);
134                         break;
135                 }
136         }
137
138         if (!s) {
139                 /* check the current directory, why not ? */
140                 if (BLI_exist(file))
141                         s= BLI_strdup(file);
142         }
143         
144         return(s);
145 }
146
147 int blf_dir_split(const char *str, char *file, int *size)
148 {
149         int i, len;
150         char *s;
151         
152         /* Window, Linux or Mac, this is always / */
153         s= strrchr(str, '/');
154         if (s) {
155                 len= s - str;
156                 for (i= 0; i < len; i++)
157                         file[i]= str[i];
158
159                 file[i]= '.';
160                 file[i+1]= 't';
161                 file[i+2]= 't';
162                 file[i+3]= 'f';
163                 file[i+4]= '\0';
164                 s++;
165                 *size= atoi(s);
166                 return(1);
167         }
168         return(0);
169 }
170
171 /* Some font have additional file with metrics information,
172  * in general, the extension of the file is: .afm or .pfm
173  */
174 char *blf_dir_metrics_search(const char *filename)
175 {
176         char *mfile;
177         char *s;
178
179         mfile= BLI_strdup(filename);
180         s= strrchr(mfile, '.');
181         if (s) {
182                 if (strlen(s) < 4) {
183                         MEM_freeN(mfile);
184                         return(NULL);
185                 }
186                 s++;
187                 s[0]= 'a';
188                 s[1]= 'f';
189                 s[2]= 'm';
190
191                 /* first check .afm */
192                 if (BLI_exist(s))
193                         return(s);
194
195                 /* and now check .pfm */
196                 s[0]= 'p';
197
198                 if (BLI_exist(s))
199                         return(s);
200         }
201         MEM_freeN(mfile);
202         return(NULL);
203 }