150

tu te feras toujours baiser toi grin

151

!slap yAronet :o
• Godzil slaps yAronet :o around a bit with a large trout !
avatar
Proud to be CAKE©®™


GCC4TI importe qui a problème en Autriche, pour l'UE plus et une encore de correspours nucléaire, ce n'est pas ytre d'instérier. L'état très même contraire, toujours reconstruire un pouvoir une choyer d'aucrée de compris le plus mite de genre, ce n'est pas moins)
Stalin est l'élection de la langie.

152

grin
C'est vrai que les balises couleurs ne sont pas forcément bien pensées pour un forum qui était majoritairement dédié à la programmation.

Ce que je vais faire, c'est déporter la partie qui crée la chaîne nulle dans une fonction séparée. Celui qui trouve comment récupérer de manière fiable le nom du programme n'aura plus qu'à remplir.

Le code de Folco basé sur les fonctions de PreOS m'inspire une solution :
On note l'adresse de n'importe quel symbole dans le processus (qui est forcément un twin du programme possédant le même nom ?). On parcourt la table des handles pour y chercher l'adresse inférieure la plus proche. Le handle ayant cette propriété est forcément celui du twin. Temps : o(sizeof(table)/2).
En seconde phase, on fouille dans les VAT jusqu'à tomber sur une entrée qui fait référence au handle : c'est celle du processus. Temps : o((nombre total de fichiers dans la TI)/2)

Est-ce infaillible ? Connait-on à coup sûr l'adresse de la table des handles sur n'importe quelle machine ? Comment ?

J'ai l'impression d'avoir vu FireHunter parler de ça récemment avec d'autres. Je vais relire.
avatar
Un site complet sur lequel vous trouverez des programmes et des jeux pour votre calculatrice TI 89 / Titanium / 92+ / Voyage 200 : www.ti-fr.com.
Quelques idées personnelles ici.

153

Thibaut (./152) :
Est-ce infaillible ?

Je crois que non. En tout cas, PreOS fait une manip très bizare au niveau des twins (qui font 6 octets quel que soit le programme), et je ne crois pas que les programmes read-only aient un twin.
Thibaut (./152) :
Connait-on à coup sûr l'adresse de la table des handles sur n'importe quelle machine ?

tios::Heap (ramcall grin)

154

Est-ce infaillible ?

Ca paraît raisonnable de faire comme ça, oui. Le handle ne sera pas forcément un twin, cependant.
En utilisant l'adresse d'un symbole du programme, tu peux effectivement te dispenser d'utiliser un Ptr2Hd générique, tel qu'il est implémenté par les kernels, PedroM et GCC4TI ("PtrToHandle").
Connait-on à coup sûr l'adresse de la table des handles sur n'importe quelle machine ?

Sur AMS, oui (traitement différent selon AMS 1.xx et AMS 2.xx/3.xx).
Sur PedroM, je suis moins sûr.
avatar
Membre de la TI-Chess Team.
Co-mainteneur de GCC4TI (documentation en ligne de GCC4TI), TIEmu et TILP.
Co-admin de TI-Planet.

155

Thibaut (./152) :
Est-ce infaillible
Folco (./153) :
Je crois que non
Lionel Debroux (./154) :
Ca paraît raisonnable

Oui, ok, mais ça sera pas forcément un twin comme tu dis grin

156

Thibaut (./152) :
On note l'adresse de n'importe quel symbole dans le processus (qui est forcément un twin du programme possédant le même nom ?).

Je suis à peu près sûr qu'aucun programme compressé (par quelque méthode que ce soit) ne possède un twin...
Folco (./153) :
En tout cas, PreOS fait une manip très bizare au niveau des twins (qui font 6 octets quel que soit le programme), et je ne crois pas que les programmes read-only aient un twin.

Aucun programme exécuté par le kernel ne possède de twin. Le twin du programme initial est détruit (mais le handle est conservé pour éviter de tout faire planter)

157

Thibaut (./152) :
J'ai l'impression d'avoir vu FireHunter parler de ça récemment avec d'autres. Je vais relire.


Le concerné cité n'a aucune idée de ce que tu racontes ^^. Le contenu de tes .h me dépasse de loin smile

158

PpHd (./156) :
Aucun programme exécuté par le kernel ne possède de twin. Le twin du programme initial est détruit (mais le handle est conservé pour éviter de tout faire planter)

Ah ok, tu conserves le handle. Mais ce n'est plus un twin au nivau de la VAT, j'avais pas compris ça. Merci.

159

Bon... Il existe une manière fiable de lire la dernière commande tapée dans Home ?
... C'est une mauvaise question aussi. Les programmes lancés par d'autres n'ont pas d'entrée dans la ligne de commande.

Bon.... Vive le TIOS... Si le mode kernel était resté un standard, il y aurait tellement de lacunes du TIOS qui seraient comblées...
avatar
Un site complet sur lequel vous trouverez des programmes et des jeux pour votre calculatrice TI 89 / Titanium / 92+ / Voyage 200 : www.ti-fr.com.
Quelques idées personnelles ici.

160

FireHunter : Il y a pas mal de bas niveau (c'est à dire de traitements réalisés avec des appels système) et deux algos labyrintheux. Moi-même, dans un mois, j'aurai certainement du mal à comprendre en détail sans relire plusieurs fois quelques passages wink
avatar
Un site complet sur lequel vous trouverez des programmes et des jeux pour votre calculatrice TI 89 / Titanium / 92+ / Voyage 200 : www.ti-fr.com.
Quelques idées personnelles ici.

161

Ouais, mais je peux lire autant que je veux, je pigerais pas plus #okay#

162

Ta méthode de détection va foirer pour les programmes compressés avec ExePack (la majorité des programmes TIGCC).

Je ne vois pas d'autre solution que d'identifier l'adresse de retour dans le code de démarrage (le seul endroit où l'offset sur la pile est connu, cf. par exemple le code pour SET_FILE_IN_USE_BIT) et de chercher aussi le handle de cette adresse (qui sera celui du lanceur). Mais si on utilise un lanceur générique comme ttstart ou, pire (parce que c'est une FlashApp et donc le code n'est pas dans un handle), Super Start, c'est mal parti.
avatar
Mes news pour calculatrices TI: Ti-Gen
Mes projets PC pour calculatrices TI: TIGCC, CalcForge (CalcForgeLP, Emu-TIGCC)
Mes chans IRC: #tigcc et #inspired sur irc.freequest.net (UTF-8)

Liberté, Égalité, Fraternité

163

Ouai :/ Quelqu'un sait ce qu'on obtient dans *argv* quand on lance un programme à partir d'un autre sous Linux ? J'essaierai ça bientôt, mais si quelqu'un a la réponse ca me fera gagner un peu de temps. Et toi Kevin, tu connais un moyen d'obtenir la dernière commande tapée dans Home ?

FireHunter : alors, tu as pu remettre GTC proprement à partir de zero ?


* Merci Pen2 pour l'idée fort pratique de mettre une étoile à gauche sur le forum
avatar
Un site complet sur lequel vous trouverez des programmes et des jeux pour votre calculatrice TI 89 / Titanium / 92+ / Voyage 200 : www.ti-fr.com.
Quelques idées personnelles ici.

164

la ligne de commande qu'on a mis dans exec() ?

le démarrage de programmes linux est bien plus basique.

165

Je sais pas grin je pense qu'il y a une méthode privilégiée sous Linux. Que produit-elle dans le paramètre *argv du programme lancé ?
avatar
Un site complet sur lequel vous trouverez des programmes et des jeux pour votre calculatrice TI 89 / Titanium / 92+ / Voyage 200 : www.ti-fr.com.
Quelques idées personnelles ici.

166

[squalyl@pc2 ~]$ cat test1.c
#include <stdio.h>
#include <unistd.h>

int main(int argc, char **argv)
{
        char *a[3];

        printf("argv[0] contient %s\n",argv[0]);
        printf("avant exec(test2)\n");
        a[0]="tutu";
        a[1]="toto";
        a[2]=NULL;
        execvp("./test2",a);
        return 0;
}

[squalyl@pc2 ~]$ cat test2.c
#include <stdio.h>

int main(int argc, char **argv)
{
        printf("dans test2, argv[0]=%s\n",argv[0]);
        return 0;
}

[squalyl@pc2 ~]$ gcc test1.c -o test1
[squalyl@pc2 ~]$ gcc test2.c -o test2
[squalyl@pc2 ~]$ ./test1
argv[0] contient ./test1
avant exec(test2)
dans test2, argv[0]=tutu
[squalyl@pc2 ~]$

167

[squalyl@pc2 ~]$ cat test3.c
#include <stdio.h>
#include <unistd.h>

int main(int argc, char **argv)
{
        printf("argv[0] contient %s\n",argv[0]);
        printf("avant system(test2)\n");
        system("./test2");
        return 0;
}

[squalyl@pc2 ~]$ gcc test3.c -o test3
[squalyl@pc2 ~]$ ./test3
argv[0] contient ./test3
avant system(test2)
dans test2, argv[0]=./test2
[squalyl@pc2 ~]$

168

tu connais un moyen d'obtenir la dernière commande tapée dans Home ?

Cette commande est stockée dans un handle, qu'il est possible d'obtenir en lisant 2 ou 4 octets à un certain offset par rapport au début d'une certaine fonction. J'ai ce code, du moins pour AMS 1.xx et 2.xx, dans tthdex-internal-not-working. La taille et l'offset dépendent des versions d'AMS (sinon ça n'est pas drôle grin) et cela ne fonctionne certainement pas sous PedroM.
De toute façon, cette ligne de commande a elle aussi de grandes chances de contenir le nom du lanceur (spécifique, "ttstart" générique ou "sstart").

[EDIT: extrait de tthdex:
__Search_for_system_TEXT_EDIT__:
    | Search for the system TEXT_EDIT structure. We need it to retrieve the
    | home screen line handle.
    | Thanks to Samuel Stearley for this method.
    movea.l 0x10E*4(%%a5),%%a0 | HomeExecute.
    move.l 0xB1*4(%%a5),%%d0  | TE_select.

__Loop_search_system_TEXT_EDIT_loop__:
    addq.l #2,%%a0
    cmp.l (%%a0),%%d0
    bne.s __Loop_search_system_TEXT_EDIT_loop__
    
    | This line might be unsafe on future AMS versions, if TI puts the
    | TEXT_EDIT structure above 0x8000... Note that TI doing that would 
    | break many other programs too !
    move.w -4(%%a0),%%a0    | Pointer to the home text edit structure.

    move.w 34(%%a0),%%d0    | Take the handle of the home screen line.

Comme écrit depuis des années dans le commentaire, ça risque de ne pas fonctionner tel quel sous AMS 3.xx - et il te faudra trouver le nom du programme compressé, si programme compressé il y a. Une usine à gaz, quoi.]
avatar
Membre de la TI-Chess Team.
Co-mainteneur de GCC4TI (documentation en ligne de GCC4TI), TIEmu et TILP.
Co-admin de TI-Planet.

169

Thibaut (./163) :
tu connais un moyen d'obtenir la dernière commande tapée dans Home ?

flashsavior le faisait embarrassed (mais comme un porc et faudrait actualiser quelques adresses pour que ça fonctionne avec AMS > 2.05)

170

Thibaut (./163) :
FireHunter : alors, tu as pu remettre GTC proprement à partir de zero ?


Ouaip smile J'ai juste un p'tit problème
#include <stdio.h>

char main(char arg[64])
{
   arg = SYMSTR(arg);
   return arf;
}

Ne fonctionne pas. (retourne un entier extravagant)

En revanche :
#include <stdio.h>

short main(char arg[64])
{
   arg = SYMSTR(arg);
   return strlen(arg);
}


Retourne 0.

Ou je sais plus coder ou je sais pas utiliser ta lib ??

171

c'est quoi short, et char[64]?

je vote pour la réponse B.

172

main est censé retourner un int et avoir comme paramètre un int et un char**
avatar

173

Pas plutôt un char *[] ?
avatar
« Quand le dernier arbre sera abattu, la dernière rivière empoisonnée, le dernier poisson capturé, alors vous découvrirez que l'argent ne se mange pas. »

174

Merci à vous squalyl et Lionel. On laisse tomber je pense.

FireHunter : Je ne me permettrais pas. Prends un tutoriel de C classique et tu verras l'interface standard de main et comment s'utilisent les arguments. Et n'emploie pas SYM_STR, ça n'a pas de rapport wink

squalyl : réponse B parceque réponse A en fait. Merde je me permettrais pas.
avatar
Un site complet sur lequel vous trouverez des programmes et des jeux pour votre calculatrice TI 89 / Titanium / 92+ / Voyage 200 : www.ti-fr.com.
Quelques idées personnelles ici.

175

Sasume (./173) :
Pas plutôt un char *[] ?
Un tableau étant un pointeur, les deux fonctionnent bien.

avatar

176

Idéalement c'est même un const char **

Sinon Thibaut si tu fais un execv le argv est passé en paramètre explicitement par le programme appelant, donc tu n'as pas besoin de te demander ce qu'il y a en 0 (ça devrait être le nom du programme appelé en principe, mais c'est au programme appelant de s'en charger).

Si tu utilises la fonction system, ça appelle en fait le shell avec la ligne de commande passée en argument, donc tout se passe (à peu près) comme si cette ligne de commande avait été tapée dans un shell interactif.
avatar
« Le bonheur, c'est une carte de bibliothèque ! » — The gostak distims the doshes.
Membrane fondatrice de la confrérie des artistes flous.
L'univers est-il un dodécaèdre de Poincaré ?
(``·\ powaaaaaaaaa ! #love#

177

Le code de recherche de la ligne d'entrée de HOME fonctionne aussi sous AMS 3. J'ai aussi une version C de Greg Dietsche quelque part. Mais ce n'est pas une solution fiable non plus, par exemple le programme pourrait avoir été exécuté depuis un programme TI-BASIC ou un shell, voire renommé en kbdprgm1 et lancé avec DIAMOND+1 (ou un autre numéro).
avatar
Mes news pour calculatrices TI: Ti-Gen
Mes projets PC pour calculatrices TI: TIGCC, CalcForge (CalcForgeLP, Emu-TIGCC)
Mes chans IRC: #tigcc et #inspired sur irc.freequest.net (UTF-8)

Liberté, Égalité, Fraternité

178

Ouai, c'est pas cool tout ça...

Sally : C'est noté ! J'aurais appris un truc aujourd'hui : lancer des programmes sous Linux c'est simple.

FireHunter : Je t'ai trouvé un cours très clair. Le voici, adapté au cas des TI68k, notamment parceque la partie traitant de la ligne de commande DOS ne nous concerne pas et que argv[0] est vide :

4. Les arguments transmis à la fonction main

4.1 Comment passer des arguments à un programme


La fonction main peut récupérer les valeurs des arguments fournis au programme lors de son lancement. Le mécanisme utilisé par l'utilisateur pour fournir ces informations dépend de l'environnement. Il peut s'agir de commandes de menu pour des environnements dits graphiques ou intégrés. Dans les environnements fonctionnant en mode texte (tels DOS ou UNIX), il s'agit de valeurs associées à la commande de lancement du programme (d'où le terme d'arguments de la ligne de commande). Voici un exemple où l'on demande l'exécution du programme nommé test, en lui transmettant des arguments :

test("caractères1", nombre1, "caractères2")

ou encore :

test("caractères1 nombre1 caractères2")



4.2 Comment récupérer ces arguments dans la fonction main

Ces paramètres sont des chaînes de caractères ou des nombres. Lorsqu'ils sont fournis entre des guillemets dans la ligne de commande, ils sont séparés par des espaces. On peut aussi les séparer par des virgules. Leur transmission à la fonction main (réalisée par le système) se fait selon les conventions suivantes :

* le premier argument reçu par la fonction main sera de type int et il représentera le nombre total de paramètres fournis dans la ligne de commande (le nom du programme compte lui-même pour un paramètre) ;
* le second argument reçu par la fonction main sera l'adresse d'un tableau de pointeurs, chaque pointeur désignant la chaîne correspondant à chacun des paramètres.

Ainsi, en écrivant l'entête de la fonction main comme ceci :

int main (int argc, char * argv[])nous obtiendrons :

* dans argc, le nombre total de paramètres ;
* à l'adresse argv[0], le premier paramètre, qui correspond au nom du programme sur PC. Sur TI, la chaine est vide ;
* à l'adresse argv[1], le second paramètre. Dans notre exemple, il s'agirait de la chaîne "caractères1" ;
* etc.

Voici un exemple de programme utilisant ces possibilités. Il est accompagné de trois exemples d'exécution. Nous avons supposé que notre programme se nommait tagada.

#include <stdio.h>

int main (int argc, char * argv[])
{
    int i;
    
    if (argc>1) for (i=1; i<argc; i++) printf ("Argument numero %d : %s\n", i, argv[i]);
        else printf ("Pas d'argument\n");

    return 0;
}


tagada()Pas d'argument

tagada("fraise tsointsoin")
Argument numero 1 : fraise
Argument numero 2 : tsointsoin


tagada("fraise", "tsointsoin")
Argument numero 1 : fraise
Argument numero 2 : tsointsoin

Adapté de http://www.gchagnon.fr/cours/cgi/cours4.html
avatar
Un site complet sur lequel vous trouverez des programmes et des jeux pour votre calculatrice TI 89 / Titanium / 92+ / Voyage 200 : www.ti-fr.com.
Quelques idées personnelles ici.

179

Dans la prochaine version de likeonpc, un troisième argument sera passé à main : char *env[]. Je l'avais oublié celui-là chapo Ce sera un simple élément pointant vers NULL.
avatar
Un site complet sur lequel vous trouverez des programmes et des jeux pour votre calculatrice TI 89 / Titanium / 92+ / Voyage 200 : www.ti-fr.com.
Quelques idées personnelles ici.

180

c'est quoi l'utilité ? trifus

tu connais le nombre de programmes qui utilisent main(int argc, char *argv[], char *envp[]) ?
et le nombre de ceux qui utilisent getenv(char*) ?