1 // $Id: Naming.cc,v 1.37 2003/04/25 07:23:32 christof Exp $
2 /* glade--: C++ frontend for glade (Gtk+ User Interface Builder)
3 * Copyright (C) 1998 Christof Petig
4 * Copyright (C) 1999-2000 Adolf Petig GmbH & Co. KG, written by Christof Petig
5 *
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation; either version 2 of the License, or
9 * (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
18 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
19 */
20
21 #warning copying and substituting in place would be much more efficient
22
23 #include "Naming.hh"
24 #include "Configuration.hh"
25 #include <cctype>
26 #include <unistd.h>
27 // kind of macro misuse, but everything else is non-portable
28 #define __FILELINE__ __FILE__ << ':' << __LINE__ <<
29
Capitalize(const std::string & s)30 const std::string Naming::Capitalize(const std::string &s) throw()
31 { std::string ret("");
32 std::string::const_iterator i=s.begin();
33 for (;i!=s.end() && *i=='_';++i) ret+=*i;
34 if (i!=s.end()) ret+=toupper((unsigned char)*(i++));
35 for (;i!=s.end();++i) ret+=*i;
36 return ret;
37 }
38
TypeName(const std::string & tag,bool glade) const39 const std::string Naming::TypeName(const std::string &tag,bool glade) const
40 { std::string ret(ToCIdentifier(tag));
41 if (Configuration.do_case_conversion) ret=Capitalize(ret);
42 if (glade) ret+=(Configuration.do_case_conversion?"_Glade":"_glade");
43 return ret;
44 }
45
LowerCase(const std::string & s)46 const std::string Naming::LowerCase(const std::string &s) throw()
47 { std::string ret("");
48 std::string::const_iterator i=s.begin();
49 for (;i!=s.end();++i) ret+=tolower((unsigned char)*i);
50 return ret;
51 }
52
InstanceName(const std::string & tag) const53 const std::string Naming::InstanceName(const std::string &tag) const
54 { if (Configuration.do_case_conversion) return LowerCase(ToCIdentifier(tag));
55 else return ToCIdentifier(tag);
56 }
57
FileName(const std::string & tag,File_type tp,int flags) const58 const std::string Naming::FileName(const std::string &tag,File_type tp,int flags) const
59 { std::string ret;
60
61 if (!(flags&File_NODIR))
62 { switch(tp)
63 { case File_FOO_GLADE_HH:
64 case File_FOO_HH:
65 case File_FOO_GLADE_CC:
66 case File_FOO_CC:
67 case File_MAIN_CC:
68 case File_SUPPORT_HH:
69 case File_SUPPORT_CC:
70 case File_MAKEFILE_AM:
71 case File_BASECLASSES_HH:
72 ret=Configuration.destination_directory
73 +Configuration.source_directory+"/";
74 break;
75
76 case File_CONFIGURE_IN:
77 case File_AUTOGEN_SH:
78 case File_README:
79 case File_AUTHORS:
80 case File_ChangeLog:
81 case File_NEWS:
82 case File_TODO:
83 case File_ACCONFIG_H:
84 case File_toplevel_MAKEFILE_AM:
85 ret=Configuration.destination_directory;
86 if (ret.size() && ret[ret.size()-1]!='/') ret+='/';
87 break;
88
89 case File_po_ChangeLog:
90 case File_po_POTFILES_in:
91 ret=Configuration.destination_directory;
92 if (ret.size() && ret[ret.size()-1]!='/') ret+='/';
93 ret+="po/";
94 break;
95
96 case File_MAKEFILE:
97 if (!Configuration.no_autoconf)
98 { ret=Configuration.destination_directory;
99 }
100 else
101 { ret=Configuration.destination_directory
102 +Configuration.source_directory+"/";
103 }
104 if (ret.size() && ret[ret.size()-1]!='/') ret+='/';
105 break;
106
107 default: assert(0); break;
108 }
109 }
110 switch(tp)
111 { case File_FOO_GLADE_HH:
112 ret+=FName(tag);
113 ret+="_glade" + Configuration.header_suffix;
114 break;
115 case File_SUPPORT_HH:
116 ret+="glademm_support" + Configuration.header_suffix;
117 break;
118 case File_SUPPORT_CC:
119 ret+="glademm_support";
120 ret+=flags&File_OBJECT?".o": Configuration.source_suffix;
121 break;
122 case File_FOO_HH:
123 ret+=FName(tag);
124 ret+= Configuration.header_suffix;
125 break;
126 case File_FOO_GLADE_CC:
127 ret+=FName(tag);
128 ret+="_glade";
129 ret+=flags&File_OBJECT?".o": Configuration.source_suffix;
130 break;
131 case File_FOO_CC:
132 ret+=FName(tag);
133 ret+=flags&File_OBJECT?".o": Configuration.source_suffix;
134 break;
135 case File_ACCONFIG_H:
136 ret+="acconfig.h";
137 break;
138 case File_MAKEFILE:
139 ret+="Makefile";
140 break;
141 case File_toplevel_MAKEFILE_AM:
142 case File_MAKEFILE_AM:
143 ret+="Makefile.am";
144 break;
145 case File_CONFIGURE_IN:
146 ret+="configure.in";
147 break;
148 case File_AUTOGEN_SH:
149 ret+="autogen.sh";
150 break;
151 case File_MAIN_CC:
152 ret+=Configuration.main_filename;
153 ret+=flags&File_OBJECT?".o": Configuration.source_suffix;
154 break;
155 case File_README: ret+="README"; break;
156 case File_AUTHORS: ret+="AUTHORS"; break;
157 case File_po_ChangeLog:
158 case File_ChangeLog: ret+="ChangeLog"; break;
159 case File_NEWS: ret+="NEWS"; break;
160 case File_TODO: ret+="TODO"; break;
161 case File_po_POTFILES_in: ret+="POTFILES.in"; break;
162 case File_BASECLASSES_HH:
163 ret+=Configuration.main_filename;
164 ret+="_base";
165 ret+= Configuration.header_suffix;
166 break;
167 default:
168 std::cerr<<__FILELINE__" attempt to create unknown file type " << int(tp) << "\n";
169 ret+='?';
170 break;
171 }
172 switch (tp)
173 { case File_FOO_GLADE_HH:
174 case File_SUPPORT_HH:
175 case File_SUPPORT_CC:
176 case File_FOO_HH:
177 case File_FOO_GLADE_CC:
178 case File_FOO_CC:
179 case File_ACCONFIG_H:
180 case File_MAKEFILE:
181 case File_toplevel_MAKEFILE_AM:
182 case File_MAKEFILE_AM:
183 case File_CONFIGURE_IN:
184 case File_AUTOGEN_SH:
185 case File_MAIN_CC:
186 case File_BASECLASSES_HH:
187 if ((flags&File_GLADE) || ((flags&File_NOREPLACE) && !access(ret.c_str(),F_OK)))
188 { ret+=Configuration.template_postfix;
189 }
190 break;
191 case File_README:
192 case File_AUTHORS:
193 case File_po_ChangeLog:
194 case File_ChangeLog:
195 case File_NEWS:
196 case File_TODO:
197 case File_po_POTFILES_in:
198 default:
199 break;
200 }
201 return ret;
202 }
203
FileDefine(const std::string & tag,File_type tp) const204 const std::string Naming::FileDefine(const std::string &tag,File_type tp) const
205 { std::string ret(tag);
206 switch(tp)
207 { case File_FOO_GLADE_HH:
208 ret+="_glade" + Configuration.header_suffix;
209 break;
210 case File_FOO_HH:
211 ret+= Configuration.header_suffix;
212 break;
213 case File_BASECLASSES_HH:
214 ret+= Configuration.main_filename+"baseclasses"+Configuration.header_suffix;
215 break;
216 default:
217 std::cerr << __FILELINE__" attempt to create unknown define type " << int(tp) << "\n";
218 break;
219 }
220 return "_"+DefineName(ret);
221 }
222
UpperCase(const std::string & s)223 const std::string Naming::UpperCase(const std::string &s) throw()
224 { std::string ret;
225 for (std::string::const_iterator i=s.begin();i!=s.end();++i)
226 ret+=toupper((unsigned char)*i);
227 return ret;
228 }
229
DefineName(const std::string & tag) const230 const std::string Naming::DefineName(const std::string &tag) const throw()
231 { std::string ret(ToCIdentifier(tag));
232 if (!Configuration.mixedcase_defines) ret=UpperCase(ret);
233 return ret;
234 }
235
CName(const std::string & tag) const236 const std::string Naming::CName(const std::string &tag) const throw()
237 { return ToCIdentifier(tag);
238 }
239
240 // since people seem to use identifiers like '1', translate them to
241 // something different from '_'
242
243 static const char * const digitnames[10]
244 = { "zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine" };
245
ToCIdentifier(const std::string & tag)246 const std::string Naming::ToCIdentifier(const std::string &tag) throw()
247 { std::string ret("");
248 std::string::const_iterator i=tag.begin();
249 // first char [_a-zA-Z]
250 if (i!=tag.end())
251 { if ('0' <= *i&&*i <= '9') ret+=digitnames[*i-'0'];
252 else if (!(*i=='_' || ('a' <= *i&&*i <= 'z') || ('A' <= *i&&*i <= 'Z')))
253 ret+='_';
254 else ret+=*i;
255 ++i;
256 }
257 // now [_a-zA-Z0-9]
258 for (;i!=tag.end();++i)
259 { if (!(*i=='_' || ('a' <= *i&&*i <= 'z') || ('A' <= *i&&*i <= 'Z')
260 || ('0' <= *i&&*i <= '9')))
261 ret+='_';
262 else ret+=*i;
263 }
264 return ret;
265 }
266
CString(const std::string & x) const267 const std::string Naming::CString(const std::string &x) const throw()
268 { std::string ret("");
269 std::string::const_iterator i=x.begin();
270 for (;i!=x.end();++i)
271 { switch((unsigned char)*i)
272 { case '"': ret+="\\\"";
273 break;
274 case '\\': ret+="\\\\";
275 break;
276 case '\n': ret+="\\n\"\n\t\t\"";
277 break;
278 default: ret+=*i;
279 break;
280 }
281 }
282 return ret;
283 }
284
static_Translatable(const std::string & s) const285 const std::string Naming::static_Translatable(const std::string &s) const
286 { if (!Configuration.gettext_support) return CString_WithQuotes(s);
287 return "N_("+CString_WithQuotes(s)+")"; }
288
Translatable(const std::string & s) const289 const std::string Naming::Translatable(const std::string &s) const
290 { if (!Configuration.gettext_support) return CString_WithQuotes(s);
291 return "_("+CString_WithQuotes(s)+")"; }
292
ToFileName(const std::string & x)293 const std::string Naming::ToFileName(const std::string &x) throw()
294 { std::string ret("");
295 std::string::const_iterator i=x.begin();
296 for (;i!=x.end();++i)
297 { switch((unsigned char)*i)
298 { case 0 ... 31:
299 // case 127 ... 159: these are valid UTF8 !
300 ret+="_";
301 break;
302 default: ret+=*i;
303 break;
304 }
305 }
306 return ret;
307 }
308
GtkmmIncludePath() const309 const std::string Configuration::GtkmmIncludePath() const throw()
310 { if (Gtkmm2()) return "gtkmm/";
311 return "gtk--/";
312 }
313
GnomeUImmIncludePath() const314 const std::string Configuration::GnomeUImmIncludePath() const throw()
315 { return Gnome2() ? "libgnomeuimm/" : "gnome--/";
316 }
317
GnomemmIncludePath() const318 const std::string Configuration::GnomemmIncludePath() const throw()
319 { return Gnome2() ? "libgnomemm/" : "gnome--/";
320 }
321
BonobommIncludePath() const322 const std::string Configuration::BonobommIncludePath() const throw()
323 { return "bonobomm/";
324 }
325
BonoboUImmIncludePath() const326 const std::string Configuration::BonoboUImmIncludePath() const throw()
327 { return "bonobomm/";
328 }
329
select_Gnome1()330 void Configuration::select_Gnome1()
331 { if (!gnome2) return;
332 gnome2=false;
333 gtk_version.set_if_more_specific(Pkg_Version(GTK_MAJOR,GTK_MINOR,GTK_MICRO,Pkg_Version::Glademm_Compile_Time));
334 gtkmm_version.set_if_more_specific(Pkg_Version(GTKMM_MAJOR,GTKMM_MINOR,GTKMM_MICRO,Pkg_Version::Glademm_Compile_Time));
335 #ifdef GNOMEMM_MAJOR
336 libgnomemm_version.set_if_more_specific(Pkg_Version(GNOMEMM_MAJOR,GNOMEMM_MINOR,GNOMEMM_MICRO,Pkg_Version::Glademm_Compile_Time));
337 libgnomeuimm_version.set_if_more_specific(Pkg_Version(GNOMEMM_MAJOR,GNOMEMM_MINOR,GNOMEMM_MICRO,Pkg_Version::Glademm_Compile_Time));
338 #endif
339 }
340
select_Gnome2()341 void Configuration::select_Gnome2()
342 { if (gnome2) return;
343 gnome2=true;
344 gtk_version.set_if_more_specific(Pkg_Version(GTK2_MAJOR,GTK2_MINOR,GTK2_MICRO,Pkg_Version::Glademm_Compile_Time));
345 gtkmm_version.set_if_more_specific(Pkg_Version(GTKMM2_MAJOR,GTKMM2_MINOR,GTKMM2_MICRO,Pkg_Version::Glademm_Compile_Time));
346 #ifdef LIBGNOMEMM_MAJOR
347 libgnomemm_version.set_if_more_specific(Pkg_Version(LIBGNOMEMM_MAJOR,LIBGNOMEMM_MINOR,LIBGNOMEMM_MICRO,Pkg_Version::Glademm_Compile_Time));
348 #endif
349 #ifdef LIBGNOMEUIMM_MAJOR
350 libgnomeuimm_version.set_if_more_specific(Pkg_Version(LIBGNOMEUIMM_MAJOR,LIBGNOMEUIMM_MINOR,LIBGNOMEUIMM_MICRO,Pkg_Version::Glademm_Compile_Time));
351 #endif
352 #ifdef LIBBONOBOMM_MAJOR
353 libbonobomm_version.set_if_more_specific(Pkg_Version(LIBBONOBOMM_MAJOR,LIBBONOBOMM_MINOR,LIBBONOBOMM_MICRO,Pkg_Version::Glademm_Compile_Time));
354 #endif
355 #ifdef LIBBONOBOUIMM_MAJOR
356 libbonobouimm_version.set_if_more_specific(Pkg_Version(LIBBONOBOUIMM_MAJOR,LIBBONOBOUIMM_MINOR,LIBBONOBOUIMM_MICRO,Pkg_Version::Glademm_Compile_Time));
357 #endif
358 has_accelerators=true; // make it standard
359 }
360