|
Packit |
bd2e5d |
/***********************************************************************/
|
|
Packit |
bd2e5d |
/* */
|
|
Packit |
bd2e5d |
/* MLTk, Tcl/Tk interface of OCaml */
|
|
Packit |
bd2e5d |
/* */
|
|
Packit |
bd2e5d |
/* Francois Rouaix, Francois Pessaux, Jun Furuse and Pierre Weis */
|
|
Packit |
bd2e5d |
/* projet Cristal, INRIA Rocquencourt */
|
|
Packit |
bd2e5d |
/* Jacques Garrigue, Kyoto University RIMS */
|
|
Packit |
bd2e5d |
/* */
|
|
Packit |
bd2e5d |
/* Copyright 2002 Institut National de Recherche en Informatique et */
|
|
Packit |
bd2e5d |
/* en Automatique and Kyoto University. All rights reserved. */
|
|
Packit |
bd2e5d |
/* This file is distributed under the terms of the GNU Library */
|
|
Packit |
bd2e5d |
/* General Public License, with the special exception on linking */
|
|
Packit |
bd2e5d |
/* described in file LICENSE found in the OCaml source tree. */
|
|
Packit |
bd2e5d |
/* */
|
|
Packit |
bd2e5d |
/***********************************************************************/
|
|
Packit |
bd2e5d |
|
|
Packit |
bd2e5d |
/* $Id$ */
|
|
Packit |
bd2e5d |
|
|
Packit |
bd2e5d |
#include <string.h>
|
|
Packit |
bd2e5d |
#include <tcl.h>
|
|
Packit |
bd2e5d |
#include <tk.h>
|
|
Packit |
bd2e5d |
#include <mlvalues.h>
|
|
Packit |
bd2e5d |
#include <memory.h>
|
|
Packit |
bd2e5d |
#include "camltk.h"
|
|
Packit |
bd2e5d |
|
|
Packit |
bd2e5d |
/* Parsing results */
|
|
Packit |
bd2e5d |
CAMLprim value camltk_splitlist (value v)
|
|
Packit |
bd2e5d |
{
|
|
Packit |
bd2e5d |
int argc;
|
|
Packit |
bd2e5d |
char **argv;
|
|
Packit |
bd2e5d |
int result;
|
|
Packit |
bd2e5d |
char *utf;
|
|
Packit |
bd2e5d |
|
|
Packit |
bd2e5d |
CheckInit();
|
|
Packit |
bd2e5d |
|
|
Packit |
bd2e5d |
utf = caml_string_to_tcl(v);
|
|
Packit |
bd2e5d |
/* argv is allocated by Tcl, to be freed by us */
|
|
Packit |
bd2e5d |
result = Tcl_SplitList(cltclinterp,utf,&argc,(const char ***)&argv);
|
|
Packit |
bd2e5d |
switch(result) {
|
|
Packit |
bd2e5d |
case TCL_OK:
|
|
Packit |
bd2e5d |
{ value res = copy_string_list(argc,argv);
|
|
Packit |
bd2e5d |
Tcl_Free((char *)argv); /* only one large block was allocated */
|
|
Packit |
bd2e5d |
/* argv points into utf: utf must be freed after argv are freed */
|
|
Packit |
bd2e5d |
caml_stat_free( utf );
|
|
Packit |
bd2e5d |
return res;
|
|
Packit |
bd2e5d |
}
|
|
Packit |
bd2e5d |
case TCL_ERROR:
|
|
Packit |
bd2e5d |
default:
|
|
Packit |
bd2e5d |
caml_stat_free( utf );
|
|
Packit |
bd2e5d |
tk_error(Tcl_GetStringResult(cltclinterp));
|
|
Packit |
bd2e5d |
}
|
|
Packit |
bd2e5d |
}
|
|
Packit |
bd2e5d |
|
|
Packit |
bd2e5d |
/* Copy an OCaml string to the C heap. Should deallocate with caml_stat_free */
|
|
Packit |
bd2e5d |
char *string_to_c(value s)
|
|
Packit |
bd2e5d |
{
|
|
Packit |
bd2e5d |
int l = caml_string_length(s);
|
|
Packit |
bd2e5d |
char *res = caml_stat_alloc(l + 1);
|
|
Packit |
bd2e5d |
memmove (res, String_val (s), l);
|
|
Packit |
bd2e5d |
res[l] = '\0';
|
|
Packit |
bd2e5d |
return res;
|
|
Packit |
bd2e5d |
}
|