From fa552f69c1c3e6bf1346de52c87c749719e5974b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Beno=C3=AEt=20Minisini?= Date: Mon, 9 Jul 2012 15:37:42 +0000 Subject: [PATCH] [DEVELOPMENT ENVIRONMENT] * NEW: New gb.complex component [INTERPRETER] * BUG: Automatic array conversion now works with not yet loaded array classes. [GB.COMPLEX] * NEW: New component that implements a rudimentary management of complex numbers. This component is automatically loaded if a complex number constant is encountered and no loaded component can already handle complex numbers. git-svn-id: svn://localhost/gambas/trunk@4924 867c0c6c-44f3-4631-809d-bfa615b0a4ec --- app/src/gambas3/.lang/.pot | 130 +++--- app/src/gambas3/.lang/fr.mo | Bin 104256 -> 104329 bytes app/src/gambas3/.lang/fr.po | 134 +++--- .../gambas3/.src/Component/CComponent.class | 1 + gb.gsl/src/c_complex.c | 4 +- gb.gsl/src/gb.gsl.component | 6 +- main/configure.ac | 1 + main/gbx/gbx_c_array.c | 19 +- main/gbx/gbx_exec.c | 2 +- main/lib/Makefile.am | 2 +- main/lib/complex/Makefile.am | 14 + main/lib/complex/ccomplex.c | 388 ++++++++++++++++++ main/lib/complex/ccomplex.h | 44 ++ main/lib/complex/gb.complex.component | 4 + main/lib/complex/main.c | 58 +++ main/lib/complex/main.h | 34 ++ 16 files changed, 700 insertions(+), 141 deletions(-) create mode 100644 main/lib/complex/Makefile.am create mode 100644 main/lib/complex/ccomplex.c create mode 100644 main/lib/complex/ccomplex.h create mode 100644 main/lib/complex/gb.complex.component create mode 100644 main/lib/complex/main.c create mode 100644 main/lib/complex/main.h diff --git a/app/src/gambas3/.lang/.pot b/app/src/gambas3/.lang/.pot index 5d8407702..6f97f1e72 100644 --- a/app/src/gambas3/.lang/.pot +++ b/app/src/gambas3/.lang/.pot @@ -31,258 +31,262 @@ msgid "Chart drawing" msgstr "" #: CComponent.class:81 -msgid "Compression & decompression" +msgid "Complex numbers management" msgstr "" #: CComponent.class:82 +msgid "Compression & decompression" +msgstr "" + +#: CComponent.class:83 msgid "MD5/DES crypting" msgstr "" -#: CComponent.class:83 FCreateProject.form:292 +#: CComponent.class:84 FCreateProject.form:292 msgid "Database access" msgstr "" -#: CComponent.class:84 +#: CComponent.class:85 msgid "Firebird database driver" msgstr "" -#: CComponent.class:85 +#: CComponent.class:86 msgid "Data bound controls" msgstr "" -#: CComponent.class:86 +#: CComponent.class:87 msgid "MySQL database driver" msgstr "" -#: CComponent.class:87 +#: CComponent.class:88 msgid "ODBC database driver" msgstr "" -#: CComponent.class:88 +#: CComponent.class:89 msgid "PostgreSQL database driver" msgstr "" -#: CComponent.class:89 +#: CComponent.class:90 msgid "SQLite 2 database driver" msgstr "" -#: CComponent.class:90 +#: CComponent.class:91 msgid "SQLite 3 database driver" msgstr "" -#: CComponent.class:91 +#: CComponent.class:92 msgid "Application debugger helper" msgstr "" -#: CComponent.class:92 +#: CComponent.class:93 msgid "Desktop-neutral routines from Portland project" msgstr "" -#: CComponent.class:93 +#: CComponent.class:94 msgid "D-Bus interface" msgstr "" -#: CComponent.class:94 +#: CComponent.class:95 msgid "Expression evaluator" msgstr "" -#: CComponent.class:95 +#: CComponent.class:96 msgid "Syntax highlighter routines" msgstr "" -#: CComponent.class:96 +#: CComponent.class:97 msgid "More controls for graphical components" msgstr "" -#: CComponent.class:97 +#: CComponent.class:98 msgid "Enhanced standard dialogs" msgstr "" -#: CComponent.class:98 +#: CComponent.class:99 msgid "Multi Document Interface" msgstr "" -#: CComponent.class:99 +#: CComponent.class:100 msgid "Default icon theme" msgstr "" -#: CComponent.class:100 +#: CComponent.class:101 msgid "GNU Scientific Library" msgstr "" -#: CComponent.class:101 +#: CComponent.class:102 msgid "GTK+ toolkit" msgstr "" -#: CComponent.class:102 +#: CComponent.class:103 msgid "GTK+ toolkit extension" msgstr "" -#: CComponent.class:103 +#: CComponent.class:104 msgid "OpenGL with GTK+ toolkit" msgstr "" -#: CComponent.class:104 +#: CComponent.class:105 msgid "GTK+ SVG renderer" msgstr "" -#: CComponent.class:105 +#: CComponent.class:106 msgid "QT/GTK+ switcher component" msgstr "" -#: CComponent.class:106 +#: CComponent.class:107 msgid "OpenGL with QT/GTK+ switcher component" msgstr "" -#: CComponent.class:107 +#: CComponent.class:108 msgid "Image management" msgstr "" -#: CComponent.class:108 +#: CComponent.class:109 msgid "Image filtering component" msgstr "" -#: CComponent.class:109 +#: CComponent.class:110 msgid "Image routines from the Imlib2 library" msgstr "" -#: CComponent.class:110 FPropertyComponent.form:138 +#: CComponent.class:111 FPropertyComponent.form:138 msgid "Image loading and saving" msgstr "" -#: CComponent.class:111 +#: CComponent.class:112 msgid "OpenLDAP client" msgstr "" -#: CComponent.class:112 +#: CComponent.class:113 msgid "GStreamer multimedia component" msgstr "" -#: CComponent.class:113 +#: CComponent.class:114 msgid "MySQL specific routines" msgstr "" -#: CComponent.class:114 +#: CComponent.class:115 msgid "NCurses library" msgstr "" -#: CComponent.class:115 FCreateProject.form:298 +#: CComponent.class:116 FCreateProject.form:298 msgid "Network programming" msgstr "" -#: CComponent.class:116 +#: CComponent.class:117 msgid "Network high-level protocols management" msgstr "" -#: CComponent.class:117 +#: CComponent.class:118 msgid "SMTP client" msgstr "" -#: CComponent.class:118 +#: CComponent.class:119 msgid "3D programming with OpenGL" msgstr "" -#: CComponent.class:119 +#: CComponent.class:120 msgid "OpenGL utility component" msgstr "" -#: CComponent.class:120 +#: CComponent.class:121 msgid "OpenGL shaders management" msgstr "" -#: CComponent.class:121 +#: CComponent.class:122 msgid "GNU command option parser" msgstr "" -#: CComponent.class:122 +#: CComponent.class:123 msgid "Perl-compatible Regular Expression Matching" msgstr "" -#: CComponent.class:123 +#: CComponent.class:124 msgid "PDF renderer based on Poppler library" msgstr "" -#: CComponent.class:124 +#: CComponent.class:125 msgid "QT4 toolkit" msgstr "" -#: CComponent.class:125 +#: CComponent.class:126 msgid "QT4 toolkit extension" msgstr "" -#: CComponent.class:126 +#: CComponent.class:127 msgid "QT4 WebKit component" msgstr "" -#: CComponent.class:127 +#: CComponent.class:128 msgid "OpenGL with QT4 toolkit" msgstr "" -#: CComponent.class:128 +#: CComponent.class:129 msgid "Report designer" msgstr "" -#: CComponent.class:129 +#: CComponent.class:130 msgid "SDL library" msgstr "" -#: CComponent.class:130 +#: CComponent.class:131 msgid "SDL sound & CD-ROM management" msgstr "" -#: CComponent.class:131 +#: CComponent.class:132 msgid "Application settings management" msgstr "" -#: CComponent.class:132 +#: CComponent.class:133 msgid "Signals management" msgstr "" -#: CComponent.class:133 +#: CComponent.class:134 msgid "Video capture" msgstr "" -#: CComponent.class:134 +#: CComponent.class:135 msgid "Visual Basic compatibility" msgstr "" -#: CComponent.class:135 +#: CComponent.class:136 msgid "XML tools based on libxml" msgstr "" -#: CComponent.class:136 +#: CComponent.class:137 msgid "XML tools" msgstr "" -#: CComponent.class:137 +#: CComponent.class:138 msgid "HTML generator" msgstr "" -#: CComponent.class:138 +#: CComponent.class:139 msgid "XML-RPC protocol" msgstr "" -#: CComponent.class:139 +#: CComponent.class:140 msgid "XSLT tools based on libxslt and libxml" msgstr "" -#: CComponent.class:140 +#: CComponent.class:141 msgid "Web applications tools" msgstr "" -#: CComponent.class:146 FPropertyComponent.form:126 +#: CComponent.class:147 FPropertyComponent.form:126 msgid "Graphical form management" msgstr "" -#: CComponent.class:147 FPropertyComponent.form:132 +#: CComponent.class:148 FPropertyComponent.form:132 msgid "Event loop management" msgstr "" -#: CComponent.class:149 FPropertyComponent.form:144 +#: CComponent.class:150 FPropertyComponent.form:144 msgid "OpenGL display" msgstr "" -#: CComponent.class:443 +#: CComponent.class:444 msgid "Loading information on component &1..." msgstr "" diff --git a/app/src/gambas3/.lang/fr.mo b/app/src/gambas3/.lang/fr.mo index 87ef6b50d204bf8bc29391aa168f3ed9f7b1cfbc..bcab620935d1636f6cf57645d9f5f24199129895 100644 GIT binary patch delta 31658 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 RyZ53>`@Xv`g#~mU@P9{KYN-GK delta 31597 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 s?m8Auteurs\n" msgid "

Licence

\n\n

This program is FREE SOFTWARE; you can redistribute it AND/OR modify it under the terms of the GNU General Public License as published by the Free Software Foundation ; either version 2, or (at your option) any later version.

\n\n

This program is distributed in the hope that it will be useful but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.

\n" msgstr "

Licence

Ce programme est un LOGICIEL LIBRE. Vous pouvez le redistribuer ET/OU le modifier selon les termes de la Licence Publique Générale GNU telle qu'elle est publiée par la Free Software Foundation ; soit la version 2, ou bien n'importe quelle version ultérieure de votre choix.

Ce programme est distribué en espérant qu'il soit utile MAIS SANS GARANTIE D'AUCUNE SORTE ; y compris les garanties implicites de COMMERCIABILITÉ ET DE CONFORMITÉ À UNE UTILISATION PARTICULIÈRE. Se reporter à la Licence Publique Générale GNU pour plus d'information.

\n" -#: CComponent.class:118 +#: CComponent.class:119 msgid "3D programming with OpenGL" msgstr "Programmation 3D avec OpenGL" @@ -955,11 +955,11 @@ msgstr "Expression ambigüe. Veuillez utiliser des parenthèses" msgid "Amethyst" msgstr "Améthiste" -#: CComponent.class:91 +#: CComponent.class:92 msgid "Application debugger helper" msgstr "Debogueur intégré" -#: CComponent.class:131 +#: CComponent.class:132 msgid "Application settings management" msgstr "Gestion des fichiers de configuration" @@ -1647,6 +1647,10 @@ msgstr "Tout compiler" msgid "Compiling project" msgstr "Compilation du projet" +#: CComponent.class:81 +msgid "Complex numbers management" +msgstr "Gestion des nombres complexes" + #: FPropertyProject.form:171 msgid "Component" msgstr "Composant" @@ -1679,7 +1683,7 @@ msgstr "Composants" msgid "Compress file" msgstr "Compresser le fichier" -#: CComponent.class:81 +#: CComponent.class:82 msgid "Compression & decompression" msgstr "Compression et décompression" @@ -1859,7 +1863,7 @@ msgstr "Couper" msgid "Czech (Czech Republic)" msgstr "Tchèque (République Tchèque)" -#: CComponent.class:93 +#: CComponent.class:94 msgid "D-Bus interface" msgstr "Interfaçage avec D-Bus" @@ -1871,7 +1875,7 @@ msgstr "Danois (Danemark)" msgid "Data" msgstr "Données" -#: CComponent.class:85 +#: CComponent.class:86 msgid "Data bound controls" msgstr "Contrôles liés aux données" @@ -1883,7 +1887,7 @@ msgstr "Types de données" msgid "Database" msgstr "Bases de données" -#: CComponent.class:83 FCreateProject.form:292 +#: CComponent.class:84 FCreateProject.form:292 msgid "Database access" msgstr "Accès aux bases de données" @@ -1915,7 +1919,7 @@ msgstr "Le cas par défaut doit être le dernier" msgid "Default font size" msgstr "Taille de police par défaut" -#: CComponent.class:99 +#: CComponent.class:100 msgid "Default icon theme" msgstr "Thème d'icônes par défaut" @@ -1975,7 +1979,7 @@ msgstr "Bureau" msgid "Desktop configuration file" msgstr "Fichier de configuration du bureau" -#: CComponent.class:92 +#: CComponent.class:93 msgid "Desktop-neutral routines from Portland project" msgstr "Routines indépendantes du bureau du projet Portland" @@ -2251,7 +2255,7 @@ msgstr "Anglais (U.S.A.)" msgid "English (United Kingdom)" msgstr "Anglais (Royaume Uni)" -#: CComponent.class:97 +#: CComponent.class:98 msgid "Enhanced standard dialogs" msgstr "Boîtes de dialogue standard améliorées" @@ -2295,7 +2299,7 @@ msgstr "Evènement" msgid "Event loop" msgstr "Boucle d'évènements" -#: CComponent.class:147 FPropertyComponent.form:132 +#: CComponent.class:148 FPropertyComponent.form:132 msgid "Event loop management" msgstr "Gestion de la boucle d'évènements" @@ -2367,7 +2371,7 @@ msgstr "Classes exportées" msgid "Expression" msgstr "Expression" -#: CComponent.class:94 +#: CComponent.class:95 msgid "Expression evaluator" msgstr "Evaluateur d'expressions" @@ -2511,7 +2515,7 @@ msgstr "Finlandais (Finlande)" msgid "Firebird" msgstr "-" -#: CComponent.class:84 +#: CComponent.class:85 msgid "Firebird database driver" msgstr "Pilote de base de données Firebird" @@ -2723,11 +2727,11 @@ msgstr "Obtenir depuis un fichier 'VERSION'" msgid "GIF" msgstr "-" -#: CComponent.class:121 +#: CComponent.class:122 msgid "GNU command option parser" msgstr "Analyseur d'options de ligne de commande GNU" -#: CComponent.class:100 +#: CComponent.class:101 msgid "GNU Scientific Library" msgstr "Bibliothèque scientifique GNU" @@ -2755,7 +2759,7 @@ msgstr "Aller à la ligne..." msgid "Graphical application" msgstr "Application graphique" -#: CComponent.class:146 FPropertyComponent.form:126 +#: CComponent.class:147 FPropertyComponent.form:126 msgid "Graphical form management" msgstr "Gestion de formulaires graphiques" @@ -2767,7 +2771,7 @@ msgstr "Grec (Grèce)" msgid "Groups" msgstr "Groupes" -#: CComponent.class:112 +#: CComponent.class:113 msgid "GStreamer multimedia component" msgstr "Composant multimedia GStreamer" @@ -2775,15 +2779,15 @@ msgstr "Composant multimedia GStreamer" msgid "GTK+ graphical application" msgstr "Application graphique GTK+" -#: CComponent.class:104 +#: CComponent.class:105 msgid "GTK+ SVG renderer" msgstr "Affichage de fichiers SVG pour GTK+" -#: CComponent.class:101 +#: CComponent.class:102 msgid "GTK+ toolkit" msgstr "Bibliothèque GTK+" -#: CComponent.class:102 +#: CComponent.class:103 msgid "GTK+ toolkit extension" msgstr "Extension du toolkit GTK+" @@ -2855,7 +2859,7 @@ msgstr "Fichier HTML" msgid "HTML files" msgstr "Fichiers HTML" -#: CComponent.class:137 +#: CComponent.class:138 msgid "HTML generator" msgstr "Générateur HTML" @@ -2923,15 +2927,15 @@ msgstr "Éditeur d'images" msgid "Image files" msgstr "Fichiers images" -#: CComponent.class:108 +#: CComponent.class:109 msgid "Image filtering component" msgstr "Composant de filtrage d'images" -#: CComponent.class:110 FPropertyComponent.form:138 +#: CComponent.class:111 FPropertyComponent.form:138 msgid "Image loading and saving" msgstr "Chargement et sauvegarde d'images" -#: CComponent.class:107 +#: CComponent.class:108 msgid "Image management" msgstr "Gestion des images" @@ -2939,7 +2943,7 @@ msgstr "Gestion des images" msgid "Image processing" msgstr "Traitement d'images" -#: CComponent.class:109 +#: CComponent.class:110 msgid "Image routines from the Imlib2 library" msgstr "Gestion des images basée sur la librairie Imlib2" @@ -3239,7 +3243,7 @@ msgstr "Lithuanien (Lithuanie)" msgid "Loading &1..." msgstr "Chargement de &1..." -#: CComponent.class:443 +#: CComponent.class:444 msgid "Loading information on component &1..." msgstr "Chargement des informations sur le composant &1..." @@ -3335,7 +3339,7 @@ msgstr "Erreur mathématique" msgid "Max. version" msgstr "Version max." -#: CComponent.class:82 +#: CComponent.class:83 msgid "MD5/DES crypting" msgstr "Chiffrement MD5/DES" @@ -3431,7 +3435,7 @@ msgstr "Les modules sont publics par défaut" msgid "Modules" msgstr "Modules" -#: CComponent.class:96 +#: CComponent.class:97 msgid "More controls for graphical components" msgstr "Controles supplémentaires pour les composants graphiques" @@ -3471,7 +3475,7 @@ msgstr "Déplacer tout en haut" msgid "Move up" msgstr "Déplacer vers le haut" -#: CComponent.class:98 +#: CComponent.class:99 msgid "Multi Document Interface" msgstr "Interface multi-documents" @@ -3483,11 +3487,11 @@ msgstr "Multimedia" msgid "MySQL" msgstr "-" -#: CComponent.class:86 +#: CComponent.class:87 msgid "MySQL database driver" msgstr "Pilote de base de données MySQL" -#: CComponent.class:113 +#: CComponent.class:114 msgid "MySQL specific routines" msgstr "Routines spécifiques pour MySQL" @@ -3499,15 +3503,15 @@ msgstr "Nom" msgid "native code" msgstr "code natif" -#: CComponent.class:114 +#: CComponent.class:115 msgid "NCurses library" msgstr "Bibliothèque NCurses" -#: CComponent.class:116 +#: CComponent.class:117 msgid "Network high-level protocols management" msgstr "Gestion de protocoles réseaux de haut-niveau" -#: CComponent.class:115 FCreateProject.form:298 +#: CComponent.class:116 FCreateProject.form:298 msgid "Network programming" msgstr "Programmation réseau" @@ -3719,7 +3723,7 @@ msgstr "Obsidienne" msgid "ODBC" msgstr "-" -#: CComponent.class:87 +#: CComponent.class:88 msgid "ODBC database driver" msgstr "Pilote de base de données ODBC" @@ -3783,7 +3787,7 @@ msgstr "Ouvrir un projet..." msgid "OpenGL" msgstr "OpenGL" -#: CComponent.class:149 FPropertyComponent.form:144 +#: CComponent.class:150 FPropertyComponent.form:144 msgid "OpenGL display" msgstr "Affichage OpenGL" @@ -3791,27 +3795,27 @@ msgstr "Affichage OpenGL" msgid "OpenGL programming" msgstr "Programmation OpenGL" -#: CComponent.class:120 +#: CComponent.class:121 msgid "OpenGL shaders management" msgstr "Gestion des shaders OpenGL" -#: CComponent.class:119 +#: CComponent.class:120 msgid "OpenGL utility component" msgstr "composant utilitaire OpenGL" -#: CComponent.class:103 +#: CComponent.class:104 msgid "OpenGL with GTK+ toolkit" msgstr "OpenGL avec GTK+" -#: CComponent.class:106 +#: CComponent.class:107 msgid "OpenGL with QT/GTK+ switcher component" msgstr "Sélection du composant graphique OpenGL selon le bureau" -#: CComponent.class:127 +#: CComponent.class:128 msgid "OpenGL with QT4 toolkit" msgstr "OpenGL avec QT4" -#: CComponent.class:111 +#: CComponent.class:112 msgid "OpenLDAP client" msgstr "Client OpenLDAP" @@ -3931,11 +3935,11 @@ msgstr "Emplacement" msgid "Pause" msgstr "Pause" -#: CComponent.class:123 +#: CComponent.class:124 msgid "PDF renderer based on Poppler library" msgstr "Lecture de PDF basée sur la bibliothèque Poppler" -#: CComponent.class:122 +#: CComponent.class:123 msgid "Perl-compatible Regular Expression Matching" msgstr "Expression rationnelles compatibles avec Perl" @@ -4075,7 +4079,7 @@ msgstr "Portugais (Portugal)" msgid "PostgreSQL" msgstr "-" -#: CComponent.class:88 +#: CComponent.class:89 msgid "PostgreSQL database driver" msgstr "Pilote de base de données PostgreSQL" @@ -4223,19 +4227,19 @@ msgstr "-" msgid "QT graphical application" msgstr "Application graphique QT" -#: CComponent.class:105 +#: CComponent.class:106 msgid "QT/GTK+ switcher component" msgstr "Sélection du composant graphique selon le bureau" -#: CComponent.class:124 +#: CComponent.class:125 msgid "QT4 toolkit" msgstr "Bibliothèque QT4" -#: CComponent.class:125 +#: CComponent.class:126 msgid "QT4 toolkit extension" msgstr "Controles supplémentaires basés sur la bibliothèque QT4" -#: CComponent.class:126 +#: CComponent.class:127 msgid "QT4 WebKit component" msgstr "Composant WebKit de QT4" @@ -4375,7 +4379,7 @@ msgstr "Remplacement de couleur" msgid "Report" msgstr "État" -#: CComponent.class:128 +#: CComponent.class:129 msgid "Report designer" msgstr "Générateur d'états" @@ -4531,11 +4535,11 @@ msgstr "Déplacer" msgid "SDL application" msgstr "Application SDL" -#: CComponent.class:129 +#: CComponent.class:130 msgid "SDL library" msgstr "Bibliothèque SDL" -#: CComponent.class:130 +#: CComponent.class:131 msgid "SDL sound & CD-ROM management" msgstr "Gestion du son et du CD-ROM basé sur la bibliothèque SDL" @@ -4755,7 +4759,7 @@ msgstr "Afficher les astuces au démarrage" msgid "Show tooltips" msgstr "Afficher les bulles d'aide" -#: CComponent.class:132 +#: CComponent.class:133 msgid "Signals management" msgstr "Gestion des signaux" @@ -4783,7 +4787,7 @@ msgstr "Petite" msgid "Small font size" msgstr "Petite taille de police" -#: CComponent.class:117 +#: CComponent.class:118 msgid "SMTP client" msgstr "Client SMTP" @@ -4799,7 +4803,7 @@ msgstr "Proxy SOCKS5" msgid "Sol&ve" msgstr "&Résoudre" -#: Project.module:3162 +#: FPropertyProject.class:421 Project.module:3162 msgid "Some components are missing: &1" msgstr "Certains composants ne sont pas installés : &1" @@ -4887,11 +4891,11 @@ msgstr "Requête SQL" msgid "SQLite" msgstr "-" -#: CComponent.class:89 +#: CComponent.class:90 msgid "SQLite 2 database driver" msgstr "Pilote de base de données SQLite 2" -#: CComponent.class:90 +#: CComponent.class:91 msgid "SQLite 3 database driver" msgstr "Pilote de base de données SQLite 3" @@ -5107,7 +5111,7 @@ msgstr "Erreur de syntaxe. Le &1 champ n'est pas un identificateur valide." msgid "Syntax error. VarPtr() takes only one identifier" msgstr "Erreur de syntaxe. VarPtr() ne prend qu'un seul identificateur." -#: CComponent.class:95 +#: CComponent.class:96 msgid "Syntax highlighter routines" msgstr "Routines de coloration syntaxique" @@ -6015,7 +6019,7 @@ msgstr "Séparation verticale" msgid "Video" msgstr "Vidéo" -#: CComponent.class:133 +#: CComponent.class:134 msgid "Video capture" msgstr "Capture vidéo" @@ -6035,7 +6039,7 @@ msgstr "-" msgid "Visual" msgstr "Visuel" -#: CComponent.class:134 +#: CComponent.class:135 msgid "Visual Basic compatibility" msgstr "Compatibilité avec Visual Basic" @@ -6063,7 +6067,7 @@ msgstr "Surveiller" msgid "Watch expression" msgstr "Surveiller des expressions" -#: CComponent.class:140 +#: CComponent.class:141 msgid "Web applications tools" msgstr "Outils pour les applications Web" @@ -6111,15 +6115,15 @@ msgstr "Programmation XML / XSLT" msgid "XML file" msgstr "Fichier XML" -#: CComponent.class:136 +#: CComponent.class:137 msgid "XML tools" msgstr "Outils XML" -#: CComponent.class:135 +#: CComponent.class:136 msgid "XML tools based on libxml" msgstr "Outils XML basés sur la bibliothèque libxml" -#: CComponent.class:138 +#: CComponent.class:139 msgid "XML-RPC protocol" msgstr "Protocole XML-RPC" @@ -6127,7 +6131,7 @@ msgstr "Protocole XML-RPC" msgid "XPM" msgstr "-" -#: CComponent.class:139 +#: CComponent.class:140 msgid "XSLT tools based on libxslt and libxml" msgstr "Outils XSLT basés sur libxslt et libxml" diff --git a/app/src/gambas3/.src/Component/CComponent.class b/app/src/gambas3/.src/Component/CComponent.class index 41d65f382..0dd7f086a 100644 --- a/app/src/gambas3/.src/Component/CComponent.class +++ b/app/src/gambas3/.src/Component/CComponent.class @@ -78,6 +78,7 @@ Static Private Sub InitComponentNames() $cName["gb"] = ("Internal native classes") $cName["gb.cairo"] = ("Cairo graphic library") $cName["gb.chart"] = ("Chart drawing") + $cName["gb.complex"] = ("Complex numbers management") $cName["gb.compress"] = ("Compression & decompression") $cName["gb.crypt"] = ("MD5/DES crypting") $cName["gb.db"] = ("Database access") diff --git a/gb.gsl/src/c_complex.c b/gb.gsl/src/c_complex.c index 3b3a499ec..f4bf55269 100644 --- a/gb.gsl/src/c_complex.c +++ b/gb.gsl/src/c_complex.c @@ -480,8 +480,10 @@ GB_DESC ComplexDesc[] = // Utility Methods GB_METHOD("_new", NULL, Complex_new, "[(Real)f(Imag)f]"), GB_STATIC_METHOD("_call", "Complex", Complex_call, "[(Real)f(Imag)f]"), + GB_STATIC_METHOD("Polar", "Complex", Complex_Polar, "[(Abs)f(Arg)f]"), + GB_METHOD("Copy", "Complex", Complex_Copy, NULL), - GB_STATIC_METHOD("Polar", "Complex", Complex_Polar, "[(Real)f(Imag)f]"), + GB_METHOD("Conj", "Complex", Complex_Conjugate, NULL), GB_METHOD("Neg", "Complex", Complex_Negative, NULL), GB_METHOD("Inv", "Complex", Complex_Inverse, NULL), diff --git a/gb.gsl/src/gb.gsl.component b/gb.gsl/src/gb.gsl.component index 5b233b3c4..db83e6261 100644 --- a/gb.gsl/src/gb.gsl.component +++ b/gb.gsl/src/gb.gsl.component @@ -1,5 +1,5 @@ [Component] -Key=__COMPONENT -Name=__DESCRIPTION -Author= +Key=gb.gsl +Author=Randall Morgan,Benoît Minisini Alpha=1 +Implements=Complex diff --git a/main/configure.ac b/main/configure.ac index 8abceba30..70ae50466 100644 --- a/main/configure.ac +++ b/main/configure.ac @@ -110,6 +110,7 @@ lib/gui.opengl/Makefile \ lib/image/Makefile \ lib/image.effect/Makefile \ lib/signal/Makefile \ +lib/complex/Makefile \ ]) AC_OUTPUT diff --git a/main/gbx/gbx_c_array.c b/main/gbx/gbx_c_array.c index 156b5ae1e..93a778601 100644 --- a/main/gbx/gbx_c_array.c +++ b/main/gbx/gbx_c_array.c @@ -1395,27 +1395,32 @@ END_METHOD static CARRAY *_converted_array; -static void error_array_convert() +static void error_convert() { OBJECT_UNREF(_converted_array, "error_array_convert"); } -static bool array_convert(CARRAY *src, CLASS *class, VALUE *conv) +static bool _convert(CARRAY *src, CLASS *class, VALUE *conv) { CARRAY *array; int i; void *data; VALUE temp; - if (!src || !TYPE_is_pure_object((TYPE)class) || !CLASS_inherits(class, CLASS_Array)) + if (!src || !TYPE_is_pure_object((TYPE)class)) + return TRUE; + + CLASS_load(class); // Force creation of array classes + + if (!class->is_array) //CLASS_inherits(class, CLASS_Array)) return TRUE; _converted_array = array = OBJECT_create(class, NULL, NULL, 0); ARRAY_add_many_void(&array->data, src->count); array->count = src->count; - - ON_ERROR(error_array_convert) + + ON_ERROR(error_convert) { for (i = 0; i < src->count; i++) { @@ -1437,7 +1442,7 @@ static bool array_convert(CARRAY *src, CLASS *class, VALUE *conv) #include "gbx_c_array.h" -#define array_convert NULL +#define _convert NULL #endif /* #ifndef GBX_INFO */ @@ -1485,7 +1490,7 @@ GB_DESC NATIVE_Array[] = GB_METHOD("Delete", "Array", Array_Extract, "(Start)i[(Length)i]"), GB_METHOD("Fill", NULL, Array_Fill, "(Value)v[(Start)i(Length)i]"),*/ - GB_INTERFACE("_convert", array_convert), + GB_INTERFACE("_convert", _convert), GB_END_DECLARE }; diff --git a/main/gbx/gbx_exec.c b/main/gbx/gbx_exec.c index c2606d8bd..533252fa9 100644 --- a/main/gbx/gbx_exec.c +++ b/main/gbx/gbx_exec.c @@ -1978,7 +1978,7 @@ void EXEC_push_complex(void) { if (COMPONENT_get_info("PUSH_COMPLEX", POINTER(&func))) { - COMPONENT_load(COMPONENT_create("gb.gsl")); + COMPONENT_load(COMPONENT_create("gb.complex")); if (COMPONENT_get_info("PUSH_COMPLEX", POINTER(&func))) THROW(E_MATH); } diff --git a/main/lib/Makefile.am b/main/lib/Makefile.am index 161e6222c..5eb76f172 100644 --- a/main/lib/Makefile.am +++ b/main/lib/Makefile.am @@ -1,4 +1,4 @@ -SUBDIRS = . debug eval db compress vb option draw image gui gui.opengl image.effect signal +SUBDIRS = . debug eval db compress vb option draw image gui gui.opengl image.effect signal complex dist_gblib_DATA = gb.component gblib_DATA = gb.component diff --git a/main/lib/complex/Makefile.am b/main/lib/complex/Makefile.am new file mode 100644 index 000000000..bb78945ce --- /dev/null +++ b/main/lib/complex/Makefile.am @@ -0,0 +1,14 @@ +COMPONENT = gb.complex +include $(top_srcdir)/component.am + +gblib_LTLIBRARIES = gb.complex.la + +gb_complex_la_LIBADD = @MATH_LIB@ +gb_complex_la_LDFLAGS = -module @LD_FLAGS@ +gb_complex_la_CFLAGS = -I$(top_srcdir)/share $(AM_CFLAGS) + +gb_complex_la_SOURCES = \ + ccomplex.h ccomplex.c \ + main.h main.c + + diff --git a/main/lib/complex/ccomplex.c b/main/lib/complex/ccomplex.c new file mode 100644 index 000000000..9bfb1dc38 --- /dev/null +++ b/main/lib/complex/ccomplex.c @@ -0,0 +1,388 @@ +/*************************************************************************** + + ccomplex.c + + (c) 2000-2012 Benoît Minisini + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, + MA 02110-1301, USA. + +***************************************************************************/ + +#define __CCOMPLEX_C + +#include "ccomplex.h" + +#define THIS ((CCOMPLEX *)_object) +#define RE(_c) ((_c)->v[0]) +#define IM(_c) ((_c)->v[1]) +#define ABS(_c) (hypot(RE(_c), IM(_c))) +#define ABS2(_c) (RE(_c) * RE(_c) + IM(_c) * IM(_c)) +#define ZERO(_c) (RE(_c) == 0.0 && IM(_c) == 0.0) + + +//---- Complex number creation ---------------------------------------------- + +CCOMPLEX *COMPLEX_create(double re, double im) +{ + static GB_CLASS CLASS_Complex = (GB_CLASS)NULL; + CCOMPLEX *c; + + if (!CLASS_Complex) + CLASS_Complex = GB.FindClass("Complex"); + + c = (CCOMPLEX *)GB.New(CLASS_Complex, NULL, NULL); + c->v[0] = re; + c->v[1] = im; + + return c; +} + +CCOMPLEX *COMPLEX_push_complex(double value) +{ + return COMPLEX_create(0, value); +} + +//---- Arithmetic operators ------------------------------------------------- + +static CCOMPLEX *_addf(CCOMPLEX *a, double f) +{ + return COMPLEX_create(RE(a) + f, IM(a)); +} + +static CCOMPLEX *_add(CCOMPLEX *a, CCOMPLEX *b) +{ + return COMPLEX_create(RE(a) + RE(b), IM(a) + IM(b)); +} + +static CCOMPLEX *_subf(CCOMPLEX *a, double f) +{ + return COMPLEX_create(RE(a) - f, IM(a)); +} + +static CCOMPLEX *_sub(CCOMPLEX *a, CCOMPLEX *b) +{ + return COMPLEX_create(RE(a) - RE(b), IM(a) - IM(b)); +} + +static CCOMPLEX *_mulf(CCOMPLEX *a, double f) +{ + return COMPLEX_create(RE(a) * f, IM(a) * f); +} + +static CCOMPLEX *_mul(CCOMPLEX *a, CCOMPLEX *b) +{ + return COMPLEX_create(RE(a) * RE(b) - IM(a) * IM(b), RE(a) * IM(b) + IM(a) * RE(b)); +} + +static CCOMPLEX *_divf(CCOMPLEX *a, double f) +{ + if (f == 0.0) + return NULL; + + return COMPLEX_create(RE(a) / f, IM(a) / f); +} + +static CCOMPLEX *_idivf(CCOMPLEX *a, double f) +{ + if (ZERO(a)) + return NULL; + + double s = ABS2(a); + double re, im; + + re = RE(a) / s; + im = -IM(a) / s; + + return COMPLEX_create(re * f, im * f); +} + +static CCOMPLEX *_div(CCOMPLEX *a, CCOMPLEX *b) +{ + double ar = RE(a), ai = IM(a); + double br = RE(b), bi = IM(b); + + if (br == 0.0 && bi == 0.0) + return NULL; + + double s = 1.0 / ABS(b); + + double sbr = s * br; + double sbi = s * bi; + + double zr = (ar * sbr + ai * sbi) * s; + double zi = (ai * sbr - ar * sbi) * s; + + return COMPLEX_create(zr, zi); +} + +static int _equal(CCOMPLEX *a, CCOMPLEX *b) +{ + return RE(a) == RE(b) && IM(a) == IM(b); +} + +static int _equalf(CCOMPLEX *a, double f) +{ + return RE(a) == f && IM(a) == 0; +} + +static double _abs(CCOMPLEX *a) +{ + return ABS(a); +} + +static CCOMPLEX *_neg(CCOMPLEX *a) +{ + return COMPLEX_create(-RE(a), -IM(a)); +} + +static GB_OPERATOR_DESC _operators = +{ + add: (void *)_add, + addf: (void *)_addf, + sub: (void *)_sub, + subf: (void *)_subf, + mul: (void *)_mul, + mulf: (void *)_mulf, + div: (void *)_div, + divf: (void *)_divf, + idivf: (void *)_idivf, + equal: (void *)_equal, + equalf: (void *)_equalf, + abs: (void *)_abs, + neg: (void *)_neg +}; + +//---- Conversions ---------------------------------------------------------- + +char *COMPLEX_to_string(double real, double imag, bool local) +{ + char buffer[64]; + char *p; + char *str; + int len; + + if (real == 0.0 && imag == 0.0) + return GB.NewString("0", 1); + + p = buffer; + + if (real != 0.0) + { + GB.NumberToString(local, real, NULL, &str, &len); + strncpy(p, str, len); + p += len; + } + + if (imag != 0.0) + { + if (imag < 0.0) + { + *p++ = '-'; + imag = (-imag); + } + else if (p != buffer) + *p++ = '+'; + + if (imag != 1.0) + { + GB.NumberToString(local, imag, NULL, &str, &len); + strncpy(p, str, len); + p += len; + } + *p++ = 'i'; + } + + return GB.NewString(buffer, p - buffer); +} + +static bool _convert(CCOMPLEX *a, GB_TYPE type, GB_VALUE *conv) +{ + if (a) + { + switch (type) + { + case GB_T_FLOAT: + conv->_float.value = ABS(a); + return FALSE; + + case GB_T_SINGLE: + conv->_single.value = ABS(a); + return FALSE; + + case GB_T_INTEGER: + case GB_T_SHORT: + case GB_T_BYTE: + conv->_integer.value = ABS(a); + return FALSE; + + case GB_T_LONG: + conv->_long.value = ABS(a); + return FALSE; + + case GB_T_STRING: + case GB_T_CSTRING: + conv->_string.value.addr = COMPLEX_to_string(RE(a), IM(a), type == GB_T_CSTRING); + conv->_string.value.start = 0; + conv->_string.value.len = GB.StringLength(conv->_string.value.addr); + return FALSE; + + default: + return TRUE; + } + } + else + { + switch(type) + { + case GB_T_FLOAT: + conv->_object.value = COMPLEX_create(conv->_float.value, 0); + return FALSE; + + case GB_T_SINGLE: + conv->_object.value = COMPLEX_create(conv->_single.value, 0); + return FALSE; + + case GB_T_INTEGER: + case GB_T_SHORT: + case GB_T_BYTE: + conv->_object.value = COMPLEX_create(conv->_integer.value, 0); + return FALSE; + + default: + return TRUE; + } + } +} + +//--------------------------------------------------------------------------- + +BEGIN_METHOD(Complex_new, GB_FLOAT real; GB_FLOAT imag) + + THIS->v[0] = VARGOPT(real, 0.0); + THIS->v[1] = VARGOPT(imag, 0.0); + +END_METHOD + + +BEGIN_METHOD(Complex_call, GB_FLOAT real; GB_FLOAT imag) + + GB.ReturnObject(COMPLEX_create(VARG(real), VARG(imag))); + +END_METHOD + + +BEGIN_METHOD_VOID(Complex_Copy) + + GB.ReturnObject(COMPLEX_create(RE(THIS), IM(THIS))); + +END_METHOD + + +BEGIN_METHOD(Complex_Polar, GB_FLOAT abs; GB_FLOAT arg) + + double mod = VARG(abs); + double arg = VARG(arg); + + GB.ReturnObject(COMPLEX_create(cos(arg) * mod, sin(arg) * mod)); + +END_METHOD + + +BEGIN_METHOD_VOID(Complex_Arg) + + if (ZERO(THIS)) + GB.ReturnFloat(0.0); + else + GB.ReturnFloat(atan2(IM(THIS), RE(THIS))); + +END_METHOD + + +BEGIN_METHOD_VOID(Complex_Abs) + + GB.ReturnFloat(ABS(THIS)); + +END_METHOD + + +BEGIN_METHOD_VOID(Complex_Abs2) + + GB.ReturnFloat(ABS2(THIS)); + +END_METHOD + + +BEGIN_PROPERTY(Complex_Real) + + if (READ_PROPERTY) + GB.ReturnFloat(RE(THIS)); + else + THIS->v[0] = VPROP(GB_FLOAT); + +END_PROPERTY + + +BEGIN_PROPERTY(Complex_Imag) + + if (READ_PROPERTY) + GB.ReturnFloat(IM(THIS)); + else + THIS->v[1] = VPROP(GB_FLOAT); + +END_PROPERTY + + +BEGIN_METHOD_VOID(Complex_Inv) + + GB.ReturnObject(_divf(THIS, 1)); + +END_METHOD + + +BEGIN_METHOD_VOID(Complex_Conj) + + GB.ReturnObject(COMPLEX_create(RE(THIS), -IM(THIS))); + +END_METHOD + +//--------------------------------------------------------------------------- + +GB_DESC ComplexDesc[] = +{ + GB_DECLARE("Complex", sizeof(CCOMPLEX)), + + // Utility Methods + GB_METHOD("_new", NULL, Complex_new, "[(Real)f(Imag)f]"), + GB_STATIC_METHOD("_call", "Complex", Complex_call, "[(Real)f(Imag)f]"), + GB_STATIC_METHOD("Polar", "Complex", Complex_Polar, "[(Abs)f(Arg)f]"), + + GB_METHOD("Copy", "Complex", Complex_Copy, NULL), + + GB_METHOD("Conj", "Complex", Complex_Conj, NULL), + GB_METHOD("Inv", "Complex", Complex_Inv, NULL), + + GB_PROPERTY("Real", "f", Complex_Real), + GB_PROPERTY("Imag", "f", Complex_Imag), + + GB_METHOD("Abs", "f", Complex_Abs, NULL), + GB_METHOD("Abs2", "f", Complex_Abs2, NULL), + GB_METHOD("Arg", "f", Complex_Arg, NULL), + + GB_INTERFACE("_operators", &_operators), + GB_INTERFACE("_convert", &_convert), + + GB_END_DECLARE +}; diff --git a/main/lib/complex/ccomplex.h b/main/lib/complex/ccomplex.h new file mode 100644 index 000000000..4d7430575 --- /dev/null +++ b/main/lib/complex/ccomplex.h @@ -0,0 +1,44 @@ +/*************************************************************************** + + ccomplex.h + + (c) 2000-2012 Benoît Minisini + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, + MA 02110-1301, USA. + +***************************************************************************/ + +#ifndef __CCOMPLEX_H +#define __CCOMPLEX_H + +#include "gambas.h" +#include "main.h" + +#ifndef __CDEBUG_C +extern GB_DESC ComplexDesc[]; +#endif + +typedef + struct { + GB_BASE ob; + double v[2]; + } + CCOMPLEX; + +CCOMPLEX *COMPLEX_create(double re, double im); +CCOMPLEX *COMPLEX_push_complex(double value); + +#endif diff --git a/main/lib/complex/gb.complex.component b/main/lib/complex/gb.complex.component new file mode 100644 index 000000000..d362d4094 --- /dev/null +++ b/main/lib/complex/gb.complex.component @@ -0,0 +1,4 @@ +[Component] +Key=gb.component +Author=Benoît Minisini +Implements=Complex diff --git a/main/lib/complex/main.c b/main/lib/complex/main.c new file mode 100644 index 000000000..c21a66808 --- /dev/null +++ b/main/lib/complex/main.c @@ -0,0 +1,58 @@ +/*************************************************************************** + + main.c + + (c) 2000-2012 Benoît Minisini + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, + MA 02110-1301, USA. + +***************************************************************************/ + +#define __MAIN_C + +#include "gambas.h" +#include "ccomplex.h" +#include "main.h" + +GB_INTERFACE GB EXPORT; + +GB_DESC *GB_CLASSES[] EXPORT = +{ + ComplexDesc, + NULL +}; + +int EXPORT GB_INIT(void) +{ + return 0; +} + +void EXPORT GB_EXIT() +{ +} + +int EXPORT GB_INFO(const char *key, void **value) +{ + if (!strcasecmp(key, "PUSH_COMPLEX")) + { + *value = (void *)COMPLEX_push_complex; + return TRUE; + } + else + return FALSE; +} + + diff --git a/main/lib/complex/main.h b/main/lib/complex/main.h new file mode 100644 index 000000000..9b4f62e2c --- /dev/null +++ b/main/lib/complex/main.h @@ -0,0 +1,34 @@ +/*************************************************************************** + + main.h + + (c) 2000-2012 Benoît Minisini + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, + MA 02110-1301, USA. + +***************************************************************************/ + +#ifndef __MAIN_H +#define __MAIN_H + +#include "gambas.h" +#include "gb_common.h" + +#ifndef __MAIN_C +extern GB_INTERFACE GB; +#endif + +#endif