生锈0.10有rl包吗?

时间:2014-05-29 20:43:23

标签: readline rust

我开始使用rust来创建一个使用gnu readline库的小玩具命令提示应用程序。我开始使用c外部函数接口,然后使用came across this in rust 0.8

crate extra有一个模块extra::rl,它似乎是一个包含所有必需工具的readline。我的问题是,这是生锈0.10,如果是这样,它在哪里?如果没有,它是否打包为外部模块,如果是,我在哪里可以找到它?

提前致谢。

2 个答案:

答案 0 :(得分:1)

use std::c_str;

#[link(name = "readline")]
extern {
    fn readline (p: *std::libc::c_char) -> * std::libc::c_char;
}

fn rust_readline (prompt: &str) -> Option<~str> {
    let cprmt = prompt.to_c_str();
    cprmt.with_ref(|c_buf| {
    unsafe {
        let ret = c_str::CString::new (readline (c_buf), true);
        ret.as_str().map(|ret| ret.to_owned())
    }
    })
}

fn eval(input: &str)
{
    println! ("{}", input);
}

fn main()
{
    loop {
        let val = rust_readline (">>> ");
        match val {
            None => { break }
            _ => {
                let input = val.unwrap ();
                eval(input);
            }
        }
    }
}

这是一个样本REPL样式的解释器,只是打印而不是eval'ing。基于http://redbrain.co.uk/2013/11/09/rust-and-readline-c-ffi/的代码。他的榜样不再编纂。

此代码现在位于github here

答案 1 :(得分:1)

对不起我真的应该说,我想出了一个回答我自己的问题,它包括了readline的历史。我把它放在这里以防其他人想要这些功能。

//! Readline FFI

//extern crate libc;
use std::libc;
use libc::c_char;
use std::c_str;

#[link(name = "readline")]

extern {
    fn readline(p: *c_char) -> * c_char;
    fn add_history(l: *c_char);
}

pub fn rust_readline(prompt: &str) -> Option<~str> {
    let c_prompt = prompt.to_c_str();
    c_prompt.with_ref(|c_buf| {
        unsafe {
            let ret = c_str::CString::new(readline(c_buf), true);
            ret.as_str().map(|ret| ret.to_owned())
        }
    })
}

pub fn rust_add_history(line: &str) -> int {
    // if line.len() == 0 { return Err("Empty string!") }
    let c_line = line.to_c_str();
    c_line.with_ref(|my_c_line| {
        unsafe {
            // println!("{}", my_c_line)
            add_history(my_c_line);
        }
    });
    0
    }

fn main() {
    loop {
        let val = rust_readline("mikes_lisp> ");
        match val {
            None    => { break }
            _       => {
                let input = val.unwrap();
                rust_add_history(input);
                println!("you said: '{}'", input);

            }
        }
    }
}