* [Caml-list] Interfacing C++ and Ocaml
@ 2001-03-28 8:37 David Chemouil
0 siblings, 0 replies; 11+ messages in thread
From: David Chemouil @ 2001-03-28 8:37 UTC (permalink / raw)
To: caml-list
Hi,
I am in the situation where I would like to write an Ocaml program which
makes use of some C++ classes. It seems to me some people had said there
were some problems doing so, but I can't recall what these problems may
be, and didn't find anything precise in the ML archive.
So, I would like to know what may prevent me to reuse C++ code from
Ocaml, if anything may. I am sure some arrangements can be done, as
there exists an Ocaml implementation on BeOS, which is programmed in
C++.
Moreover, if it is possible, what do you advise me to do? What are the
limitations? Have you got simple examples of such interfacings?
Thanks in advance,
dc
PS: BTW, I would like to thank these happy volunteers who aim at
packaging a Caml Development Kit. IMO, this is truly a good idea, which
may help Caml spread. Just a question to the Caml team: I would like to
know if you intend to include polymorphic I/O and some kind of
overloading in a forthcoming release of Caml. It seems to me Pierre had
written some mails about this, but is is now a long time ago, how is the
situation today?
--
David Chemouil [mailto:David.Chemouil@irit.fr]
Institut de recherche en informatique de Toulouse
-------------------
To unsubscribe, mail caml-list-request@inria.fr. Archives: http://caml.inria.fr
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [Caml-list] interfacing C and OCaml
2003-06-27 5:24 ` Re[2]: " Mikhail Fedotov
@ 2003-06-27 8:31 ` Jean-Baptiste Rouquier
0 siblings, 0 replies; 11+ messages in thread
From: Jean-Baptiste Rouquier @ 2003-06-27 8:31 UTC (permalink / raw)
To: caml-list
> JBR> 1. Should I use
> JBR> CAMLprim value input(value channel, value buffer, value offset, value
> JBR> length)
> JBR> {
> JBR> return Val_long (...);
> JBR> }
>
> Yes. This function can be called from other C function or from OCaml.
>
> JBR> as in 18.1.2 in the manual, or
>
> JBR> void foo (value v1, value v2, value v3)
> JBR> {
> JBR> CAMLparam3 (v1, v2, v3);
> JBR> ...
> JBR> CAMLreturn0;
> JBR> }
>
> This if for functions called from C only. Not suitable for use from
> OCaml directly.
>
> Should be specified in the manual, I believe, but I've got no response
> in the list to my comment on this. I hope it will be in the manual for
> the OCaml 3.07.
>
Strange !
The complete example given in 18.6 contains :
curses.mli :
external initscr: unit -> window = "curses_initscr"
curses.c ("curses.o" in the manual) :
value curses_initscr(value unit)
{
CAMLparam1 (unit);
CAMLreturn ((value) initscr());
}
curses.ml :
open Curses
let main_window = initscr () in
So functions using CAMLparam and CAMLreturn are called from OCaml directly.
Or am I completely wrong ?
I'm worried about the GC (for now, my code seems to run correctly, but use
perhaps to much memory).
Thanks,
JBR
-------------------
To unsubscribe, mail caml-list-request@inria.fr Archives: http://caml.inria.fr
Bug reports: http://caml.inria.fr/bin/caml-bugs FAQ: http://caml.inria.fr/FAQ/
Beginner's list: http://groups.yahoo.com/group/ocaml_beginners
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [Caml-list] interfacing C and OCaml
2003-06-26 14:42 [Caml-list] interfacing C and OCaml Jung Woon Ho
2003-06-26 15:14 ` Lex Stein
@ 2003-06-26 19:02 ` Jean-Baptiste Rouquier
2003-06-27 5:24 ` Re[2]: " Mikhail Fedotov
1 sibling, 1 reply; 11+ messages in thread
From: Jean-Baptiste Rouquier @ 2003-06-26 19:02 UTC (permalink / raw)
To: caml-list
> Can anybody explain me if there is anyway that I can pass in
> a (int*int*int*int*int) from a C function to OCaml.
Do you want to call C auxiliary function from Caml, or are you writing your
main programm in C and using some Caml functions ?
Both are very well explained in the manual, though it may take a while to
read it.
Don't hesitate to ask me for a complete example if your main programm is in
Caml (I haven't learn yet how to write the main programm in C).
------------------------------------------------
À propos, I have some questions about the manual :
1. Should I use
CAMLprim value input(value channel, value buffer, value offset, value
length)
{
return ...
}
as in 18.1.2 in the manual, or
void foo (value v1, value v2, value v3)
{
CAMLparam3 (v1, v2, v3);
...
CAMLreturn0;
}
as in 18.5.1, or both ? I think at least the second.
------------------------------------------------
2.
I use
alloc(2*n, Double_array_tag.)
to create a float array of size n (then I initialize it), is it correct ?
------------------------------------------------
3. Is it correct to store p in the custom block v by
CAMLlocal(v);
v = alloc_custom(ops, 4, 0, 1);
(my_type *) Data_custom_val(v) = p;
?
When does the parameter "size" (here "4") vary ?
Thanks,
Jean-Baptiste.
-------------------
To unsubscribe, mail caml-list-request@inria.fr Archives: http://caml.inria.fr
Bug reports: http://caml.inria.fr/bin/caml-bugs FAQ: http://caml.inria.fr/FAQ/
Beginner's list: http://groups.yahoo.com/group/ocaml_beginners
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [Caml-list] interfacing C and OCaml
2003-06-26 14:42 [Caml-list] interfacing C and OCaml Jung Woon Ho
@ 2003-06-26 15:14 ` Lex Stein
2003-06-26 19:02 ` Jean-Baptiste Rouquier
1 sibling, 0 replies; 11+ messages in thread
From: Lex Stein @ 2003-06-26 15:14 UTC (permalink / raw)
To: Jung Woon Ho; +Cc: caml-list
Hi, In the C code allocate a memory block value of size 5 with tag 0.
CAMLparam0 ();
CAMLlocal2 (v, v1);
static value * clos;
v = alloc_tuple (5);
/* assign to the fields using the Store_Field macro */
clos = caml_named_value ("c_function_name")
/* where c_function_name is registered from within the Caml code
via (Callback.register "c_function_name" function_name)
Then just call the Caml routine via callback like so: */
v1 = callback (*clos, v);
Remember to return from the C function with one of the CAMLreturn
macros to be friendly with the garbage collector.
Let me know if you have any further questions/problems with Caml/C
interaction. I'm happy to help.
Lex
--
Lex Stein http://www.eecs.harvard.edu/~stein/
stein@eecs.harvard.edu TEL: 617-233-0246
On Thu, 26 Jun 2003, Jung Woon Ho wrote:
> Hi,
>
> Can anybody explain me if there is anyway that I can pass in
> a (int*int*int*int*int) from a C function to OCaml.
>
> Thank you.
>
> _________________________________________________________________
> The new MSN 8: smart spam protection and 2 months FREE*
> http://join.msn.com/?page=features/junkmail
>
> -------------------
> To unsubscribe, mail caml-list-request@inria.fr Archives: http://caml.inria.fr
> Bug reports: http://caml.inria.fr/bin/caml-bugs FAQ: http://caml.inria.fr/FAQ/
> Beginner's list: http://groups.yahoo.com/group/ocaml_beginners
>
-------------------
To unsubscribe, mail caml-list-request@inria.fr Archives: http://caml.inria.fr
Bug reports: http://caml.inria.fr/bin/caml-bugs FAQ: http://caml.inria.fr/FAQ/
Beginner's list: http://groups.yahoo.com/group/ocaml_beginners
^ permalink raw reply [flat|nested] 11+ messages in thread
* [Caml-list] interfacing C and OCaml
@ 2003-06-26 14:42 Jung Woon Ho
2003-06-26 15:14 ` Lex Stein
2003-06-26 19:02 ` Jean-Baptiste Rouquier
0 siblings, 2 replies; 11+ messages in thread
From: Jung Woon Ho @ 2003-06-26 14:42 UTC (permalink / raw)
To: caml-list
Hi,
Can anybody explain me if there is anyway that I can pass in
a (int*int*int*int*int) from a C function to OCaml.
Thank you.
_________________________________________________________________
The new MSN 8: smart spam protection and 2 months FREE*
http://join.msn.com/?page=features/junkmail
-------------------
To unsubscribe, mail caml-list-request@inria.fr Archives: http://caml.inria.fr
Bug reports: http://caml.inria.fr/bin/caml-bugs FAQ: http://caml.inria.fr/FAQ/
Beginner's list: http://groups.yahoo.com/group/ocaml_beginners
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [Caml-list] Interfacing C and Ocaml
2003-06-19 19:58 [Caml-list] Interfacing C " Jung Woon Ho
2003-06-19 20:06 ` Kip Macy
@ 2003-06-19 20:28 ` art yerkes
1 sibling, 0 replies; 11+ messages in thread
From: art yerkes @ 2003-06-19 20:28 UTC (permalink / raw)
To: Jung Woon Ho; +Cc: caml-list, unosoft
On Thu, 19 Jun 2003 19:58:16 +0000
"Jung Woon Ho" <unosoft@hotmail.com> wrote:
See: http://lists.suse.com/archive/suse-linux-e/2001-Aug/0476.html
It appears that the name of the curses library on Suse is libncurses.
> Hi, Im trying to implement a simple program that interfaces C and Ocaml.
> Here is what I do:
>
> ocamlc -custom -output-obj -o modcaml.o mod.ml
> ocamlc -c modwrap.c
> cp /usr/local/lib/ocaml/libcamlrun.a mod.a
> ar r mod.a modcaml.o modwrap.o
> cc -o prog main.c mod.a -lcurses
>
> and I get the error:
> /usr/lib/gcc-lib/i486-suse-linux/3.2/../../../../i486-suse-linux/bin/ld:
> cannot find -lcurses
> collect2: ld returned 1 exit status
>
> I tried cc -o prog main.c mod.a -lcurses -ltermcap and cc -o prog main.c
> mod.a -ltermcap but i cant get the program to link.
>
> Does anybody know how to solve this problem?
>
> Thank you very much.
>
>
>
>
> ---------------------mod.ml-------------------------------
> (* File mod.ml -- some ``useful'' Caml functions *)
>
> let rec fib n = if n < 2 then 1 else fib(n-1) + fib(n-2)
>
> let format_result n = Printf.sprintf "Result is: %d\n" n
>
> (* Export those two functions to C *)
>
> let _ = Callback.register "fib" fib
> let _ = Callback.register "format_result" format_result
> ----------------------------------------------------------
>
> --------------------modwrap.c-----------------------------
> /* File modwrap.c -- wrappers around the Caml functions */
>
> #include <stdio.h>
> #include <string.h>
> #include <caml/mlvalues.h>
> #include <caml/callback.h>
>
> int fib(int n)
> {
> static value * fib_closure = NULL;
> if (fib_closure == NULL) fib_closure = caml_named_value("fib");
> return Int_val(callback(*fib_closure, Val_int(n)));
> }
>
> char * format_result(int n)
> {
> static value * format_result_closure = NULL;
> if (format_result_closure == NULL)
> format_result_closure = caml_named_value("format_result");
> return strdup(String_val(callback(*format_result_closure, Val_int(n))));
> /* We copy the C string returned by String_val to the C heap
> so that it remains valid after garbage collection. */
> }
> ----------------------------------------------------------
>
> -------------------main.c---------------------------------
> /* File main.c -- a sample client for the Caml functions */
>
> #include <stdio.h>
>
> int main(int argc, char ** argv)
> {
> int result;
>
> /* Initialize Caml code */
> caml_startup(argv);
> /* Do some computation */
> result = fib(10);
> printf("fib(10) = %s\n", format_result(result));
> return 0;
> }
> ----------------------------------------------------------
>
> _________________________________________________________________
> Help STOP SPAM with the new MSN 8 and get 2 months FREE*
> http://join.msn.com/?page=features/junkmail
>
> -------------------
> To unsubscribe, mail caml-list-request@inria.fr Archives: http://caml.inria.fr
> Bug reports: http://caml.inria.fr/bin/caml-bugs FAQ: http://caml.inria.fr/FAQ/
> Beginner's list: http://groups.yahoo.com/group/ocaml_beginners
--
`No, you don't understand,' the Knight said, looking a little vexed.
`That's what the name is called. The name really is "The Aged Aged
Man."'
-- Lewis Carroll
-------------------
To unsubscribe, mail caml-list-request@inria.fr Archives: http://caml.inria.fr
Bug reports: http://caml.inria.fr/bin/caml-bugs FAQ: http://caml.inria.fr/FAQ/
Beginner's list: http://groups.yahoo.com/group/ocaml_beginners
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [Caml-list] Interfacing C and Ocaml
2003-06-19 19:58 [Caml-list] Interfacing C " Jung Woon Ho
@ 2003-06-19 20:06 ` Kip Macy
2003-06-19 20:28 ` art yerkes
1 sibling, 0 replies; 11+ messages in thread
From: Kip Macy @ 2003-06-19 20:06 UTC (permalink / raw)
To: Jung Woon Ho; +Cc: caml-list
try sticking in -L<path to libcurses.so> for -lcurses
On Thu, 19 Jun 2003, Jung Woon Ho wrote:
> Hi, Im trying to implement a simple program that interfaces C and Ocaml.
> Here is what I do:
>
> ocamlc -custom -output-obj -o modcaml.o mod.ml
> ocamlc -c modwrap.c
> cp /usr/local/lib/ocaml/libcamlrun.a mod.a
> ar r mod.a modcaml.o modwrap.o
> cc -o prog main.c mod.a -lcurses
>
> and I get the error:
> /usr/lib/gcc-lib/i486-suse-linux/3.2/../../../../i486-suse-linux/bin/ld:
> cannot find -lcurses
> collect2: ld returned 1 exit status
>
> I tried cc -o prog main.c mod.a -lcurses -ltermcap and cc -o prog main.c
> mod.a -ltermcap but i cant get the program to link.
>
> Does anybody know how to solve this problem?
>
> Thank you very much.
>
>
>
>
> ---------------------mod.ml-------------------------------
> (* File mod.ml -- some ``useful'' Caml functions *)
>
> let rec fib n = if n < 2 then 1 else fib(n-1) + fib(n-2)
>
> let format_result n = Printf.sprintf "Result is: %d\n" n
>
> (* Export those two functions to C *)
>
> let _ = Callback.register "fib" fib
> let _ = Callback.register "format_result" format_result
> ----------------------------------------------------------
>
> --------------------modwrap.c-----------------------------
> /* File modwrap.c -- wrappers around the Caml functions */
>
> #include <stdio.h>
> #include <string.h>
> #include <caml/mlvalues.h>
> #include <caml/callback.h>
>
> int fib(int n)
> {
> static value * fib_closure = NULL;
> if (fib_closure == NULL) fib_closure = caml_named_value("fib");
> return Int_val(callback(*fib_closure, Val_int(n)));
> }
>
> char * format_result(int n)
> {
> static value * format_result_closure = NULL;
> if (format_result_closure == NULL)
> format_result_closure = caml_named_value("format_result");
> return strdup(String_val(callback(*format_result_closure, Val_int(n))));
> /* We copy the C string returned by String_val to the C heap
> so that it remains valid after garbage collection. */
> }
> ----------------------------------------------------------
>
> -------------------main.c---------------------------------
> /* File main.c -- a sample client for the Caml functions */
>
> #include <stdio.h>
>
> int main(int argc, char ** argv)
> {
> int result;
>
> /* Initialize Caml code */
> caml_startup(argv);
> /* Do some computation */
> result = fib(10);
> printf("fib(10) = %s\n", format_result(result));
> return 0;
> }
> ----------------------------------------------------------
>
> _________________________________________________________________
> Help STOP SPAM with the new MSN 8 and get 2 months FREE*
> http://join.msn.com/?page=features/junkmail
>
> -------------------
> To unsubscribe, mail caml-list-request@inria.fr Archives: http://caml.inria.fr
> Bug reports: http://caml.inria.fr/bin/caml-bugs FAQ: http://caml.inria.fr/FAQ/
> Beginner's list: http://groups.yahoo.com/group/ocaml_beginners
>
-------------------
To unsubscribe, mail caml-list-request@inria.fr Archives: http://caml.inria.fr
Bug reports: http://caml.inria.fr/bin/caml-bugs FAQ: http://caml.inria.fr/FAQ/
Beginner's list: http://groups.yahoo.com/group/ocaml_beginners
^ permalink raw reply [flat|nested] 11+ messages in thread
* [Caml-list] Interfacing C and Ocaml
@ 2003-06-19 19:58 Jung Woon Ho
2003-06-19 20:06 ` Kip Macy
2003-06-19 20:28 ` art yerkes
0 siblings, 2 replies; 11+ messages in thread
From: Jung Woon Ho @ 2003-06-19 19:58 UTC (permalink / raw)
To: caml-list; +Cc: unosoft
Hi, Im trying to implement a simple program that interfaces C and Ocaml.
Here is what I do:
ocamlc -custom -output-obj -o modcaml.o mod.ml
ocamlc -c modwrap.c
cp /usr/local/lib/ocaml/libcamlrun.a mod.a
ar r mod.a modcaml.o modwrap.o
cc -o prog main.c mod.a -lcurses
and I get the error:
/usr/lib/gcc-lib/i486-suse-linux/3.2/../../../../i486-suse-linux/bin/ld:
cannot find -lcurses
collect2: ld returned 1 exit status
I tried cc -o prog main.c mod.a -lcurses -ltermcap and cc -o prog main.c
mod.a -ltermcap but i cant get the program to link.
Does anybody know how to solve this problem?
Thank you very much.
---------------------mod.ml-------------------------------
(* File mod.ml -- some ``useful'' Caml functions *)
let rec fib n = if n < 2 then 1 else fib(n-1) + fib(n-2)
let format_result n = Printf.sprintf "Result is: %d\n" n
(* Export those two functions to C *)
let _ = Callback.register "fib" fib
let _ = Callback.register "format_result" format_result
----------------------------------------------------------
--------------------modwrap.c-----------------------------
/* File modwrap.c -- wrappers around the Caml functions */
#include <stdio.h>
#include <string.h>
#include <caml/mlvalues.h>
#include <caml/callback.h>
int fib(int n)
{
static value * fib_closure = NULL;
if (fib_closure == NULL) fib_closure = caml_named_value("fib");
return Int_val(callback(*fib_closure, Val_int(n)));
}
char * format_result(int n)
{
static value * format_result_closure = NULL;
if (format_result_closure == NULL)
format_result_closure = caml_named_value("format_result");
return strdup(String_val(callback(*format_result_closure, Val_int(n))));
/* We copy the C string returned by String_val to the C heap
so that it remains valid after garbage collection. */
}
----------------------------------------------------------
-------------------main.c---------------------------------
/* File main.c -- a sample client for the Caml functions */
#include <stdio.h>
int main(int argc, char ** argv)
{
int result;
/* Initialize Caml code */
caml_startup(argv);
/* Do some computation */
result = fib(10);
printf("fib(10) = %s\n", format_result(result));
return 0;
}
----------------------------------------------------------
_________________________________________________________________
Help STOP SPAM with the new MSN 8 and get 2 months FREE*
http://join.msn.com/?page=features/junkmail
-------------------
To unsubscribe, mail caml-list-request@inria.fr Archives: http://caml.inria.fr
Bug reports: http://caml.inria.fr/bin/caml-bugs FAQ: http://caml.inria.fr/FAQ/
Beginner's list: http://groups.yahoo.com/group/ocaml_beginners
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [Caml-list] Interfacing C++ and Ocaml
2001-03-30 9:13 ` Bruce Hoult
@ 2001-03-30 9:24 ` Fergus Henderson
0 siblings, 0 replies; 11+ messages in thread
From: Fergus Henderson @ 2001-03-30 9:24 UTC (permalink / raw)
To: Bruce Hoult; +Cc: David Chemouil, caml-list
On 30-Mar-2001, Bruce Hoult <bruce@hoult.org> wrote:
> I'm no expert on Caml, so maybe the wizards have done something
> clever, but interfacing other languages to C++ is normally best done
> by writing an adaptor in C++ that provides a pure C interface to the
> C++ code (usable by C code, compiled by a C compiler, not C++), and
In particular defining the C++ functions in your adaptor code
as `extern "C"' so that they can be called from C code.
--
Fergus Henderson <fjh@cs.mu.oz.au> | "I have always known that the pursuit
| of excellence is a lethal habit"
WWW: <http://www.cs.mu.oz.au/~fjh> | -- the last words of T. S. Garp.
-------------------
To unsubscribe, mail caml-list-request@inria.fr. Archives: http://caml.inria.fr
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [Caml-list] Interfacing C++ and Ocaml
2001-03-30 8:54 David Chemouil
@ 2001-03-30 9:13 ` Bruce Hoult
2001-03-30 9:24 ` Fergus Henderson
0 siblings, 1 reply; 11+ messages in thread
From: Bruce Hoult @ 2001-03-30 9:13 UTC (permalink / raw)
To: David Chemouil, caml-list
At 10:54 AM +0200 3/30/01, David Chemouil wrote:
>Hi,
>
>
>
>I am in the situation where I would like to write an Ocaml program which
>makes use of some C++ classes. It seems to me some people had said there
>were some problems doing so, but I can't recall what these problems may
>be, and didn't find anything precise in the ML archive.
>
>So, I would like to know what may prevent me to reuse C++ code from
>Ocaml, if anything may. I am sure some arrangements can be done, as
>there exists an Ocaml implementation on BeOS, which is programmed in
>C++.
I'm no expert on Caml, so maybe the wizards have done something
clever, but interfacing other languages to C++ is normally best done
by writing an adaptor in C++ that provides a pure C interface to the
C++ code (usable by C code, compiled by a C compiler, not C++), and
then call *that* from your favourite language.
-- Bruce
-------------------
To unsubscribe, mail caml-list-request@inria.fr. Archives: http://caml.inria.fr
^ permalink raw reply [flat|nested] 11+ messages in thread
* [Caml-list] Interfacing C++ and Ocaml
@ 2001-03-30 8:54 David Chemouil
2001-03-30 9:13 ` Bruce Hoult
0 siblings, 1 reply; 11+ messages in thread
From: David Chemouil @ 2001-03-30 8:54 UTC (permalink / raw)
To: caml-list
Hi,
I am in the situation where I would like to write an Ocaml program which
makes use of some C++ classes. It seems to me some people had said there
were some problems doing so, but I can't recall what these problems may
be, and didn't find anything precise in the ML archive.
So, I would like to know what may prevent me to reuse C++ code from
Ocaml, if anything may. I am sure some arrangements can be done, as
there exists an Ocaml implementation on BeOS, which is programmed in
C++.
Moreover, if it is possible, what do you advise me to do? What are the
limitations? Have you got simple examples of such interfacings?
Thanks in advance,
dc
PS: BTW, I would like to thank these happy volunteers who aim at
packaging a Caml Development Kit. IMO, this is truly a good idea, which
may help Caml spread. Just a question to the Caml team: I would like to
know if (when?) you intend to include polymorphic I/O and some kind of
overloading in a forthcoming release of Caml. It seems to me Pierre had
written some mails about this, but is is now a long time ago, how is the
situation today?
--
David Chemouil [mailto:David.Chemouil@irit.fr]
Institut de recherche en informatique de Toulouse
-------------------
To unsubscribe, mail caml-list-request@inria.fr. Archives: http://caml.inria.fr
^ permalink raw reply [flat|nested] 11+ messages in thread
end of thread, other threads:[~2003-06-27 8:34 UTC | newest]
Thread overview: 11+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2001-03-28 8:37 [Caml-list] Interfacing C++ and Ocaml David Chemouil
2001-03-30 8:54 David Chemouil
2001-03-30 9:13 ` Bruce Hoult
2001-03-30 9:24 ` Fergus Henderson
2003-06-19 19:58 [Caml-list] Interfacing C " Jung Woon Ho
2003-06-19 20:06 ` Kip Macy
2003-06-19 20:28 ` art yerkes
2003-06-26 14:42 [Caml-list] interfacing C and OCaml Jung Woon Ho
2003-06-26 15:14 ` Lex Stein
2003-06-26 19:02 ` Jean-Baptiste Rouquier
2003-06-27 5:24 ` Re[2]: " Mikhail Fedotov
2003-06-27 8:31 ` Jean-Baptiste Rouquier
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox