⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 simple.c

📁 一个类似windows
💻 C
字号:
/*
 * An example how to embed the JavaScript interpreter to your program.
 * Copyright (c) 1998-1999 New Generation Software (NGS) Oy
 *
 * Author: Markku Rossi <mtr@ngs.fi>
 */

/*
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Library General Public
 * License as published by the Free Software Foundation; either
 * version 2 of the License, or (at your option) any later version.
 *
 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Library General Public License for more details.
 *
 * You should have received a copy of the GNU Library General Public
 * License along with this library; if not, write to the Free
 * Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
 * MA 02111-1307, USA
 */

/*
 * $Source: /cygdrive/c/RCVS/CVS/ReactOS/reactos/lib/kjs/examples/simple.c,v $
 * $Id: simple.c 21681 2006-04-21 15:00:24Z peterw $
 */

#include <stdio.h>
#include <stdlib.h>

#include <js.h>

/*
 * Static functions.
 */

/* I/O function for the standard error stream. */
int
io_stderr (void *context, unsigned char *buffer, unsigned int amount)
{
  return fwrite (buffer, 1, amount, stderr);
}


/* The `hello' command. */
JSMethodResult
hello_proc (void *context, JSInterpPtr interp, int argc, JSType *argv,
	    JSType *result_return, char *error_return)
{
  char *msg = context;

  printf ("%s\n", msg);

  return JS_OK;
}

/* The `add' command. */
JSMethodResult
add_proc (void *context, JSInterpPtr interp, int argc, JSType *argv,
	  JSType *result_return, char *error_return)
{
  int i;
  double d = 0.0;
  int doubles = 0;

  for (i = 0; i < argc; i++)
    {
      JSType *arg = &argv[i];

      switch (arg->type)
	{
	case JS_TYPE_INTEGER:
	  d += (double) arg->u.i;
	  break;

	case JS_TYPE_DOUBLE:
	  d += arg->u.d;
	  doubles++;
	  break;

	default:
	  sprintf (error_return, "add: illegal argument");
	  return JS_ERROR;
	  break;
	}
    }

  if (doubles == 0)
    {
      result_return->type = JS_TYPE_INTEGER;
      result_return->u.i = (long) d;
    }
  else
    {
      result_return->type = JS_TYPE_DOUBLE;
      result_return->u.d = d;
    }

  return JS_OK;
}

/* Methods for the `Hello' class. */

/* The instance context for Hello objects. */
struct hello_ctx_st
{
  char msg[1024];
};

typedef struct hello_ctx_st HelloCtx;

/* Method `Hello.show()'. */
static JSMethodResult
hello_show (JSClassPtr cls, void *instance_context, JSInterpPtr interp,
	    int argc, JSType *argv, JSType *result_return, char *error_return)
{
  HelloCtx *ictx = instance_context;
  char *msg;

  if (ictx)
    msg = ictx->msg;
  else
    msg = js_class_context (cls);

  printf ("%s\n", msg);

  return JS_OK;
}

/* Method `Hello.fail()'. */
static JSMethodResult
hello_fail (JSClassPtr cls, void *instance_context, JSInterpPtr interp,
	    int argc, JSType *argv, JSType *result_return, char *error_return)
{
  strcpy (error_return, "My mission is to fail!");

  return JS_ERROR;
}

/* Method `Hello.investigate(obj)'. */
static JSMethodResult
hello_investigate (JSClassPtr cls, void *instance_context, JSInterpPtr interp,
		   int argc, JSType *argv, JSType *result_return,
		   char *error_return)
{
  HelloCtx *others_ictx;

  if (argc != 1)
    {
      strcpy (error_return, "illegal amount of arguments");
      return JS_ERROR;
    }
  if (!js_isa (interp, &argv[0], js_lookup_class (interp, "Hello"),
	       (void **) &others_ictx))
    {
      strcpy (error_return, "illegal argument");
      return JS_ERROR;
    }

  printf ("Hello.investigate(): my argument's message is \"%s\"\n",
	  others_ictx->msg);

  return JS_OK;
}

/* Take a copy of us. */
static JSMethodResult
hello_copy (JSClassPtr cls, void *instance_context, JSInterpPtr interp,
	    int argc, JSType *argv, JSType *result_return,
	    char *error_return)
{
  HelloCtx *ictx = instance_context;
  HelloCtx *nictx;
  JSClassPtr rcls;

  rcls = js_lookup_class (interp, "Hello");
  if (cls != rcls)
    {
      sprintf (error_return, "internal class error");
      return JS_ERROR;
    }

  nictx = malloc (sizeof (*nictx));
  if (ictx)
    strcpy (nictx->msg, ictx->msg);
  else
    strcpy (nictx->msg, "Hello, world!!!!!");

  js_instantiate_class (interp, cls, nictx, free, result_return);

  return JS_OK;
}

/* The getter function for the `Hello.msg' property. */
static JSMethodResult
hello_msg (JSClassPtr cls, void *instance_context, JSInterpPtr interp,
	   int setp, JSType *value, char *error_return)
{
  HelloCtx *ictx = instance_context;
  char *msg;

  if (ictx)
    msg = ictx->msg;
  else
    msg = js_class_context (cls);

  js_type_make_string (interp, value, msg, strlen (msg));
}


static JSMethodResult
hello_constructor (JSClassPtr cls, JSInterpPtr interp, int argc, JSType *argv,
		   void **ictx_return, JSFreeProc *ictx_destructor_return,
		   char *error_return)
{
  HelloCtx *ictx;
  int len;

  if (argc != 1)
    {
      strcpy (error_return, "wront amount of arguments");
      return JS_ERROR;
    }
  if (argv[0].type != JS_TYPE_STRING)
    {
      strcpy (error_return, "illegal argument");
      return JS_ERROR;
    }

  ictx = calloc (1, sizeof (*ictx));
  if (ictx == NULL)
    {
      strcpy (error_return, "out of memory");
      return JS_ERROR;
    }

  len = argv[0].u.s->len;
  if (len + 1 > sizeof (ictx->msg))
    len = sizeof (ictx->msg) - 1;

  memcpy (ictx->msg, argv[0].u.s->data, len);
  ictx->msg[len] = '\0';

  *ictx_return = ictx;
  *ictx_destructor_return = free;

  return JS_OK;
}


/*
 * Global functions.
 */

int
main (int argc, char *argv[])
{
  JSInterpPtr interp;
  JSInterpOptions options;
  JSClassPtr cls;

  int i;

  if (argc < 2)
    {
      fprintf (stderr, "Usage: %s FILE...\n", argv[0]);
      exit (1);
    }

  /* Create one interpreter. */

  js_init_default_options (&options);

  options.verbose = 2;
  options.s_stderr = io_stderr;
  options.s_context = NULL;

  interp = js_create_interp (&options);

  /* Create our extensions. */
  js_create_global_method (interp, "hello", hello_proc,
			   "(global method) Hello, world!", NULL);
  js_create_global_method (interp, "add", add_proc, NULL, NULL);

  /* Create our class. */
  cls = js_class_create ("(Hello) Hello, world!", NULL, 0,
			 hello_constructor);

  js_class_define_method (cls, "show", JS_CF_STATIC, hello_show);
  js_class_define_method (cls, "fail", JS_CF_STATIC, hello_fail);
  js_class_define_method (cls, "investigate", JS_CF_STATIC, hello_investigate);
  js_class_define_method (cls, "copy", 0, hello_copy);

  js_class_define_property (cls, "msg", JS_CF_STATIC | JS_CF_IMMUTABLE,
			    hello_msg);

  js_define_class (interp, cls, "Hello");

  /* Evaluate all argument files. */
  for (i = 1; i < argc; i++)
    if (!js_eval_file (interp, argv[i]))
      fprintf (stderr, "evaluation of file `%s' failed: %s\n",
	       argv[i], js_error_message (interp));

  /* Call our add command with the js_apply() function. */
  {
    JSType argv[3];

    argv[0].type = JS_TYPE_INTEGER;
    argv[0].u.i = 42;

    argv[1].type = JS_TYPE_INTEGER;
    argv[1].u.i = 72;

    if (!js_apply (interp, "add", 2, argv))
      {
	fprintf (stderr, "js_apply() failed: %s\n", js_error_message (interp));
	exit (1);
      }

    js_result (interp, &argv[2]);

    if (argv[2].type != JS_TYPE_INTEGER)
      {
	fprintf (stderr, "add() returned wrong type!\n");
	exit (1);
      }

    printf ("%ld + %ld = %ld\n", argv[0].u.i, argv[1].u.i, argv[2].u.i);
  }

  /* Cleanup. */
  js_destroy_interp (interp);

  return 1;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -