Skip to content

Commit 96ca48f

Browse files
authored
Use std::os::raw::c_char for cross-platform compat (#169)
* use libc::c_char for cross-platform compat * use standard library instead of libc crate
1 parent adf3167 commit 96ca48f

File tree

3 files changed

+21
-23
lines changed

3 files changed

+21
-23
lines changed

extensions/positron-r/amalthea/crates/ark/src/lsp/browser.rs

+2-9
Original file line numberDiff line numberDiff line change
@@ -11,37 +11,32 @@ use harp::exec::RFunction;
1111
use harp::object::RObject;
1212
use libR_sys::*;
1313
use log::info;
14+
use std::os::raw::c_char;
1415

1516
use crate::interface::KERNEL;
1617

1718
pub static mut PORT: u16 = 0;
1819

1920
#[harp::register]
2021
pub unsafe extern "C" fn ps_browse_url(url: SEXP) -> SEXP {
21-
2222
match ps_browse_url_impl(url) {
2323
Ok(_) => Rf_ScalarLogical(1),
2424
Err(error) => {
2525
log::error!("{}", error);
2626
Rf_ScalarLogical(0)
2727
}
2828
}
29-
3029
}
3130

3231
unsafe fn ps_browse_url_impl(url: SEXP) -> anyhow::Result<()> {
33-
3432
// Extract URL
3533
let url = RObject::view(url).to::<String>()?;
3634

3735
// Check for help requests
38-
let port = RFunction::new("tools", "httpdPort")
39-
.call()?
40-
.to::<i32>()?;
36+
let port = RFunction::new("tools", "httpdPort").call()?.to::<i32>()?;
4137

4238
let prefix = format!("http://127.0.0.1:{}/", port);
4339
if url.starts_with(&prefix) {
44-
4540
let replacement = format!("http://127.0.0.1:{}/", PORT);
4641
let url = url.replace(prefix.as_str(), replacement.as_str());
4742
let event = PositronEvent::ShowHelp(ShowHelpEvent {
@@ -53,9 +48,7 @@ unsafe fn ps_browse_url_impl(url: SEXP) -> anyhow::Result<()> {
5348
info!("Sending ShowHelp event: {:#?}", event);
5449
let kernel = KERNEL.as_ref().unwrap().lock().unwrap();
5550
kernel.send_event(event);
56-
5751
}
5852

5953
Ok(())
60-
6154
}

extensions/positron-r/amalthea/crates/ark/src/lsp/show_message.rs

+3-3
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,10 @@
55
//
66
//
77

8-
use amalthea::events::{ShowMessageEvent, PositronEvent};
8+
use amalthea::events::{PositronEvent, ShowMessageEvent};
99
use harp::object::RObject;
1010
use libR_sys::*;
11+
use std::os::raw::c_char;
1112
use stdext::local;
1213

1314
use crate::request::Request;
@@ -17,8 +18,7 @@ use super::global::INSTANCE;
1718
/// Shows a message in the Positron frontend
1819
#[harp::register]
1920
pub unsafe extern "C" fn ps_show_message(message: SEXP) -> SEXP {
20-
21-
let result : anyhow::Result<()> = local! {
21+
let result: anyhow::Result<()> = local! {
2222
// Convert message to a string
2323
let msg = RObject::view(message).to::<String>()?;
2424

extensions/positron-r/amalthea/crates/harp/harp-macros/src/lib.rs

+16-11
Original file line numberDiff line numberDiff line change
@@ -6,29 +6,37 @@
66
//
77

88
use proc_macro::TokenStream;
9-
use quote::ToTokens;
109
use quote::format_ident;
1110
use quote::quote;
11+
use quote::ToTokens;
1212

1313
extern crate proc_macro;
1414

1515
fn invalid_parameter(stream: impl ToTokens) -> ! {
16-
panic!("Invalid parameter `{}`: registered routines can only accept SEXP parameters.", stream.to_token_stream());
16+
panic!(
17+
"Invalid parameter `{}`: registered routines can only accept SEXP parameters.",
18+
stream.to_token_stream()
19+
);
1720
}
1821

1922
fn invalid_return_type(stream: impl ToTokens) -> ! {
20-
panic!("Invalid return type `{}`: registered routines must return a SEXP.", stream.to_token_stream());
23+
panic!(
24+
"Invalid return type `{}`: registered routines must return a SEXP.",
25+
stream.to_token_stream()
26+
);
2127
}
2228

2329
fn invalid_extern(stream: impl ToTokens) -> ! {
24-
panic!("Invalid signature `{}`: registered routines must be 'extern \"C\"'.", stream.to_token_stream());
30+
panic!(
31+
"Invalid signature `{}`: registered routines must be 'extern \"C\"'.",
32+
stream.to_token_stream()
33+
);
2534
}
2635

2736
#[proc_macro_attribute]
2837
pub fn register(_attr: TokenStream, item: TokenStream) -> TokenStream {
29-
3038
// Get metadata about the function being registered.
31-
let function : syn::ItemFn = syn::parse(item).unwrap();
39+
let function: syn::ItemFn = syn::parse(item).unwrap();
3240

3341
// Make sure the function is 'extern "C"'.
3442
let abi = match function.sig.abi {
@@ -48,7 +56,6 @@ pub fn register(_attr: TokenStream, item: TokenStream) -> TokenStream {
4856

4957
// Make sure that the function only accepts SEXPs.
5058
for input in function.sig.inputs.iter() {
51-
5259
let pattern = match input {
5360
syn::FnArg::Typed(pattern) => pattern,
5461
syn::FnArg::Receiver(receiver) => invalid_parameter(receiver),
@@ -63,13 +70,12 @@ pub fn register(_attr: TokenStream, item: TokenStream) -> TokenStream {
6370
if value != "SEXP" {
6471
invalid_parameter(pattern);
6572
}
66-
6773
}
6874

6975
// Make sure that the function returns a SEXP.
7076
let ty = match function.sig.output {
7177
syn::ReturnType::Type(_, ref ty) => ty,
72-
_ => invalid_return_type(function.sig.output)
78+
_ => invalid_return_type(function.sig.output),
7379
};
7480

7581
let stream = ty.into_token_stream();
@@ -97,7 +103,7 @@ pub fn register(_attr: TokenStream, item: TokenStream) -> TokenStream {
97103

98104
unsafe {
99105
harp::routines::add(R_CallMethodDef {
100-
name: (#name).as_ptr() as *const i8,
106+
name: (#name).as_ptr() as *const c_char,
101107
fun: Some(::std::mem::transmute(#ident as *const ())),
102108
numArgs: #nargs
103109
});
@@ -110,5 +116,4 @@ pub fn register(_attr: TokenStream, item: TokenStream) -> TokenStream {
110116
// Put everything together.
111117
let all = quote! { #function #registration };
112118
all.into()
113-
114119
}

0 commit comments

Comments
 (0)