Batch Index du Forum
S’enregistrerRechercherFAQMembresGroupesConnexion
Répondre au sujet Page 1 sur 1
[C][Dos9/Linux] TinyLB - Batbox/TinyBG pour linux - TSnake41
Auteur Message
Répondre en citant
Message [C][Dos9/Linux] TinyLB - Batbox/TinyBG pour linux - TSnake41 
Bonjour, me revoilà avec une autre commande externe destiné aux autre systèmes d'exploitation que Windows Mr. Green.

Cette commande utilise une syntaxe compatible avec batbox et normalement TinyBG, elle majoritairement compatible avec les fonctions de chacun.
Cela veut dire que certains scripts batch utilisant batbox peuvent fonctionner avec cette commande, il suffit juste de renommer TinyLB en Batbox.

Pour l'utilisation, voir les commentaires (entre /* et */ et écris en gris) du code source (main.c) à commencer à la ligne 57.
Sinon, la documentation de batbox est convenable dans la plupart des cas.

Téléchargement (spritebox porté, binaires compressées avec upx (executables/commandes) et codes sources inclus) : https://1drv.ms/u/s!Ao64nlgUfTexg_FUdNfLN1Pnno4GEQ

Code:
[lang=c]/*
    Copyright (c) 2016 Astie Teddy

    Permission is hereby granted, free of charge, to any person obtaining a copy
    of this software and associated documentation files (the "Software"), to deal
    in the Software without restriction, including without limitation the rights
    to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
    copies of the Software, and to permit persons to whom the Software is
    furnished to do so, subject to the following conditions:

    The above copyright notice and this permission notice shall be included in all
    copies or substantial portions of the Software.

    THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
    IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
    FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
    AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
    LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
    OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
    SOFTWARE.
*/

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include <unistd.h>

#include "common.h"
#include "color.h"
#include "input.h"
#include "mouse.h"

void gotoxy(int x, int y);
void get_mouse(int mode);

int x, y,
    x_origin, y_origin;

int main(int argc, char const *argv[])
{
    const char *arg = NULL;

    for (size_t i = 1; i < argc; i++) {

        const char *arg = argv[i];

        if (*arg != '/') {
            fprintf(stderr, "[arg: %lu] Invalid argument\n", i);
            continue;
        }

        arg++;

        switch (tolower(*arg)) {
            case 'g':
                /*
                    Syntax : /g x y
                    Usage : Move the cursor to x y
                */
                if ( argc - i - 1 < 2 )
                    /* no more arguments available */
                    break;

                x = strtol(argv[++i], NULL, 10);
                y = strtol(argv[++i], NULL, 10);

                gotoxy(x + x_origin, y + y_origin);
                break;

            case 'd':
                /*
                    Syntax : /d[_] "Text"
                    Usage : Display "Text" to console

                    With _ suffix, do not convert "Text" from OEM-850.
                */
                if ( argc - i - 1 < 1 )
                    /* no more arguments available */
                    break;

                char *text = (char*)argv[++i];

                if ( *(arg + 1) != '_')
                    text = toUtf8(text);

                fputs(text, stdout);
                break;

            case 'c':
                /*
                    Syntax : /c color_code
                    Usage : Change the current terminal color

                    NOTE: color_code follow these formats :
                        0xFB Where F is the foreground,
                             B is the background

                        0xF where F is the foreground

                        Without 0x suffix, use decimal format
                */

                if ( argc - i - 1 < 1 )
                    /* no more arguments available */
                    break;

                const char *str = argv[++i];

                /* Check if the color_code is in 0xF format */
                bool foreground_only = !strncmp("0x", str, 2) &&
                                        strlen(str + 2) == 1;

                unsigned char color = strToWinColor((char*)str);

                if (!color && strcmp(str + 2, foreground_only ? "0" : "00"))
                    /* Do not do anything when the conversion failed (value is
                       zero but the hexadecimal code is different to zero) */
                    continue;

                if (foreground_only)
                    changeForegroundColor(color);
                else
                    changeColor(color);

                break;

            case 'a':
                /*
                    Syntax : /a char
                    Usage : Display an OEM-850 or UTF-8 char.

                    Character can be in decimal and hexadecimal format.
                */

                if ( argc - i - 1 < 1 )
                    /* no more arguments available */
                    break;

                int Char = strToInt((char*)argv[++i]);

                char *chars = calloc(2, sizeof(char));
                chars[0] = (char)Char;

                if (Char < 256)
                    /* Convert itself to UTF-8 */
                    chars = toUtf8(chars);

                puts(chars);
                free(chars);
                break;

            case 'k': ;
                /*
                    Syntax : /k[_]
                    Usage : Return the current key to errorlevel,
                            NOTE: with '_' suffix, do not wait key press
                */

                int key;

                if ( *(arg + 1) == '_')
                    /* Check if a key if available, get the
                       key using getch, if not, return 0 */
                    key = kbhit() ? getch() : 0;
                else
                    /* Wait until the key is pressed */
                    key = getch();

                resetColor();
                return key;

            case 'w':
                /*
                    Syntax : /w t
                    Usage : Wait t milliseconds.
                */

                if ( argc - i - 1 < 1 )
                    /* no more arguments available */
                    break;

                usleep(strtol(argv[++i], NULL, 10) * 1000);
                break;

            case 'o':
                /*
                    Syntax : /o x y
                    Usage : Move the origin to x y
                */
                if ( argc - i - 1 < 2 )
                    /* no more arguments available */
                    break;

                x_origin = strtol(argv[++i], NULL, 10);
                y_origin = strtol(argv[++i], NULL, 10);
                break;

            case 'h':
                /*
                    Syntax : /h x
                    Usage : Hide or show the cursor

                    1 : hide
                    2 : show
                */

                if ( argc - i - 1 < 1 )
                    /* no more arguments available */
                    break;

                puts (
                    atoi(argv[++i]) ?
                    "\e[?25h" : /* hide */
                    "\e[?25l"   /* show */
                );

                break;

            case 'm':
                /*
                    Syntax : /m
                    Usage : Get mouse position and button
                            (on button press or released)

                    NOTE: Scrolling is considerated
                          as button press and do not
                          release after being pressed.

                    Output : x:y:b

                    x : x position of mouse in terminal
                    y : y position of mouse in terminal
                    b : ID of mouse button

                    Mouse buttons IDs :
                        1 : Left button clic
                        2 : Right button clic
                        5 : Middle button clic
                        6 : Mouse scroll up
                        7 : Mouse scroll down
                        8 : Mouse button release (any)
                        9 : Nothing (no button pressed, see /y)
                */

                get_mouse(1000);
                break;
            case 'y':
                /*
                    Syntax : /y
                    Usage : Get mouse position and button
                            (on any mouse event), see /m
                */

                get_mouse(1003);
                break;

            case '\0' :
            case ' '  :
            case '\t' :
                fprintf(stderr, "[arg: %d] No argument specified\n", i);
                break;

            default:
                fprintf(stderr, "[arg: %d] Unknown argument value %c\n", i, *arg);
                break;
        }
    }

    resetColor();

    return 0;
}

void get_mouse(int mode)
{
    mouse_init(mode);
    char mouse_x, mouse_y, mouse_b;

    while (!mouse_get(&mouse_x, &mouse_y, &mouse_b))
        ;

    printf("%d:%d:%d\n", mouse_x, mouse_y, mouse_b);
    mouse_close(mode);
}

void gotoxy(int x, int y)
{
    printf("%c[%d;%df", 0x1B, y, x);
}


Testé, fonctionnel et codé sous Archlinux x86_64.

NOTE: Le code à été écris de façon simple et réutilisable, il y a un grand nombre de choses réutilisables pour par exemple la gestion des couleurs, l'entré clavier, etc.
Le code est aussi commenté pour être accessible pour les novices et certains débutants.



Dernière édition par TSnake41 le Mar 30 Aoû 2016 - 00:58; édité 11 fois

______________________________________________________
Partager permet le savoir. Le savoir permet de partager de nouveau savoirs.
Message Publicité 
PublicitéSupprimer les publicités ?


Répondre en citant
Message [C][Dos9/Linux] TinyLB - Batbox/TinyBG pour linux - TSnake41 
Mise à jour de TinyLB :
    * meilleur support de /a (plus de symboles sont compatibles)
    * meilleure explication de la syntaxe dans le code source
    * ajout de /h
    * /d convertit désormais les symboles OEM-850 en UTF-8, pour désactiver cette fonctionnalité, il faut ajouter le préfix _ (/d_)





______________________________________________________
Partager permet le savoir. Le savoir permet de partager de nouveau savoirs.
Répondre en citant
Message [C][Dos9/Linux] TinyLB - Batbox/TinyBG pour linux - TSnake41 
Mise à jour de TinyLB :
    Ajout de /y et /m (voir syntaxe sur le 1er topique)
    Conversion à l'encodage OEM-850 pour /a et /d (meilleur support des symboles)
    Correction d'une fuite de mémoire entraînant une allocation non contrôlée (et non libérée) de 2 octets lors de /a
    Ajout de certaines syntaxes manquantes dans le code sources
    Ajout de /h
    Correction du bug de compilation de Spritebox si Dos9 n'était pas installé
    Des exécutables compressées avec upx sont proposées (environ 1/2 de leur taille de base)


A prévoir :
    Une meilleur gestion des touches avec /k (certaines touches ne sont pas traitées comme il faut)
    Une documentation simplifiée





______________________________________________________
Partager permet le savoir. Le savoir permet de partager de nouveau savoirs.
Message [C][Dos9/Linux] TinyLB - Batbox/TinyBG pour linux - TSnake41 


Montrer les messages depuis:
Répondre au sujet Page 1 sur 1
  



Index | créer un forum | Forum gratuit d’entraide | Annuaire des forums gratuits | Signaler une violation | Conditions générales d'utilisation
Copyright 2008 - 2016 // Batch