Blame support/cltkMisc.c

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
}