Historique des corrections dans Dvfp
Le 16/10/06
1) La version 3.14 ne décompile pas bien :
Gather from a fields like
aa*, bb*
Dans Gather contrairement à la documentation la vraie
syntaxe n’est pas :
… FIELDS LIKE | EXCEPT
skeleton …
Mais
… FIELDS LIKE | EXCEPT
skeleton_list …
J’ai donc rectifié les fonctions Gather_stmt() et
Scatter_stmt() dans Statements.prg
2) Dans la version 3.14 j’avais oublié les options menu et
popup dans l’instruction push. J’ai donc corrigé la fonction push_stmt() dans
Statements.prg
3) La version 3.14 décompile bien :
x = lookup( fa, s, fb )
mais pas :
x = lookup( fa, left(s,3),
fb)
qui se décompile :
x = lookup( @fa, left(s,3),
@fb)
En fait il faut comprendre que la fonction lookup est
compilée en donnant les adresses des champs utilisés (ici fa et fb). C’est au
décompilateur d’enlever ces @ dans le cas de certaines fonctions (pour
simplifier la syntaxe). A cause de la récursivité, quand une fonction appelle
une autre fonction je détruisais la variable llTrimArobas car j’avais oublié de
la déclarer local dans la fonction BuildExpression de Expressions.prg ! C’est
corrigé.
4) Cosmétique. J’ai ajouté un ‘*’ devant le dump des
instructions pour que le texte reste compilable.
Le 17/10/06
5) Les constantes Datetime ne se décompile pas,
exemple :
dt = {^2006-10-17 12:45:00}
Je corrige en ajoutant un nouveau type de constante
T_DATETIME_, je modifie donc
- dfox.h
- tokens.prg
- expressions.prg
Dans expressions.prg je rajoute la fonction ConstDatetimeToC(
double )
Au passage on constate que la partie entière du double est
un nombre de jours alors que le nombre de secondes depuis 00h00 est égale à
86400 * la partie fractionnaire du double.
En FoxPro, pour l’arithmétique sur les types « date »
1 représente un jour, alors que pour l’arithmétique sur les types « datetime »
1 représente une seconde, pour ajouter un jour à un « datetime » il
faut lui rajouter 86400 (ou passer par les fonctions de conversion).
Le 17/10/06
6) Quand on extrait l’app d’un exe et que l’app existe déjà
dans la version 3.14 de Dvfp ou de Dump on obtient un message d’erreur.
Le prg AppFromExe a été modifié pour éviter cette erreur. A
partir de la version 3.141 il n’y a plus d’erreur mais l’app existant est
écrasé par la nouvelle extraction.
Le 24/10/06
7) Ayant découvert dernièrement la fonction aLanguage, j’ai
créé un petit programme qui appelle toutes les fonctions. J’ai ainsi rajouté
les fonctions suivantes qui n’étaient pas traitées :
AnsiToOem
Change
Completed
CpNoTrans
Network
DbAlias
Fixed
Float
GetHost
IsHosted
Pack
PadPrompt
RemoveProperty
Rollback
UnPack
A part RemoveProperty ces fonctions ne sont pas documentées
dans la doc de ma version de VFP9.
Maintenant, toutes les fonctions données par aLanguage(
array, 2) sont décompilées correctement. Les modifications de constantes et
d’initialisations ont été faites dans :
Par contre cela m’a permis de mettre en évidence une erreur
dans le traitement de la fonction Icase dans le cas d’un nombre pair
d’arguments. Le problème a été réglé dans le programme :
Le 26/10/06
8) Cela m’a aussi donné l’idée de regarder si toutes les
commandes étaient reconnues en utilisant aLanguage( array,1). J’ai ainsi
rajouté les commandes suivantes :
- Assist (qui est obsolète, qui n’est là que pour
compatibilité, qui ne fait rien)
- RunScript
(qui est obsolète, était une commande Mac équivalente à Run)
- Reset
J’ai complété les commandes
Le 02/11/2006
Contraitement à beaucoup d'endroit où l'on peut remplacer un
nom litéral par ce même nom entre quotes, il est incorrect d’écrire :
declare
integer "f1" in "MyApi" as "fOne" long BufSize
il faut
écrire :
declare
integer f1 in MyApi as fOne long BufSize
Correction dans Declare_Stmt
Les isExpressionStr() sont remplacés par des
isSringLiteral()
Le 17/11/06
9) Les rencontres AtoutFox m'ont donné des idées!
On ne décompilait pas bien du tout l'expression hyper simple
:
x = $0
Il est vrai que je n'utilise pas vraiement la notation
"Monnaie".
J'ai donc rajouté un type de constante Money et fait les
modifs nécessaires dans dfox.h, expressions et tokens.
Maintenant cela se décompile :
x = $0.0000
ce qui est normal, car il prend 4 décimales pour les types
monaie.
Le 20/11/06
9) Encore les
rencontres AtoutFox ! Au passage je m'étais dis que la possibilité de glisser
"distinct" dans la liste d'argument de certaines fonctions
"aggregate" n'était pas une syntaxe générale de fonction :
Select count( distinct N )
from aaaa
Ne décompilait pas bien (le distinct était oublié). C'est
maintenant corrigé pour les fonctions d'agrégation "Count ou Cnt Avg Max
Min Sum"
10) On m'avait fait remarqué que le "delete view
v" ne fonctionnait pas, et pour cause je l'avais oublié. Maintenant c'est
OK.
11) Le project builder ne reconnaît pas bien les
instructions du genre :
Set procedure to 'outils', 'statements'
Pour bien construire le projet il lui faut :
Set procedure to outils, statements
J'ai corrigé en ce sens.
Le 09/12/06
10) Enfin, quelqu’un
qui s’intéresse de prêt à dvfp me fait remarquer que certaines certaines
instructions SQL ne se décompilent pas bien. En effet, certaines sous-requêtes
ne se forment pas bien. Je corrige donc très légèrement le code. Maintenant on
décompile bien des requêtes du type :
select a,(select * from b),c
from d
select * from a where x in
(select * from b)
select * from a where exists
(select * from b)
Le 15/02/07
11) Correction
concernant le mot clé « like » oublié (!) dans une condition SQL
12) Ajout de la prise
en compte d’un fichier dictionnaire (Dict.dbf) qui permet de choisir la capitalisation
des variables et autres identificateurs. Si le mot appartient au dictionnaire
on choisit cette capitalisation, sinon (si le dictionnaire est absent, ou si le
mot n’est pas dans le dictionnaire) la casse est choisie comme auparavent (et
donc pas toujours bien).
L’utilitaire MakeDict est donné pour collecter les mots
voulus à partir d’un prg (que l’on obtient facilement avec l’option AllInOnce
de dvfp). C’est utilitaire utilise aussi une table Tabu.dbf qui permet
d’empécher certains mots (comme les mots réservés de VFP) de rentrer dans le
dictionnaire (si on le désire). Bien sûr, on doit modifier à la main la casse
des caractères dans le dictionnaire avant de l’utiliser efficacement dans Dvfp.
Le chemin vers le dictionnaire est paramétrable avec la
variable « dictionary » de la section [cosmetic] de dvfp.ini
Est-ce que ceci fonctionne comme Refox? Je n'a pas tout lu, mais si tu décompile un executable, est-ce que cela ramene les fichier entier (.scx et sct par exmaple) ou strictement le code? J'ai essayé par deux fois et il me donne toujours des erreurs.