libg1m - une interface mieux pensée que son format
Posté le 01/11/2016 10:05
Le saviez-vous ? L'ensemble des formats de fichiers dont vous avez l'habitude (g1m, g1e, g1a, g3a, ...) sont en réalité des déclinaisons d'un seul même format ? Ce format, comme d'habitude, n'a pas vraiment de nom public, donc je l'ai nommé par le nom de l'une de ses déclinaisons les plus complexes, le G1M.
Ça fait un petit moment que je souhaite faire une lib qui soit capable de lire (d'analyser) et d'écrire dans toutes ces déclinaisons (ou au moins les plus communes), avec une interface assez facile d'accès (parce que le faire directement, c'est quand même bien casse-gueule). Eh bien ça y est, je me suis lancé dessus depuis quelques temps. Pour l'instant, je ne m'occupe que de la partie lecture pour avoir une idée globale de toutes les déclinaisons du format, pour savoir ensuite comment je stockerai ça pour le renvoyer à l'utilisateur.
Les sources sont d'ores et déjà disponibles sur ma forge personnelle.
Pour le moment, je ne me concentre que sur la capacité d'analyse de la lib, puis je me concentrerai sur le fait de lire pour renvoyer à l'utilisateur. Ne comptez pas sur une capacité d'écriture avant un moment.
Les formats actuellement "gérés" (ou en cours de décortiquage) sont :
-
G1A,
G3A : add-ins pour les calculatrices monochromes et Classpads (/Prizm) ;
-
G[1-3][MR] : sauvegardes de la MCS (mémoire principale) ;
-
G[1-3]E : e-activities (documents) ;
-
G3P : pictures pour les Prizm ;
-
C2P : pictures pour les Classpads ;
-
G1S : archive ;
-
G1L,
G3L : fichiers de locale.
-
G1N : fichiers de
function keys. (merci Simon Lothar <3)
Il me reste encore pas mal de subtilités à comprendre/tester, comme pas mal de types de strips pour les e-activities (calculs, UI.main, ...) ou les BCD. Aussi, en plus de ces formats-là, d'autres formats sont sur ma TODO list (voir plus bas).
Pour les sauvegardes de la mémoire principale, les éléments suivants sont gérés :
-
Programmes
-
Spreadsheets
-
Captures
-
Pictures
-
Listes
-
Matrices
Mon test kit actuel avec les fichiers, sources et scripts de test
ICI (et les
anciens au cas où)
Ce projet possède un sous-projet : la référence FONTCHARACTER,
n'hésitez pas à aller voir si vous voulez découvrir l'encodage qu'utilisent les calculatrices CASIO.
Citer : Posté le 01/11/2016 11:03 | #
Je n'ai pas bien compris à quoi va servir ta lib. Tu parles de capacité d'analyse (analyser quoi ?) et de lire et renvoyer à l'utilisateur (renvoyer quoi ?)
Citer : Posté le 01/11/2016 11:13 | #
Pour le ZIP par exemple, il y a une libzip qui existe et qui permet de lire le format et de permettre à l'utilisateur (l'utilisateur d'une lib, c'est le développeur qui va s'en servir, qu'on s'entende bien là-dessus) de s'en servir simplement.
Eh bien là, c'est pareil (sauf que le format a pas de nom, c'est genre "le format de CASIO", seules ses déclinaisons en ont un). J'ai pas encore décidé de l'usage de la lib, mais on peut imaginer quelque chose comme :
if (g1m_open(handle, "C:\Users\lol\Documents\fichier.g1m"))
/* on traite l'erreur */
if (g1m_get_type(handle) != g1m_type_mcs)
/* le fichier n'est pas un fichier .g1m ou .g1r */
g1m_mcs_element **list = g1m_look_for_mcs_elements(handle, G1M_FILTER_CAPTURES);
while (*list) {
void *data = g1m_get_data(*list);
/* on décode la capture et on l'enregistre quelque part */
}
g1m_free_mcs_elements_list(list);
g1m_free(handle);
(garde à l'esprit que quasi-aucune de ces fonctions n'existe pour le moment, c'est pas encore l'étape à laquelle j'en suis, j'ai juste imaginé des fonctions qui pourraient exister plus tard)
Mon blog ⋅ Mes autres projets
Citer : Posté le 01/11/2016 11:19 | #
Ce qui explique pourquoi on peut changer l'extension de certains fichiers sans aucun problème.
Citer : Posté le 01/11/2016 11:20 | #
Si tu penses au renommage des .g*r en .g*m, yep, mais en l'occurrence, les deux ont la même utilité et la différence entre les deux est stupide et inutile. x)
Mon blog ⋅ Mes autres projets
Citer : Posté le 01/11/2016 13:52 | #
Entre g*m et g*r, c'est plus sur l'idée de l'endroit de stockage et de lecture.
Citer : Posté le 01/11/2016 13:54 | #
Tu peux détailler plus stp ?
(parce que structurellement, les g*m et les g*r c'est vraiment exactement la même chose pour ce que j'en ai vu quoi, et bon, j'ai un parsing assez complet de ce côté-là )
EDIT: Effectivement, Zezombye l'a soulevé dans la shoutbox, dans un g1r, il semble systématiquement y avoir une section SETUP et une section ALPHA MEM.
Mon blog ⋅ Mes autres projets
Citer : Posté le 01/11/2016 14:29 | #
Ah bien, voilà qui pourrait s'avérer utile à l'avenir. Je sens déjà la combinaison avec p7 : « télécharge-moi la CAPTURE 10 au format BMP ».
Bon courage, il y a pas grand-monde qui ose mettre les mains dans le foutoir des formats de Casio
Citer : Posté le 01/11/2016 21:26 | #
D'ailleurs en passant, les g3a c'est (aussi ?) les add-ins à destination des Prizms.
Éventuellement si tu t'ennuies à moment donné, les types g1l et g3l pourraient être sympas à gérer, enfin, ce serait surtout gérer l'écriture qui le serait en fait, donc à voir dans un futur plus lointain éventuellement (ou jamais, c'est toi qui voit).
Citer : Posté le 01/11/2016 21:28 | #
Je ne connais pas du tout ces formats, tu as plus de détails, tu saurais où je peux en trouver ? (la doc de Simon Lothar est assez incomplète pour tout ce qui est formats, même si elle donne une bonne base... )
Mon blog ⋅ Mes autres projets
Citer : Posté le 01/11/2016 21:37 | #
Je sais juste que ce sont des fichiers qui permettent d'internationaliser les machines (de fournir plus de "locales" en gros), en gros ça permet d'ajouter des langues à la machine assez facilement si je dis pas de bêtises. Bon après je doute qu'on en ait vraiment besoin, mais le fait de pouvoir passer facilement sa calto en Esperanto me semble pourtant fondamental.
Après sur un plan plus technique, je me suis jamais penché dessus en fait, mais ça n'a pas l'air hyper complexe :
« The g3l files consist of a header, containing the language name and other values, followed by a list of multi-byte strings. »
(bon le «other values» est un peu flou c'est vrai. x) )
«This type of files (.G1l) is easy to hack with a hex editor.»
Et éventuellement ça : http://prizm.cemetech.net/index.php/Locale
Mais après c'est tout ce que j'ai sous la main, je ne pense pas que ça ait été plus précisément documenté… ^^'
Citer : Posté le 01/11/2016 21:40 | #
Ça doit avoir à voir avec la liste des strings que l'on peut consulter dans le menu de test, accessible au boot avec [OPTN]+[EXP]+[AC/ON], [5], [9], [6], [3]|[4] sur G85. À tous les coups la numérotation correspond... (la Prizm doit fonctionner pareil)
Citer : Posté le 01/11/2016 21:48 | #
Pour les strings, pour le coup, une page dans le chm correspond.
Pour les "other values", peut-être quelque chose vis-à-vis des estrips ? (pas compris ce que c'était, mais j'ai vu ça associé aux langues dans le header G3A)
Et je regarde tout ça plus en détail quand je peux
Mon blog ⋅ Mes autres projets
Citer : Posté le 01/11/2016 21:57 | #
Sympa
Une GUI serai pas de refus par contre pour le coup x)
Citer : Posté le 01/11/2016 21:58 | #
La GUI, de une, ce sera quand la partie fonctionnelle sera prête (donc dans un bout de temps), et de deux, c'est pas moi qui la ferai.
Ajouté le 19/11/2016 à 23:27 :
Bon, comme je commence à avoir deux ou trois résultats, je viens poster ici.
Premier exemple, un programme qui affiche tous les mots de passe de programmes dans un g1m/g1r :
#include <stdio.h>
#include <errno.h>
#include <string.h>
int main(int ac, char **av)
{
if (ac != 2) return (0);
/* get context */
g1m_t *handle; int err;
if ((err = g1m_open(&handle, av[1]))) {
printf("Could not open file: %s\n", g1m_strerror(err));
if (err == g1m_error_nostream)
printf("Errno was %d: %s\n", errno, strerror(errno));
return (1);
}
/* check type */
if (handle->type & g1m_type_mcs) {
for (int i = 0; i < handle->part_count; i++) {
g1m_mcs_t *mcs = handle->parts[i];
for (int j = 0; j < mcs->file_count; j++) {
g1m_mcsfile_t *file = mcs->files[j];
if (~file->type & g1m_mcstype_program)
continue;
if (*file->password) {
printf("[%s] Password is '%s'\n",
file->name, file->password);
} else
printf("[%s] No password\n", file->name);
}
}
} else
printf("Was not an MCS file!\n");
/* free */
g1m_free(handle);
return (0);
}
Résultat sur Eon The Dragon par Drak (merci mec, ton programme est un super exemple o/) :
[�BEGIN] No password
[�CARAC] No password
[�CREDIT] Password is ' DRAK'
[�EDITOR] No password
[�EPILOG] No password
[�FIGHT] No password
[�FMOTOR] No password
[�MAIN P] No password
[�MAP M1] No password
[�MAP M2] No password
[�MAP M3] No password
[�MAP M4] No password
[�MATE MO] No password
[�MENU] No password
[�MLIST] No password
[�NAME] No password
[�SELEC] No password
[�SKET] No password
[�SYMB] No password
[�XP] No password
Je gère pas mal d'éléments de la MCS du coup, il me reste encore pas mal de variantes du format à explorer, de parsing à réaliser et d'éléments à faire pour rendre ça plus user-friendly. De plus, la lib n'a qu'une capacité de lecture pour le moment. Mais je bosse dessus !
(et oui, pour l'encodage, ça doit être du FONTCHARACTER pour lesquelles les fonctions sont déjà là, mais je comprends pas encore totalement comment c'est appliqué)
Mon blog ⋅ Mes autres projets
Citer : Posté le 20/11/2016 01:00 | #
Sympa.
Mais ton code C il est sur calto ou ordi ?
Citer : Posté le 20/11/2016 01:01 | #
La libg1m est totalement du côté PC, et n'est aucunement vouée à être portée sur calculatrice.
Ajouté le 23/11/2016 à 09:44 :
Je passe juste dire que j'avance, mais qu'il me manque encore pas mal de fichiers de test. Donc si vous avez des fichiers de type G3M, G1L, G3L, G3P, je prends (sans description complète et centralisée du format, malheureusement, c'est compliqué de faire autrement).
(l'avancement est sur ma forge, comme d'hab)
Mon blog ⋅ Mes autres projets
Citer : Posté le 23/11/2016 12:20 | #
De mémoire il y a une collection de G3P (fonds d'écran) quelque part sur Cemetech, ou TI-Planet (oups). Y'en a au moins 15, donc assez pour toi je pense. Y'a aussi un thread assez complet sur l'étude du format, sur PC au sujet je pense de mViewer pour CP400 (Critor).
Pour le G3M, la recherche est ton ami : lien
Oups, on dirait que la suppression du quatrième fichier des programmes n'a pas été correctement propagée. Mais puisque c'est toi, ça va <3
Citer : Posté le 01/12/2016 15:50 | #
Pour les G3P du coup, j'ai contacté Kerm sur Cemetech et il m'en a donné six relativement différents, donc normalement, ça devrait aller.
Pour la recherche, c'est super chiant à fix (la v42 est vraiment horrible putain.), donc faudra que je trouve le moyen de fix ça pour accéder aux G3M sur le site.
Ensuite, j'ai pu dégoter des C2P et des G1S (avec ce que j'ai découvert récemment, je suis capable de reconnaître les deux (pas encore de les lire)), et j'ai dégoté une petite fiche avec un format assez approximatif des C2P (où n'apparaissent pas les checksums, et comme je suis une quiche en reverse, c'est con). Par contre, j'avoue que pour les G1S, à part avoir lu quelque part que c'étaient des archives (l'équivalent made-in-Casio des zips), je n'ai pu trouver nulle part encore le format de ceux-ci ; quelqu'un aurait vu ça quelque part ? (comme précisé avant, je suis une quiche en reverse)
J'en profite aussi pour demander si quelqu'un n'a pas vu passer un rapport de reverse du format G1L. J'en ai un sous la main, je sais l'identifier, mais aucune idée de comment le lire.
Dernière note, il y a des formats très rares sur lesquels je ne suis pas parvenu à mettre la main, comme les G1N et les G1K/G3K (clés ?). La seule trace en ligne d'un G1N que j'ai pu trouver est un portuguais qui a posté sur Casiocalc.org il y a neuf/dix ans (son professeur de l'époque aurait transmis ça aux élèves de sa classe), aucune information sur l'utilité du format en lui-même (un FLS made-in-Casio ?), je l'ai donc contacté mais la probabilité que je reçoive une réponse est quand même extrêmement faible. Donc si vous avez la moindre info, je suis preneur.
Merci d'avance.
Mon blog ⋅ Mes autres projets
Citer : Posté le 01/12/2016 16:40 | #
Je vois que tu ne fais ce boulot à moitié
Je ne peux pas t'aider pour grand-chose mais je sais que les fichiers g1s, ou en tout cas FA-124, a une fonction de "saturation" qui se manifeste sous la forme d'un "Memory Full", mais sur l'ordinateur, et à l'importation dans l'interface graphique. Il y a donc une possibilité pour que ce format soit une copie conforme de la mémoire de stockage et que FA-124 se trimballe une implémentation de Bfile (je cite la boîte de dialogue : "Optimize?"). À voir.
Ah oui, au fait :
Ensuite, j'ai pu dégoter des C2P et des G1S [...]
Étant donné que les fichier g1s sont les images de mémoire de stockage de FA-124 et donc plutôt faciles à trouver, la formulation est un peu étonnante.
Citer : Posté le 01/12/2016 17:18 | #
Donc pire que ce que je pensais.
Et en fait, j'ai juste récupéré les G1S de ce programme-là (et des C2P random trouvés sur TI-Planet). (je vois pas trop en quoi la formulation est étrange)
Mon blog ⋅ Mes autres projets