editline est un équivalent de readline, sous license BSD. Pour le reste des détails, voir editline(3).

Ce code a été écrit sous OuvertBSD (à partir de la page man, et aussi grâce à /usr/src/usr.bin/ssh/sftp.c) mais a été testé et reconnu fonctionnel sur LibreBSD. Il devrait probablement tourner sur les cousins sans trop de problèmes. Le code n'est pas commenté (y'en a pas besoin, en même temps), compile sans erreurs/warnings sur i386/amd64 et ne fait pas râler lint(1), d'où quelques (void) un peu partout…

#include <stdlib.h>
#include <stdio.h>
#include <string.h>
 
#include <err.h>
#include <unistd.h>
#include <histedit.h>
 
extern char * __progname;
 
static const char * el_prompt(const EditLine * e)
{
    (void) e;
    return "(el_prompt) ";
}
 
int main(const int argc, const char ** argv)
{
    int interactive;
    History * hl;
    HistEvent hev;
    EditLine * el;
    const char * line;
    char buf[256];
    int n;
    char cmd[128];
    interactive = isatty(STDIN_FILENO);
    if (interactive)
    {
        if ((hl = history_init()) == NULL)
            errx(__LINE__, "history_init");
        history(hl, &hev, H_SETSIZE, 128);
        if ((el = el_init(__progname, stdin, stdout, stderr)) == NULL)
            errx(__LINE__, "el_init");
        el_set(el, EL_HIST, history, hl);
        el_set(el, EL_PROMPT, el_prompt);
        el_set(el, EL_EDITOR, "emacs");
        el_set(el, EL_TERMINAL, NULL);
        el_set(el, EL_SIGNAL, 1);
        el_source(el, NULL);
        el_parse(el, argc, argv);
        (void) puts("Bonjour ! Tapez `quit' pour quitter.");
    }
    else
    {
        hl = NULL;
        el = NULL;
    }
    do
    {
        char * c;
        if (interactive)
        {
            if ((line = el_gets(el, &n)) == NULL)
                errx(__LINE__, "el_gets");
            if (history(hl, &hev, H_ENTER, line) == -1)
                warnx("history");
        }
        else
        {
            if ((line = fgets(buf, sizeof buf, stdin)) == NULL)
                break;
        }
        if (strlcpy(cmd, line, sizeof cmd) >= sizeof cmd)
        {
            warnx("strlcpy: commande trop longue");
            continue;
        }
        if ((c = strrchr(cmd, '\n')) != NULL)
            *c = '\0';
        (void) printf("Commande entrée : `%s'\n", cmd);
    } while (strcmp(cmd, "quit") != 0);
    if (interactive)
    {
        (void) puts("Au revoir !");
        history_end(hl);
        el_end(el);
    }
    return EXIT_SUCCESS;
}

Et hop, un cc main.c -ledit -lcurses plus loin, vous avez un programme de base capable de gérer le mode interactif et le mode batch.

c/editline.txt · Last modified: 2010/01/12 13:29 (external edit)
www.chimeric.de Creative Commons License Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0