DBU
DBU
Um die abweichenden und unterschiedlichen Konzepte von Clipper und Xbase darzustellen, möchte ich hier kurz die Migration von DBU, der Data Base Utility von Nantucket, beschreiben.
Das Programm liegt im Quelltext vor und kann relativ leicht geändert werden. Gleichzeitig ist es aber auch so, dass DBU mehr oder weniger ein Project in Progress war. Auch haben die Programmierer an vielen Stellen die Beschränkungen von Clipper ausgenutzt.
Dazu gehört z.B. dass in Clipper Variablen-Namen auf 10 Stellen beschränkt waren, längere Namen waren "gültig", jedoch wurden immer nur die ersten 10 Stellen verwendet. (Diese Einschränkung haben dann auch die DBF-Dateien "geerbt").
Bereitstellen einer Projekt-Datei
Eigentlich sollte es ein leichtes sein, diese Migration vorzunehmen, da bis auf wenige Ausnahmen umfassende Kompatibilität besteht. Also, die DBU-Quellen in ein Verzeichnis gepackt, dann
dir *.prg /b > dbu.txt pbuild @dbu.txt pbuild
ausgeführt.
Erster PBuild-Lauf
Xbase++ (R) ProjectBuilder Version 1.90.355 Copyright (c) Alaska Software 1997-2009. All rights reserved. xpp /q /b /dDEBUG @C:\Users\n69304\AppData\Local\Temp\06041789.tmp Xbase++ (R) Compiler 1.90.355 Apr 9 2009 Copyright (c) Alaska Software. All rights reserved. File DBU.PRG successfully compiled. DBUCOPY.PRG(593:0): warning XBT0105: Function scope_num does not end with RETURN DBUCOPY.PRG(594:0): error XBT0232: LOCAL declaration follows executable statement DBUCOPY.PRG(701:0): warning XBT0105: Function MAIN does not end with RETURN DBUCOPY.PRG(704:0): warning XBT0105: Function tog_sdf does not end with RETURN DBUCOPY.PRG(705:0): error XBT0232: LOCAL declaration follows executable statement DBUCOPY.PRG(780:0): warning XBT0105: Function MAIN does not end with RETURN DBUCOPY.PRG(783:0): warning XBT0105: Function tog_delim does not end with RETURN DBUCOPY.PRG(784:0): error XBT0232: LOCAL declaration follows executable statement DBUCOPY.PRG(854:0): warning XBT0105: Function MAIN does not end with RETURN 3 error(s) found in file DBUCOPY.PRG! 'xpp /q /b /dDEBUG @C:\Users\ichbins\AppData\Local\Temp\06041789.tmp' returned error 3 Processing time: 0.29 secs.
Fehleranalyse
Das erste (hier aber nicht gelistete) Problem ist, dass der Einstiegspunkt in DBU.prg DBU() heisst, und nicht MAIN(), wie es Xbase++ erwartet.
1. Schritt: Umbenennen von DBU() in MAIN(). 2. Wir finden drei Fehler mit dem Hinweis, dass die LOCAL Deklaration auf eine ausführbare Anweisung folgt. Werfen wir einen Blick in DBUCOPY.PRG:
FUNCTION scope_num PARAMETERS sysparam local saveColor PRIVATE old_scope help_code = 17
Die Anweisung PARAMETERS definiert Variablen vom Type PRIVATE, die als Parameter an die Funktion scope_num übergeben werden. Per Definition sind die Deklarationen von PRIVATE und PUBLIC Variablen ausführbare Anweisungen und müssen auf die LOCAL (oder STATIC) Deklarationen folgen.
Da die drei anderen Fehler auf die gleiche Ursache zurückgehen, verschieben wir die PARAMETERS Deklaration hinter die folgende LOCAL Deklaration und wagen einen weiteren Compile-Lauf:
Xbase++ (R) ProjectBuilder Version 1.90.355 Copyright (c) Alaska Software 1997-2009. All rights reserved. xpp /q /b /dDEBUG @C:\Users\n69304\AppData\Local\Temp\06048276.tmp Xbase++ (R) Compiler 1.90.355 Apr 9 2009 Copyright (c) Alaska Software. All rights reserved. File DBUCOPY.PRG successfully compiled. File DBUEDIT.PRG successfully compiled. File DBUHELP.PRG successfully compiled. File DBUINDX.PRG successfully compiled. File DBUNET.PRG successfully compiled. File DBUSTRU.PRG successfully compiled. DBUUTIL.PRG(294:0): warning XBT0105: Function multibox does not end with RETURN DBUUTIL.PRG(295:0): error XBT0232: LOCAL declaration follows executable statement DBUUTIL.PRG(417:0): warning XBT0105: Function MAIN does not end with RETURN DBUUTIL.PRG(570:0): warning XBT0105: Function ok_button does not end with RETURN DBUUTIL.PRG(571:0): error XBT0232: LOCAL declaration follows executable statement DBUUTIL.PRG(618:0): warning XBT0105: Function MAIN does not end with RETURN DBUUTIL.PRG(621:0): warning XBT0105: Function can_button does not end with RETURN DBUUTIL.PRG(622:0): error XBT0232: LOCAL declaration follows executable statement DBUUTIL.PRG(664:0): warning XBT0105: Function MAIN does not end with RETURN DBUUTIL.PRG(699:0): warning XBT0105: Function itemlist does not end with RETURN DBUUTIL.PRG(700:0): error XBT0232: LOCAL declaration follows executable statement DBUUTIL.PRG(809:0): warning XBT0105: Function MAIN does not end with RETURN DBUUTIL.PRG(912:0): warning XBT0105: Function getfile does not end with RETURN DBUUTIL.PRG(913:0): error XBT0232: LOCAL declaration follows executable statement DBUUTIL.PRG(1006:0): warning XBT0105: Function MAIN does not end with RETURN DBUUTIL.PRG(1079:0): warning XBT0105: Function get_exp does not end with RETURN DBUUTIL.PRG(1080:0): error XBT0232: LOCAL declaration follows executable statement DBUUTIL.PRG(1159:0): warning XBT0105: Function MAIN does not end with RETURN DBUUTIL.PRG(1254:0): warning XBT0105: Function get_k_trim does not end with RETURN DBUUTIL.PRG(1255:0): error XBT0232: LOCAL declaration follows executable statement DBUUTIL.PRG(1346:0): warning XBT0105: Function MAIN does not end with RETURN DBUUTIL.PRG(2263:0): warning XBT0105: Function enter_rc does not end with RETURN DBUUTIL.PRG(2264:0): error XBT0232: LOCAL declaration follows executable statement DBUUTIL.PRG(2311:0): warning XBT0105: Function MAIN does not end with RETURN 8 error(s) found in file DBUUTIL.PRG! 'xpp /q /b /dDEBUG @C:\Users\ichbins\AppData\Local\Temp\06048276.tmp' returned error 8 Processing time: 0.44 secs.
Nach der Bearbeitung von DBUUTIL.prg und dem Verschieben der PARAMETERS Anweisung kommen die gleichen Fehler in DBUVIEW.prg hoch. Nach deren Behebung lässt sich das Programm ohne Fehlermeldung compilieren und linken. Und starten!
Leitfaden von Alaska
Es gibt für die Migration von DBU auch einen Leitfaden von Alaska, der von der Homepage heruntergeladen werden kann.
(Artikel noch in Bearbeitung)