Projekte für Freiberufler – Liste der Agenturen und Portale für IT Projekte

Dies sind meine “Fundstellen” für freiberufliche IT-Projekte. Die Links sind zur Zeit weder sortiert noch katalogisiert. Also gibt die Reihenfolge keine Aussage über die Qualität der Agentur.

Wo auch immer es möglich war, habe ich die Projektliste direkt verlinkt. Ansonsten sind es die Links der Firmen, bei denen es sich anzufragen lohnt. Für alle Hinweise auf ungültige Links bin ich sehr dankbar. Ich würde mich auch auf Eure Linkssammlung sehr freuen.

Viel Erfolg bei Eurer Projektsuche!
Valentin Heinitz

centomo GmbH & Co. KG – Embedded, Automotive, SAP, Finanzen
AURELLY TECHNOLOGIES GmbH – Automotive, Embedded
CIRIC Software GmbH – HMI, Design, Mobile
ASSpro e.K. – Embedded, Konstruktion
Careerjet – Jobsuchmaschine, die auch freiberufliche Projekte bietet.
LV Consulting GmbH
atensis Consulting Expert-Recruiter aus Dietzenbach – Steinberg. SAP, WEB, QA, CM
VOLT Personaldienstleister mit Vertretung (u.A.) in München. Telekommunikation, Medizintechnik, Spielindustrie. Keine Projektausschreibungen auf der Webseite.
mymotion.de – Embedded, Konstruktion, QM, PM. Gut gestaltete Webseite mit Projektauflistung und Profileingabemöglichkeit.
Portal free-lancer.eu – Kostenlose Projektvermittlung für Freelancer und Unternehmen. Möglichkeit, sich kostenlos als Freiberufler einzutragen. Name, Stunden-/Tagessatz sind für alle sichtbar.
Euro London Appointments – Vermittlung vom mehrsprachigen Personal, auch von freiberuflichen IT-Spezialisten. Jobsuchmaschiene auf der Startseite. Niederlassungen in Deutschland in Frankfurt, Düsseldorf und München.
bonabendis GmbH Viele Projektausschreibungen auf der Webseite. SAP, Java, Finanzen
Pronovit AG SAP, QA, viele Projekte auf der Webseite.
be1ne Unternehmensberatung – .NET, Java, SAP, Finanzen
IDM Support & Consulting GbR EDV-GbR aus Berlin, die auch mit Freiberuflern zusammen arbeitet. Keine Projektausschreibung auf der Webseite.
Sterling Consulting – IT-Beratungsagentur aus München. Keine Projektausschreibung auf der Webseite.
msg systems AG – IT-Beratungsunternehmen aus München. Keine Angaben, ob sie mit Freiberuflern zusammen arbeiten, eher Arbeitnehmerüberlassungsmodell. SAP, Automotive, Finanzen, Versicherungswesen.
MGW – EDV- und Informatik-Büro aus Gernsheim, die auch mit Freiberuflern zusammen arbeiten. Automatisierung, Medizintechnik
Kumgeo GmbH – Kleinere IT-Beratungsgesellschaft aus Hamburg, die auch mit Freiberuflern zusammen arbeiten. Automotive, Raumfahrt.
it-projekte.de – Portal für IT-Projekte, Anmeldung erforderlich.
LV Consulting – Agentur aus Rüsselsheim. Finanzen.
DV-RATIO – Java, C#, SAP, Business und Finanzen. Ausschreibungen sind für Festanstellungen, angeblich arbeiten sie jedoch auch mit Freelancern.
BGI E-Commerce, Finanzen, Energie. Keine Projektausschreibungen auf der Webseite.
BEST JOB IT Services Niederlassungen in Hamburg, München, Berlin. IT-Support/Administration, SAP, MS-Technilogien
Xiopia GmbH Ein Unternehmen der ALLGEIER Holding aus D8-Raum.
7G-Consult – Start-Up Agentur aus Darmstadt. Viele Projekte auf der Webseite, kein klares Profil.
Flex-Base Eine kleinere Agentur aus Düsseldorf. Keine Projektausschreibungen auf der Webseite.
Oxford Europe Automotive, Medizintechnik, Avionik
Arateam Personalberatung, Executive Search aus Nürnberg.
SERMA GmbH IT-Dienstleister mit mehreren Niederlassungen (Berlin, Nürnbern). Festanstellung und freiberufliche Mitarbeit möglich.
consultingpool Unternehmensberatung Automotive, Finanzen
Systeme24 IT-Dienstleistungen GmbH Spezialist Recruitment aus Mainz. Überwiegend SAP, DB, E-Commerce.
unitepeople GmbH Beratungs- und Personaldienstleister mit Niederlassungen in Heidelberg und Berlin.
Accelsis Technologies GmbH Finanzbranche, Java EE, SOA
viadee Unternehmensberatung GmbH Java EE, Projekt-, Prozessmanagement, QA
IDM Germany – Java EE, IT-Infrastruktur, Datenbanken
VISPIRON AG Technologieunternehmen, das auch mit Freuberuflern zusammen arbeitet – Automotive, Embedded, Luftfahrt,
Huxley AssociatesFrankfurter Niederlassung des internationalen Recruitment-Unternehmens. Finanzen, IT, Energieversorgung.
Fox Department Finanzen. IT-Berater aus Frankfurt/M.
Bertrandt Services Engineering-Dienstleister, die auch mit Freiberuflern zusammen arbeiten.
Axxessio GmbH IT-Berater mit Niederlassungen in Köln und Darmstadt, die auch mit Freiberuflern zusammen arbeiten. Web-Projekte und Projekte für Mobile Plattformen (Android, iP.*, etc.)
Richard Gruber Gonsulting Java, E-Commerce
DIS AG IT-Dienstleister mit überwiegender Mitarbeitform – Arbeitnehmenüberlassung. Angeblich bieten sie auch freiberufliche Projekte an.
NTC-Systems/
ABSOLUT PersonalManagement Festanstellung (überwiegend) und Projekte in den Bereichen Automotive, Energie, Medizin, Halbleiter.
SyroCon GmbH IT-Berater Firma aus Eschborn (bei Frankfurt)
adesta GmbH & Co. KG Agentur aus Darmstadt.
MC IT Solutions – IT-Unternehmen aus Wiesbaden, das Laut der Selbstbeschreibung mit Freiberuflern arbeitet.
IPSWAYS – Unternehmen aus Mainz für Softwareentwicklung und IT-Experten.
http://www.linux-lancers.com – Projekte für Freiberufler mit Linuxkentnissen. Es werden auch Diplomarbeiten, Studienprojekte, Festanstellungen ausgeschrieben. Viele Projekte veraltet.
CONNEXIS Projekte und Stellen im süddeutschen Raum.
people4project.com Überwiegend SAP Projekte.
Consultime Registrierung erforderlich.
http://www.profi4project.com – Projektportal für Freiberufler der PASS Consulting.
XING In Forum “Freiberufler Projektmarkt” Verfügbarkeit posten.
Megapart GmbH
Consileon IT-Beratung, Karlsruhe. Finanzen, Automotive. Keine Projektausschriebungen auf der Seite.
ProTechnology IT-Dienstleister, überwiegend MS-Produkte, Dresden
AraCom – Agentur aus Augsburg. uC, C++, Mainframes, Hardwarenahe Projekte überwiegend im Raum München. Es besteht eine Möglichkeit, Projektnewsletters zu abonnieren.

Constaff
Etengo
http://varius-it.com – Überwiegend SAP, Finanzen
1st solution consulting GmbH
resoom.de Scannt andere Projektportale nach Projekten. Scheint noch nicht ausgereift zu sein, aber man kann schnell rausfinden, welche Portale es gibt.
Infutura Freelance-Portal
www.zeitgeist-at-work.com – Suchmaschine für Projekte/Freiberufler
Reutax
www.cs2-informatik.de Projekte überwiegend in D8 Raum. SAP, C++, Java
www.solcom.de
www.bsf-consulting.de Überwiegend Festanstellung
request2 – Keine Projekte aufgelistet, jedoch gute Vermittlungschancen.
Computerfutures
xpsnet.de
www.rosa-ag.de
Freelance.de
www.future-consulting.de Überwiegend SAP Projekte in Rhein-Main Region
Hays AG – höflich, fair, kompetent (meine Erfahrung)
http://www.valentum.de Projekte für Freiberufler und Festanstellung
www.valyue.de
www.gft.com
www.personality-it.de Gute C++ Projekte.
www.magic-dream-personal.de u.A. Automotive Projekte in Rhein-Main und im Norddeutschen Raum
de.progressiverecruitment.com
www.harveynash.com
exco.de Überwiegend Festanstellung
www.talisman-software.com Überwiegend Executives
www.freelancermap.de Portal für Projekte
GULP Portal für IT-Freiberufler. Projekte aus allen Branchen.
www.projektwerk.de Portal für Projekte
www.goetzfried-ag.com Überwiegend SAP, Finanzen
www.it-jobs.stepstone.de Überwiegend Festanstellung
www.elan-it-resource.de Überwiegend SAP, Finanzen
www.expertnet.de
www.projekt-pool.de
Actinium Consulting GmbH Keine Projektliste auf der Webseite, lohnt sich dennoch Profil einzureichen
ProTechnology – Gesellschaft für lösungsorientierte Informationstechnologien mbH
www.abcona.de
www.lenroxx.com
BBV Software Services AG, hauptsächlich Projekte in Schweiz
www.sw-xperts.com
www.tekom-gmbh.de
http://www.dozentenscout.de – Portal zum Anbieten von Vorträgen oder Schulungen
BlueCarat – Überwiegend Finance/SAP in Frankfurt
http://www.joinvision.com/ Portal für Freelancer. DE-CH-AT
Freelance-Market – Don’t call us, we’ll call you. Möglichkeit, sich als Freelancer einzutragen. Nicht auf IT beschränkt.
karriere.at – Portalbereich für IT-Jobs und Projekte in Österreich
Syspoint ConsultingKeine Projektausschreibung auf der Webseite.
Apriori AG Keine Projektausschreibungen auf der Webseite.
Computerwoche Eine Suchmaschine der Zeitschrift Computerwoche. Keine eigene Projekte.
IQ-Net SAP, Finanzen, E-Commerce.
euro engineering IT-Dienstleister mit Vertretungen in mehreren Standorten. Keine Angabe, ob sie auch mit Freelancern arbeiten.
comebis GmbH IT-Dienstleistungsunternehmen im D4-Raum (Ratingen). Keine Projektausschreibungen auf der Webseite.
Matchtech GmbH IT-Dienstleistungsunternehmen aus Stuttgart. Stellen- und Projektanzeigen auf der Webseite. Avionik, Automotive, Energie, Automatisierung

QoolPersistence – Persistence easy in Qt4

Mein zweites kleines Projekt bei Google-Code ist online. QoolPersistence ist eine Singleton-Klasse und einige Makros, die es erlauben, persistente Daten in kleinen Qt4 Programmen sehr einfach zu implementieren. Persistente Daten können z.Z. integer, QStrings oder Eigenschaften von QObjects sein. Weiter Infos und natürlich das Quelcode dazu sind hier: Qoolpersistence

Things you should have done before introducing unit-testing in your software project.

Software Quality Improvement Strategy

This is a the presentation in English about how to increase quality of a software project with low costs. I have prepared it for one of my customers who considered to introduce unit-testing. As usual (I have seen this scenario many times in several companies), the “UT-framework selection orgy” began. The time passed by, the ressources were allocated to evaluation and the developers were busy debating how this or that feature of a particular UT-framework could be used in the project.

This short presentation suggests four steps to do before introducing unit-testing. The goal is to reach considerable quality improvement with low effort and to take advantage already during the introduction-phase of unit-testing.

If you would like me to hold this presentation on your premises, please see my contact details.

Generierung von Getters und Setters für C++ Klassen mit VIm

Ich selbst benutze zwar vi nicht als IDE zum Entwickeln, finde es aber sehr nützlich als mächtiges Search&Replace Tool. In diesem Beispiel geht es darum, wie man schnell aus privaten Member-Variablen einer (C++) Klasse die public Getter- und Setter-Funktionen erzeugen kann.
Die drei Variablen kopiere ich aus VisualStudio ins VIm:

QString _viewer;
QString _viewerArgs;
QString _previewRegex;

Wie man sieht, mein präferiertes Namensstil ( das ich von GoF übernommen habe ) ist für private Member: _memberName.
Die Getter heißen bei mir: const T & memberName () const;
Die Setter: void setMemberName (const T & memberName) ;

Die Getter erzeuge ich mit:

:1,$s/\(\w\+\)\s\+_\(\w\+\).*/const \1 \& \2() const {return _\2;}/

Ergebnis:

const QString & viwer const {return _viewer;};
const QString & viwerArgs const {return _viewerArgs;};
const QString & previwRegex const {return _previewRegex;};

Den Code copiere ich in public-Bereich der Klasse in VisualStudio und mache UNDO in VIm mit “ESC u”:
Und ähnlich für die Setters. Dabei wird der erste Buchstabe nach _ in Großbuchstaben konvertiert (\u):

:1,$s/\(\w\+\)\s\+_\(\w\)\(\w\+\).*/void set\u\2\3(const \1 \& \2\3){ _\2\3 = \2\3;}/

Ergebnis:


void setViwer(const QString & viewer){ _viewer = viewer;}
void setViwerArgs(const QString & viewerArgs){ _viewerArgs = viewerArgs;}
void setPreviwRegex(const QString & previewRegex){ _previewRegex = previewRegex;}

Einige alte Projekte

Nach dem Umbau der Webseite habe ich erst-mal die alten Projekte gelöscht. Überraschenderweise wurde ich hin und wieder von den Besuchern angeschrieben, die ein altes Link auf der Webseite nicht mehr gefunden haben. Die Anfragen nach den alten Projekten oder Artikeln haben mich natürlich sehr gefreut, und ich stelle die Dateien gerne wieder zur Verfügung.

Shape Widget – Ein Beispiel, wie man ein Widget in Qt3 in beliebiger Form darstellt. Für Qt4 habe ich die Portierung sehr freundlicher weise von Falko Buttler bekommen. Allerdings würde ich dieses Problem in Qt4 z.Z. mit Stylesheets und transparenten Pixmaps lösen.

Kezb – Ein Tool um beliebige Zeichen von einer Standardtastatur einzugeben. Ich habe es selbst lange benutzt um mit deutscher Tastatur kyrilisch zu schreiben. Mittlerweile benutzt ich allerdings dafür www.translit.ru.

GOTO Ireland: – Meine Erfahrung als Jobsuchender in Irland.

J2ME – Getting Started – Kurze J2ME Einführung. Ich habe sie geschrieben, als ich meine ersten Schritte mit Java-Programmierung für ein Siemens-Handy gemacht habe.

Subtitle assistant – Ein kleines C++ Projekt um aus DVD-Untertiteln Wortlisten mit Übersetzung und Anwendungsbeispielen zu erzeugen.

Selfmade BlackBerry 8800 emergency charger

Today I’ve got a kind of emergency. The USB-slot of my BlackBerry 8800 has broken. There was no chance to charge the mobile phone with a USB-cable. A broken BlackBerry is bad enough, but the worst thing was – it happened on a business trip. As I couldn’t find a cradle charger for BlackBerry 8800 in any shop around, I decided to make one myself.
My search in Internet for self-made charger HOWTO has brought no results. However it revealed, that I was not the only one owner of BlackBerry 8800 with broken USB-slot. All the question from my fellows in misfortune were in English, which motivated me to write this post.

BlackBerry 8800 has a power-connector on the left side. A multimeter told me, that upper contact was for plus and lower for minus (lower contact is connected to ground).

I’ve cut the Slim-USB ending of the USB-cable off and removed 10mm of cladding from power wires. Attention! There is no guarantee, that on your USB-Cable the red wire is + and black is -. Test the polarity with a multimeter first!
USB Cable

A piece of sticky tape did the rest of the job – connected the wires to the BlackBerry power connector.

You may ask, how I’d found out that USB on my laptop is just the source of power BlackBerry 8800 wants? Well the only thing I knew, was It wouldn’t harm my laptop as USB has built-in short-circuit guard. And for BlackBerry, well I gave it a chance and it worked.

Good luck with charging your phone!
Valentin Heinitz

ATTENTION! Try it on your own risk. I will not take any responsibility for any damage on your BlackBerry or computer.

GMT (jeeamtee) – Mein erstes Projekt bei Google-Code

GMT ist eine C++ Klasse für Manipulation von Speicherblöcken. Ich habe sie während eines hardware-nahes Projektes implementiert, um die Hardware (FPGA) auf einem Embedded-Board mit einem komfortablen Konsolen-Tool testen zu können. Eine solche Konsolenapplikation wird mit GMT zu einem Zehnzeiler.

Die ursprüngliche Applikation hieß gmm (Generic Memory Manipulator) und war zum Teil auch beim Kunden entwickelt. GMT ( Generic Memory Tool ) wurde neu geschrieben und hat von gmm nur die Idee geerbt. Außerdem habe ich mich entschlossen, das Projekt nicht als eine Applikation zu entwickeln sondern als eine Klasse (oder auch eine winzige Klassenbibliothek).

Die Einfachheit und das Komfort, bei Google Open-Source Projekte zu hosten, hat mich sehr positiv überrascht. Man kann von dem Workflow und von der Projektmanagementumgebung viel lernen. Ich bin mir sicher, es wird nicht mein letztes Google-Code Projekt sein.

Das Projekt ist gehostet bei: https://code.google.com/p/jeeamtee/

Viel Erfolg damit und vielen Dank für alle Anregungen!
Valentin Heinitz

P.S.: Ah ja, warum so seltsamer Name? Der Projektname GMT war bei google-code bereits belegt, deshalb bin ich auf jeeamtee ausgewichen.

Fehlermeldungen von GCC in Visual Studio ausgeben

In vielen C/C++ Embedded-Projekten an denen ich mitgearbeitet habe, wurde als Compiler eine Variante von GCC genommen. Als Entwicklungsumgebung hat allerdings MS Visual Studio gedient. Für Visual Studio als IDE spricht vieles. MSVS ist schnell, bietet sehr gute Navigationsmöglichkeiten und löst die Symbole recht zuverlässig auch bei nicht kompilierbarem Code und losen Source-Dateien auf. (Leider kann ihmo Eclipse/CDT mit MSVS nicht mithalten und kommt z.B. bei (nicht trivialen) Templates mit der Symbolauflösung schnell durcheinander.)

In der Regel wurde der Buildvorgang mit einem Batch-Skript gestartet und die Buildergebnisse wie Fehler, Warnungen, etc. in eine Log-Datei umgeleitet.
Um eventuelle Fehler zu beseitigen, musste man mühselig nach dem Dateinamen und der Zeilennummer in der Log-Datei suchen und zu der Stelle in Visual Studio manuell gehen.
Da die Fehlerformate von GNU und MSVS unterschiedlich sind, kann Visual Studio mit den GCC Fehlermeldungen nichts anfangen.

Dabei kann ein sehr einfacher Konverter die Arbeit erleichtern, so dass man mit dem Doppelklick auf die Fehlermeldung sofort zur richtigen Stelle gelangt.
Der Fehlerformat von GNU ist:
GCC format: source.cpp:123: error: a gcc error message
Der Fehlerformat von MSVS ist:
MSVC++ format: source.cpp(123) : error: a MSVS error message
Der Konverter ist ein Einzeiler:
grep ": error:\|: warning:" "%1" | sed "s/:\([0-9]\+\): \(error\|warning\):/(\1) : \2: /"
Es werden UNIX-Tools grep und sed benutzt. Sie dürften auf keinem Entwicklerrechner fehlen, auch unter Windows: http://gnuwin32.sourceforge.net/.
Der Skript sollte als eine Batch-Datei implementiert werden (einfach die Zeile in z.B. gcc2msvs.bat kopieren), und mit der Fehlerlogdatei als Parameter aufgerufen werden.

Zum Einbinden in Visual Studio benutze ich immer folgendes:
In MSVS Menu anklicken “Tools->External Tools”, “Add” und folgende Felder ausfüllen:
Title: BugFixing
Command: Path/gcc2msvs.bat
Arguments: “Path/GccBuildLogOutput”
Use Output window: YES

Jetzt kann man sich die Fehlermeldungen vom letzten Build mit “Tools->BugFixing” anzeigen lassen. Das Gute daran ist, es funktioniert mit jeder MSVS Instanz, es bedarf keines gültigen Projektes oder Pfadeinstellungen.

Viel Spaß damit und viel Erfolg in Euren Projekten.
Valentin Heinitz

INI-FIle Parser als Einzeiler in Bash

Viele Programme speichern ihre Konfigurationsdaten immer noch im alten INI-Format ab. Das Format ist einfach: es gibt Sektionen, Schlüssel, Werte und Kommentare. Sektionen dürfen nicht ineinander geschachtelt werden, die Schlüssel innerhalb einer Sektion sollen eindeutig sein. Das Format ist zeilenbasiert, die Leerzeichen am Anfang und am Ende eines Tokens werden ignoriert.

[Section]
; Comment
Key = Value

Dieser Einzeiler ist ein Bash-Script zum Lesen der Werte aus solchen INI-Dateien. Das Script wird aufgerufen mit dem Dateinamen, dem Sektionsnamen und mit dem Schlüssel. Der Wert wird auf der Standardausgabe ausgegeben.
cat $INIFILE | sed -n /^\[$SECTION\]/,/^\[.*\]/p | grep "^[:space:]*$ITEM[:space:]*=" | sed s/.*=[:space:]*//
Zuerst wird der Inhalt entsprechender Sektion extrahiert. Danach wird die Zeile mit dem Schlüssel=Wert Paar für den gegebenen Schlüssel gefunden und davon der Wert genommen.

Viel Spaß damit, und denkt an XML als eine bessere Alternative für Konfigurationsdateien.
Hier ist das komplette Source-Listing für INI-Reader:

#!/bin/bash
#Valentin Heinitz, www.heinitz-it.de, 2008-11-13
#Reader for MS Windows 3.1 Ini-files
#Usage: inireader.sh

# e.g.: inireader.sh win.ini ERRORS DISABLE
# would return value "no" from the section of win.ini
#[ERRORS]
#DISABLE=no
INIFILE=$1
SECTION=$2
ITEM=$3
cat $INIFILE | sed -n /^\[$SECTION\]/,/^\[.*\]/p | grep "^[:space:]*$ITEM[:space:]*=" | sed s/.*=[:space:]*//

Enum2String

Beim Programmieren in C++ ist es oft nützlich, die enum-Werte nicht als Zahlen sondern als Symbole mit ihren Namen auszugeben. C++ bietet diese Funktionalität nicht an. Es kann aber mit kleinem Stück Code bewerkstelligt werden. Dieses Code wird nur dann aktiviert, wenn es erforderlich ist – meistens im Entwicklungsstadium und zur Fehlersuche.
Das hier vorgestellte Perl Skript erzeugt eine C++ Klasse, die viele überladene toString Methoden für alle im Projekt deklarierten Enums bietet. Außerdem wird hier kurz auf das nutzliche Tool ctags eingegangen.

Um alle enum-Deklarationen im Code zu finden, wäre das Parsen notwendig. C++ Code manuell (mit Perl) zu parsen, ist abenteuerlich. Es gibt eine viel einfachere und sicherere Mögligkeit – das Tool ctags.

Für jeden, der mit GNU Tool-Chain arbeitet, ist ctags sicherlich ein Begrif – das Tool parst Quellcode und erzeugt daraus Symboltabelle. Der Aufruf ctags -R * parst alle Verzeichnisse rekursiv und erzeugt eine Datei namens tags im Arbeitsverzeichnis. Zu jedem Symbol in der tags-Datei gibt es Information, in welcher Datei es deklariert wurde und mit welchem Regulärem Ausdruck es in der Datei zu finden ist. z.B. hier ist ein Ausschnitt aus der einer tags-Datei:

EnumA inc\enums1.h /^enum EnumA { eA1, eA2, eA3, };$/;" g
eA1 inc\enums1.h /^enum EnumA { eA1, eA2, eA3, };$/;" e enum:EnumA

Die erste Zeile besagt, dass in der Datei inc/enum1.h ein neuer Enum-Typ deklariert wird. Die zweite Zeile bedeutet – “enum eA1 ist ein enum vom Typ EnumA.”

Und tatsächlich, in der Testdatei inc/enums1.h findet man das EnumA:
///@file enums1.h
#ifndef ENUMS1_HG_
#define ENUMS1_HG_
enum
EnumA {
eA1, eA2, eA3, };
enum EnumB
{
eB1, // first enum
eB2, eB3=eA3,
// eBUnused,
/* eBUnused, */eB4
};
typedef enum ECStyle{
eCStyle1=0, eCStyle2=100,
};
typedef enum EStrangeStyle{
eStrangeStyle1, eStrangeStyle2
}EStrangeStyle;
#endif

Die Datei enums1.h ist eine gültige C++ Headerdatei. Ich habe dort vier Enumtypen deklariert. Die unterschiedlichen Schreibweisen habe ich absichtlich gewählt, um zu zeigen, dass manuelles Parsen keine triviale Aufgabe wäre. Diese Möglichkeiten, enums in C++ zu deklarieren, sind nicht hypothetisch. Ich habe sie alle schon im produktiven Code gesehen.
(Die Deklaration von EnumA und EnumB ist das, was man normalerweise in C++ benutzt. Die anderen, … na ja.)
Für Testzwecke habe ich im Verzeichnis inc eine weitere Datei hinterlegt:
///@file enums2.h
#ifndef ENUMS2_HG_
#define ENUMS2_HG_
enum EnumC { eC1, eC2, eC3, };
enum EnumD { eD1, eD2, eD3, };
#endif

Das komplete Perl-Skript samt dem Beispielprojekt findest Du unten, am Ende des Artikels. Hier ist eine kurze Erläuterung.

Das folgende Rreguläre Ausdruck enthält 2 “back-references” – Unterausdrucke, die nach dem Anwenden des Hauptausdrucks referenziert werden können. In Perl würden die reservierten Perl-Variablen $1 und $2 die Inhalte von den fettmarkierten Ausdrücken enthalten.
my $pat="^[^\t]+\t([^\t]+)\t.*enum:([a-zA-Z_][a-zA-Z0-9_]*)";
Zum Beispiel, nach Anwenden des oberen RegExp bei folgender Zeile würden die Perl-Variablen $1 und $2 die fettmarkierten Anteile enthalten:
eA1 inc\enums1.h /^ eA1, eA2, eA3, };$/;" e enum:EnumA

Folgende Schleife schreibt die gefundenen includes und enums in zwei Listen:
while () {
if (my ($m) = m/$pat/){
push @etypes, $2;
push @includes, $1;
}
}

Folgendes Codeschnipsel erzeugt aus beiden Listen, die mehrere gleiche Einträge enthalten können, Unique-Listen:
my %hlp1 = ();
my @uniqenums = grep { ! $hlp1{$_} ++ } @etypes;
my %hlp2 = ();
my @uniqinc = grep { ! $hlp2{$_} ++ } @includes;

Nun habe ich alle notwendigen Informationen für die Codegenerierung – Enum-Typen und Headerdateien.
Es wird eine Utility-Klasse (keine Instanzen möglich/sinnvoll) generiert, die mehrere überladenen statischen toString-Mehtoden hat z.B.:
static const char * toString( EnumA en ) {
switch( en ) {
case eA1: return "eA1";
case eA2: return "eA2";
case eA3: return "eA3";
}
}

Außerdem wird in der Klasse eine Testmethode definiert – static void testEnum2String(), die beim Aufruf alle toString Methoden testet. Enum-Wert und Enum-Symbolname werden auf der Standardausgabe ausgegeben.

Download

Copyright 2010, Valentin Heinitz