-rwxr-xr-x | libopie2/tools/regen.py | 198 |
1 files changed, 187 insertions, 11 deletions
diff --git a/libopie2/tools/regen.py b/libopie2/tools/regen.py index 3779896..89385e1 100755 --- a/libopie2/tools/regen.py +++ b/libopie2/tools/regen.py @@ -1,31 +1,36 @@ #!/usr/bin/env python -# -# regenerate ioctl_table.h -# +"""Regenerate C++ mapping classes""" + +#---------------------------------------------------------------------------# +# # +#---------------------------------------------------------------------------# + +def regenDebugMapper( basename ): + """ + Debug Mapper - maps ioctl numbers to names, e.g. 0x4x5a -> SIOCGIWNAME + """ -import sys -import os result = os.popen( 'find /usr/include -name "*.h" |xargs grep -h SIOC|grep 0x' ).readlines() try: - tablehfile = file( sys.argv[1]+".h", "w" ) + tablehfile = file( basename+".h", "w" ) except: tablehfile = sys.stdout try: - tablecfile = file( sys.argv[1]+".cpp", "w" ) + tablecfile = file( basename+".cpp", "w" ) except: tablecfile = sys.stdout print >>tablehfile,""" /* - * debug value mapper - generated by regen.py - (C) Michael 'Mickey' Lauer <mickey@vanille.de> + * debug value mapper - generated by %s - (C) Michael 'Mickey' Lauer <mickey@vanille.de> */ #ifndef DEBUGMAPPER_H #define DEBUGMAPPER_H #include <qstring.h> #include <qintdict.h> @@ -38,32 +43,32 @@ class DebugMapper ~DebugMapper(); const QString& map( int value ) const; private: IntStringMap _map; }; #endif -""" +""" % sys.argv[0] print >>tablecfile,""" /* - * debug value mapper - generated by regen.py - (C) Michael 'Mickey' Lauer <mickey@vanille.de> + * debug value mapper - generated by %s - (C) Michael 'Mickey' Lauer <mickey@vanille.de> */ #include <opie2/odebug.h> #include "%s" DebugMapper::DebugMapper() { odebug << "DebugMapper::DebugMapper()" << oendl; -""" % (tablehfile.name) +""" % ( sys.argv[0], tablehfile.name ) for line in result: l = line.split() if not l[0].startswith( "#define" ) or not l[2].startswith( "0x" ): print >>sys.stderr, "can't parse line: %s" % l continue print >>tablecfile, " _map.insert( %s, new QString(\"%s\") );" % ( l[2], l[1] ) @@ -89,8 +94,179 @@ const QString& DebugMapper::map( int value ) const } else { return *result; } } """ + +#---------------------------------------------------------------------------# +# # +#---------------------------------------------------------------------------# + +def regenManufacturerDB( basename ): + + try: + h = file( basename+".h", "w" ) + except: + h = sys.stdout + + try: + cpp = file( basename+".cpp", "w" ) + except: + cpp = sys.stdout + + print >>h,""" +#ifndef OMANUFACTURERDB_H +#define OMANUFACTURERDB_H + +#include <qmap.h> + +/** + * @brief A Ethernet card vendor database. + * + * This class encapsulates the lookup of Ethernet vendor given a + * certain Mac Address. Only the first three bytes define the vendor. + */ +class OManufacturerDB +{ + public: + /** + * @returns the one-and-only @ref OManufacturerDB instance. + */ + static OManufacturerDB* instance(); + /** + * @returns the short manufacturer string given a @a macaddr. + */ + const QString& lookup( const QString& macaddr ) const; + /** + * @returns the enhanced manufacturer string given a @a macaddr. + */ + const QString& lookupExt( const QString& macaddr ) const; + + protected: + OManufacturerDB(); + virtual ~OManufacturerDB(); + + private: + QMap<QString, QString> manufacturers; + QMap<QString, QString> manufacturersExt; + static OManufacturerDB* _instance; +}; + +#endif +""" + + print >>cpp,""" +#include "%s.h" + +/* OPIE CORE */ +#include <opie2/odebug.h> + +/* QT */ +#include <qapplication.h> +#include <qstring.h> + +#define OPIE_IMPROVE_GUI_LATENCY 1 + +OManufacturerDB* OManufacturerDB::_instance = 0; + +OManufacturerDB* OManufacturerDB::instance() +{ + if ( !OManufacturerDB::_instance ) + { + odebug << "OManufacturerDB::instance(): creating OManufacturerDB..." << oendl; + _instance = new OManufacturerDB(); + } + return _instance; +} + + +OManufacturerDB::OManufacturerDB() +{ +""" % basename + + count = 0 + for line in sys.stdin: + if line[0] == "#": # skip comments + continue + #print line.strip() + entries = line.strip().split() + #print "number of entries =", len( entries ) + #print entries + if len( entries ) < 2: + continue + elif len( entries ) == 2: + count += 1 + print "2-line detected." + print >>cpp, ' manufacturers.insert( "%s", "%s" );' % ( entries[0], entries[1] ) + print >>cpp, ' manufacturersExt.insert( "%s", "%s" );' % ( entries[0], entries[1] ) + elif len( entries ) > 2: + count += 1 + print "3-line detected." + print >>cpp, ' manufacturers.insert( "%s", "%s" );' % ( entries[0], entries[1] ) + print >>cpp, ' manufacturersExt.insert( "%s", "%s" );' % ( entries[0], "_".join( entries[3:] ) ) + else: + assert( false ) + if not (count % 1000): + print >>cpp,""" +#ifdef OPIE_IMPROVE_GUI_LATENCY + if (qApp) qApp->processEvents(); +#endif +""" + print "successfully parsed", count, "manufacturer lines" + print >>cpp,""" +} + + +OManufacturerDB::~OManufacturerDB() +{ +} + + +const QString& OManufacturerDB::lookup( const QString& macaddr ) const +{ + return manufacturers[macaddr.upper().left(8)]; +} + + +const QString& OManufacturerDB::lookupExt( const QString& macaddr ) const +{ + QMap<QString,QString>::ConstIterator it = manufacturersExt.find( macaddr.upper().left(8) ); + return it == manufacturersExt.end() ? lookup( macaddr ) : *it; +} +""" + +#---------------------------------------------------------------------------# +# # +#---------------------------------------------------------------------------# + +#---------------------------------------------------------------------------# +# # +#---------------------------------------------------------------------------# + +#---------------------------------------------------------------------------# +# # +#---------------------------------------------------------------------------# + +import sys +import os +import copy + +if __name__ == "__main__": + if len( sys.argv ) != 3: + print """ +Usage: %s <table> <basename> + +Available tables: %s +""" % ( sys.argv[0], [ str(k)[5:] for k in copy.copy( locals() ) if k.startswith( "regen" ) ] ) + sys.exit( -1 ) + + try: + func = locals()["regen%s" % sys.argv[1]] + except KeyError: + print "Table '%s' unknown." % sys.argv[1] + sys.exit( -1 ) + else: + func( sys.argv[2] ) + sys.exit( 0 )
\ No newline at end of file |