Creative Commons License
.

Aller au contenu | Aller au menu | Aller à la recherche | Voir les modalités d'utilisation des travaux de l'auteur

Bon, bah, plus de twitter. Hm, en contre partie, allez donc voir mon WebComic! ca se passe juste en dessous:
Page d'accueil rss Geekstories.fr La Boite à Vomi E-Generation Mon CV

dimanche 25 janvier 2009

Saisis ta chance !

[ Partager : Partager sur Digg ]

Qualité webcam

++ Tix.

mercredi 21 janvier 2009

Contre le brevet logiciel.

[ Partager : Partager sur Digg ]

Soyez nombreux à venir signer la pétition contre le brevet logiciel en Europe ! Pour rappel, un brevet logiciel est une technique d'accaparement judiciaire de lignes de code... En d'autre terme, la légalisation de la proprietarisation d'une forme d'accès à la culture et à l'expression ! On ne peu plus être plus liberticide que ce genre de chose... Plus d'information sur le site de la pétition :

stopsoftwarepatents.eu petition banner

++ Tix.

mercredi 14 janvier 2009

{ Illustration Vectorielle } Cernunnos

[ Partager : Partager sur Digg ]
Salutations

Voilà maintenant un bon moment que je tourne presque essentiellement sous GNU/Linux, et, jusqu'à il ya peu, je n'avais encore jamais trouvé d'équivalent viable à M$ Visio (c'est sans doute leur meilleur programme, il faut bien l'avouer). C'est d'autant plus grave qu'aucune machine virtuelle gratuite ne permet de le virtualiser !!!

Puis, j'ai découvert le fabuleux Inkscape !

Inkscape est un logiciel libre de dessin vectoriel sous licence GNU/GPL. Il a pour but de devenir un puissant outil d?édition graphique tout en étant entièrement conforme avec les standards XML, SVG et CSS du W3C.

Il s?agit d?un logiciel multiplate-forme, disponible notamment sous Microsoft Windows, Mac OS X (sous X11), Linux et FreeBSD

--> via Wikipedia

Car, en effet, comme en témoigne mes Tuxs, et autres illustrations ( qui étaient devenues récurrentes, du temps ou j'utilisait visio ...), je me servait de Visio (propriétaire, berk), qui est en théorie fait pour dessiner des diagrammes et des schémas, pour dessiner des trucs un peu moins techniques. Mais l'utilisation de Inkscape, elle est bien dédiée au dessin! Résultat ? Un programme génial, tres complet, tres performant, et super bien foutu pour dessiner plus que jamais !

Je vous présente donc ma toute première illustration, réalisée entièrement avec ce petit bijou :

Il sagit d'une interprétation toute personnelle de Cernunnos, une divinité gauloise, allégorie de l'abondance... Pour la petite histoire, il fait partie de ceux, parait-il, que les cathos, dans leur quête effrénée de pouvoir, auraient assimilés par la suite au diable, à satan, etc...
Bref, voilà =) c'est pas parfait, mais, en étant raisonnable, je n'aurais sû en espérer plus !

++ Tix.

lundi 5 janvier 2009

Des nouvelles du fioul....

[ Partager : Partager sur Digg ]

Il y a à peine quelques mois, la hausse du prix du pétrole était due aux chinois, qui consommaient... Plus tard, il y à environ deux mois, c'était la crise, qui apres avoir fait descendre "momentanément" son cour, allait sans doute le fair eremonter. Mais comme ça ne tiens plus, on à enfin trouvé une solution pour que ces connards de francais ces chers consommateurs francophones, gobent une hausse du prix du pétrole sans trop gueuler : la guerre en palestine...

C'est pas miraculeux la com en france ? en moins de six mois : trois bonnes raison d'expliquer qu'on nous prends pas assez, et qu'il faut participer aux commissions des actionnaires du gouvernement... u_u"

encore une fois : Affligeant ... totalement affligeant ...

++ Tix.

dimanche 28 décembre 2008

La Quadrature.net : Nouveau scandale muet...

[ Partager : Partager sur Digg ]
citation directe de La Quadrature.net :

Paris, le 17 Décembre 2008. L'amendement n°125 à la loi sur l'audiovisuel public, déposé par le rapporteur Christian Kert et Françoise de Panafieu vient d'être voté. Il vise à soumettre au contrôle du Conseil Supérieur de l'Audiovisuel les publicités sur Internet. Au nom de la protection de l'enfance, cet amendement absurde crée un dangereux précédent visant à imposer l'idée de régulation des contenus sur Internet.

« S’agissant des services consistant à éditer du contenu créé par des utilisateurs privés à des fins de partage et d’échanges au sein de communautés d’intérêt, le Conseil supérieur de l’audiovisuel veille à ce que la publicité placée par l’éditeur du site ne puisse nuire à l’épanouissement physique, mental ou moral des mineurs. »

« Protégeons les enfants ! » Qui pourrait s'opposer à ce noble objectif ? Il est pourtant indispensable de s'interroger sur la légitimité de mesures visant, sous ce prétexte, à imposer plus de contrôle1 et à contourner l'autorité judiciaire. L'amendement n° 125 est de ceux là : cette proposition réactionnaire et inapplicable constitue une atteinte grave à la libre concurrence et à la liberté d'expression.

D'ailleurs cet amendement ne décrit aucunement ses conditions d'applications. De même, la définition floue des « services consistant à éditer du contenu créé par des utilisateurs privés à des fins de partage et d’échanges au sein de communautés d’intérêt » pourrait très bien englober la quasi-totalité de l'Internet non-marchand, soit la vaste majorité des contenus publiés sur le réseau.

« Assimiler le réseau Internet aux médias télévisuels est au mieux une escroquerie intellectuelle (et technique), au pire une grave menace pour la liberté d'expression. » affirme Jérémie Zimmermann, co-fondateur de La Quadrature du Net, «  Cette mesure est un pied dans la porte, un pas de plus vers un contrôle administratif du réseau, une mise en coupe réglée par le pouvoir politique. Et le tout au nom de la protection de l'enfance, bien sûr ! »

Je n'ai rien à dire de plus, cependant, comme on pourrais s'autoriser à le préconiser, faites tourner, faites tourner ! . enfin, là, je ne le dis pas hein, je vous le suggère ;) plusplus, Tix.

samedi 20 décembre 2008

Phrase à la con n°2

[ Partager : Partager sur Digg ]
Il a parlé
"Hâtons nous de succomber à la tentation avant qu'elle ne s'éloigne." (Épicure)

le nouvel AspirAtor

[ Partager : Partager sur Digg ]

Ouiouioui, ce matin, en faisant les courses avec le pere, on est tombé né à né avec un engin assez spéciale dans le rayon informatique de l'échoppe visitée : le nouvel Acer Aspire Predator.



Réplique du pere : "Ho regarde, un aspirateur !"

Petit clin d'œil en passant, au vieil Alex.com qui, fût un temps, m'avais parlé du très fameux "Gringo del validator"

mercredi 17 décembre 2008

Phrase à la con n°1

[ Partager : Partager sur Digg ]
Le saviez vous ?
Un homme marche à une vitesse moyenne de 8,6x1012 Angström/semaine.

Quand la grande victime de l'Iraq s'explique...

[ Partager : Partager sur Digg ]
Salutations

Salutations.
C'est un peu révolté que je prends la plume ce matin, en lisant les nouvelles politiques sur le blog de RMS. Il y cite notamment cet article publié sur sfgate.com.

Il y dit, en gros, être la victime des services de renseignements, qui l'auraient trompé, et que l'inexactitude des données à propos de la présence d'armes de destruction massive avait été prouvée. Il se défends, et tente de se défaire de ses responsabilités avant de léguer le pouvoir au prochain président des États-Unis. Il aurait usé, selon l'article sus-cité, de "l'incertitude et de l'effet de panique" pour vendre aux américains, qui selon les mêmes sources aurait coûté la vie de quelques 4200 vies américaines (sans compter les victimes, les vraies, de cette espèce de guerre), plus de cent milliard de dollars par ans, et porté des dommages important à l'image des états unis.

Bon, si on entends parler de ca ce soir au JT de TF1, j'en serait bien étonné en tous les cas, tout le monde sait bien que la seule chose qui intéresse les français, c'est la star'ac et les ébats sexuels des sexagénaires reconvertis... Rappelons aussi que Bush est également le genre de gars à affirmer dans les interview qu'il fait de la politique pour les croyants, et que les athées ne sont pas son principal centre d'intérêt. Une personne bien intentionnée comme dirait Brassens...

++ Tix.

jeudi 11 décembre 2008

Developpement -> LowBrainBasicInterpreter [0.0.2]

[ Partager : Partager sur Digg ]

Voilà le dernier sample de mon interpréteur basic. Ajout d'une fonction Ltrim, et d'une fonction d'analyse plus poussée du code. Optimisation des fonctions précédentes. J'ai aussi revu un peu ma syntaxe, et j'ai décidé de m'orienter un peu plus vers un basic qui tourne un peu comme celui des TI. En effet, il permet de bien gérer les imbrications de boucles, et de ne pas s'embêter avec de drôles de choses qui consomment de la mémoire ! Vous constaterez aussi que par le fait, le codage est bien plus libre espaces superflus gérés etc...)
TODO: le reste u___u

/*****************************************************************************************


                                  BASIC interpreter
                                (PIC2PC - simulateur)
                                        0.0.2


          By Gery DUBIEF, www.tixlegeek.com, tixlegee AT gmail DOT com

          Code à compiler exclusivement avec GCC. Non compatible WINDOWS

*****************************************************************************************

            -> L'intégralité de ce code est sous license GPL. Rapportez vous au
            site ci dessous pour connaître les conditions exactes de la license.

                            http://www.gnu.org/copyleft/

*****************************************************************************************/
#include <stdio.h>
#include <stdlib.h>

/*****************************************************************************************
                            Reperes de lignes
*****************************************************************************************/
#define LBB_RCCHAR 59
#define LBB_STOPCHAR 0

//Domaine de définition ASCII des variables
#define LBB_SVDEF 65
#define LBB_EVDEF 90

/*****************************************************************************************
                            Index d'instruction
*****************************************************************************************/
#define LBBI_IF 100
#define LBBI_FOR 101

#define LBBI_ELSE 110
#define LBBI_GOTO 111
/*****************************************************************************************
                            Macros du simulateur
*****************************************************************************************/

// Affiche un retour chariot
#define LBB_NRC()   printf("\033[30m"); \

                    printf("\033[43m"); \
                    printf("[RC]"); \

                    printf("\033[37m"); \
                    printf("\033[40m"); \

                    printf("\n");
// Affiche un début de conditionnelle IF
#define LBB_NCIS(stackind)   printf("\033[34m"); \

                    printf("\033[40m"); \
                    printf("{%d\t[Debut de conditionelle IF]", stackind); \

                    printf("\033[37m"); \
                    printf("\033[40m"); \

                    printf("\n");
// Affiche un début de conditionnelle FOR
#define LBB_NCFS(stackind)   printf("\033[31m"); \

                    printf("\033[40m"); \
                    printf("{%d\t[Debut de conditionelle FOR]", stackind); \

                    printf("\033[37m"); \
                    printf("\033[40m"); \

                    printf("\n");
// Affiche une fin de conditionelle
#define LBB_NCE(stackind)   printf("\033[35m"); \

                    printf("\033[40m"); \
                    printf("}%d\t[Fin de conditionelle END]", stackind); \

                    printf("\033[37m"); \
                    printf("\033[40m"); \

                    printf("\n");
// Affiche un goto
#define LBB_NCG()   printf("\033[36m"); \

                    printf("\033[40m"); \
                    printf("--> \t<GO TO>"); \

                    printf("\033[37m"); \
                    printf("\033[40m"); \

                    printf("\n");
// Affiche un titre
#define LBB_NTI(titre)   printf("\033[30m"); \

                    printf("\033[47m"); \
                    printf("-------------------- [ %s ] --------------------", titre); \

                    printf("\033[37m"); \
                    printf("\033[40m"); \

                    printf("\n");

// Affiche un texte
#define LBB_CTS(txt,b,f)   printf("\033[3%dm",f); \

                    printf("\033[4%dm",b); \
                    printf("%s", txt); \

                    printf("\033[37m"); \
                    printf("\033[40m");

// Affiche un caractere
#define LBB_CTC(txt,b,f)   printf("\033[3%dm",f); \

                    printf("\033[4%dm",b); \
                    printf("%c", txt); \

                    printf("\033[37m"); \
                    printf("\033[40m");

// Affiche une erreur
#define LBB_NERR(errtxt)   printf("\033[31m"); \

                    printf("\033[40m"); \
                    printf("[ERROR] : %s ", errtxt); \

                    printf("\033[37m"); \
                    printf("\033[40m"); \

                    printf("\n");

/*****************************************************************************************
                            Typedefs
*****************************************************************************************/
typedef struct

{
	int index;  // Adresse ligne
	int argstart;

	int ctype;  // Type
	int branch; // Accord de goto

} LBB_CodeLine;

/*****************************************************************************************
                    Contenu de l'eeprom, normalement externe au programme.

                    Toutes les instructions de lectures de cette varibale devront
                    interragir avec le périphérique de support dirrectement.
*****************************************************************************************/
char ProgBuffer[] = "A=0 ; for B, 1, 10;A=A+1 ;if A<=10 ;  goto 3;end ; A=A - 1; if A>=1;goto 7; end ;end ;B=78; C=D ;";

int             LBB_LineCursor = 0;             // Curseur de lecture
int             LBB_LineUltimate = 0;           // Nombre de lignes

LBB_CodeLine    LBB_LineIndex[1024];            // Index des Lignes
int             LBB_ConditionalStack[10];       // Pile de repérage des branchements

/*****************************************************************************************
                            Déclaration des fonctions
*****************************************************************************************/
int LBB_strlen(char *str);
int LBB_strstr(char *str1, char *str2);

int LBB_InitConditionnal();
int LBB_Init();
int LBB_Execut(int LBB_LineToEx);

int LBB_Ltrim(char *str, int offset);
/*****************************************************************************************
                            Fonctions
*****************************************************************************************/

/*****************************************************************************************
                        Découpe et cartographie les lignes de script

                        les ";" actuels seront transcrit comme caracteres
                        spéciaux (habituellement \n, codé 15) dans l'eeprom.
*****************************************************************************************/
int LBB_Init()
{
    LBB_NTI("Initialisation de la trame de code");

    int i=0, j=1;
    while(ProgBuffer[i] != LBB_STOPCHAR)

    {
        if(ProgBuffer[i] == LBB_RCCHAR)

        {
            j++;
            LBB_Ltrim(ProgBuffer, i+1);

            LBB_LineIndex[j].index = i+1;
            LBB_NRC();

        }
        else
        {
            printf("%c", ProgBuffer[i]);

        }
        i++;
    }
    LBB_LineUltimate = j;

    printf("\nNombre de lignes : %d \n", LBB_LineUltimate);
    return(0);

}

/*****************************************************************************************
                            Cartographie de l'arbre conditionel
*****************************************************************************************/
int LBB_InitConditionnal()
{
    LBB_NTI("Analyse des conditionelles");

    int i=0, j=1, charindex = 1, LBB_ConditionalStackIndex = 0;

    char LBB_InstructionBuffer[30];
    for(i = 1 ; i <= LBB_LineUltimate-1 ; i++)

    {
        charindex = 0;
        printf("Ligne n° %d : instruction ", i);

        for(j=LBB_LineIndex[i].index; j<=LBB_LineIndex[i+1].index; j++)

        {

            if(ProgBuffer[j] == 32 || ProgBuffer[j] == 59 || ProgBuffer[j] == 61)

            {
                LBB_InstructionBuffer[charindex] = 0;
                LBB_LineIndex[i].argstart = LBB_strlen(LBB_InstructionBuffer);                // Inscription de l'offset de lecture pour

                break;
            }
            else
            {
            LBB_InstructionBuffer[charindex] = ProgBuffer[j];

            charindex++;
            }
        }



                                                 // les arguments

        printf("%s \t\t(offset de lecture : %d) \n",LBB_InstructionBuffer, LBB_LineIndex[i].argstart);

        if(LBB_strstr(LBB_InstructionBuffer, "if")==1)

        {
            LBB_ConditionalStackIndex ++;                                               // Ajout d'une adresse au STACK conditionel
            LBB_ConditionalStack[LBB_ConditionalStackIndex] = i;                        // pour les retours

            LBB_LineIndex[i].ctype = LBBI_IF;
            LBB_NCIS(LBB_ConditionalStackIndex);

        }
        if(LBB_strstr(LBB_InstructionBuffer, "end")==1)

        {
            LBB_LineIndex[LBB_ConditionalStack[LBB_ConditionalStackIndex]].branch = i;  // Attribution de l'index actuel

            LBB_NCE(LBB_ConditionalStackIndex);                                         // au STACK précedent
            LBB_ConditionalStackIndex --;                                               //

            LBB_LineIndex[i].ctype = LBBI_ELSE;

        }

        if(LBB_strstr(LBB_InstructionBuffer, "for")==1)

        {
            LBB_ConditionalStackIndex ++;                           // Ajout d'une adresse au STACK conditionel
            LBB_ConditionalStack[LBB_ConditionalStackIndex] = i;    // pour les retours

            LBB_LineIndex[i].ctype = LBBI_FOR;
            LBB_NCFS(LBB_ConditionalStackIndex);

        }
/*
        if(LBB_strstr(LBB_InstructionBuffer, "next")==1)
        {
            LBB_LineIndex[LBB_ConditionalStack[LBB_ConditionalStackIndex]].branch = i;  // Attribution de l'index actuel
            LBB_NCE(LBB_ConditionalStackIndex);                                         // au STACK précedent
            LBB_ConditionalStackIndex --;                                               //
            LBB_LineIndex[i].ctype = LBBI_ELSE;

        }
*/

        if(LBB_strstr(LBB_InstructionBuffer, "goto")==1)

        {
            LBB_LineIndex[i].ctype = LBBI_GOTO;
            LBB_NCG();

        }

    }
    if(LBB_ConditionalStackIndex > 0)
    {

        LBB_NERR("Arbre de branchement déséquilibré");
    }
    return(0);

}

/*****************************************************************************************
                                Analyse d'une ligne en vue de l'exécuter
*****************************************************************************************/
int LBB_Execut(int LBB_LineToEx)
{

    // 101 132
    int j=1, charindex;
    char LBB_InstructionBuffer[5],LBB_ArgumentBuffer[30];

        //printf(" >> ligne %d --> argstart: %d, index: %d \n",LBB_LineToEx, LBB_LineIndex[LBB_LineToEx].argstart, LBB_LineIndex[LBB_LineToEx].index);
        /////////////////////////////////////////////////////////////////////////////////////////////
        charindex = 0;

        for(j=LBB_LineIndex[LBB_LineToEx].index; j<= LBB_LineIndex[LBB_LineToEx].index + LBB_LineIndex[LBB_LineToEx].argstart-1; j++)    // Parcour de l'instruction

        {

            LBB_InstructionBuffer[charindex] = ProgBuffer[j];               // Copie dans le Buffer

            charindex++;
        }
        LBB_InstructionBuffer[charindex] = 0;

        /////////////////////////////////////////////////////////////////////////////////////////////
        charindex = 0;
        for(j=LBB_LineIndex[LBB_LineToEx].index + LBB_LineIndex[LBB_LineToEx].argstart; j<= LBB_LineIndex[LBB_LineToEx+1].index-2; j++)    // Parcour des arguments

        {

            LBB_ArgumentBuffer[charindex] = ProgBuffer[j];               // Copie dans le Buffer

            charindex++;
        }
        LBB_ArgumentBuffer[charindex] = 0;

        /////////////////////////////////////////////////////////////////////////////////////////////
        printf("%d#\t",LBB_LineToEx);
        LBB_Ltrim(LBB_ArgumentBuffer, 0);

        //printf("[");
        LBB_CTS(LBB_InstructionBuffer,0,4);
        //printf("][");

        LBB_CTS(LBB_ArgumentBuffer,0,5);

        if(LBB_InstructionBuffer[0] >= LBB_SVDEF && LBB_InstructionBuffer[0] <= LBB_EVDEF)

        {
           printf ("\t\t[Modification du registre ");
           LBB_CTC(LBB_InstructionBuffer[0],0,3);

           printf ("]");
        }
        printf(" \n");

       /* if(LBB_strstr(LBB_InstructionBuffer, "goto")==1)
        {
            LBB_LineIndex[i].ctype = LBBI_GOTO;
            LBB_NCG();
        }*/
    return(0);
}

/*****************************************************************************************
                            Renvoie la taille d'un tableau
*****************************************************************************************/
int LBB_strlen(char *str)
{
    int i=0,  strlen_buffer = 0;

    while(str[i] != 0)
    {

        strlen_buffer++;
        i++;
    }
    return strlen_buffer;

}

/*****************************************************************************************
                            Supprimme les espaces à gauche
                         d'une chaine et renvoie leur nombre
*****************************************************************************************/
int LBB_Ltrim(char *str, int offset)

{
    int i=0, decreased = 0, b;

    while(str[offset] == 32)
    {

        for(i=offset; i<=LBB_strlen(str); i++)

        {
        b = str[i+1];
        str[i] = b;

        }
        decreased++;
    }
    return(decreased);

}

/*****************************************************************************************
                            Compare deux chaines
*****************************************************************************************/
int LBB_strstr(char *str1, char *str2)

{
    int i = 0, strlen_str = LBB_strlen(str1), returned = 1;

    if(strlen_str==LBB_strlen(str2))
    {
        while(i < strlen_str)

        {

            if(str1[i]!=str2[i])

            {
                returned = 0;
            }
            i++;

        }

    }
    else
    {
        returned = 0;

    }
    return returned;

}
/*****************************************************************************************
                            Fonction principale
*****************************************************************************************/
int main()

{
    int i;
    LBB_Init();
    LBB_InitConditionnal();

        LBB_NTI("Exécution");
    for(i=1; i<=LBB_LineUltimate; i++)

    {
        LBB_Execut(i);
    }
    return 0;

}

Et, une fois compilé, ce gros tas de bug donne ca :

++ Tix.

mercredi 10 décembre 2008

Au passage ...

[ Partager : Partager sur Digg ]
salutations

Au passage, comme je le disait, souhaitons la bienvenue à Lara, la dernière release stable petite fille de Ornella et Alex, devenus heureux parents en ce 6 décembre 2008! Beaucoup de bonheur à eux deux et à leur petit bou d'chou!

++ Tix.

Developpement -> LowBrainBasicInterpreter

[ Partager : Partager sur Digg ]
Salutations

Cette semaine, j'ai entrepris le développement d'un petit interpréteur BASIC simple. Le but à terme est de pouvoir l'utiliser dans des systemes embarqués, genre PIC, AVR... pour traiter de petits scripts "clairs", et ce, sans avoir à gérer l'EMI, qui permet d'étendre la mémoire RAM du micro, sur des systèmes amovibles par exemple.

Le la syntaxe du BASIC que j'entreprends de décoder est un genre d'hybride entre le BASIC des micro d'antan, et un assembleur émulé. J'ai choisi cette voie pour des raisons pratique. En effet, si cette solution est plus stricte au niveau du script, elle est bien plus simple à décoder tout en permettant l'interprétation d'instructions très "bas niveau" (gestion de la mémoire plus poussée, registres, pile, etc...)

voilà un exemple de script :

va =0
vb=0
va = va + 1
if va <= 10
goto 3
else
va= va - 1
if va >= 1
goto 7
else
vb = vb + 1
if vb <= 10
goto 4
else

Ce petit morceau de code fait varier la valeur de va une dizaine de fois, de 1 à 10, puis de 10 à 1.

Actuellement, l'interpréteur n'en est qu'à ses balbutiement. Il découpe d'ors et déjà le script en lignes puis dresse une carte du programme et des branchements conditionnels. En effet, tout l'intéret de cet interpréteur est que le code n'est pas copié dans la RAM dans son intégralité, mais uniquement par ligne. Ensuite, en fonction de la carte dressée au préalable, il pourra exécuter telle ou telle ligne. Pour le développement, j'utilise un code qui n'ets pas le code définitif, mais une émulation de ce qui se passerait dans le PIC. Par exemple, le script ne sera pas stocké dans une variable (ca serait en contradiction avec les principes cités plus haut) mais dans un périphérique externe (genre mémoire EEPROM ou FLASH). Deplus, aucun dispositif de monitoring, tout ce qui est en rapport avec l'affichage sera viré au moment opportun.

Voilà le code actuel :

/*****************************************************************************************


                                  BASIC interpreter
                                (PIC2PC - simulateur)
                                        0.0.1


          By Gery DUBIEF, www.tixlegeek.com, tixlegee AT gmail DOT com

          Code à compiler exclusivement avec GCC. Non compatible WINDOWS

*****************************************************************************************

            -> L'intégralité de ce code est sous license GPL. Rapportez vous au
            site ci dessous pour connaître les conditions exactes de la license.

                            http://www.gnu.org/copyleft/

*****************************************************************************************/
#include <stdio.h>
#include <stdlib.h>

/*****************************************************************************************
                            Reperes de lignes
*****************************************************************************************/
#define LBB_RCCHAR 59
#define LBB_STOPCHAR 0

/*****************************************************************************************
                            Index d'instruction
*****************************************************************************************/
#define LBBI_IF 100
#define LBBI_ELSE 101

#define LBBI_GOTO 102
/*****************************************************************************************
                            Macros du simulateur
*****************************************************************************************/
// Affiche un retour chariot
#define LBB_NRC()   printf("\033[30m"); \

                    printf("\033[43m"); \
                    printf("[RC]"); \

                    printf("\033[37m"); \
                    printf("\033[40m"); \

                    printf("\n");
// Affiche un début de conditionnelle
#define LBB_NCS(stackind)   printf("\033[33m"); \

                    printf("\033[40m"); \
                    printf("{%d\t[Debut de conditionelle IF]", stackind); \

                    printf("\033[37m"); \
                    printf("\033[40m"); \

                    printf("\n");
// Affiche une fin de conditionelle
#define LBB_NCE(stackind)   printf("\033[33m"); \

                    printf("\033[40m"); \
                    printf("}%d\t[Fin de conditionelle IF]", stackind); \

                    printf("\033[37m"); \
                    printf("\033[40m"); \

                    printf("\n");
// Affiche un goto
#define LBB_NCG()   printf("\033[36m"); \

                    printf("\033[40m"); \
                    printf("--> \t<GO TO>"); \

                    printf("\033[37m"); \
                    printf("\033[40m"); \

                    printf("\n");
// Affiche un titre
#define LBB_NTI(titre)   printf("\033[30m"); \

                    printf("\033[47m"); \
                    printf("-------------------- [ %s ] --------------------", titre); \

                    printf("\033[37m"); \
                    printf("\033[40m"); \

                    printf("\n");
// Affiche une erreur
#define LBB_NERR(errtxt)   printf("\033[31m"); \

                    printf("\033[40m"); \
                    printf("[ERROR] : %s ", errtxt); \

                    printf("\033[37m"); \
                    printf("\033[40m"); \

                    printf("\n");

/*****************************************************************************************
                            Typedefs
*****************************************************************************************/
typedef struct

{
	int index;  // Adresse ligne
	int argstart;

	int ctype;  // Type
	int branch; // Accord de goto

} LBB_CodeLine;

/*****************************************************************************************
                    Contenu de l'eeprom, normalement externe au programme.

                    Toutes les instructions de lectures de cette varibale devront
                    interragir avec le périphérique de support dirrectement.
*****************************************************************************************/
unsigned char ProgBuffer[] = "va =0;vb = 0;va = va + 1;if va <= 10;goto 3;else ;va = va - 1;if va >= 1;goto 7;else ;vb = vb + 1;if vb <= 10;goto 4;else ; ;";

int             LBB_LineCursor = 0;             // Curseur de lecture
int             LBB_LineUltimate = 0;           // Nombre de lignes

LBB_CodeLine    LBB_LineIndex[1024];            // Index des Lignes
int             LBB_ConditionalStack[10];       // Pile de repérage des branchements

/*****************************************************************************************
                            Déclaration des fonctions
*****************************************************************************************/
int LBB_strlen(char *str);
int LBB_strstr(char *str1, char *str2);

int LBB_InitConditionnal();
int LBB_Init();
/*****************************************************************************************
                            Fonctions
*****************************************************************************************/

/*****************************************************************************************
                        Découpe et cartographie les lignes de script

                        les ";" actuels seront transcrit comme caracteres
                        spéciaux (habituellement \n, codé 15) dans l'eeprom.
*****************************************************************************************/
int LBB_Init()
{
    LBB_NTI("Initialisation de la trame de code");

    int i=0, j=1;
    while(ProgBuffer[i] != LBB_STOPCHAR)

    {
        if(ProgBuffer[i] == LBB_RCCHAR)

        {
            j++;
            LBB_LineIndex[j].index = i+1;

            LBB_NRC();
        }
        else
        {
            printf("%c", ProgBuffer[i]);

        }
        i++;
    }
    LBB_LineUltimate = j;

    printf("\nNombre de lignes : %d \n", LBB_LineUltimate);
    return(0);

}

/*****************************************************************************************
                            Cartographie de l'arbre conditionel
*****************************************************************************************/
int LBB_InitConditionnal()
{
    LBB_NTI("Analyse des conditionelles");

    int i=0, j=1, charindex = 1, LBB_ConditionalStackIndex = 0;

    char LBB_InstructionBuffer[30];
    for(i = 1 ; i <= LBB_LineUltimate-1 ; i++)

    {
        charindex = 0;
        printf("Ligne n° %d : instruction ", i);

        for(j=LBB_LineIndex[i].index; j<=LBB_LineIndex[i+1].index; j++)

        {
            if(ProgBuffer[j] == 32)

            {
                LBB_InstructionBuffer[charindex] = 0;
                break;

            }
            LBB_InstructionBuffer[charindex] = ProgBuffer[j];

            charindex++;

        }

        LBB_LineIndex[i].argstart = LBB_strlen(LBB_InstructionBuffer)+1;  // Inscription de l'offset de lecture poue

                                                                        // les arguments
        printf("%s \t\t(offset de lecture : %d) \n",LBB_InstructionBuffer, LBB_LineIndex[i].argstart);

        if(LBB_strstr(LBB_InstructionBuffer, "if")==1)

        {
            LBB_ConditionalStackIndex ++;                           // Ajout d'une adresse au STACK conditionel
            LBB_ConditionalStack[LBB_ConditionalStackIndex] = i;    // pour les retours

            LBB_LineIndex[i].ctype = LBBI_IF;
            LBB_NCS(LBB_ConditionalStackIndex);

        }
        if(LBB_strstr(LBB_InstructionBuffer, "else")==1)

        {
            LBB_LineIndex[LBB_ConditionalStack[LBB_ConditionalStackIndex]].branch = i;  // Attribution de l'index actuel

            LBB_NCE(LBB_ConditionalStackIndex);                                         // au STACK précedent
            LBB_ConditionalStackIndex --;                                               //

            LBB_LineIndex[i].ctype = LBBI_ELSE;

        }

        if(LBB_strstr(LBB_InstructionBuffer, "goto")==1)

        {
            LBB_LineIndex[i].ctype = LBBI_GOTO;
            LBB_NCG();

        }

    }
    if(LBB_ConditionalStackIndex > 0)
    {

        LBB_NERR("Arbre de branchement déséquilibré");
    }
    return(0);

}
/*****************************************************************************************
                            Renvoie la taille d'un tableau
*****************************************************************************************/
int LBB_strlen(char *str)
{

    int i=0,  strlen_buffer = 0;
    while(str[i] != 0)

    {
        strlen_buffer++;
        i++;
    }

    return strlen_buffer;
}
/*****************************************************************************************
                            Compare deux chaines
*****************************************************************************************/
int LBB_strstr(char *str1, char *str2)

{
    int i = 0, strlen_str = LBB_strlen(str1), returned = 1;

    if(strlen_str==LBB_strlen(str2))
    {
        while(i < strlen_str)

        {

            if(str1[i]!=str2[i])

            {
                returned = 0;
            }
            i++;

        }

    }
    else
    {
        returned = 0;

    }
    return returned;

}
/*****************************************************************************************
                            Fonction principale
*****************************************************************************************/
int main()

{
    LBB_Init();
    LBB_InitConditionnal();
    return 0;

}

Et, une fois compilé, ce gros sac de noeud donne ca :

Plus d'infos dans les semaines à venir.

mardi 25 novembre 2008

Le nouveau blog d'Alex.com

[ Partager : Partager sur Digg ]
Salutations!

Aujourd'hui, je prends la plume (et oui, mon clavier à de drôles d'airs parfois) pour causer pub ! En effet, ce cher Alex.com, qui, comme s'il fallait que je le rapelle u___u', un genre de collègue spirituel, un mentor, doté d'un niveau de geekerie tres élevé. S'il ne fallait citer que son simili-ambilight multizone, son détecteur d'éclaire pour appareil photo, son fusible électronique, ses diverses réalisations à led, son horloge Cmos, son vaisseau, on passerait à coté de bien des réalisations intéressantes. Il fait, de plus, de tres sympathiques photographies (reflex man, comme Giles, le japonais), et cause toujours avec une grande précision sur bien des sujets. Guy (mon pere) dit souvent, (et amicalement) de lui qu'il fait partie des gens avec qui, quand on à fini de discuter, on ne se souviens plus du sujet de départ. C'est un compliment bien entendu, de nos jours, trouver des gens intéressant, c'est coton.

Bref, après cette présentation un peu vaseuse, le vif du sujet: L'amis Alex.com à changé de Blog! En ce qui me concerne, je trouve le changement approprié, étant donné la grande médiocrité des services proposés par NRJ. Bref, un blog intéressant au contenu prenant en règle générale !

voilà le lien : http://le-zgeg25.over-blog.fr/

++ Tix.

mardi 18 novembre 2008

Encore un petit dessin, un diable cette fois-ci

[ Partager : Partager sur Digg ]
Salutations !

Toujours en physique, mais cette fois, d'inspiration tout à fait neutre, un petit diable, méphistophélique diabolique :) .

++ Tix.

lundi 17 novembre 2008

Encore un petit dessin.

[ Partager : Partager sur Digg ]
Salutations !

Pour couper court avec la note précédente, voilà un petit dessin fait en cour de physique, une petite gribouille lointaine ment inspirée de du (mauvais) film "Silent Hill". Ce n'est pas mon premier gaillard mutan en masque à oxygene, mais celui ci me plaisait bien.

Voilà donc l'engin si j'ose dire ;)

voilà, z'en pensez quoi ?

++ Tix.

Creative Commons License
Les travaux signés "Tixlegeek" by DUBIEF Gery sont mis à disposition selon les termes de la licence Creative Commons Paternité-Pas d'Utilisation Commerciale-Partage des Conditions Initiales à l'Identique 2.0 France.

Pour toute modifications apportées, merci de mentionner l'auteur d'origine, et l'adresse de ce blog.