2 kpath.cc -- glue kpathsea to lily. Need some ugly kludges for gcc 2.96
4 source file of the GNU LilyPond music typesetter
6 (c) 2000--2004 Han-Wen Nienhuys <hanwen@cs.uu.nl>
14 The problem, as far as I can tell, is that MacOS X has its getopt
15 prototype in <unistd.h>, while I think other operating systems have it
16 in other places. <unistd.h> is included by kpathsea.h, so you end up
17 renaming both conflicting prototypes to YAKLUDGE.
19 I found a somewhat more elegant patch for this: Just #include
20 <unistd.h> before defining YAKLUDGE.
26 #define popen REALLYUGLYKLUDGE
27 #define pclose ANOTHERREALLYUGLYKLUDGE
28 #define getopt YAKLUDGE
30 #if HAVE_KPATHSEA_KPATHSEA_H
32 #include <kpathsea/kpathsea.h>
33 #include <kpathsea/tex-file.h>
37 #include "file-path.hh"
41 #include "source-file.hh"
45 kpathsea_find_afm (char const * name)
47 #if (KPATHSEA && HAVE_KPSE_FIND_FILE)
48 char * name_ptr = kpse_find_file (name, kpse_afm_format, true);
53 don't mutter about afms, since we try to find them first, and lots of
56 // warning (_f ("kpathsea couldn't find AFM file `%s'", name));
66 kpathsea_find_tfm (char const * name)
68 String p = global_path.find (String (name) + ".tfm");
73 #if (KPATHSEA && HAVE_KPSE_FIND_FILE)
74 char * name_ptr = kpse_find_file (name, kpse_tfm_format, true);
76 warning (_f ("kpathsea can not find TFM file: `%s'", name));
85 /* FIXME: this should be part of kpathsea */
87 static kpse_file_format_type
88 kpathsea_find_format (String name)
90 for (int i = 0; i < kpse_last_format; i++)
92 if (!kpse_format_info[i].type)
93 kpse_init_format ((kpse_file_format_type) i);
95 char const **suffixes[] = { kpse_format_info[i].suffix,
96 kpse_format_info[i].alt_suffix };
97 for (int j = 0; j < 2; j++)
98 for (char const **p = suffixes[j]; p && *p; p++)
101 if (name.right_string (suffix.length ()) == suffix)
102 return (kpse_file_format_type) i;
105 return kpse_last_format;
110 kpathsea_gulp_file_to_string (String name)
112 String filename = global_path.find (name);
114 #if (KPATHSEA && HAVE_KPSE_FIND_FILE)
115 if (filename.is_empty ())
117 char *p = kpse_find_file (name.to_str0 (), kpathsea_find_format (name),
122 warning (_f ("kpathsea can not find file: `%s'", name));
126 if (filename.is_empty ())
127 error (_f ("can't find file: `%s'", name));
129 if (verbose_global_b)
130 progress_indication ("[" + filename);
133 char *str = gulp_file (filename, &filesize);
137 if (verbose_global_b)
138 progress_indication ("]");
143 LY_DEFINE (ly_kpathsea_gulp_file, "ly:kpathsea-gulp-file",
145 "Read the file @var{name}, and return its contents in a string. "
146 "The file is looked up using the search path and kpathsea.")
148 SCM_ASSERT_TYPE (gh_string_p (name), name, SCM_ARG1, __FUNCTION__, "string");
149 return scm_makfrom0str
150 (kpathsea_gulp_file_to_string (ly_scm2string (name)).to_str0 ());
154 initialize_kpathsea (char *av0)
156 #if KPATHSEA && HAVE_KPATHSEA_KPATHSEA_H
158 We take two pronged approach to tfms:
160 * the lilypond tfms (feta*.tfm) are found through our own routines.
162 * the TeX tfms are found through vanilla kpathsea.
164 (* other TFMs are not found, i.e. don't use them. )
168 - TFM and AFM checksums always match in Lily.
170 - less hassle, no kpathsea spaghetti
174 - feta PK files are often recreated, locally
175 Solution: cache PK files locally?
177 - need env. vars to make sure that TeX finds the TFMs
179 - Outdated PK (TFM?) font files are not automatically removed,
180 since VERSION is not part of the standard location.
185 we have tried to come up with schemes that leave this kind of work
186 to kpathsea with objective of fixing the CONs, but miserably
187 failed. TeX installations and kpathsea itself form a buggy,
188 inconsistent, and unorderly mess.
195 kpse_set_program_name (av0, NULL);
196 kpse_maketex_option ("tfm", TRUE);