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