1
Folco a encore frappé avec un programme kiserarien sur une scène désertique depuis de longues années. De quoi s'agit-il ? De Framegen bien sûr.

Qu'est-ce que c'est ?
Un générateur de frame, qui pond des headers de ce genre à partir d'un simple fichier texte.

A quoi sert-il ?
Il calcule les offsets, les aligne à la demande, utilise un offset de base paramétrable, définit une taille totale si ça vous amuse, et, comble de l'inutilité, il sait même virer les commentaires !!!

Comment ça marche en pratique ?
Le readme est là. C'est en ligne de commande, compilé avec MinGW (statique, donc il n'y a qu'un exe), et compilable sous Linux (makefile).

C'est programmé en quoi ?
En C. Ce langage est reconnu pour son inadaptation totale à parser du texte, mais comme le dit un très vieux proverbe chinois, 500 lignes de C sont plus simple à maintenir que deux lignes de Perl qui font la même chose. Surtout quand la performance est aussi cruciale que pour ce genre de travail. Et au moins, c'est portable sur TI et Apple Watch.

C'était pas possible de faire une macro pour éviter ce truc aussi affreux qu'inutile ?
Si, d'ailleurs voici le code :
offset	set	0
var	macro
\1	equ	offset
offset	set	offset+\2
	endm
Mais il est bien connu que les macros tombent en panne quand la Lune et la Terre sont alignées sur une droite, alors que Framegen est rock-solid.

Et en vrai, ça te sert à quoi ?
A replonger dans des très vieux projets avec des headers comme celui cité en exemple. Faut avouer que c'est quand même plus commode, même si complètement gadget.

Tu comptes distribuer ton programme ?
Oui, il est téléchargeable ici, mais personne n'ira le prendre vu que tout le monde s'en fout. N'allez pas voir les sources non plus, et puis elles sont sous GPL.

Si on est quand même très con, on en fait quoi de ton programme ?
On écrit des stack frames pour la moindre fonction, même quand on utilise pas de var locale. Dans ce cas, on remplace les registres par des vars. Mais on utilise Framegen de partout parce que c'est inutile.

Et sinon, tu fais quoi dans la vie ?
Directeur marketing. Au chômage.

Le mot de la fin ?
Betterave.
avatar<<< Kernel Extremist©®™ >>>
Feel the power of (int16) !
2
(tu devrais apprendre un langage de script quelconque — non, pas PHP ! — pour faire ce genre de projets, ça me semble bien adapté ^^)
avatar<<< Kernel Extremis©®™ >>> et Inventeur de la différence administratif/judiciaire ! (©Yoshi Noir)

<Vertyos> un poil plus mais elle suce bien quand même la mienne ^^
<Sabrina`> tinkiete flan c juste qu'ils sont jaloux que je te trouve aussi appétissant
3
Fortran? grin
4
Ça doit pouvoir se faire avec awk. smile (Mais ne me demandez pas comment. wink)
avatarMes 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é
5
C'est malin Folco, j'ai failli réveiller mes voisins à minuit passé en éclatant de rire en lisant le post ./1 embarrassed
(grin)
avatarZeroblog

« Tout homme porte sur l'épaule gauche un singe et, sur l'épaule droite, un perroquet. » — Jean Cocteau
« Moi je cherche plus de logique non plus. C'est surement pour cela que j'apprécie les Ataris, ils sont aussi logiques que moi ! » — GT Turbo
6
Oui d'ailleurs le son vient d'arriver, c'est malin embarrassed

Folco > grin
7
Folco (./1) :
comme le dit un très vieux proverbe chinois, 500 lignes de C sont plus simple à maintenir que deux lignes de Perl qui font la même chose.
Ca fait 10 ans que j'ai pas fait de Perl, du coup la version en 2 lignes ce sera pour une autre fois, mais j'ai une version en 20 lignes avec tout sauf --help et --version, que je laisse en exercice pour le lecteur embarrassed
$ cat -n framegen.pl 1 use Getopt::Long; 2 3 ($opt_offset, $opt_even) = (0, 0); 4 GetOptions("offset|o=i", "frame-name|f=s", "even|e", "remove-comments|r") or exit 1; 5 6 print "; This file is auto-generated by Framegen."; 7 print " It will be overwritten at next recompilation\n\n"; 8 9 while (<>) { 10 m/^(\s*)((\S+)\s+(\d+))?\s*#?(.*)/ or die "syntax error line $.\n"; 11 if ($2) { 12 print "$3\tequ\t$opt_offset"; 13 print $5 && !$opt_remove_comments ? "\t; $5\n" : "\n"; 14 $opt_offset = ($opt_offset + $4 + $opt_even) & ~$opt_even; 15 } else { 16 print $5 ? "$1;$5\n" : "\n" unless $opt_remove_comments; 17 } 18 } 19 20 print "\n$opt_frame_name\tequ\t$opt_offset\n" if $opt_frame_name;
$ perl framegen.pl --even --frame-name FRAME_SIZE --offset 10 exemple.txt 
; This file is auto-generated by Framegen. It will be overwritten at next recompilation

foo	equ	10	; this is a comment
bar	equ	14	; reserve 1 bytes for the symbol 'bar'
xyz	equ	16
  ; this is a comment line

  ; ^ it was an empty line !
qwerty	equ	18


FRAME_SIZE	equ	38
8
Si simple ? Wow, ça vaudrait le coup de se pencher dessus en effet, mais bon c'est toujours pareil, le temps, le temps... ^^
avatar<<< Kernel Extremist©®™ >>>
Feel the power of (int16) !
9
(ne pas chercher a en faire une en python ou lua, j'ai des choses (vraiment) plus importante a faire...)
avatarProud to be CAKE©®™
The cake is a lie! - Love your weighted companion cube

->986-Studio's Wonder Project!<-
[color=DAA5
-
Comme toutes les regexp, il aurais fait en C que la regexp n'aurais pas changée smile
avatarProud to be CAKE©®™
The cake is a lie! - Love your weighted companion cube

->986-Studio's Wonder Project!<-
[color=DAA5
Les regex c'est comme l'assembleur, c'est un art qui n'est pas donné à tout le monde chinois

En Perl il y a le modificateur /x qui permet de les écrire sur plusieurs lignes avec des commentaires si on veut :
  m/^        # beginning of line
    (\s*)    # optional whitespaces → $1
    (        # optional symbol definition → $2
      (\S+)    # symbol name → $3
      \s+      # whitespaces
      (\d+)    # value → $4
    )?
    \s*      # optional whitespaces
    \#?      # optional comment
    (.*)     # everything until end of line → $5
  /x
En l'occurrence, c'est pas forcément moins clair que le code spaghetti équivalent en C, qui fait 57 lignes embarrassed
il est allé compter ce fourbe grin
Mais bravo pour la regex ^^
avatar<<< Kernel Extremist©®™ >>>
Feel the power of (int16) !
Bah elle est vraiment très simple, tu peux maîtriser ça en moins d'une minute avec la légende :

Metacharacters
    ^        Match the beginning of the line
    .        Match any character (except newline)
    ()       Grouping
Quantifiers
    *        Match 0 or more times
    +        Match 1 or more times
    ?        Match 1 or 0 times
Special Escapes
    \s       Match a whitespace character
    \S       Match a non-whitespace character
    \d       Match a decimal digit character
Même sans aucune autre explication, tu vois comment ça marche en gros ?
Yep je vois, j'ai déjà trifouillé le coloriseur de 68000 de Kate : http://www.mirari.fr/UVrg (ajout des \labels_locaux entre autres)
Mais on ne peut pas dire que je sois un grand copain de ces bébêtes ^^
avatar<<< Kernel Extremist©®™ >>>
Feel the power of (int16) !
Et dans l'autre sens (regexp -> description) :
http://rick.measham.id.au/paste/explain.pl
avatarZeroblog

« Tout homme porte sur l'épaule gauche un singe et, sur l'épaule droite, un perroquet. » — Jean Cocteau
« Moi je cherche plus de logique non plus. C'est surement pour cela que j'apprécie les Ataris, ils sont aussi logiques que moi ! » — GT Turbo
Tiens, ça semble pas mal. Je note, merci happy
NODE EXPLANATION
--------------------------------------------------------------------------------
m/ 'm/'
--------------------------------------------------------------------------------
^ the beginning of the string
--------------------------------------------------------------------------------
( group and capture to \1:
--------------------------------------------------------------------------------
\s* whitespace (\n, \r, \t, \f, and " ") (0
or more times (matching the most amount
possible))
--------------------------------------------------------------------------------
) end of \1
--------------------------------------------------------------------------------
( group and capture to \2 (optional
(matching the most amount possible)):
--------------------------------------------------------------------------------
( group and capture to \3:
--------------------------------------------------------------------------------
\S+ non-whitespace (all but \n, \r, \t,
\f, and " ") (1 or more times
(matching the most amount possible))
--------------------------------------------------------------------------------
) end of \3
--------------------------------------------------------------------------------
\s+ whitespace (\n, \r, \t, \f, and " ") (1
or more times (matching the most amount
possible))
--------------------------------------------------------------------------------
( group and capture to \4:
--------------------------------------------------------------------------------
\d+ digits (0-9) (1 or more times
(matching the most amount possible))
--------------------------------------------------------------------------------
) end of \4
--------------------------------------------------------------------------------
)? end of \2 (NOTE: because you are using a
quantifier on this capture, only the LAST
repetition of the captured pattern will be
stored in \2)
--------------------------------------------------------------------------------
\s* whitespace (\n, \r, \t, \f, and " ") (0 or
more times (matching the most amount possible))
avatarProud to be CAKE©®™
The cake is a lie! - Love your weighted companion cube

->986-Studio's Wonder Project!<-
[color=DAA5
Zerosquare (./18) :
Et dans l'autre sens (regexp -> description) :
http://rick.measham.id.au/paste/explain.pl

regex101 l'explique aussi grin

/^(\s*)((\S+)\s+(\d+))?\s*#?(.*)/
^ assert position at start of the string
1st Capturing group (\s*)
\s* match any white space character [\r\n\t\f ]
Quantifier: * Between zero and unlimited times, as many times as possible, giving back as needed [greedy]
2nd Capturing group ((\S+)\s+(\d+))?
Quantifier: ? Between zero and one time, as many times as possible, giving back as needed [greedy]
Note: A repeated capturing group will only capture the last iteration. Put a capturing group around the repeated group to capture all iterations or use a non-capturing group instead if you're not interested in the data
3rd Capturing group (\S+)
\S+ match any non-white space character [^\r\n\t\f ]
Quantifier: + Between one and unlimited times, as many times as possible, giving back as needed [greedy]
\s+ match any white space character [\r\n\t\f ]
Quantifier: + Between one and unlimited times, as many times as possible, giving back as needed [greedy]
4th Capturing group (\d+)
\d+ match a digit [0-9]
Quantifier: + Between one and unlimited times, as many times as possible, giving back as needed [greedy]
\s* match any white space character [\r\n\t\f ]
Quantifier: * Between zero and unlimited times, as many times as possible, giving back as needed [greedy]
#? matches the character # literally
Quantifier: ? Between zero and one time, as many times as possible, giving back as needed [greedy]
5th Capturing group (.*)
.* matches any character (except newline)
Quantifier: * Between zero and unlimited times, as many times as possible, giving back as needed [greedy]

5QPhHAo.png