2
* fsearch.c - search a file
3
* by Hirotsugu Kakugawa
5
* 28 May 1997 Added recursive file searching feature.
6
* 24 Dec 1998 Added searching in "VFlib.fdb" file that contain file list
7
* 21 Sep 1999 Added a feature to generate PK & GF files on the fly.
11
* Copyright (C) 1996-1999 Hirotsugu Kakugawa.
12
* All rights reserved.
14
* This file is part of the VFlib Library. This library is free
15
* software; you can redistribute it and/or modify it under the terms of
16
* the GNU Library General Public License as published by the Free
17
* Software Foundation; either version 2 of the License, or (at your
18
* option) any later version. This library is distributed in the hope
19
* that it will be useful, but WITHOUT ANY WARRANTY; without even the
20
* implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
21
* PURPOSE. See the GNU Library General Public License for more details.
22
* You should have received a copy of the GNU Library General Public
23
* License along with this library; if not, write to the Free Software
24
* Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
35
#include <sys/types.h>
36
#include <sys/param.h>
41
# define NAMLENGTH(dirent) strlen((dirent)->d_name)
43
#else /* not DIRENT */
45
# define dirent direct
46
# define NAMLENGTH(dirent) ((dirent)->d_namlen)
48
#ifdef HAVE_SYS_NDIR_H
49
# include <sys/ndir.h>
60
#endif /* not DIRENT */
62
#ifdef HAVE_SYS_STAT_H
66
# include <sys/stat.h>
69
#include "VFlib-3_6.h"
79
# include "kpathsea/kpathsea.h"
84
# ifdef HAVE_SYS_STAT_H
86
# define RECURSIVE_FILE_SEARCH
97
Private int kps_switch = DEFAULT_KPS_SWITCH;
98
Private char *kps_mode = DEFAULT_KPS_MODE;
99
Private int kps_dpi = DEFAULT_KPS_DPI;
101
Private char *kps_path = DEFAULT_KPS_PROGRAM_PATH;
103
Private char *kps_prog = DEFAULT_KPS_PROGRAM_NAME;
107
vf_kpathsea_init(char *prog, char *mode, int dpi, int kps_sw)
110
static int inited_prog = 0;
122
if (inited_prog == 1)
127
if (vf_dbg_kpathsea == 1){
128
if (kps_switch == TRUE)
129
printf(">>Kpathsea: enabled\n");
131
printf(">>Kpathsea: disabled\n");
134
if (vf_dbg_kpathsea == 1)
135
printf(">>Kpathsea: mode=%s, dpi=%d program=%s\n",
136
kps_mode, kps_dpi, kps_prog);
138
kpse_set_program_name(kps_path, kps_prog);
139
kpse_init_prog(kps_prog, kps_dpi, kps_mode, NULL);
140
for (f = 0; f < kpse_last_format; f++) {
144
if (vf_dbg_kpathsea == 1)
145
printf(">>Kpathsea: disabled by configure\n");
152
** VF_AddUncompresser()
155
Private SEXP_ALIST vf_uncompresser_alist = NULL;
158
vf_add_uncompresser_alist(SEXP_ALIST alist)
165
if (!vf_sexp_alistp(alist)){
166
fprintf(stderr, "VFlib Error [fsearch.c:VF_AddUncompresser]: %s\n",
171
t = vf_uncompresser_alist;
172
vf_sexp_nconc(alist, t);
173
vf_uncompresser_alist = alist;
180
vf_open_uncompress_stream(char *compressed_file, char *uncompress_prog)
191
cmdline = malloc(strlen(uncompress_prog) + strlen(compressed_file) + 16);
194
sprintf(cmdline, "%s %s", uncompress_prog, compressed_file);
195
fp = popen(cmdline, "r");
200
#endif /* HAVE_POPEN */
204
vf_close_uncompress_stream(FILE* fp)
223
Private char *search_in_fdb(char *name, char *dir,
224
SEXP_LIST compressed_ext_list,
225
char **p_uncompr_prog, int *ret_val);
226
Private int search_fdb_fp(FILE *fp, char *d, char *f,
227
char *ret_path, int ret_path_size);
228
Private char *search_file_kpathsea(char*,int,char*,int);
229
Private char *search_file(char*,char*,SEXP_LIST,char**);
230
Private char *search_file_recursive(char*, char*,SEXP_LIST,char**);
231
Private int ext2uncprog(char *ext, SEXP_LIST compressed_ext_list,
232
char **p_uncompr_prog);
237
vf_search_file(char *name, int opt_arg1, char *opt_arg2,
238
int use_kpathsea, int kpathsea_file_format,
240
SEXP_LIST compressed_ext_list, char **p_uncompr_prog)
241
/* NOTE: CALLER OF THIS FUNCTION *SHOULD* RELEASE RETURN VALUE.
242
(STRING RETURNED BY P_UNCOMPR_PROG SHOULD NOT BE RELEASED.) */
251
if (vf_dbg_font_search == 1){
252
printf(">> File search: %s\n", name);
255
if (p_uncompr_prog != NULL)
256
*p_uncompr_prog = NULL;
258
if (vf_path_absolute(name)){
259
if (vf_path_file_read_ok(name)){
260
if (vf_dbg_font_search == 1)
261
printf(">> File search: Found %s\n", name);
262
return vf_strdup(name);
264
if (vf_dbg_font_search == 1)
265
printf(">> File search: Not found (no such absolute path)\n");
269
if ((dir_list == NULL) || (!vf_sexp_listp(dir_list))){
270
if (vf_dbg_font_search == 1)
271
printf(">> File search: Not found (empty dir list)\n");
276
for (d = dir_list; vf_sexp_consp(d); d = vf_sexp_cdr(d)){
277
dir = vf_sexp_get_cstring(vf_sexp_car(d));
280
if ((vf_strcmp_ci(dir, "TEXMF") == 0)
281
|| (vf_strcmp_ci(dir, "KPATHSEA") == 0)){
282
/* Search by 'KPATHSEA' */
283
if (use_kpathsea == FALSE){
285
"VFlib Warning: Unsupported file format by kpathsea.\n");
288
if (kps_switch == FALSE)
290
path = search_file_kpathsea(name, opt_arg1, opt_arg2,
291
kpathsea_file_format);
293
/* check font file hint db */
294
path = search_in_fdb(name, dir, compressed_ext_list, p_uncompr_prog, &v);
296
if (vf_path_terminated_by_2delims(dir) == FALSE){
297
/* Search under dir */
298
path = search_file(name, dir, compressed_ext_list, p_uncompr_prog);
300
/* Recursive search under dir */
301
path = search_file_recursive(name, dir,
302
compressed_ext_list, p_uncompr_prog);
311
if (vf_dbg_font_search == 1){
313
printf(">> File search: Found %s\n", path);
315
printf(">> File search: Not found\n");
327
search_in_fdb(char *name, char *dir,
328
SEXP_LIST compressed_ext_list, char **p_uncompr_prog,
330
/* NOTE: CALLER OF THIS FUNCTION *SHOULD* RELEASE RETURN VALUE. */
332
char fdb[MAXPATHLEN], name_ext[MAXPATHLEN], *path;
343
if ((vf_path_cons_path(fdb, sizeof(fdb), dir, VF_FONT_FILE_HINT_DB) < 0)
344
|| (! vf_path_file_read_ok(fdb))
345
|| ((fp = fopen(fdb, FOPEN_RD_MODE_TEXT)) == NULL)){
346
if (vf_dbg_font_search == 1)
347
printf(">> No font hint db file: %s\n", fdb);
348
*p_ret_val = -2; /* hint db not found */
352
if (vf_dbg_font_search == 1)
353
printf(">> Reading hint db file: %s\n", fdb);
355
pathsize = MAXPATHLEN;
356
ALLOCN_IF_ERR(path, char, pathsize){
357
*p_ret_val = -2; /* hint db not found */
362
/* look for font without compression */
363
if (search_fdb_fp(fp, dir, name, path, pathsize) >= 0){ /* found */
364
*p_ret_val = 0; /* found */
368
/* look for font with compression */
370
for (s = compressed_ext_list; vf_sexp_consp(s); s = vf_sexp_cdr(s)){
371
ext = vf_sexp_get_cstring(vf_sexp_car(s));
372
strncpy(name_ext, name, sizeof(name_ext));
373
strncat(name_ext, ext, sizeof(name_ext) - strlen(name));
374
fseek(fp, 0, SEEK_SET);
375
if ((search_fdb_fp(fp, dir, name_ext, path, pathsize) >= 0)
376
&& (ext2uncprog(ext, compressed_ext_list, p_uncompr_prog) >= 0)){
377
*p_ret_val = 0; /* found */
384
if (*p_ret_val != 0){
389
if (vf_dbg_font_search == 1){
391
printf(">> Found in db file: %s\n", path);
393
printf(">> Not found in db file\n");
400
search_fdb_fp(FILE *fp, char *d, char *f, char *ret_path, int ret_path_size)
402
char linebuff[MAXPATHLEN], *p;
405
if ((fp == NULL) || (d == NULL) || (f == NULL) || (ret_path == NULL))
410
while (fgets(linebuff, sizeof(linebuff), fp) != NULL){
411
if ((strncmp(f, linebuff, flen) == 0) && isspace((int)linebuff[flen])){
412
for (p = &linebuff[flen]; (*p != '\0') && isspace((int)*p); p++)
416
for (i = 0; p[i] != '\0'; i++){
417
if (isspace((int)p[i])){
422
vf_path_cons_path(ret_path, ret_path_size, d, p);
433
vf_find_file_in_directory(char *name, char *dir)
434
/* NOTE: CALLER OF THIS FUNCTION *SHOULD* RELEASE RETURN VALUE. */
436
return search_file(name, dir, NULL, NULL);
441
search_file_kpathsea(char *name, int dpi, char *name2, int file_format)
442
/* NOTE: CALLER OF THIS FUNCTION *SHOULD* RELEASE RETURN VALUE. */
444
#ifndef WITH_KPATHSEA
451
kpse_glyph_file_type g_ret;
454
printf("search_file_kpathsea(%s, %s, %d, %d)\n",
455
name, name2, dpi, file_format);
458
if (kps_switch == FALSE)
461
if (vf_dbg_kpathsea == 1)
462
printf(">> Kpathsea: Search %s\n", name);
466
switch (file_format){
467
case FSEARCH_FORMAT_TYPE_GF:
468
s = kpse_find_gf(name2, dpi, &g_ret);
470
case FSEARCH_FORMAT_TYPE_PK:
471
s = kpse_find_pk(name2, dpi, &g_ret);
473
case FSEARCH_FORMAT_TYPE_VF:
474
s = kpse_find_vf(name);
476
s = kpse_find_ovf(name);
478
case FSEARCH_FORMAT_TYPE_TFM:
479
s = kpse_find_tfm(name);
481
s = kpse_find_ofm(name);
483
case FSEARCH_FORMAT_TYPE_OVF:
484
s = kpse_find_ovf(name);
486
case FSEARCH_FORMAT_TYPE_OFM:
487
s = kpse_find_ofm(name);
489
case FSEARCH_FORMAT_TYPE_TTF:
490
s = kpse_find_file(name, kpse_truetype_format, 0);
492
case FSEARCH_FORMAT_TYPE_TYPE1:
493
s = kpse_find_file(name, kpse_type1_format, 0);
495
case FSEARCH_FORMAT_TYPE_TYPE42:
496
s = kpse_find_file(name, kpse_type42_format, 0);
498
case FSEARCH_FORMAT_TYPE_AFM:
499
s = kpse_find_file(name, kpse_afm_format, 0);
501
case FSEARCH_FORMAT_TYPE_PSHEADER:
502
s = kpse_find_file(name, kpse_tex_ps_header_format, 0);
509
if (vf_dbg_kpathsea == 1){
511
printf(">> Kpathsea: Found %s\n", s);
513
printf(">> Kpathsea: Not found\n");
530
search_file(char *name, char *dir,
531
SEXP_LIST compressed_ext_list, char **p_uncompr_prog)
532
/* NOTE: CALLER OF THIS FUNCTION *SHOULD* RELEASE RETURN VALUE. */
539
if ((dir != NULL) && (vf_path_directory_read_ok(dir) == FALSE))
545
path_len = strlen(dir) + strlen(name) + 64;
546
/* +64 for compressed extensions. Their lengths must be less 64. */
547
ALLOCN_IF_ERR(path, char, path_len){
548
vf_error = VF_ERR_NO_MEMORY;
552
/* search non-compressed file */
553
vf_path_cons_path(path, path_len, dir, name);
554
if (vf_path_file_read_ok(path))
557
if (compressed_ext_list == NULL){
562
/* search compressed file */
564
for (s = compressed_ext_list; vf_sexp_consp(s); s = vf_sexp_cdr(s)){
565
ext = vf_sexp_get_cstring(vf_sexp_car(s));
566
vf_path_cons_path2(path, path_len, dir, name, ext);
567
if (vf_path_file_read_ok(path) == TRUE){
577
if (ext2uncprog(ext, compressed_ext_list, p_uncompr_prog) < 0){
586
/* Obtain uncompression program name from extension */
588
ext2uncprog(char *ext, SEXP_LIST compressed_ext_list, char **p_uncompr_prog)
589
/* NOTE: CALLER OF THIS FUNCTION *SHOULD NOT* RELEASE
590
RETURN VALUE IN P_UNCOMPR_PROG. */
595
if (p_uncompr_prog == NULL)
598
*p_uncompr_prog = NULL;
599
for (q = vf_uncompresser_alist; vf_sexp_consp(q); q = vf_sexp_cdr(q)){
601
uncext = vf_sexp_get_cstring(vf_sexp_car(p));
602
if (strcmp(uncext, ext) == 0){
603
*p_uncompr_prog = vf_sexp_get_cstring(vf_sexp_cadr(p));
607
if (*p_uncompr_prog == NULL){
608
fprintf(stderr, "VFlib Warning: %s %s\n",
609
"Undefined uncompression program for file extension", ext);
612
if (vf_dbg_font_search == 1)
613
printf(">> Uncompression program: %s\n", *p_uncompr_prog);
619
vf_tex_make_glyph(int type, char *font_name, int dpi, double mag)
622
#ifndef WITH_KPATHSEA
628
char *name, *filename;
631
kpse_glyph_file_type file_ret;
636
case FSEARCH_FORMAT_TYPE_PK:
638
kp_fmt = kpse_pk_format;
644
if ((name = vf_path_base_core(font_name)) == NULL)
647
fprintf(stderr, "Generating %s.%d%s (dpi=%d, mag=%.3f)...\n",
648
name, (unsigned)(dpi*mag+0.5), ext, dpi, mag);
651
kpse_set_program_enabled(kp_fmt, MAKE_TEX_PK_BY_DEFAULT, kpse_src_compile);
653
filename = kpse_find_glyph(name, (unsigned)(dpi*mag+0.5), kp_fmt, &file_ret);
654
if (filename == NULL){
655
fprintf(stderr, "\nFailed.\n");
660
fprintf(stderr, "Done.\n");
665
#endif /*WITH_KPATHSEA*/
671
#ifndef RECURSIVE_FILE_SEARCH
674
search_file_recursive(char *name, char *dir,
675
SEXP_LIST compressed_ext_list, char **p_uncompr_prog)
683
len = strlen(dir) + 1;
684
ALLOCN_IF_ERR(d, char, len){
685
vf_error = VF_ERR_NO_MEMORY;
690
vf_path_del_terminating_2delims(d);
691
if (vf_path_directory_read_ok(d) == FALSE){
695
path = search_file(name, d, compressed_ext_list, p_uncompr_prog);
701
#else /*RECURSIVE_FILE_SEARCH*/
706
struct s_dtr_list *prev;
707
struct s_dtr_list *next;
713
struct s_dtr_elem *next;
714
struct s_dtr_elem *prev;
715
struct s_dtr_list subdirs;
718
char path[MAXPATHLEN];
719
struct s_dtr_elem *direc_head;
720
struct s_dtr_elem *direc_tail;
723
typedef struct s_dtr_list *DTR_LIST;
724
typedef struct s_dtr_elem *DTR_ELEM;
725
typedef struct s_dtr *DTR;
727
Private DTR dtr_alloc(char*);
728
Private void dtr_free(DTR);
729
Private char* dtr_get_path(DTR);
730
Private int dtr_add_name(DTR, char*, int);
731
Private void dtr_del_name(DTR);
732
Private int dtr_add_subdir(DTR, struct dirent*, struct stat*);
733
Private DTR_LIST dtr_subdir_list(DTR);
734
Private DTR_LIST dtr_next_subdir(DTR, DTR_LIST);
735
Private int dtr_go_subdir(DTR, DTR_LIST);
736
Private int dtr_go_updir(DTR);
738
Private char *traverse_directory(DTR, char*, SEXP_LIST, char**);
742
search_file_recursive(char *name, char *dir,
743
SEXP_LIST compressed_ext_list, char **p_uncompr_prog)
752
len = strlen(dir) + 1;
753
ALLOCN_IF_ERR(d, char, len){
754
vf_error = VF_ERR_NO_MEMORY;
758
vf_path_del_terminating_2delims(d);
760
if (vf_path_directory_read_ok(d) == FALSE){
765
if (vf_dbg_font_search == 1)
766
printf(">> Search Recursively in: %s\n", d);
768
if ((dtr = dtr_alloc(d)) == NULL){
773
path = traverse_directory(dtr, name, compressed_ext_list, p_uncompr_prog);
782
traverse_directory(DTR dtr, char *name,
783
SEXP_LIST compressed_ext_list, char **p_uncompr_prog)
792
if (vf_dbg_font_search == 1)
793
printf(">> Searching in: %s\n", dtr_get_path(dtr));
795
/* search a file in a directory */
796
path = search_file(name, dtr_get_path(dtr),
797
compressed_ext_list, p_uncompr_prog);
801
/* obtain a set of subdirectories in a directory */
802
if ((dir = opendir(dtr_get_path(dtr))) == NULL)
804
while ((ent = readdir(dir)) != NULL){
805
if ((NAMLENGTH(ent) == 1) && (strcmp(ent->d_name, ".") == 0))
807
if ((NAMLENGTH(ent) == 2) && (strcmp(ent->d_name, "..") == 0))
810
dtr_add_name(dtr, ent->d_name, NAMLENGTH(ent));
811
v = stat(dtr_get_path(dtr), &st);
815
if ((st.st_mode & S_IFMT) == S_IFDIR){
816
dtr_add_subdir(dtr, ent, &st);
821
/* search a file under subdirectories */
823
for (sd = dtr_subdir_list(dtr); sd != NULL; sd = dtr_next_subdir(dtr, sd)){
824
if (dtr_go_subdir(dtr, sd) >= 0){
825
path = traverse_directory(dtr, name,
826
compressed_ext_list, p_uncompr_prog);
842
if ((dtr_elem = (DTR_ELEM)malloc(sizeof(struct s_dtr_elem))) == NULL)
845
dtr_elem->path_index = 0;
848
dtr_elem->next = NULL;
849
dtr_elem->prev = NULL;
850
dtr_elem->subdirs.name = NULL;
851
dtr_elem->subdirs.prev = &dtr_elem->subdirs;
852
dtr_elem->subdirs.next = &dtr_elem->subdirs;
857
dtr_elem_free(DTR_ELEM dtr_elem)
859
DTR_LIST dl, dl_next;
861
dl = dtr_elem->subdirs.next;
862
while (dl != &dtr_elem->subdirs){
873
dtr_alloc(char *topdir)
879
if ((dtr = (DTR)malloc(sizeof(struct s_dtr))) == NULL)
881
dtr->direc_head = NULL;
882
dtr->direc_tail = NULL;
883
strcpy(dtr->path, topdir);
884
vf_path_del_terminating_2delims(dtr->path);
885
if (stat(dtr->path, &st) < 0)
888
if ((dtr_elem = dtr_elem_alloc()) == NULL)
890
dtr->direc_head = dtr_elem;
891
dtr->direc_tail = dtr_elem;
892
dtr_elem->path_index = strlen(dtr->path);
893
dtr_elem->dev = st.st_dev;
894
dtr_elem->ino = st.st_ino;
905
DTR_ELEM dtr_elem, dtr_elem_next;
909
dtr_elem = dtr->direc_head;
910
while (dtr_elem != NULL){
911
dtr_elem_next = dtr_elem->next;
912
dtr_elem_free(dtr_elem);
913
dtr_elem = dtr_elem_next;
919
dtr_get_path(DTR dtr)
925
dtr_add_subdir(DTR dtr, struct dirent *ent, struct stat* st)
927
DTR_LIST dl_new, dl_0, dl_1;
929
if ((dl_new = (DTR_LIST)malloc(sizeof(struct s_dtr_list))) == NULL)
931
if ((dl_new->name = (char*)malloc(NAMLENGTH(ent)+1)) == NULL){
936
memcpy(dl_new->name, ent->d_name, NAMLENGTH(ent));
937
dl_new->name[NAMLENGTH(ent)] = '\0';
938
memcpy(&dl_new->st, st, sizeof(struct stat));
940
dl_0 = &dtr->direc_tail->subdirs;
951
dtr_go_subdir(DTR dtr, DTR_LIST sd)
953
DTR_ELEM dtr_elem, elem;
955
if (dtr_add_name(dtr, sd->name, strlen(sd->name)) < 0)
958
for (elem = dtr->direc_head; elem != NULL; elem = elem->next){
959
if ((elem->dev == sd->st.st_dev) && (elem->ino == sd->st.st_ino)){
966
if ((dtr_elem = dtr_elem_alloc()) == NULL){
971
dtr_elem->path_index = strlen(dtr->path);
972
dtr_elem->dev = sd->st.st_dev;
973
dtr_elem->ino = sd->st.st_ino;
974
dtr_elem->prev = dtr->direc_tail;
975
dtr->direc_tail->next = dtr_elem;
976
dtr->direc_tail = dtr_elem;
982
dtr_go_updir(DTR dtr)
986
tail_elem = dtr->direc_tail;
987
if (tail_elem == NULL){
988
fprintf(stderr, "FATAL: CANNOT HAPPEN --- in dtr_go_updir().\n");
991
tail_elem->prev->next = NULL;
992
dtr->direc_tail = tail_elem->prev;
993
dtr_elem_free(tail_elem);
1002
dtr_subdir_list(DTR dtr)
1008
ss = dtr->direc_tail->subdirs.prev;
1010
while (ss != &dtr->direc_tail->subdirs){
1011
printf("%s, ", ss->name);
1017
if ((sd = dtr->direc_tail->subdirs.prev) == &dtr->direc_tail->subdirs)
1024
dtr_next_subdir(DTR dtr, DTR_LIST sd)
1028
if ((next = sd->prev) == &dtr->direc_tail->subdirs)
1035
dtr_add_name(DTR dtr, char *name, int len)
1040
index = dtr->direc_tail->path_index;
1042
for (p = vf_directory_delimiter; *p != '\0'; p++){
1043
dtr->path[index++] = *p;
1046
dtr->path[index++] = *(name++);
1049
dtr->path[index] = '\0';
1055
dtr_del_name(DTR dtr)
1057
dtr->path[dtr->direc_tail->path_index] = '\0';
1060
#endif /* RECURSIVE_FILE_SEARCH */
1068
recursive_searcher(char *path, struct dirent *ent, struct stat *st)
1070
SEXP_ALIST iter, q, s;
1071
char *ext, *uncext, *uncprog;
1074
if (rec_target_file_len > NAMLENGTH(ent))
1076
if (strncmp(ent->d_name, rec_target_file, rec_target_file_len) != 0)
1079
if ((rec_target_file_len == NAMLENGTH(ent))
1080
&& (strncmp(rec_target_file, ent->d_name, NAMLENGTH(ent)) == 0)){
1081
recursive_searcher_found(path);
1085
if (rec_compressed_ext != NULL){
1086
for (iter = rec_compressed_ext;
1087
vf_sexp_consp(iter);
1088
iter = vf_sexp_cdr(iter)){
1089
ext = vf_sexp_get_cstring(vf_sexp_car(iter));
1090
if ((ext == NULL) || (strcmp(ext, "") == 0))
1092
ext_len = strlen(ext);
1093
if ((ext_len == (NAMLENGTH(ent) - rec_target_file_len))
1094
&& (strncmp(&ent->d_name[rec_target_file_len], ext, ext_len) == 0)){
1096
for (s = vf_uncompresser_alist; vf_sexp_consp(s); s = vf_sexp_cdr(s)){
1098
uncext = vf_sexp_get_cstring(vf_sexp_car(q));
1099
if (strcmp(uncext, ext) == 0){
1100
uncprog = vf_sexp_get_cstring(vf_sexp_cadr(q));
1104
if (rec_p_uncompression_program != NULL)
1105
*rec_p_uncompression_program = uncprog;
1106
if (uncprog == NULL){
1107
fprintf(stderr, "VFlib Warning: %s %s\n",
1108
"Undefined compression program for file extension", ext);
1111
if (vf_dbg_font_search == 1)
1112
printf(">> Uncompression program: %s\n", uncprog);
1113
recursive_searcher_found(path);
1123
recursive_searcher_found(char *path)
1127
if ((len = strlen(file_path) + 32) > file_path_length){
1129
file_path_length = len;
1130
ALLOCN_IF_ERR(file_path, char, file_path_length){
1131
file_path_length = 0;
1132
vf_error = VF_ERR_NO_MEMORY;
1136
strcpy(file_path, path);
1137
rec_found_file = file_path;