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.39 2000/10/10 19:58:24 hubbe Exp $ + // $Id: Readline.pike,v 1.40 2001/10/23 20:10:12 nilsson Exp $   #pike __REAL_VERSION__ -  +    class OutputController   {    static private object(Stdio.File) outfd;    static private object(Stdio.Terminfo.Termcap) term;    static private int xpos = 0, columns = 0;    static private mapping oldattrs = 0;      #define BLINK 1   #define BOLD 2   #define DIM 4
pike.git/lib/modules/Stdio.pmod/Readline.pike:1087:   static private string text="", readtext;   static private function(string:void) newline_func;   static private int cursorpos = 0;   static private int mark = 0;   /*static private */ object(History) historyobj = 0;   static private int hide = 0;      static private array(string) kill_ring=({});   static private int kill_ring_size=30;    + //! @fixme + //! Document this function   object(OutputController) get_output_controller()   {    return output_controller;   }    -  + //! @fixme + //! Document this function   object(InputController) get_input_controller()   {    return input_controller;   }    -  + //! @fixme + //! Document this function   string get_prompt()   {    return prompt;   }    -  + //! @fixme + //! Document this function   string set_prompt(string newp, array(string)|void newattrs)   {   // werror("READLINE: Set prompt: %O\n",newp);    string oldp = prompt;    if(newp!=prompt || !equal(prompt_attrs, newattrs))    {    prompt = newp;    prompt_attrs = newattrs && copy_value(newattrs);    if(newline_func) redisplay(0);       }    return oldp;   }    -  + //! @fixme + //! Document this function   void set_echo(int onoff)   {    hide=!onoff;   }    -  + //! @fixme + //! Document this function   string gettext()   {    return text;   }    -  + //! @fixme + //! Document this function   int getcursorpos()   {    return cursorpos;   }    -  + //! @fixme + //! Document this function   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]);
pike.git/lib/modules/Stdio.pmod/Readline.pike:1152:    }    else if (p>cursorpos)    {    if(!input_controller->dumb)    output_controller->move_forward(text[cursorpos..p-1]);    cursorpos = p;    }    return cursorpos;   }    + //! @fixme + //! Document this function   int setmark(int p)   {    if (p<0)    p = 0;    if (p>strlen(text))    p = strlen(text);    mark=p;   }    -  + //! @fixme + //! Document this function   int getmark()   {    return mark;   }    -  + //! @fixme + //! Document this function   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);
pike.git/lib/modules/Stdio.pmod/Readline.pike:1187:    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);   }    + //! @fixme + //! Document this function   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) {
pike.git/lib/modules/Stdio.pmod/Readline.pike:1209:    }    text = text[..p1-1]+text[p2..];       if (mark>p2) mark-=(p2-p1);    else if (mark>p1) mark=p1;       cursorpos = strlen(text);    setcursorpos(p1);   }    + //! @fixme + //! Document this function   array(int) pointmark() // returns point and mark in numeric order   {    int p1,p2;    p1=getcursorpos(),p2=getmark();    if (p1>p2) return ({p2,p1});    return ({p1,p2});   }    -  + //! @fixme + //! Document this function   string region(int ... args) /* p1, p2 or point-mark */   {    int p1,p2;    if (sizeof(args)) [p1,p2]=args;    else [p1,p2]=pointmark();    return text[p1..p2-1];   }    -  + //! @fixme + //! Document this function   void kill(int p1, int p2)   {    if (p1<0)    p1 = 0;    if (p2>strlen(text))    p2 = strlen(text);    if (p1>=p2)    return;    add_to_kill_ring(text[p1..p2-1]);    delete(p1,p2);   }    -  + //! @fixme + //! Document this function   void add_to_kill_ring(string s)   {    kill_ring+=({s});    if (sizeof(kill_ring)>kill_ring_size) kill_ring=kill_ring[1..];   }    -  + //! @fixme + //! Document this function   string kill_ring_yank()   {    if (!sizeof(kill_ring)) return "";    return kill_ring[-1];   }    -  + //! @fixme + //! Document this function   void history(int n)   {    if(historyobj) {    string h = historyobj->history(n, text);    delete(0, strlen(text)+strlen(prompt));    insert(h, 0);    }   }    -  + //! @fixme + //! Document this function   void delta_history(int d)   {    if(historyobj)    history(historyobj->get_history_num()+d);   }    -  + //! @fixme + //! Document this function   void redisplay(int clear, int|void nobackup)   {    int p = cursorpos;    if(clear)    output_controller->clear();    else if(!nobackup) {    setcursorpos(0);    output_controller->bol();    output_controller->clear(1);    }
pike.git/lib/modules/Stdio.pmod/Readline.pike:1290:    output_controller->write(prompt);    if(prompt_attrs)    output_controller->turn_off(@prompt_attrs);    }    output_controller->write(text,0,hide);    }    cursorpos = sizeof(text);    setcursorpos(p);   }    + //! @fixme + //! Document this function   static private void initline()   {    text = "";    cursorpos = 0;    if (historyobj)    historyobj->initline();   }    -  + //! @fixme + //! Document this function   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);   }    -  + //! @fixme + //! Document this function   void eof()   {    if (historyobj)    historyobj->finishline(text);    initline();    if(newline_func)    newline_func(0);   }    -  + //! @fixme + //! Document this function   void message(string msg)   {    int p = cursorpos;    setcursorpos(strlen(text));    output_controller->newline();    foreach(msg/"\n", string l) {    output_controller->write(l);    output_controller->newline();    }    redisplay(0, 1);    setcursorpos(p);   }    -  + //! @fixme + //! Document this function   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)
pike.git/lib/modules/Stdio.pmod/Readline.pike:1357:    output_controller->write(l,word_wrap);    output_controller->newline();    }    output_controller->write(tmp[-1],word_wrap);       cursorpos=strlen(text);    redisplay(0, 1);    setcursorpos(p);   }    + //! @fixme + //! Document this function   void list_completions(array(string) c)   {    message(sprintf("%-*#s",output_controller->get_number_of_columns(),    c*"\n"));   }      static private void read_newline(string s)   {    input_controller->disable();    readtext = s;   }    -  + //! @fixme + //! Document this function   void set_nonblocking(function f)   {    int p=cursorpos;    if (newline_func = f) {    output_controller->enable();    input_controller->enable();       output_controller->bol();    output_controller->clear(1);    cursorpos=p;
pike.git/lib/modules/Stdio.pmod/Readline.pike:1391:    setcursorpos(0);    output_controller->bol();    output_controller->clear(1);    cursorpos=p;       input_controller->disable();    output_controller->disable();    }   }    + //! @fixme + //! Document this function   void set_blocking()   {    set_nonblocking(0);   }    -  + //! @fixme + //! Document this function   string edit(string data, string|void local_prompt, array(string)|void attrs)   {    if(data && strlen(data) && input_controller->dumb)    {    string ret=edit("", (local_prompt || get_prompt()) +"["+data+"] ", attrs);    return (!ret || !strlen(ret))?data:ret;    }    string old_prompt;    array(string) old_attrs;   
pike.git/lib/modules/Stdio.pmod/Readline.pike:1438:          set_nonblocking(oldnl);       if(local_prompt)    set_prompt(old_prompt, old_attrs);       return (res>=0 || sizeof(readtext)) && readtext;   }    + //! @fixme + //! Document this function   string read(string|void prompt, array(string)|void attrs)   {    return edit("", prompt, attrs);   }    -  + //! @fixme + //! Document this function   void enable_history(array(string)|object(History)|int hist)   {    if (objectp(hist))    historyobj = hist;    else if(arrayp(hist))    historyobj = History(512,hist);    else if(!hist)    historyobj = 0;    else if(historyobj)    historyobj->set_max_history(hist);    else    historyobj = History(hist);   }    -  + //! @fixme + //! Document this function   History get_history()   {    return historyobj;   }    -  + //! @fixme + //! Document this function   void destroy()   {    if(input_controller)    destruct(input_controller);    if(output_controller)    destruct(output_controller);   }    -  + //! Creates a Readline object, that takes input from @[infd] and has output + //! on @[outfd]. + //! + //! @param infd + //! Defaults to @[Stdio.stdout]. + //! + //! @param interm + //! Defaults to @[Stdio.Terminfo.getTerm()]. + //! + //! @param outfd + //! Defaults to @[infd], unless @[infd] is 0, in which case + //! @[outfd] defaults to @[Stdio.stdout]. + //! + //! @param outterm + //! Defaults to @[interm].   void create(object|void infd, object|string|void interm,    object|void outfd, object|string|void outterm)   {    atexit(destroy);    output_controller = OutputController(outfd || infd, outterm || interm);    input_controller = InputController(infd, interm);    DefaultEditKeys(this_object());   }