pike.git / lib / modules / Stdio.pmod / Readline.pike

version» Context lines:

pike.git/lib/modules/Stdio.pmod/Readline.pike:1: - // $Id: Readline.pike,v 1.21 1999/06/09 18:03:14 hubbe Exp $ + // $Id: Readline.pike,v 1.22 1999/06/11 21:40:29 marcus Exp $      class OutputController   {    static private object outfd, term;    static private int xpos = 0, columns = 0;    static private mapping oldattrs = 0;       void disable()    {    catch{
pike.git/lib/modules/Stdio.pmod/Readline.pike:280:   class InputController   {    static private object infd, term;    static private int enabled = -1;    static private function(:int) close_callback = 0;    static private string prefix="";    static private mapping(int:function|mapping(string:function)) bindings=([]);    static private function grab_binding = 0;    static private mapping oldattrs = 0;    +  int dumb=0; +     void destroy()    {    catch{ infd->set_blocking(); }; -  +  if(dumb) +  return;    catch{ infd->tcsetattr((["ECHO":1,"ICANON":1])); };    catch{ if(oldattrs) infd->tcsetattr((["ECHO":0,"ICANON":0,"VEOF":0,    "VEOL":0,"VLNEXT":0])&oldattrs); };    }       static private string process_input(string s)    {    int i;       for (i=0; i<sizeof(s); i++)
pike.git/lib/modules/Stdio.pmod/Readline.pike:584:    return sprintf("%c", n);    }), values(bb)),    @Array.filter(values(bindings), mappingp));    }       void create(object|void _infd, object|string|void _term)    {    infd = _infd || Stdio.File("stdin");    term = objectp(_term)? _term : .Terminfo.getTerm(_term);    disable(); +  if(search(term->aliases, "dumb")>=0) { +  // Dumb terminal. Don't try anything fancy. +  dumb = 1; +  return; +  }    catch { oldattrs = infd->tcgetattr(); }; -  +  if(catch { infd->tcsetattr((["ECHO":0])); }) { +  // If echo can't be disabled, Readline won't work very well. +  // Go to dumb mode. +  dumb = 1; +  return; +  }    catch { infd->tcsetattr((["ECHO":0,"ICANON":0,"VMIN":1,"VTIME":0,    "VLNEXT":0])); };    }      }      class DefaultEditKeys   {    static private multiset word_break_chars = mkmultiset("\t \n\r/*?_-.[]~&;\!#$%^(){}<>\"'`"/"");    static object _readline;
pike.git/lib/modules/Stdio.pmod/Readline.pike:860:       static void set_default_bindings()    {    object ic = _readline->get_input_controller();    ic->nullbindings();    for(int i=' '; i<'\177'; i++)    ic->bindstr(sprintf("%c", i), self_insert_command);    for(int i='\240'; i<='\377'; i++)    ic->bindstr(sprintf("%c", i), self_insert_command);    +  if(ic->dumb) { +  ic->bind("^J", newline); +  ic->bind("^M", lambda() { }); +  return; +  } +     foreach(default_bindings, array(string|function) b)    ic->bind(@b);    }       void create(object readline)    {    _readline = readline;    set_default_bindings();    }   
pike.git/lib/modules/Stdio.pmod/Readline.pike:1011:   }      int setcursorpos(int p)   {    if (p<0)    p = 0;    if (p>strlen(text))    p = strlen(text);    if (p<cursorpos)    { +  if(!input_controller->dumb)    output_controller->move_backward(text[p..cursorpos-1]);    cursorpos = p;    }    else if (p>cursorpos)    { -  +  if(!input_controller->dumb)    output_controller->move_forward(text[cursorpos..p-1]);    cursorpos = p;    }    return cursorpos;   }      int setmark(int p)   {    if (p<0)    p = 0;
pike.git/lib/modules/Stdio.pmod/Readline.pike:1043:    return mark;   }      void insert(string s, int p)   {    if (p<0)    p = 0;    if (p>strlen(text))    p = strlen(text);    setcursorpos(p); +  if(!input_controller->dumb)    output_controller->write(s,0,hide);    cursorpos += strlen(s);    string rest = text[p..]; -  if (strlen(rest)) +  if (strlen(rest) && !input_controller->dumb)    {    output_controller->write(rest,0,hide);    output_controller->move_backward(rest);    }    text = text[..p-1]+s+rest;       if (mark>p) mark+=strlen(s);   }      void delete(int p1, int p2)   {    if (p1<0)    p1 = 0;    if (p2>strlen(text))    p2 = strlen(text);    setcursorpos(p1);    if (p1>=p2)    return; -  +  if(!input_controller->dumb) {    output_controller->write(text[p2..],0,hide);    output_controller->erase(text[p1..p2-1]); -  +  }    text = text[..p1-1]+text[p2..];       if (mark>p2) mark-=(p2-p1);    else if (mark>p1) mark=p1;       cursorpos = strlen(text);    setcursorpos(p1);   }      array(int) pointmark() // returns point and mark in numeric order
pike.git/lib/modules/Stdio.pmod/Readline.pike:1143:    int p = cursorpos;    if(clear)    output_controller->clear();    else if(!nobackup) {    setcursorpos(0);    output_controller->bol();    output_controller->clear(1);    }    output_controller->check_columns();    +  if(!input_controller->dumb) {    // This seems like a silly limitation    // if(newline_func == read_newline)    output_controller->write(prompt);    output_controller->write(text,0,hide); -  +  }    cursorpos = sizeof(text);    setcursorpos(p);   }      static private void initline()   {    text = "";    cursorpos = 0;    if (historyobj)    historyobj->initline();   }      string newline()   {    setcursorpos(sizeof(text)); -  +  if(!input_controller->dumb)    output_controller->newline(); -  +  else +  output_controller->bol();    string data = text;    if (historyobj && !hide)    historyobj->finishline(text);    initline();    if(newline_func)    newline_func(data);   }      void eof()   {
pike.git/lib/modules/Stdio.pmod/Readline.pike:1198:    output_controller->newline();    }    redisplay(0, 1);    setcursorpos(p);   }      void write(string msg,void|int word_wrap)   {    int p = cursorpos;    setcursorpos(0); +  if(!input_controller->dumb) {    output_controller->bol();    output_controller->clear(1); -  +  }    array(string) tmp=msg/"\n";    foreach(tmp[..sizeof(tmp)-2],string l)    {    output_controller->write(l,word_wrap);    output_controller->newline();    }    output_controller->write(tmp[-1],word_wrap);       cursorpos=strlen(text);    redisplay(0, 1);