Annotation of rpl/src/interface_readline.c, revision 1.22

1.1       bertrand    1: /*
                      2: ================================================================================
1.22    ! bertrand    3:   RPL/2 (R) version 4.1.36
1.21      bertrand    4:   Copyright (C) 1989-2024 Dr. BERTRAND Joël
1.1       bertrand    5: 
                      6:   This file is part of RPL/2.
                      7: 
                      8:   RPL/2 is free software; you can redistribute it and/or modify it
                      9:   under the terms of the CeCILL V2 License as published by the french
                     10:   CEA, CNRS and INRIA.
                     11:  
                     12:   RPL/2 is distributed in the hope that it will be useful, but WITHOUT
                     13:   ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
                     14:   FITNESS FOR A PARTICULAR PURPOSE.  See the CeCILL V2 License
                     15:   for more details.
                     16:  
                     17:   You should have received a copy of the CeCILL License
                     18:   along with RPL/2. If not, write to info@cecill.info.
                     19: ================================================================================
                     20: */
                     21: 
                     22: 
                     23: #include "rpl-conv.h"
                     24: 
                     25: 
                     26: /*
                     27: ================================================================================
1.2       bertrand   28:   Procédure permettant d'accéder à la structure s_etat_processus sous
                     29:   la forme d'une variable globale par fil d'exécution.
1.1       bertrand   30: ================================================================================
1.2       bertrand   31:   Entrées :
1.1       bertrand   32: --------------------------------------------------------------------------------
1.2       bertrand   33:   Sorties : erreur le cas échéant
1.1       bertrand   34: --------------------------------------------------------------------------------
1.2       bertrand   35:   Effets de bord : néant
1.1       bertrand   36: ================================================================================
                     37: */
                     38: 
                     39: static pthread_key_t       k_etat_processus;
                     40: 
                     41: 
                     42: int
                     43: initialisation_etat_processus_readline()
                     44: {
                     45:    return(pthread_key_create(&k_etat_processus, NULL));
                     46: }
                     47: 
                     48: int
                     49: liberation_etat_processus_readline()
                     50: {
                     51:    return(pthread_key_delete(k_etat_processus));
                     52: }
                     53: 
                     54: int
                     55: association_etat_processus_readline(struct_processus *s_etat_processus)
                     56: {
                     57:    return(pthread_setspecific(k_etat_processus, s_etat_processus));
                     58: }
                     59: 
                     60: 
                     61: /*
                     62: ================================================================================
1.2       bertrand   63:   Procédure de d'analyse syntaxique du source pour readline
1.1       bertrand   64: ================================================================================
1.2       bertrand   65:   Entrées :
1.1       bertrand   66: --------------------------------------------------------------------------------
                     67:   Sorties :
1.2       bertrand   68:    - rl_done à 0 ou à 1.
1.1       bertrand   69: --------------------------------------------------------------------------------
                     70:   Effets de bord :
                     71: ================================================================================
                     72: */
                     73: 
                     74: static char                    *ligne = NULL;
                     75: static unsigned int            niveau = 0;
                     76: 
                     77: int
                     78: readline_analyse_syntaxique(int count, int key)
                     79: {
                     80:    char                        prompt[] = "+ %03d> ";
                     81:    char                        prompt2[8];
                     82:    char                        *registre;
                     83: 
                     84:    integer8                    tampon_position_courante;
                     85: 
                     86:    struct_processus            *s_etat_processus;
                     87: 
                     88:    unsigned char               *tampon_definitions_chainees;
                     89:    unsigned char               *tampon_instruction_courante;
                     90: 
                     91:    s_etat_processus = pthread_getspecific(k_etat_processus);
                     92: 
                     93:    if ((*rl_line_buffer) == d_code_fin_chaine)
                     94:    {
                     95:        if (ligne == NULL)
                     96:        {
                     97:            rl_done = 1;
                     98:        }
                     99:        else
                    100:        {
                    101:            rl_done = 0;
                    102:        }
                    103:    }
                    104:    else
                    105:    {
                    106:        if (ligne == NULL)
                    107:        {
                    108:            if ((ligne = sys_malloc((strlen(rl_line_buffer) + 1)
                    109:                    * sizeof(char))) == NULL)
                    110:            {
                    111:                rl_done = 1;
                    112:                return(0);
                    113:            }
                    114: 
                    115:            strcpy(ligne, rl_line_buffer);
                    116:        }
                    117:        else
                    118:        {
                    119:            registre = ligne;
                    120: 
                    121:            if ((ligne = sys_malloc((strlen(registre)
                    122:                    + strlen(rl_line_buffer) + 2) * sizeof(char))) == NULL)
                    123:            {
                    124:                rl_done = 1;
                    125:                return(0);
                    126:            }
                    127: 
                    128:            sprintf(ligne, "%s %s", registre, rl_line_buffer);
                    129:        }
                    130: 
                    131:        rl_replace_line("", 1);
                    132: 
                    133:        tampon_definitions_chainees = (*s_etat_processus).definitions_chainees;
                    134:        tampon_instruction_courante = (*s_etat_processus).instruction_courante;
                    135:        tampon_position_courante = (*s_etat_processus).position_courante;
                    136: 
                    137:        (*s_etat_processus).definitions_chainees = ligne;
                    138:        (*s_etat_processus).debug = d_faux;
                    139:        (*s_etat_processus).erreur_systeme = d_es;
                    140:        (*s_etat_processus).erreur_execution = d_ex;
                    141: 
                    142:        if (analyse_syntaxique(s_etat_processus) == d_absence_erreur)
                    143:        {
                    144:            rl_done = 1;
                    145:        }
                    146:        else
                    147:        {
                    148:            if ((*s_etat_processus).erreur_systeme != d_es)
                    149:            {
                    150:                rl_done = 1;
                    151:            }
                    152:            else
                    153:            {
                    154:                rl_done = 0;
                    155:                rl_crlf();
                    156: 
                    157:                sprintf(prompt2, prompt, ++niveau);
                    158: 
                    159:                rl_expand_prompt(prompt2);
                    160:                rl_on_new_line();
                    161:            }
                    162:        }
                    163: 
                    164:        (*s_etat_processus).definitions_chainees = tampon_definitions_chainees;
                    165:        (*s_etat_processus).instruction_courante = tampon_instruction_courante;
                    166:        (*s_etat_processus).position_courante = tampon_position_courante;
                    167:        (*s_etat_processus).erreur_execution = d_ex;
                    168:    }
                    169: 
                    170:    if (rl_done != 0)
                    171:    {
                    172:        uprintf("\n");
                    173: 
                    174:        if (ligne != NULL)
                    175:        {
                    176:            rl_replace_line(ligne, 1);
                    177: 
                    178:            sys_free(ligne);
                    179:            ligne = NULL;
                    180:        }
                    181: 
                    182:        niveau = 0;
                    183:    }
                    184: 
                    185:    return(0);
                    186: }
                    187: 
                    188: int
                    189: readline_effacement(int count, int key)
                    190: {
                    191:    rl_done = 0;
                    192:    rl_replace_line("", 1);
                    193: 
                    194:    sys_free(ligne);
                    195:    ligne = NULL;
                    196:    niveau = 0;
                    197: 
                    198:    uprintf("^G\n");
                    199:    rl_expand_prompt("RPL/2> ");
                    200:    rl_on_new_line();
                    201:    return(0);
                    202: }
                    203: 
                    204: // vim: ts=4

CVSweb interface <joel.bertrand@systella.fr>