Update of "tcc4tcl::cproc"
Overview

Artifact ID: 08ed77987a7f3de7fc5694ca93bae0dd5fa9f7c9
Page Name:tcc4tcl::cproc
Date: 2014-06-22 22:17:20
Original User: rkeene
Mimetype:text/x-markdown
Content

tcc4tcl::cproc

package require tcc4tcl

Creates a Tcl procedure in the current process that calls C code.

Synopsis:

  1. tcc4tcl::cproc <procName> <argList> <returnType> <code>
    1. <procName> is the name of the Tcl procedure to create
    2. <argList> is a list of arguments and their types for the C function;
      1. The list is in the format of: type1 name1 type2 name2 ... typeN nameN
      2. The supported types are:
        1. Tcl_Interp*: Must be first argument, will be the interpreter and the user will not need to pass this parameter
        2. int
        3. long
        4. float
        5. double
        6. char*
        7. Tcl_Obj*: Passes the Tcl object in unchanged
        8. void*
    3. <returnType> is the return type for the C function
      1. The supported types are:
        1. void: No return value
        2. ok: Return TCL_OK or TCL_ERROR
        3. int
        4. long
        5. float
        6. double
        7. char*: TCL_STATIC string (immutable from C -- use this for constants)
        8. string, dstring: return a (char*) that is a TCL_DYNAMIC string (allocated from Tcl_Alloc, will be managed by Tcl)
        9. vstring: return a (char*) that is a TCL_VOLATILE string (mutable from C, will be copied be Tcl -- use this for local variables)
        10. default: Tcl_Obj*, a Tcl Object
    4. <code> is the C code that comprises the function

Examples:

  1. Create a Tcl procedure called "add" which accepts 2 integers (a, b) and returns a long:
    1. tcc4tcl::cproc add {int a int b} long { return(a+b); }
  2. Create a Tcl procedure called "mkdir" which accepts a Tcl_Obj* and returns a return code:
    1. tcc4tcl::cproc mkdir {Tcl_Interp* interp char* dir} ok { int mkdir_ret; mkdir_ret = mkdir(dir); if (mkdir_ret != 0) { Tcl_SetObjResult(interp, Tcl_NewStringObj("failed", -1)); return(TCL_ERROR); }; return(TCL_OK); }