Date: 12 Apr 2002 03:35:10 -0700 From: Max Okumoto <okumoto@ucsd.edu> To: freebsd-libh@FreeBSD.ORG Subject: cleanup of HSystem (stage 1) Message-ID: <hfbscp6w81.fsf@multivac.sdsc.edu>
next in thread | raw e-mail | index | archive | help
* (HSystem.hh) Cleanup API by reducing number of externally accesable
types and methods.
* (HSystem.hh) Cleanup API by changing the following output routines to
private, and added gen_file() which calls them in sequence.
gen_header()
gen_classes_interfaces()
gen_register_command_access()
gen_footer()
* (HSystem.hh) Declared new types to be used in stage 2 of cleanup
ClassDesc, MethodDesc, CallBackDesc
* (HSystem.hh) Flaged a problem in the copy constructor.
* (HSystem.hh) Added Doxygen style comments.
* (HSystem.hh) Corrected comment for build_systems().
* (tcl_interface_gen.cc) Cleaned up main() by using more descriptive variable
names.
* (tcl_interface_gen.cc) Cleaned up main() by using new gen_file() method.
* (tcl_interface_gen.cc) Started mucking white space.
Index: include/HSystem.hh
===================================================================
RCS file: /home/libh/cvs/libh/include/HSystem.hh,v
retrieving revision 1.5
diff -u -r1.5 HSystem.hh
--- include/HSystem.hh 2002/04/11 23:35:52 1.5
+++ include/HSystem.hh 2002/04/12 10:03:25
@@ -37,75 +37,129 @@
#ifndef HSystem_hh
#define HSystem_hh
-#ifndef LanguageInterface_hh
#include "LanguageInterface.hh"
-#endif
-#include <iostream.h>
-
-#include <set>
+#include <iostream>
#include <list>
-
-//======================================================================
+#include <set>
-class HSystem
-{
- public:
- typedef list<const LanguageInterface::Object::ClassDescription*> Descriptions;
- typedef set<string> Includes;
- typedef list<const char*> CommandAccessToRegister;
- typedef list<pair<string,string> > StaticMethods;
-
- HSystem( const string& aName )
- : name( aName ) {}
- HSystem( const HSystem& aHSystem )
- : name( aHSystem.name ) {}
-
- void add_class( const LanguageInterface::Object::ClassDescription* class_desc, const string& include_file )
- {
- descriptions.push_back( class_desc );
- includes.insert( include_file );
- }
-
- void gen_header( ostream& out );
- void gen_classes_interfaces( ostream& out );
- void gen_register_command_access( ostream& out );
- void gen_footer( ostream& out );
-
- Descriptions descriptions;
- Includes includes;
- CommandAccessToRegister commandAccessToRegister;
- StaticMethods staticMethods;
-
- string name;
- bool operator < ( const HSystem& toCompare ) const { return name < toCompare.name; }
- bool operator == ( const HSystem& toCompare ) const { return name == toCompare.name; }
-
- private:
- void gen_class_header( ostream& out, const LanguageInterface::Object::ClassDescription* aClassDescription );
- void gen_callback_interfaces( ostream& out, const LanguageInterface::Object::ClassDescription* aClassDescription );
- void gen_dynamic_methods_interfaces( ostream& out, const LanguageInterface::Object::ClassDescription* aClassDescription );
- void gen_static_method_interfaces( ostream& out, const LanguageInterface::Object::ClassDescription* aClassDescription );
- string gen_result_to_obj( LanguageInterface::Object::MethodDescription::Value t );
- string gen_method_argument( LanguageInterface::Object::MethodDescription::Value t, int argno, int method_argno, bool last_arg_in_set_method );
+/**
+ * Represent a libh subsystem object.
+ */
+class HSystem {
+ typedef LanguageInterface::Object::ClassDescription ClassDesc;
+ typedef LanguageInterface::Object::MethodDescription MethodDesc;
+ typedef LanguageInterface::Object::CallbackDescription CallBackDesc;
+
+ typedef list<const ClassDesc *> Descriptions;
+ typedef set<string> Includes;
+ typedef list<const char *> CommandAccessToRegister;
+ typedef list<pair<string,string> > StaticMethods;
+
+ Descriptions descriptions;
+ Includes includes;
+ CommandAccessToRegister commandAccessToRegister;
+ StaticMethods staticMethods;
+
+public:
+ const string name; /**< Name of the subsystem. */
+
+ /**
+ * Constructor.
+ */
+ HSystem(const string& aName)
+ : name(aName) {}
+
+ /**
+ * Copy constructor. XXX This is broken! None of the other state is
+ * copied!
+ */
+ HSystem(const HSystem& aHSystem)
+ : name(aHSystem.name) {}
+
+ /**
+ * LessThan operator.
+ */
+ bool operator<(const HSystem& rhs) const { return name < rhs.name; }
+
+ /**
+ * Equivilance operator.
+ */
+ bool operator==(const HSystem& rhs) const { return name == rhs.name; }
+
+ /**
+ * Adds the class description and include file to the system definition.
+ *
+ * @param class_desc
+ * @param include_file
+ *
+ * @see find_classes_descriptions.pl
+ */
+ void
+ add_class(const ClassDesc *class_desc, const string& include_file)
+ {
+ descriptions.push_back(class_desc);
+ includes.insert(include_file);
+ }
+
+ /**
+ * Generate libh subsystem tcl interface text.
+ *
+ * @param out stream to send text.
+ */
+ void
+ gen_file(ostream& out)
+ {
+ gen_header(out);
+ gen_classes_interfaces(out);
+ gen_register_command_access(out);
+ gen_footer(out);
+ }
+
+private:
+ /**
+ * Output header and includes. The output text contains a
+ * warning that it is a generated source file.
+ *
+ * @param out stream to send text.
+ */
+ void gen_header(ostream& out) const;
+
+ /**
+ * @param out stream to send text.
+ */
+ void gen_classes_interfaces(ostream& out);
+
+ /**
+ * @param out stream to send text.
+ */
+ void gen_register_command_access(ostream& out);
+
+ /**
+ * @param out stream to send text.
+ */
+ void gen_footer(ostream& out) const;
+
+ void gen_class_header(ostream& out, const ClassDesc* aClassDescription);
+ void gen_callback_interfaces(ostream& out, const ClassDesc* aClassDescription);
+ void gen_dynamic_methods_interfaces(ostream& out, const ClassDesc* aClassDescription);
+ void gen_static_method_interfaces(ostream& out, const ClassDesc* aClassDescription);
+ string gen_result_to_obj(MethodDesc::Value t);
+ string gen_method_argument(MethodDesc::Value t, int argno, int method_argno, bool last_arg_in_set_method);
}; // class HSystem
-//======================================================================
-
/**
* a set of systems
*/
typedef set<HSystem> Systems;
-//======================================================================
-
/**
* Initialize a subsystem and register it.
*
* The implementation of this function must add the subsystem to the
* Systems set. The subsystem added must include all classes
- * description the subsystems wishes to make accessible from TCL.
+ * description the subsystems wishes to make accessible to TCL.
*
* @note this function is created by find_classes_descriptions.pl for
* each subsystem.
@@ -113,8 +167,6 @@
* @see find_classes_descriptions.pl
* @param systems the set of HSystem objects to add the subsystem to
*/
-void build_systems( Systems& systems );
-
-//======================================================================
+void build_systems(Systems& systems);
#endif // HSystem_hh
Index: lib/tcl/tcl_interface_gen.cc
===================================================================
RCS file: /home/libh/cvs/libh/lib/tcl/tcl_interface_gen.cc,v
retrieving revision 1.7
diff -u -r1.7 tcl_interface_gen.cc
--- lib/tcl/tcl_interface_gen.cc 2001/09/20 21:17:50 1.7
+++ lib/tcl/tcl_interface_gen.cc 2002/04/12 10:03:27
@@ -1,5 +1,5 @@
/*-
- * Copyright (c) 1998-2001 The FreeBSD Project
+ * Copyright (c) 1998-2002 The FreeBSD Project
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
@@ -33,13 +33,8 @@
// Eugene Skepner <eu@qub.com>
// $Id: tcl_interface_gen.cc,v 1.45 1999/01/06 15:17:48 eugene Exp $
-#ifndef HSystem_hh
#include "HSystem.hh"
-#endif
-
-#ifndef String_hh
#include "String.hh"
-#endif
#include <fstream>
#include <stdexcept>
@@ -47,30 +42,41 @@
#include <ctime>
#include <cstdio>
-int main( int argc, char** argv )
+/**
+ * Main entry point for tcl bindings generator. Create a nessisary code
+ * tcl to access the functions.
+ *
+ * @returns 0 for success, 1 for incorrect number of args,
+ * 2 for some an exception.
+ */
+int
+main(int argc, char** argv)
{
+ const string progname = argv[0];
+
if ( argc != 3 ) {
- cerr << "Usage: " << argv[0] << " <system-name> <file-to-generate>" << endl;
+ cerr << "Usage: " << progname << " <system-name> <file-to-generate>" << endl;
return 1;
}
+ const string name = argv[1];
+ const string ofile = argv[2];
+
try {
Systems systems;
build_systems( systems );
- Systems::iterator system = systems.find( HSystem( argv[1] ) );
+ Systems::const_iterator system = systems.find(HSystem(name));
if ( system == systems.end() )
- throw runtime_error( string( "System " ) + argv[1] + " is unknown" );
+ throw runtime_error("System " + name + " is unknown");
- ofstream out( argv[2] );
+ ofstream out(ofile.c_str());
if ( !out )
- throw runtime_error( string( "Unable to create " ) + argv[2] + ": " + ::strerror( errno ) );
+ throw runtime_error("Unable to create " + ofile +
+ ": " + ::strerror(errno));
HSystem& s = const_cast<HSystem&>( *system );
- s.gen_header( out );
- s.gen_classes_interfaces( out );
- s.gen_register_command_access( out );
- s.gen_footer( out );
+ s.gen_file(out);
}
catch ( exception& err ) {
cerr << "Error: " << err.what() << endl;
@@ -81,7 +87,8 @@
} /* main */
-void HSystem::gen_header( ostream& out )
+void
+HSystem::gen_header(ostream& out) const
{
time_t t = time( 0 );
out << "/*" << endl;
@@ -110,7 +117,8 @@
} /* HSystem::gen_header */
-void HSystem::gen_class_header( ostream& out, const LanguageInterface::Object::ClassDescription* aClassDescription )
+void
+HSystem::gen_class_header(ostream& out, const LanguageInterface::Object::ClassDescription* aClassDescription)
{
out << "class " << replace_chars( aClassDescription->name, ':', '_' ) << "Access : ";
if ( aClassDescription->parents[0] ) {
@@ -129,7 +137,8 @@
} /* HSystem::gen_class_header */
-void HSystem::gen_callback_interfaces( ostream& out, const LanguageInterface::Object::ClassDescription* aClassDescription )
+void
+HSystem::gen_callback_interfaces(ostream& out, const LanguageInterface::Object::ClassDescription* aClassDescription)
{
if ( aClassDescription->has_callbacks() ) {
out << " virtual void activate_callback( Tcl_Interp* interp, Tcl_Obj* aCommand, Tcl_Obj* aUserData, Tcl_Obj* aArg, LanguageInterface::SpecificCallbackData& aSpecificCallbackData )\n"
@@ -170,7 +179,8 @@
} /* HSystem::gen_callback_interfaces */
-void HSystem::gen_dynamic_methods_interfaces( ostream& out, const LanguageInterface::Object::ClassDescription* aClassDescription )
+void
+HSystem::gen_dynamic_methods_interfaces(ostream& out, const LanguageInterface::Object::ClassDescription* aClassDescription)
{
out << " static int methodCommand( ClientData obj, Tcl_Interp *interp, int objc, Tcl_Obj *const objv[] )\n"
<< " {\n"
@@ -347,7 +357,8 @@
} /* HSystem::gen_dynamic_methods_interfaces */
-void HSystem::gen_static_method_interfaces( ostream& out, const LanguageInterface::Object::ClassDescription* aClassDescription )
+void
+HSystem::gen_static_method_interfaces( ostream& out, const LanguageInterface::Object::ClassDescription* aClassDescription)
{
if ( aClassDescription->staticMethods() > 0 ) {
out << " public:\n";
@@ -412,26 +423,27 @@
} /* HSystem::gen_static_method_interfaces */
-void HSystem::gen_classes_interfaces( ostream& out )
+void
+HSystem::gen_classes_interfaces(ostream& out)
{
for ( Descriptions::const_iterator di = descriptions.begin(); di != descriptions.end(); ++di ) {
- cout << (*di)->name << endl;
+ const char *name = (*di)->name;
+
+ cout << name << endl;
gen_class_header( out, *di );
gen_dynamic_methods_interfaces( out, *di );
gen_static_method_interfaces( out, *di );
gen_callback_interfaces( out, *di );
- out << "}; /* class " << replace_chars( (*di)->name, ':', '_' ) << "Access */\n";
-
+ out << "}; /* class " << replace_chars(name, ':', '_') << "Access */\n";
out << endl;
out << endl;
- commandAccessToRegister.push_back( (*di)->name );
+ commandAccessToRegister.push_back(name);
}
-
-} /* HSystem::gen_dynamic_methods_interfaces */
+} /* HSystem::gen_classes_interfaces */
-
-void HSystem::gen_register_command_access( ostream& out )
+void
+HSystem::gen_register_command_access(ostream& out)
{
out << "void register_command_access_tcl()\n"
<< "{\n";
@@ -455,7 +467,8 @@
} /* HSystem::gen_register_command_access */
-void HSystem::gen_footer( ostream& out )
+void
+HSystem::gen_footer(ostream& out) const
{
out << "/* end */" << endl;
out << endl;
@@ -463,7 +476,8 @@
} /* HSystem::gen_footer */
-string HSystem::gen_result_to_obj( LanguageInterface::Object::MethodDescription::Value t )
+string
+HSystem::gen_result_to_obj(LanguageInterface::Object::MethodDescription::Value t)
{
switch ( (LanguageInterface::Object::MethodDescription::ValueType)t ) {
case LanguageInterface::Object::MethodDescription::vtVoid:
@@ -500,7 +514,8 @@
} /* HSystem::gen_result_to_obj */
-string HSystem::gen_method_argument( LanguageInterface::Object::MethodDescription::Value t, int argno, int method_argno, bool last_arg_in_set_method )
+string
+HSystem::gen_method_argument(LanguageInterface::Object::MethodDescription::Value t, int argno, int method_argno, bool last_arg_in_set_method)
{
string result;
if ( t.optional() && t != LanguageInterface::Object::MethodDescription::vtList && t != LanguageInterface::Object::MethodDescription::vtListRef && t != LanguageInterface::Object::MethodDescription::vtListPtr && !last_arg_in_set_method ) {
@@ -559,3 +574,4 @@
return(result);
} /* HSystem::gen_method_argument */
+
To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-libh" in the body of the message
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?hfbscp6w81.fsf>
