Changeset 5b6ccbe33a8c64fc04d428ee186befdbf4e5a378

Show
Ignore:
Timestamp:
02/07/08 03:35:28 (6 years ago)
Author:
Theo Schlossnagle <jesus@omniti.com>
git-committer:
Theo Schlossnagle <jesus@omniti.com> 1202355328 +0000
git-parent:

[3efe34af0c1fa7bc6ac79a30bc5991554390a520]

git-author:
Theo Schlossnagle <jesus@omniti.com> 1202355328 +0000
Message:

first hack at non-blocking support

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • src/noitedit/el.c

    rbafab25 r5b6ccbe  
    5151#include "sys.h" 
    5252 
     53#ifdef HAVE_UNISTD_H 
     54#include <unistd.h> 
     55#endif 
    5356#include <sys/types.h> 
    5457#if !_MSC_VER 
     
    5861#include <stdlib.h> 
    5962#include <stdarg.h> 
     63#include <pthread.h> 
    6064#include "el.h" 
     65 
     66pthread_key_t tputs_hack; 
     67public void 
     68el_multi_init() { 
     69  pthread_key_create(&tputs_hack, NULL); 
     70} 
     71 
     72public void 
     73el_multi_set_el(EditLine *el) { 
     74  pthread_setspecific(tputs_hack, el); 
     75} 
     76 
     77public EditLine * 
     78el_multi_get_el() { 
     79  return (EditLine *)pthread_getspecific(tputs_hack); 
     80} 
    6181 
    6282/* el_init(): 
  • src/noitedit/el.h

    rbafab25 r5b6ccbe  
    145145        el_search_t       el_search;    /* Search stuff                 */ 
    146146        el_signal_t       el_signal;    /* Signal handling stuff        */ 
     147        int               el_nb_state;  /* Did we eagain?               */ 
    147148}; 
    148149 
  • src/noitedit/histedit.h

    rbafab25 r5b6ccbe  
    7979 
    8080/* 
     81 * Initializatio of a multi-use environment 
     82 */ 
     83void             el_multi_init(); 
     84void             el_multi_set_el(EditLine *); 
     85EditLine        *el_multi_get_el(); 
     86 
     87/* 
    8188 * Initialization, cleanup, and resetting 
    8289 */ 
     
    8996 * Get a line, a character or push a string back in the input queue 
    9097 */ 
     98int              el_eagain(EditLine *); 
    9199const char      *el_gets(EditLine *, int *); 
    92100int              el_getc(EditLine *, char *); 
  • src/noitedit/read.c

    rbafab25 r5b6ccbe  
    5858#include "el.h" 
    5959 
    60 #define OKCMD   -1 
     60#define OKCMD     -1 
     61#define EAGAINCMD -2 
     62 
     63#define ISEAGAIN(el) ((el)->el_nb_state == EAGAINCMD) 
    6164 
    6265private int     read__fixio(int, int); 
     
    114117#ifdef TRY_AGAIN 
    115118#if defined(F_SETFL) && defined(O_NDELAY) 
     119/* 
    116120                if ((e = fcntl(fd, F_GETFL, 0)) == -1) 
    117121                        return (-1); 
     
    121125                else 
    122126                        e = 1; 
     127*/ 
    123128#endif /* F_SETFL && O_NDELAY */ 
    124129 
    125130#ifdef FIONBIO 
     131/* 
    126132                { 
    127133                        int zero = 0; 
     
    132138                                e = 1; 
    133139                } 
     140*/ 
    134141#endif /* FIONBIO */ 
    135142 
     
    206213 
    207214        while (cmd == ED_UNASSIGNED || cmd == ED_SEQUENCE_LEAD_IN) { 
    208                 if ((num = el_getc(el, ch)) != 1)       /* if EOF or error */ 
     215                if ((num = el_getc(el, ch)) != 1) {     /* if EOF or error */ 
     216                        if(errno == EAGAIN) return EAGAINCMD; 
    209217                        return (num); 
     218                } 
    210219                 
    211220#ifdef  KANJI 
     
    280289                if (num_read) 
    281290                        break; 
    282  
    283291                if (num_read == -1) { 
     292                        if (errno == EAGAIN) return 0; 
    284293                        if (!tried && read__fixio(el->el_infd, errno) == 0) { 
    285294                                tried = 1; 
     
    447456} 
    448457 
     458public int 
     459el_eagain(EditLine *el) 
     460{ 
     461        return ISEAGAIN(el); 
     462} 
     463 
    449464public const char * 
    450465el_gets(EditLine *el, int *nread) 
     
    457472#endif /* FIONREAD */ 
    458473 
    459   if (nread) 
    460     *nread = 0; 
     474        if (nread) 
     475                *nread = 0; 
     476 
     477        if(el_eagain(el)) { 
     478                el->el_nb_state = 0; 
     479                goto eagain_resume; 
     480        } 
    461481 
    462482        if (el->el_flags & HANDLE_SIGNALS) 
     
    535555                return (el->el_line.buffer); 
    536556        } 
     557 eagain_resume: 
    537558        for (num = OKCMD; num == OKCMD;) {      /* while still editing this 
    538559                                                 * line */ 
     
    546567                            "Returning from el_gets %d\n", num); 
    547568#endif /* DEBUG_READ */ 
     569                        if(num == EAGAINCMD) { 
     570                                el->el_nb_state = EAGAINCMD; 
     571                                return NULL; 
     572                        } 
    548573                        break; 
    549574                } 
    550575                el_gets_dispatch(el, cmdnum, ch, &num); 
    551576        } 
     577        el->el_nb_state = 0; 
    552578 
    553579                                /* make sure the tty is set up correctly */ 
  • src/noitedit/term.c

    rbafab25 r5b6ccbe  
    280280 
    281281 
    282 private FILE *term_outfile = NULL;      /* XXX: How do we fix that? */ 
    283  
    284  
    285282/* term_setflags(): 
    286283 *      Set the terminal capability flags 
     
    289286term_setflags(EditLine *el) 
    290287{ 
     288        el_multi_set_el(el); 
    291289        EL_FLAGS = 0; 
    292290        if (el->el_tty.t_tabs) 
     
    354352                return (-1); 
    355353        (void) memset(el->el_term.t_val, 0, T_val * sizeof(int)); 
    356        term_outfile = el->el_outfile
     354        el_multi_set_el(el)
    357355        term_init_arrow(el); 
    358356        if (term_set(el, NULL) == -1) 
     
    451449        coord_t *c = &el->el_term.t_size; 
    452450 
     451        el_multi_set_el(el); 
    453452        term_free_display(el); 
    454453 
     
    531530{ 
    532531        int del; 
    533 #if _WIN32 
    534         if (win32_native_console()) { 
    535                 win32_move_to_line(el, where - el->el_cursor.v); 
    536                 el->el_cursor.v = where;/* now where is here */ 
    537                 return; 
    538         } 
    539 #endif 
     532        el_multi_set_el(el); 
    540533 
    541534        if (where == el->el_cursor.v) 
     
    594587{ 
    595588        int del, i; 
    596 #if _WIN32 
    597         if (win32_native_console()) { 
    598                 win32_move_to_char(el, where); 
    599                 return; 
    600         } 
    601 #endif 
     589        el_multi_set_el(el); 
    602590 
    603591mc_again: 
     
    687675term_overwrite(EditLine *el, char *cp, int n) 
    688676{ 
     677        el_multi_set_el(el); 
    689678        if (n <= 0) 
    690679                return;         /* catch bugs */ 
     
    729718term_deletechars(EditLine *el, int num) 
    730719{ 
     720        el_multi_set_el(el); 
    731721        if (num <= 0) 
    732722                return; 
     
    771761term_insertwrite(EditLine *el, char *cp, int num) 
    772762{ 
     763        el_multi_set_el(el); 
    773764        if (num <= 0) 
    774765                return; 
     
    833824{ 
    834825        int i; 
    835 #ifdef _WIN32 
    836         if (win32_native_console()) { 
    837                 win32_term_clear_EOL(); 
    838                 return; 
    839         } 
    840 #endif 
     826        el_multi_set_el(el); 
    841827        if (EL_CAN_CEOL && GoodStr(T_ce)) 
    842828                (void) tputs(Str(T_ce), 1, term__putc); 
     
    855841term_clear_screen(EditLine *el) 
    856842{                               /* clear the whole screen and home */ 
    857 #if _WIN32 
    858         if (win32_native_console()) { 
    859                 win32_term_clear_screen(); 
    860                 return; 
    861         } 
    862 #endif 
     843        el_multi_set_el(el); 
    863844        if (GoodStr(T_cl)) 
    864845                /* send the clear screen code */ 
     
    881862term_beep(EditLine *el) 
    882863{ 
     864        el_multi_set_el(el); 
    883865        if (GoodStr(T_bl)) 
    884866                /* what termcap says we should use */ 
     
    896878term_clear_to_bottom(EditLine *el) 
    897879{ 
     880        el_multi_set_el(el); 
    898881        if (GoodStr(T_cd)) 
    899882                (void) tputs(Str(T_cd), Val(T_li), term__putc); 
     
    924907        (void) sigprocmask(SIG_BLOCK, &nset, &oset); 
    925908#endif 
    926  
     909        el_multi_set_el(el); 
    927910        area = buf; 
    928911 
    929 #if _WIN32 
    930         term = win32_native_console() ? "pcansi" : "xterm"; 
    931 #else 
    932912        if (term == NULL) 
    933913                term = getenv("TERM"); 
     
    938918        if (strcmp(term, "emacs") == 0) 
    939919                el->el_flags |= EDIT_DISABLED; 
    940 #endif 
    941920 
    942921        memset(el->el_term.t_cap, 0, TC_BUFSIZE); 
     
    12721251term__putc(int c) 
    12731252{ 
    1274  
    1275         return (fputc(c, term_outfile)); 
     1253        EditLine *el; 
     1254        el = el_multi_get_el(); 
     1255        if(!el) return -1; 
     1256        return (fputc(c, el->el_outfile)); 
    12761257} 
    12771258 
     
    12831264term__flush(void) 
    12841265{ 
    1285  
    1286         (void) fflush(term_outfile); 
     1266        EditLine *el; 
     1267        el = el_multi_get_el(); 
     1268        if(!el) return; 
     1269        (void) fflush(el->el_outfile); 
    12871270} 
    12881271 
     
    12981281        char **ts; 
    12991282        char upbuf[EL_BUFSIZ]; 
     1283 
     1284        el_multi_set_el(el); 
    13001285 
    13011286        (void) fprintf(el->el_outfile, "\n\tYour terminal has the\n"); 
     
    13401325        how = argv[2]; 
    13411326 
     1327        el_multi_set_el(el); 
    13421328        /* 
    13431329         * Do the strings first 
     
    14151401        long i; 
    14161402 
     1403        el_multi_set_el(el); 
    14171404        area = buf; 
    14181405 
     
    14631450                (void) fprintf(el->el_outfile, fmtd, 0); 
    14641451#else 
    1465                 (void) fprintf(el->el_outfile, fmtd, el->el_tty.t_speed); 
     1452                (void) fprintf(el->el_outfile, fmtd, (int)el->el_tty.t_speed); 
    14661453#endif 
    14671454                return (0); 
  • src/noitedit/tty.c

    rbafab25 r5b6ccbe  
    556556tty_init(EditLine *el) 
    557557{ 
    558  
    559558        el->el_tty.t_mode = EX_IO; 
    560559        el->el_tty.t_vdisable = _POSIX_VDISABLE;