<html>
<head> </head>
<body BGCOLOR="#FFFFFF">
<tt> <pre>

/*
 * File : example_wrap.c
 * Thu Apr  4 13:11:45 1996
 *
 * This file was automatically generated by :
 * Simplified Wrapper and Interface Generator (SWIG)
 * 
 * Copyright (c) 1995,1996
 * The Regents of the University of California and
 * The University of Utah
 *
 */

/* Implementation : TCL */

#define INCLUDE_TCL    <tcl.h>
#define INCLUDE_TK     <tk.h>
#include INCLUDE_TCL
#include <string.h>
#include <stdlib.h>
static void _swig_make_hex(char *_c, void *_ptr, char *type) {
static char _hex[16] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
			'a', 'b', 'c', 'd', 'e', 'f' };
  unsigned long _p,_s;
  char     _result[128], *_r;
  _r = _result;
  _p = (unsigned long) _ptr;
  if (_p > 0) {
     while (_p > 0) {
        _s = _p & 0xf;
        *(_r++) = _hex[_s];
        _p = _p >> 4;
     } 
     *_r = '_';
     while (_r >= _result) *(_c++) = *(_r--);
  } else {
     strcpy(_c,"NULL");
  }
  if (_ptr) strcpy(_c,type);
}
static char *_swig_get_hex(char *_c, void **ptr, char *_t) {
  unsigned long _p;
  char *_tt;
  _p = 0;
  if (*_c == '_') { 
     _c++;
     while (*_c) {
       if ((*_c >= '0') && (*_c <= '9')) _p = (_p << 4) + (*_c - '0');
       else if ((*_c >= 'a') && (*_c <= 'f')) _p = (_p << 4) + ((*_c - 'a') + 10);
       else break; 
       _c++;
     }
     if (_p == 0) {
         return (char *) _c;
     }
     _tt = _c;
     if (_t) {
        if (strcmp(_c,_t)) return _tt;
     }
     *ptr = (void *) _p;
      return (char *) 0;
   } else {
      if (strcmp(_c,"NULL") == 0) {
         *ptr = (void *) 0;
         return (char *) 0;
      }
      else
         return _c;
  }
}

#define SWIG_init    Wrap_Init




/* A TCL_AppInit() function that lets you build a new copy
 * of tclsh.
 *
 * The macro WG_init contains the name of the initialization
 * function in the wrapper file.
 */

#ifndef SWIG_RcFileName
char *SWIG_RcFileName = "~/.myapprc";
#endif

#if TCL_MAJOR_VERSION == 7 && TCL_MINOR_VERSION >= 4
int main(int argc, char **argv) {

  Tcl_Main(argc, argv, Tcl_AppInit);
  return(0);

}
#else
extern int main();
#endif

int Tcl_AppInit(Tcl_Interp *interp){
  int SWIG_init(Tcl_Interp *);  /* Forward reference */

  if (Tcl_Init(interp) == TCL_ERROR) 
    return TCL_ERROR;

  /* Now initialize our functions */

  if (SWIG_init(interp) == TCL_ERROR)
    return TCL_ERROR;

  tcl_RcFileName = SWIG_RcFileName;
  return TCL_OK;
}

extern double   My_variable;
extern int  fact(int  );
extern int  mod(int  ,int  );
extern char * get_time();
int _wrap_tcl_fact(ClientData clientData, Tcl_Interp *interp, int argc, char *argv[]) {
	 int  _result;
	 int _arg0;

	 if (argc != 2) {
		 Tcl_SetResult(interp, "Wrong # args  int  : fact n ",TCL_STATIC);
		 return TCL_ERROR;
	}
	 _arg0 = (int ) atol(argv[1]);
	 _result = fact(_arg0);
	 sprintf(interp->result,"%ld", (long) _result);
	 return TCL_OK;
}
int _wrap_tcl_mod(ClientData clientData, Tcl_Interp *interp, int argc, char *argv[]) {
	 int  _result;
	 int _arg0;
	 int _arg1;

	 if (argc != 3) {
		 Tcl_SetResult(interp, "Wrong # args  int  : mod x y ",TCL_STATIC);
		 return TCL_ERROR;
	}
	 _arg0 = (int ) atol(argv[1]);
	 _arg1 = (int ) atol(argv[2]);
	 _result = mod(_arg0,_arg1);
	 sprintf(interp->result,"%ld", (long) _result);
	 return TCL_OK;
}
int _wrap_tcl_get_time(ClientData clientData, Tcl_Interp *interp, int argc, char *argv[]) {
	 char * _result;

	 if (argc != 1) {
		 Tcl_SetResult(interp, "Wrong # args  char * : get_time ",TCL_STATIC);
		 return TCL_ERROR;
	}
	 _result = get_time();
	 Tcl_SetResult(interp, _result, TCL_VOLATILE);
	 return TCL_OK;
}
int Wrap_Init(Tcl_Interp *interp) {
	 if (interp == 0) 
		 return TCL_ERROR;
	 Tcl_LinkVar(interp, "My_variable", (char *) &My_variable, TCL_LINK_DOUBLE);
	 Tcl_CreateCommand(interp, "fact", _wrap_tcl_fact, (ClientData) NULL, (Tcl_CmdDeleteProc *) NULL);
	 Tcl_CreateCommand(interp, "mod", _wrap_tcl_mod, (ClientData) NULL, (Tcl_CmdDeleteProc *) NULL);
	 Tcl_CreateCommand(interp, "get_time", _wrap_tcl_get_time, (ClientData) NULL, (Tcl_CmdDeleteProc *) NULL);
	 return TCL_OK;
}

</pre> </tt> </body>
</html>



